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
