Image download feature for search
authordrizea <danielrizea27@gmail.com>
Fri, 15 Jun 2012 10:16:16 +0000 (13:16 +0300)
committerdrizea <danielrizea27@gmail.com>
Fri, 15 Jun 2012 10:16:16 +0000 (13:16 +0300)
19 files changed:
Open-ILS/src/Android/bin/EvergreenApp.apk
Open-ILS/src/Android/bin/classes.dex
Open-ILS/src/Android/bin/classes/org/evergreen/android/globals/GlobalConfigs.class
Open-ILS/src/Android/bin/classes/org/evergreen/android/globals/Utils.class
Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/RecordInfo.class
Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalog.class
Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$1.class
Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$2$1$1.class
Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$2$1.class
Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$2.class
Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$3.class
Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$SearchArrayAdapter.class
Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView.class
Open-ILS/src/Android/src/org/evergreen/android/globals/GlobalConfigs.java
Open-ILS/src/Android/src/org/evergreen/android/globals/Utils.java
Open-ILS/src/Android/src/org/evergreen/android/searchCatalog/ImageDownloader.java [new file with mode: 0644]
Open-ILS/src/Android/src/org/evergreen/android/searchCatalog/RecordInfo.java
Open-ILS/src/Android/src/org/evergreen/android/searchCatalog/SearchCatalog.java
Open-ILS/src/Android/src/org/evergreen/android/searchCatalog/SearchCatalogListView.java

