adding author avatar image caching for better performance

Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/commit/17309521
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/tree/17309521
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/diff/17309521

Branch: refs/heads/master
Commit: 173095216f91901bb8ba7e328c73c176769cd878
Parents: f303503
Author: larrytech7 <[email protected]>
Authored: Sat Jul 25 01:22:24 2015 +0100
Committer: larrytech7 <[email protected]>
Committed: Sat Jul 25 01:22:24 2015 +0100

----------------------------------------------------------------------
 .../mobile/adapters/WorkflowAdapter.java        |  4 +-
 .../mobile/fragments/WorkflowItemFragment.java  | 39 +++++++++++++++++---
 .../fragments/workflowdetails/RunFragment.java  | 13 +------
 .../taverna/mobile/tavernamobile/User.java      |  9 ++++-
 .../taverna/mobile/utils/AvatarLoader.java      |  3 +-
 .../apache/taverna/mobile/utils/HttpUtil.java   |  2 +-
 .../xmlparsers/MyExperimentXmlParserRules.java  |  2 +-
 7 files changed, 49 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/17309521/app/src/main/java/org/apache/taverna/mobile/adapters/WorkflowAdapter.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/org/apache/taverna/mobile/adapters/WorkflowAdapter.java 
b/app/src/main/java/org/apache/taverna/mobile/adapters/WorkflowAdapter.java
index 8b36a66..5660464 100644
--- a/app/src/main/java/org/apache/taverna/mobile/adapters/WorkflowAdapter.java
+++ b/app/src/main/java/org/apache/taverna/mobile/adapters/WorkflowAdapter.java
@@ -176,7 +176,7 @@ public class WorkflowAdapter extends 
RecyclerView.Adapter<WorkflowAdapter.ViewHo
         });
 
         synchronized (this){
-            new DetailLinkLoader().execute(uri);
+            new DetailLinkLoader().execute(uri, String.valueOf(i));
         }
     }
 
@@ -245,7 +245,7 @@ public class WorkflowAdapter extends 
RecyclerView.Adapter<WorkflowAdapter.ViewHo
                 InputStream input = connection.getInputStream();
                 IRule avatarRule = new 
MyExperimentXmlParserRules.UploaderRule(IRule.Type.ATTRIBUTE,"/workflow/uploader",
 "resource","uri","id");
                 WorkflowDetailParser detailMinParser = new 
WorkflowDetailParser(new IRule[]{avatarRule});
-                detailMinParser.parse(input, new User());
+                detailMinParser.parse(input, new User(strings[1]));
 
             } catch (MalformedURLException e) {
                 e.printStackTrace();

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/17309521/app/src/main/java/org/apache/taverna/mobile/fragments/WorkflowItemFragment.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/org/apache/taverna/mobile/fragments/WorkflowItemFragment.java
 
b/app/src/main/java/org/apache/taverna/mobile/fragments/WorkflowItemFragment.java
index e4ac78b..00e2e32 100644
--- 
a/app/src/main/java/org/apache/taverna/mobile/fragments/WorkflowItemFragment.java
+++ 
b/app/src/main/java/org/apache/taverna/mobile/fragments/WorkflowItemFragment.java
@@ -40,6 +40,7 @@ import android.graphics.RectF;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
+import android.support.v4.util.LruCache;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
@@ -109,6 +110,7 @@ public class WorkflowItemFragment extends Fragment 
implements SwipeRefreshLayout
     public static Context cx;
     private static boolean STATE_ON = false;
     private static TextView noDataText;
+    private static LruCache<String, Bitmap> avatarCache;
 
     public static WorkflowItemFragment newInstance(String param1, String 
param2) {
         WorkflowItemFragment fragment = new WorkflowItemFragment();
@@ -155,6 +157,17 @@ public class WorkflowItemFragment extends Fragment 
implements SwipeRefreshLayout
         mListView.setLayoutManager(new LinearLayoutManager(getActivity()));
         mListView.setAnimation(in);
         mListView.setAdapter(new WorkflowAdapter(getActivity()));
+        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
+        // Use 1/8th of the available memory for this memory cache. up to 4MB 
for high screen densities and 1.2Mb for low sds
+        final int cacheSize = maxMemory / 8;
+        avatarCache = new LruCache<String, Bitmap>(cacheSize) {
+            @Override
+            protected int sizeOf(String key, Bitmap bitmap) {
+            // The cache size will be measured in kilobytes
+                return bitmap.getByteCount() / 1024;
+            }
+        };
+
         return rootView;
     }
 
@@ -302,18 +315,30 @@ public class WorkflowItemFragment extends Fragment 
implements SwipeRefreshLayout
             }
         });
     }
+
     public static void startLoadingAvatar(final User author) {
 
         ((Activity)cx).runOnUiThread(new Runnable() {
             @Override
             public void run() {
                 synchronized (this) {
-                    new AvatarLoader().execute(author.getDetails_uri());
+                    //check whether avatar is already in the cache before 
trying to download it from remote resource
+                    //((ImageView) 
rootView.findViewById(R.id.author_profile_image))
+                    if(avatarCache.get(author.getRow_id()) == null)
+                        new AvatarLoader().execute(author.getDetails_uri(), 
author.getRow_id());
+                    else{
+                        ((ImageView) 
rootView.findViewById(R.id.author_profile_image)).setImageBitmap(avatarCache.get(author.getRow_id()));
+                    }
+                    System.out.println("Author cached ID "+author.getRow_id());
                 }
             }
         });
     }
 
+    /**
+     * Called when avatar xml has finished parsing. fetches the avatar 
remotely and updates the item in the list view
+     * @param author the author avatar to load
+     */
     public static void updateAvatar(final User author) {
 
         ((Activity)cx).runOnUiThread(new Runnable() {
@@ -322,7 +347,7 @@ public class WorkflowItemFragment extends Fragment 
implements SwipeRefreshLayout
                 synchronized (this) {
                     try {
                         ((TextView) 
rootView.findViewById(R.id.workflow_author)).setText(author.getName());
-                        new LoadAuthorAvatar((ImageView) 
rootView.findViewById(R.id.author_profile_image)).execute(author.getAvatar_url());
+                        new LoadAuthorAvatar((ImageView) 
rootView.findViewById(R.id.author_profile_image),author.getRow_id()).execute(author.getAvatar_url());
                     }catch(NullPointerException np){
 
                     }
@@ -335,9 +360,11 @@ public class WorkflowItemFragment extends Fragment 
implements SwipeRefreshLayout
      */
     private static class LoadAuthorAvatar extends AsyncTask<String, Void, 
Bitmap> {
         ImageView img;
+        String row_id_as_key;
 
-        public LoadAuthorAvatar(ImageView imageView) {
+        public LoadAuthorAvatar(ImageView imageView, String rowid) {
             img = imageView;
+            row_id_as_key = rowid;
         }
 
         @Override
@@ -362,10 +389,10 @@ public class WorkflowItemFragment extends Fragment 
implements SwipeRefreshLayout
         @Override
         protected void onPostExecute(Bitmap bitmap) {
             img.setImageBitmap(bitmap);
-///            img.setBackground();
-//            notify();
+            //cache this image for faster loading next time
+            avatarCache.put(row_id_as_key, bitmap);
         }
-        private Bitmap ProcessingBitmap(Bitmap bmp){
+        private Bitmap processingBitmap(Bitmap bmp){
             Bitmap bm1 = null;
             Bitmap newBitmap = null;
 

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/17309521/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/RunFragment.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/RunFragment.java
 
b/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/RunFragment.java
index 71e84e4..8d1fb52 100644
--- 
a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/RunFragment.java
+++ 
b/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/RunFragment.java
@@ -7,8 +7,6 @@ import android.os.Bundle;
 import android.preference.PreferenceManager;
 import android.support.v4.app.Fragment;
 import android.text.method.ScrollingMovementMethod;
-import android.util.Base64;
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -21,15 +19,12 @@ import android.widget.TextView;
 import android.widget.Toast;
 
 import org.apache.taverna.mobile.R;
-import org.apache.taverna.mobile.activities.DashboardMainActivity;
 import org.apache.taverna.mobile.tavernamobile.TavernaPlayerAPI;
 import org.apache.taverna.mobile.utils.WorkflowDownloadManager;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.w3c.dom.Text;
 
 import java.io.BufferedReader;
-import java.io.DataOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -49,7 +44,6 @@ import static 
org.apache.taverna.mobile.activities.DashboardMainActivity.APP_DIR
 public class RunFragment extends Fragment implements View.OnClickListener{
 
     private View rootView;
-    private static int RUNID;
     private TextView runIdTextView,runNameTextView;
     private ImageButton status;
     private  TextView runStateTextView, runStartTime,runEndTime, runInputsText;
@@ -68,7 +62,6 @@ public class RunFragment extends Fragment implements 
View.OnClickListener{
         RunFragment fragment = new RunFragment();
         Bundle args = new Bundle();
         fragment.setArguments(args);
-        RUNID = 0 ;
         return fragment;
     }
 
@@ -141,7 +134,7 @@ public class RunFragment extends Fragment implements 
View.OnClickListener{
 
                 downloadOutput.setOnClickListener(this);
                 downloadLogs.setOnClickListener(this);
-
+            reloadRunResult();
         } catch (JSONException e) {
             e.printStackTrace();
         }
@@ -158,10 +151,9 @@ public class RunFragment extends Fragment implements 
View.OnClickListener{
             return true;
         }
         if(id == android.R.id.home){
-           getActivity().finish();
+           //getActivity().finish();
             return true;
         }
-
         return super.onOptionsItemSelected(item);
     }
 
@@ -275,7 +267,6 @@ public class RunFragment extends Fragment implements 
View.OnClickListener{
                 connection.disconnect();
 
                 JSONObject runInfo = new JSONObject(sb.toString());
-                System.out.println(runInfo.toString(2));
                 updateRun(this.context, runInfo);
 
             }catch (IOException ex){

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/17309521/app/src/main/java/org/apache/taverna/mobile/tavernamobile/User.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/org/apache/taverna/mobile/tavernamobile/User.java 
b/app/src/main/java/org/apache/taverna/mobile/tavernamobile/User.java
index efd578c..c3ac20f 100644
--- a/app/src/main/java/org/apache/taverna/mobile/tavernamobile/User.java
+++ b/app/src/main/java/org/apache/taverna/mobile/tavernamobile/User.java
@@ -55,11 +55,18 @@ public class User {
     protected String website;
     protected String details_uri;
     private String avatar_url;
+    private String row_id; //identifies the row  to which this user is being 
loaded in, in the workflow listview
 
-    public User(){
+    public User(String rid){
         super();
+        row_id = rid;
 //        
this.setAvatar_url("http://www.myexperiment.org/users/6/pictures/614";);
     }
+
+    public String getRow_id() {
+        return this.row_id;
+    }
+
     protected List<Workflow> user_workflows; //a list of workflows owned by 
this user
 
     public void setId(String id) {

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/17309521/app/src/main/java/org/apache/taverna/mobile/utils/AvatarLoader.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/org/apache/taverna/mobile/utils/AvatarLoader.java 
b/app/src/main/java/org/apache/taverna/mobile/utils/AvatarLoader.java
index b7f5ee4..c57949c 100644
--- a/app/src/main/java/org/apache/taverna/mobile/utils/AvatarLoader.java
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/AvatarLoader.java
@@ -38,6 +38,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 
 /**
+ * initiates a process to fetch and parse uploader information so as to 
retrieve the id, name and avatar link
  * Created by Larry AKah on 6/29/15.
  */
 public class AvatarLoader extends AsyncTask<String, Void, Void> {
@@ -56,7 +57,7 @@ public class AvatarLoader extends AsyncTask<String, Void, 
Void> {
             IRule avatarName = new 
MyExperimentXmlParserRules.AuthorRule(IRule.Type.CHARACTER,"/user/name");
             AvatarXMLParser avatarXMLParser = new AvatarXMLParser(new 
IRule[]{avatarRule, avatarName});
 
-            avatarXMLParser.parse(input, new User());
+            avatarXMLParser.parse(input, new User(strings[1]));
 
         } catch (MalformedURLException e) {
             e.printStackTrace();

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/17309521/app/src/main/java/org/apache/taverna/mobile/utils/HttpUtil.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/HttpUtil.java 
b/app/src/main/java/org/apache/taverna/mobile/utils/HttpUtil.java
index 141b1a5..9eb4cba 100644
--- a/app/src/main/java/org/apache/taverna/mobile/utils/HttpUtil.java
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/HttpUtil.java
@@ -47,7 +47,7 @@ import java.net.HttpURLConnection;
 public class HttpUtil {
 
     public <T> Object doPostAuthenticate(){
-        User muser = new User();
+        User muser = new User("");
 
         return muser;
     }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/17309521/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParserRules.java
----------------------------------------------------------------------
diff --git 
a/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParserRules.java
 
b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParserRules.java
index b9a0429..6e2b402 100644
--- 
a/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParserRules.java
+++ 
b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParserRules.java
@@ -137,7 +137,7 @@ public class MyExperimentXmlParserRules {
         User muser;
         public UploaderRule(Type type, String locationPath, String... 
attributeNames) throws IllegalArgumentException {
             super(type, locationPath, attributeNames);
-            muser = new User();
+            muser = new User("");
         }
 
         @Override

Reply via email to