index 0baf162..5528ad3 100644 (file)
Binary files a/Open-ILS/src/Android/bin/EvergreenApp.apk and b/Open-ILS/src/Android/bin/EvergreenApp.apk differ
index c02178a..5edbfec 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes.dex and b/Open-ILS/src/Android/bin/classes.dex differ
index 0597be3..4bf66f3 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/globals/GlobalConfigs.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/globals/GlobalConfigs.class differ
index 5738c7c..ec69f6b 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/globals/Utils.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/globals/Utils.class differ
index 60885a8..9913f32 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/RecordInfo.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/RecordInfo.class differ
index 24913f6..fd5f960 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalog.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalog.class differ
index cea9b21..c051e00 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$1.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$1.class differ
index 4b8e8a8..0399bc9 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$2$1$1.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$2$1$1.class differ
index 4581424..5854aee 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$2$1.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$2$1.class differ
index 7cf20b1..ae8ca9c 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$2.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$2.class differ
index 6f72bda..55e9e75 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$3.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$3.class differ
index 229e623..3e96ef9 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$SearchArrayAdapter.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView$SearchArrayAdapter.class differ
index 2e7a653..59f9176 100644 (file)
Binary files a/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView.class and b/Open-ILS/src/Android/bin/classes/org/evergreen/android/searchCatalog/SearchCatalogListView.class differ
index 50141d8..91a7362 100644 (file)
@@ -55,13 +55,15 @@ public class GlobalConfigs {
                        
                        collectionsRequest += locale + "/OrgTree.js";
                        init = true;
+                       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+                       GlobalConfigs.httpAddress = preferences.getString("library_url", "");
+                       
                        loadIDLFile();
                        getOrganisations();
                
-                       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
-                       GlobalConfigs.httpAddress = preferences.getString("library_url", "");
                        AccountAccess.setAccountInfo(preferences.getString("username", ""), preferences.getString("password", ""));
                        
+                       
                        //authenticate
                        AccountAccess ac = new AccountAccess(GlobalConfigs.httpAddress);
                        ac.authenticate();
index 0c0d058..64c6ba4 100644 (file)
@@ -1,11 +1,14 @@
 package org.evergreen.android.globals;
 
+import java.io.BufferedInputStream;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.net.InetAddress;
+import java.net.MalformedURLException;
 import java.net.SocketTimeoutException;
+import java.net.URL;
+import java.net.URLConnection;
 
 import org.apache.http.HttpResponse;
 import org.apache.http.HttpStatus;
@@ -17,10 +20,12 @@ import org.apache.http.params.HttpConnectionParams;
 import org.apache.http.params.HttpParams;
 
 import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
-import android.test.IsolatedContext;
 import android.util.Log;
+import android.widget.ImageView;
 
 public class Utils {
 
@@ -173,5 +178,41 @@ public class Utils {
 
                return result;
        }
-       
+
+       public static void bookCoverImage(ImageView picture, String imageID, int size){
+               
+               String urlS = (GlobalConfigs.httpAddress + "/opac/extras/ac/jacket/small/" + imageID);
+        
+        Bitmap bmp = null; //create a new Bitmap variable called bmp, and initialize it to null
+
+        try {
+
+                URL url = new URL(urlS); //create a URL object from the urlS string above
+                URLConnection conn = url.openConnection(); //save conn as a URLConnection
+
+                conn.connect(); //connect to the URLConnection conn
+                InputStream is = conn.getInputStream(); //get the image from the URLConnection conn using InputStream is
+                BufferedInputStream bis = new BufferedInputStream(is); //create a BufferedInputStream called bis from is
+                bmp = BitmapFactory.decodeStream(bis); //use bis to convert the stream to a bitmap image, and save it to bmp
+                int bmpHeight = bmp.getHeight(); //stores the original height of the image
+                if(bmpHeight != 1){
+                        double scale = size/(double)bmpHeight; //sets the scaling number to match the desired size
+                        double bmpWidthh = (double)bmp.getWidth() * scale; //scales and stores the original width into the desired one
+                        int bmpWidth = (int)bmpWidthh; //gets the width of the picture and saves it
+                        bmp = Bitmap.createScaledBitmap(bmp, bmpWidth, size, true); //creates and stores a new bmp with desired dimensions
+                }
+                
+        } catch (MalformedURLException e) { //catch errors
+                e.printStackTrace();
+        } catch(IOException e){
+                e.printStackTrace();
+        } catch(IllegalStateException e){
+                e.printStackTrace();
+        }
+        picture.setImageBitmap(bmp); //send the Bitmap image bmp to pic, and call the method to set the image.
+        
+
+       }
+
+
 }
diff --git a/Open-ILS/src/Android/src/org/evergreen/android/searchCatalog/ImageDownloader.java b/Open-ILS/src/Android/src/org/evergreen/android/searchCatalog/ImageDownloader.java
new file mode 100644 (file)
index 0000000..1b35d86
--- /dev/null
@@ -0,0 +1,393 @@
+package org.evergreen.android.searchCatalog;
+
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.ref.SoftReference;
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.http.AndroidHttpClient;
+import android.os.AsyncTask;
+import android.os.Handler;
+import android.util.Log;
+import android.widget.ImageView;
+
+/**
+ * This helper class download images from the Internet and binds those with the provided ImageView.
+ *
+ * <p>It requires the INTERNET permission, which should be added to your application's manifest
+ * file.</p>
+ *
+ * A local cache of downloaded images is maintained internally to improve performance.
+ */
+public class ImageDownloader {
+    private static final String LOG_TAG = "ImageDownloader";
+
+    public enum Mode { NO_ASYNC_TASK, NO_DOWNLOADED_DRAWABLE, CORRECT }
+    private Mode mode = Mode.CORRECT;
+   
+    private int MIN_IMG_HEIGHT = 75;
+    
+    /**
+     * Download the specified image from the Internet and binds it to the provided ImageView. The
+     * binding is immediate if the image is found in the cache and will be done asynchronously
+     * otherwise. A null bitmap will be associated to the ImageView if an error occurs.
+     *
+     * @param url The URL of the image to download.
+     * @param imageView The ImageView to bind the downloaded image to.
+     */
+    public void download(String url, ImageView imageView) {
+        resetPurgeTimer();
+        Bitmap bitmap = getBitmapFromCache(url);
+
+        if (bitmap == null) {
+            forceDownload(url, imageView);
+        } else {
+            cancelPotentialDownload(url, imageView);
+            imageView.setImageBitmap(bitmap);
+        }
+    }
+
+    /*
+     * Same as download but the image is always downloaded and the cache is not used.
+     * Kept private at the moment as its interest is not clear.
+       private void forceDownload(String url, ImageView view) {
+          forceDownload(url, view, null);
+       }
+     */
+
+    /**
+     * Same as download but the image is always downloaded and the cache is not used.
+     * Kept private at the moment as its interest is not clear.
+     */
+    private void forceDownload(String url, ImageView imageView) {
+        // State sanity: url is guaranteed to never be null in DownloadedDrawable and cache keys.
+        if (url == null) {
+            imageView.setImageDrawable(null);
+            return;
+        }
+
+        if (cancelPotentialDownload(url, imageView)) {
+            switch (mode) {
+                case NO_ASYNC_TASK:
+                    Bitmap bitmap = downloadBitmap(url);
+                    addBitmapToCache(url, bitmap);
+                    imageView.setImageBitmap(bitmap);
+                    break;
+
+                case NO_DOWNLOADED_DRAWABLE:
+                    imageView.setMinimumHeight(MIN_IMG_HEIGHT);
+                    BitmapDownloaderTask task = new BitmapDownloaderTask(imageView);
+                    task.execute(url);
+                    break;
+
+                case CORRECT:
+                    task = new BitmapDownloaderTask(imageView);
+                    DownloadedDrawable downloadedDrawable = new DownloadedDrawable(task);
+                    imageView.setImageDrawable(downloadedDrawable);
+                    imageView.setMinimumHeight(MIN_IMG_HEIGHT);
+                    task.execute(url);
+                    break;
+            }
+        }
+    }
+
+    /**
+     * Returns true if the current download has been canceled or if there was no download in
+     * progress on this image view.
+     * Returns false if the download in progress deals with the same url. The download is not
+     * stopped in that case.
+     */
+    private static boolean cancelPotentialDownload(String url, ImageView imageView) {
+        BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);
+
+        if (bitmapDownloaderTask != null) {
+            String bitmapUrl = bitmapDownloaderTask.url;
+            if ((bitmapUrl == null) || (!bitmapUrl.equals(url))) {
+                bitmapDownloaderTask.cancel(true);
+            } else {
+                // The same URL is already being downloaded.
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * @param imageView Any imageView
+     * @return Retrieve the currently active download task (if any) associated with this imageView.
+     * null if there is no such task.
+     */
+    private static BitmapDownloaderTask getBitmapDownloaderTask(ImageView imageView) {
+        if (imageView != null) {
+            Drawable drawable = imageView.getDrawable();
+            if (drawable instanceof DownloadedDrawable) {
+                DownloadedDrawable downloadedDrawable = (DownloadedDrawable)drawable;
+                return downloadedDrawable.getBitmapDownloaderTask();
+            }
+        }
+        return null;
+    }
+
+    Bitmap downloadBitmap(String url) {
+        final int IO_BUFFER_SIZE = 4 * 1024;
+
+        // AndroidHttpClient is not allowed to be used from the main thread
+        final HttpClient client = (mode == Mode.NO_ASYNC_TASK) ? new DefaultHttpClient() :
+            AndroidHttpClient.newInstance("Android");
+        final HttpGet getRequest = new HttpGet(url);
+
+        try {
+            HttpResponse response = client.execute(getRequest);
+            final int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode != HttpStatus.SC_OK) {
+                Log.w("ImageDownloader", "Error " + statusCode +
+                        " while retrieving bitmap from " + url);
+                return null;
+            }
+
+            final HttpEntity entity = response.getEntity();
+            if (entity != null) {
+                InputStream inputStream = null;
+                try {
+                    inputStream = entity.getContent();
+                    // return BitmapFactory.decodeStream(inputStream);
+                    // Bug on slow connections, fixed in future release.
+                    return BitmapFactory.decodeStream(new FlushedInputStream(inputStream));
+                } finally {
+                    if (inputStream != null) {
+                        inputStream.close();
+                    }
+                    entity.consumeContent();
+                }
+            }
+        } catch (IOException e) {
+            getRequest.abort();
+            Log.w(LOG_TAG, "I/O error while retrieving bitmap from " + url, e);
+        } catch (IllegalStateException e) {
+            getRequest.abort();
+            Log.w(LOG_TAG, "Incorrect URL: " + url);
+        } catch (Exception e) {
+            getRequest.abort();
+            Log.w(LOG_TAG, "Error while retrieving bitmap from " + url, e);
+        } finally {
+            if ((client instanceof AndroidHttpClient)) {
+                ((AndroidHttpClient) client).close();
+            }
+        }
+        return null;
+    }
+
+    /*
+     * An InputStream that skips the exact number of bytes provided, unless it reaches EOF.
+     */
+    static class FlushedInputStream extends FilterInputStream {
+        public FlushedInputStream(InputStream inputStream) {
+            super(inputStream);
+        }
+
+        @Override
+        public long skip(long n) throws IOException {
+            long totalBytesSkipped = 0L;
+            while (totalBytesSkipped < n) {
+                long bytesSkipped = in.skip(n - totalBytesSkipped);
+                if (bytesSkipped == 0L) {
+                    int b = read();
+                    if (b < 0) {
+                        break;  // we reached EOF
+                    } else {
+                        bytesSkipped = 1; // we read one byte
+                    }
+                }
+                totalBytesSkipped += bytesSkipped;
+            }
+            return totalBytesSkipped;
+        }
+    }
+
+    /**
+     * The actual AsyncTask that will asynchronously download the image.
+     */
+    class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
+        private String url;
+        private final WeakReference<ImageView> imageViewReference;
+
+        public BitmapDownloaderTask(ImageView imageView) {
+            imageViewReference = new WeakReference<ImageView>(imageView);
+        }
+
+        /**
+         * Actual download method.
+         */
+        @Override
+        protected Bitmap doInBackground(String... params) {
+            url = params[0];
+            return downloadBitmap(url);
+        }
+
+        /**
+         * Once the image is downloaded, associates it to the imageView
+         */
+        @Override
+        protected void onPostExecute(Bitmap bitmap) {
+            if (isCancelled()) {
+                bitmap = null;
+            }
+
+            addBitmapToCache(url, bitmap);
+
+            if (imageViewReference != null) {
+                ImageView imageView = imageViewReference.get();
+                BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);
+                // Change bitmap only if this process is still associated with it
+                // Or if we don't use any bitmap to task association (NO_DOWNLOADED_DRAWABLE mode)
+                if ((this == bitmapDownloaderTask) || (mode != Mode.CORRECT)) {
+                    imageView.setImageBitmap(bitmap);
+                }
+            }
+        }
+    }
+
+
+    /**
+     * A fake Drawable that will be attached to the imageView while the download is in progress.
+     *
+     * <p>Contains a reference to the actual download task, so that a download task can be stopped
+     * if a new binding is required, and makes sure that only the last started download process can
+     * bind its result, independently of the download finish order.</p>
+     */
+    static class DownloadedDrawable extends ColorDrawable {
+        private final WeakReference<BitmapDownloaderTask> bitmapDownloaderTaskReference;
+
+        public DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask) {
+            super(Color.BLACK);
+            bitmapDownloaderTaskReference =
+                new WeakReference<BitmapDownloaderTask>(bitmapDownloaderTask);
+        }
+
+        public BitmapDownloaderTask getBitmapDownloaderTask() {
+            return bitmapDownloaderTaskReference.get();
+        }
+    }
+
+    public void setMode(Mode mode) {
+        this.mode = mode;
+        clearCache();
+    }
+
+   
+    /*
+     * Cache-related fields and methods.
+     *
+     * We use a hard and a soft cache. A soft reference cache is too aggressively cleared by the
+     * Garbage Collector.
+     */
+   
+    private static final int HARD_CACHE_CAPACITY = 10;
+    private static final int DELAY_BEFORE_PURGE = 10 * 1000; // in milliseconds
+
+    // Hard cache, with a fixed maximum capacity and a life duration
+    private final HashMap<String, Bitmap> sHardBitmapCache =
+        new LinkedHashMap<String, Bitmap>(HARD_CACHE_CAPACITY / 2, 0.75f, true) {
+        @Override
+        protected boolean removeEldestEntry(LinkedHashMap.Entry<String, Bitmap> eldest) {
+            if (size() > HARD_CACHE_CAPACITY) {
+                // Entries push-out of hard reference cache are transferred to soft reference cache
+                sSoftBitmapCache.put(eldest.getKey(), new SoftReference<Bitmap>(eldest.getValue()));
+                return true;
+            } else
+                return false;
+        }
+    };
+
+    // Soft cache for bitmaps kicked out of hard cache
+    private final static ConcurrentHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache =
+        new ConcurrentHashMap<String, SoftReference<Bitmap>>(HARD_CACHE_CAPACITY / 2);
+
+    private final Handler purgeHandler = new Handler();
+
+    private final Runnable purger = new Runnable() {
+        public void run() {
+            clearCache();
+        }
+    };
+
+    /**
+     * Adds this bitmap to the cache.
+     * @param bitmap The newly downloaded bitmap.
+     */
+    private void addBitmapToCache(String url, Bitmap bitmap) {
+        if (bitmap != null) {
+            synchronized (sHardBitmapCache) {
+                sHardBitmapCache.put(url, bitmap);
+            }
+        }
+    }
+
+    /**
+     * @param url The URL of the image that will be retrieved from the cache.
+     * @return The cached bitmap or null if it was not found.
+     */
+    private Bitmap getBitmapFromCache(String url) {
+        // First try the hard reference cache
+        synchronized (sHardBitmapCache) {
+            final Bitmap bitmap = sHardBitmapCache.get(url);
+            if (bitmap != null) {
+                // Bitmap found in hard cache
+                // Move element to first position, so that it is removed last
+                sHardBitmapCache.remove(url);
+                sHardBitmapCache.put(url, bitmap);
+                return bitmap;
+            }
+        }
+
+        // Then try the soft reference cache
+        SoftReference<Bitmap> bitmapReference = sSoftBitmapCache.get(url);
+        if (bitmapReference != null) {
+            final Bitmap bitmap = bitmapReference.get();
+            if (bitmap != null) {
+                // Bitmap found in soft cache
+                return bitmap;
+            } else {
+                // Soft reference has been Garbage Collected
+                sSoftBitmapCache.remove(url);
+            }
+        }
+
+        return null;
+    }
+    /**
+     * Clears the image cache used internally to improve performance. Note that for memory
+     * efficiency reasons, the cache will automatically be cleared after a certain inactivity delay.
+     */
+    public void clearCache() {
+        sHardBitmapCache.clear();
+        sSoftBitmapCache.clear();
+    }
+
+    /**
+     * Allow a new delay before the automatic cache clear is done.
+     */
+    private void resetPurgeTimer() {
+        purgeHandler.removeCallbacks(purger);
+        purgeHandler.postDelayed(purger, DELAY_BEFORE_PURGE);
+    }
+}
+
+
index 1384646..f18c1e6 100644 (file)
@@ -5,6 +5,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.opensrf.util.OSRFObject;
+
 public class RecordInfo implements Serializable{
 
        
@@ -37,15 +39,20 @@ public class RecordInfo implements Serializable{
        
        public String series = null;
        
-       public RecordInfo(Map<String,?> info){
+       //tcn field
+       public String image = null;
+       
+       public RecordInfo(OSRFObject info){
                
                try{
                        
-                       this.title = (String)info.get("title");
-                       this.author = (String)info.get("author");
-                       this.pubdate = (String)info.get("pubdate");
-                       this.publisher = (String)info.get("publisher");
-                       this.doc_id = (Integer)info.get("doc_id");
+                       
+                       this.title = info.getString("title");
+                       this.author = info.getString("author");
+                       this.pubdate = info.getString("pubdate");
+                       this.publisher = info.getString("publisher");
+                       this.doc_id = info.getInt("doc_id");
+                       this.image = info.getString("tcn");
                        
                }
                catch(Exception e){System.out.println("Exception basic info " + e.getMessage());};
index 892f95e..69244b9 100644 (file)
@@ -14,6 +14,7 @@ import org.opensrf.net.http.GatewayRequest;
 import org.opensrf.net.http.HttpConnection;
 import org.opensrf.net.http.HttpRequest;
 import org.opensrf.net.http.HttpRequestHandler;
+import org.opensrf.util.OSRFObject;
 
 import android.content.Context;
 import android.util.Log;
@@ -94,8 +95,10 @@ public class SearchCatalog {
                                if(this.selectedOrganization.level != null)
                                        complexParm.put("depth", this.selectedOrganization.level-1);
                        }
-                       /*
+                       //TODO change here, multiple result per page
                        complexParm.put("limit", 10);
+                       
+                       /*
                        complexParm.put("offset",0);
                        complexParm.put("visibility_limit", 3000);
                        complexParm.put("default_class","keyword");
@@ -164,7 +167,7 @@ public class SearchCatalog {
         * @param id the id
         * @return the item short info
         */
-       private Map<String,?> getItemShortInfo(String id){
+       private OSRFObject getItemShortInfo(String id){
                
                Method method = new Method(METHOD_SLIM_RETRIVE);
                
@@ -174,7 +177,7 @@ public class SearchCatalog {
                Object resp;
                while ( (resp = req.recv()) != null) {
                    System.out.println("Sync Response: " + resp);
-                   return (Map<String,?>)resp;
+                   return (OSRFObject)resp;
                }
                
                return null;
index f115e8a..5412e66 100644 (file)
@@ -60,6 +60,8 @@ public class SearchCatalogListView extends Activity{
        private static final int PLACE_HOLD = 0;
        
        private static final int DETAILS = 1;
+
+       private final ImageDownloader imageDownloader = new ImageDownloader();
        
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -112,13 +114,12 @@ public class SearchCatalogListView extends Activity{
         choseOrganisation = (Spinner) findViewById(R.id.chose_organisation);
         
         searchButton = (ImageButton) findViewById(R.id.searchButton);
-        
+
         searchButton.setOnClickListener(new OnClickListener() {
        
         
                        @Override
                        public void onClick(View v) {
-                               // TODO Auto-generated method stub
                                
                                final String text = searchText.getText().toString();
                                
@@ -134,22 +135,22 @@ public class SearchCatalogListView extends Activity{
                                                
                                                @Override
                                                public void run() {
-                                                       // TODO Auto-generated method stub
                                                        searchResults = search.getSearchResults(text);
                                                        
                                                        runOnUiThread(new Runnable() {
                                                                
                                                                @Override
                                                                public void run() {
-                                                                       // TODO Auto-generated method stub
+
                                                                        recordList.clear();
                                                                        if(searchResults.size()>0){
-                                                                               //TODO
+                                                                               
                                                                                for(int j=0;j<searchResults.size();j++)
                                                                                        recordList.add(searchResults.get(j));
                                                                        }
                                                                        adapter.notifyDataSetChanged();
                                                                        progressDialog.dismiss();
+                                                                       
                                                                }
                                                        });
                                                        
@@ -158,7 +159,6 @@ public class SearchCatalogListView extends Activity{
                                        
                                        searchThread.start();
 
-
                                }
                        }
                });
@@ -214,7 +214,6 @@ public class SearchCatalogListView extends Activity{
     
     @Override
     public boolean onContextItemSelected(MenuItem item) {
-       // TODO Auto-generated method stub
        AdapterView.AdapterContextMenuInfo menuArrayItem = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();
        int menuItemIndex = item.getItemId();
        
@@ -232,7 +231,7 @@ public class SearchCatalogListView extends Activity{
                }
                break;
                case PLACE_HOLD : {
-                       
+                       //TODO
                }
                break;
        }
@@ -282,6 +281,10 @@ public class SearchCatalogListView extends Activity{
                // Get reference to ImageView 
                recordImage = (ImageView) row.findViewById(R.id.search_record_img);
                
+               //TODO fix bugs + features
+               String imageHref= GlobalConfigs.httpAddress + "/opac/extras/ac/jacket/small/"+record.doc_id;
+               //start async download of image 
+               imageDownloader.download(imageHref, recordImage);
                // Get reference to TextView - title
                recordTitle = (TextView) row.findViewById(R.id.search_record_title);
                
@@ -300,7 +303,6 @@ public class SearchCatalogListView extends Activity{
                return row;
        }
     }
-    
 
 }