You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by ia...@apache.org on 2015/08/24 13:08:54 UTC
[15/38] incubator-taverna-mobile git commit: Adding load more,
in order to fetch more workflows from myexperiment
Adding load more, in order to fetch more workflows from myexperiment
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/5569845c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/tree/5569845c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/diff/5569845c
Branch: refs/heads/master
Commit: 5569845c5eb7c41b6789f6eda246a75faa38772d
Parents: 8371cca
Author: larrytech7 <la...@gmail.com>
Authored: Wed Aug 5 17:29:54 2015 +0100
Committer: larrytech7 <la...@gmail.com>
Committed: Wed Aug 5 17:29:54 2015 +0100
----------------------------------------------------------------------
.../mobile/adapters/WorkflowAdapter.java | 46 ++++++++
.../mobile/fragments/FavoriteFragment.java | 1 -
.../mobile/fragments/WorkflowItemFragment.java | 118 ++++++++++++++-----
.../taverna/mobile/utils/WorkflowLoader.java | 99 +---------------
.../xmlparsers/MyExperimentXmlParserRules.java | 2 +-
5 files changed, 140 insertions(+), 126 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/5569845c/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 134eae6..74c42ed 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
@@ -86,6 +86,52 @@ public class WorkflowAdapter extends RecyclerView.Adapter<WorkflowAdapter.ViewHo
favDB = new Workflow_DB(context, WORKFLOW_FAVORITE_KEY);
}
+ public void addItems(List<Workflow> workflow, int position) throws ClassCastException{
+ //add item to the list
+// workflowList.add(position,workflow);
+ workflowList.addAll(workflow);
+ notifyItemRangeInserted(position + 24, 25);
+ }
+
+ public void removeItem(Workflow workflow){
+ workflowList.remove(workflow);
+ //notifyItemRemoved();
+ }
+
+ /**
+ * Register a new observer to listen for data changes.
+ * <p/>
+ * <p>The adapter may publish a variety of events describing specific changes.
+ * Not all adapters may support all change types and some may fall back to a generic
+ * {@link android.support.v7.widget.RecyclerView.AdapterDataObserver#onChanged()
+ * "something changed"} event if more specific data is not available.</p>
+ * <p/>
+ * <p>Components registering observers with an adapter are responsible for
+ * {@link #unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver)
+ * unregistering} those observers when finished.</p>
+ *
+ * @param observer Observer to register
+ * @see #unregisterAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver)
+ */
+ @Override
+ public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
+ super.registerAdapterDataObserver(observer);
+ }
+
+ /**
+ * Unregister an observer currently listening for data changes.
+ * <p/>
+ * <p>The unregistered observer will no longer receive events about changes
+ * to the adapter.</p>
+ *
+ * @param observer Observer to unregister
+ * @see #registerAdapterDataObserver(android.support.v7.widget.RecyclerView.AdapterDataObserver)
+ */
+ @Override
+ public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
+ super.unregisterAdapterDataObserver(observer);
+ }
+
@Override
public WorkflowAdapter.ViewHolder onCreateViewHolder(ViewGroup parentViewGroup, int viewType) {
View v = LayoutInflater.from(context).inflate(R.layout.workflow_item_layout,parentViewGroup,false);
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/5569845c/app/src/main/java/org/apache/taverna/mobile/fragments/FavoriteFragment.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/fragments/FavoriteFragment.java b/app/src/main/java/org/apache/taverna/mobile/fragments/FavoriteFragment.java
index f200d32..5eb0930 100644
--- a/app/src/main/java/org/apache/taverna/mobile/fragments/FavoriteFragment.java
+++ b/app/src/main/java/org/apache/taverna/mobile/fragments/FavoriteFragment.java
@@ -88,7 +88,6 @@ public class FavoriteFragment extends Fragment implements RecyclerView.OnCreateC
setUpFavoriteData();
setUpListView();
}
-
};
setUpFavoriteData();
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/5569845c/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 73be405..adcfb60 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
@@ -30,23 +30,16 @@ import android.app.SearchManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
-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.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.text.TextUtils;
-import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
@@ -67,12 +60,10 @@ import org.apache.taverna.mobile.tavernamobile.Workflow;
import org.apache.taverna.mobile.utils.AvatarLoader;
import org.apache.taverna.mobile.utils.WorkflowLoader;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
-import java.util.ArrayList;
import java.util.List;
/**
@@ -82,7 +73,7 @@ import java.util.List;
* with a GridView.
* <p/>
*/
-public class WorkflowItemFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener, SearchView.OnQueryTextListener {
+public class WorkflowItemFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener,SearchView.OnQueryTextListener {
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
@@ -104,12 +95,23 @@ public class WorkflowItemFragment extends Fragment implements SwipeRefreshLayout
* The Adapter which will be used to populate the ListView/GridView with
* Views.
*/
- private static WorkflowAdapter searchAdpater;
+ // private static WorkflowAdapter searchAdpater;
private static View rootView;
public static Context cx;
private static boolean STATE_ON = false;
private static TextView noDataText;
private static LruCache<String, Bitmap> avatarCache;
+ private LinearLayoutManager mLinearLayoutManager;
+ private static WorkflowAdapter workflowAdapter;
+
+ //variables for controlling the infinite scroll mechanism
+ private static int previousTotal = 0;
+ private int visibleThreshold = 3;
+ private int firstVisibleItem, visibleItemCount, totalItemCount;
+ private int currentPage = 1;
+ private boolean loading = true;
+ private InfiniteScrollListener scrollListener;
+ private RecyclerView.AdapterDataObserver workflowObserver;
public static WorkflowItemFragment newInstance(String param1, String param2) {
WorkflowItemFragment fragment = new WorkflowItemFragment();
@@ -132,16 +134,29 @@ public class WorkflowItemFragment extends Fragment implements SwipeRefreshLayout
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
cx = getActivity();
+ mLinearLayoutManager = new LinearLayoutManager(cx);
+ scrollListener = new InfiniteScrollListener();
+ workflowObserver= new RecyclerView.AdapterDataObserver() {
+ @Override
+ public void onChanged() {
+ super.onChanged();
+ }
+
+ @Override
+ public void onItemRangeInserted(int positionStart, int itemCount) {
+ super.onItemRangeInserted(positionStart, itemCount);
+ mListView.swapAdapter(workflowAdapter,true);
+ Toast.makeText(getActivity(), "adding more workflows to listview", Toast.LENGTH_SHORT).show();
+ }
+ };
+ workflowAdapter = new WorkflowAdapter(getActivity());
+ workflowAdapter.registerAdapterDataObserver(workflowObserver);
+
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
in = AnimationUtils.loadAnimation(getActivity(),android.R.anim.slide_in_left);
- // List<Workflow> mlist = new ArrayList<Workflow>();
- // mlist.add(new Workflow(getActivity(),"Testing title","Larry","Ok testing",0,"http://127.0.0.1"));
- /* mlist.add(new Workflow(getActivity(),"Testing title","Larry","Ok testing",0,"http://127.0.0.1"));
-*/
-
}
@Override
@@ -150,18 +165,22 @@ public class WorkflowItemFragment extends Fragment implements SwipeRefreshLayout
noDataText = (TextView) rootView.findViewById(android.R.id.empty);
swipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.refresh);
swipeRefreshLayout.setOnRefreshListener(this);
+
// Set the adapter
mListView = (RecyclerView) rootView.findViewById(android.R.id.list);
mListView.setHasFixedSize(true);
- mListView.setLayoutManager(new LinearLayoutManager(getActivity()));
+ mListView.setLayoutManager(mLinearLayoutManager);
mListView.setAnimation(in);
- mListView.setAdapter(new WorkflowAdapter(getActivity()));
+ mListView.setAdapter(workflowAdapter);
+ mListView.setOnScrollListener(scrollListener);
+ mListView.setItemAnimator(new DefaultItemAnimator());
+
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) {
+ avatarCache = new LruCache<String, Bitmap>(cacheSize){
@Override
- protected int sizeOf(String key, Bitmap bitmap) {
+ protected int sizeOf(String key, Bitmap bitmap){
// The cache size will be measured in kilobytes
return bitmap.getByteCount() / 1024;
}
@@ -201,7 +220,7 @@ public class WorkflowItemFragment extends Fragment implements SwipeRefreshLayout
public void onResume() {
super.onResume();
if(!STATE_ON) {
- new WorkflowLoader(getActivity(), swipeRefreshLayout).execute();
+ new WorkflowLoader(getActivity(), swipeRefreshLayout).execute(""+currentPage);
if (mListView.getAdapter().getItemCount() == 0) {
mListView.setVisibility(View.GONE);
@@ -244,21 +263,22 @@ public class WorkflowItemFragment extends Fragment implements SwipeRefreshLayout
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getTitle().equals("Refresh")){
- new WorkflowLoader(getActivity(),swipeRefreshLayout).execute();
+ new WorkflowLoader(getActivity(),swipeRefreshLayout).execute(""+currentPage);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
- public void onDetach() {
+ public void onDestroy() {
super.onDetach();
+ workflowAdapter.unregisterAdapterDataObserver(workflowObserver);
}
-//handle a request to query for given workflows
+ //handle a request to query for given workflows
private void performSearch(String search){
WorkflowAdapter ladapter = new WorkflowAdapter(getActivity());
- WorkflowAdapter wk = searchAdpater;//workflowAdapter;
+ WorkflowAdapter wk = workflowAdapter;//workflowAdapter;
if(!TextUtils.isEmpty(search)) {
if (null != wk)
@@ -277,7 +297,7 @@ public class WorkflowItemFragment extends Fragment implements SwipeRefreshLayout
@Override
public void onRefresh() {
- new WorkflowLoader(getActivity(),swipeRefreshLayout).execute();
+ new WorkflowLoader(getActivity(),swipeRefreshLayout).execute(""+currentPage);
}
/**
@@ -302,9 +322,13 @@ public class WorkflowItemFragment extends Fragment implements SwipeRefreshLayout
((Activity)cx).runOnUiThread(new Runnable() {
@Override
public void run() {
- WorkflowItemFragment.searchAdpater = new WorkflowAdapter(cx,data);
- WorkflowItemFragment.mListView.setAdapter(WorkflowItemFragment.searchAdpater);
- if(WorkflowItemFragment.searchAdpater.getItemCount() == 0){
+ WorkflowItemFragment.workflowAdapter = new WorkflowAdapter(cx,data);
+ workflowAdapter.addItems(data, previousTotal);
+ //workflowAdapter.notifyItemRangeInserted(previousTotal+24,25);
+ //mListView.getAdapter().notifyItemRangeInserted(previousTotal+24, 25);
+ mListView.swapAdapter(new WorkflowAdapter(cx,data), false);
+ // loadMoreWorkflows(data);
+ if(WorkflowItemFragment.workflowAdapter.getItemCount() == 0){
mListView.setVisibility(View.GONE);
noDataText.setVisibility(View.VISIBLE);
// Toast.makeText(cx, cx.getResources().getString(R.string.err_workflow_conn), Toast.LENGTH_LONG).show();
@@ -386,4 +410,38 @@ public class WorkflowItemFragment extends Fragment implements SwipeRefreshLayout
avatarCache.put(row_id_as_key, bitmap);
}
}
+
+ private class InfiniteScrollListener extends RecyclerView.OnScrollListener{
+ /**
+ * Callback method to be invoked when the RecyclerView has been scrolled. This will be
+ * called after the scroll has completed.
+ * <p/>
+ * This callback will also be called if visible item range changes after a layout
+ * calculation. In that case, dx and dy will be 0.
+ *
+ * @param recyclerView The RecyclerView which scrolled.
+ * @param dx The amount of horizontal scroll.
+ * @param dy The amount of vertical scroll.
+ */
+ @Override
+ public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
+ super.onScrolled(recyclerView, dx, dy);
+ visibleItemCount = mListView.getChildCount();
+ totalItemCount = mLinearLayoutManager.getItemCount();
+ firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
+ if(loading){
+ if(totalItemCount > previousTotal){
+ loading = false;
+ previousTotal = totalItemCount;
+ }
+ }
+ if(!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem+visibleThreshold)){
+ //list has reached end, load more.
+ Toast.makeText(getActivity(), "Loading more", Toast.LENGTH_SHORT).show();
+ new WorkflowLoader(getActivity(),swipeRefreshLayout).execute(""+currentPage++);
+ System.out.println(currentPage);
+ loading = true;
+ }
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/5569845c/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowLoader.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowLoader.java b/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowLoader.java
index af16b68..2346c75 100644
--- a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowLoader.java
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowLoader.java
@@ -46,25 +46,16 @@ import java.util.List;
/**
* Created by Larry Akah on 6/13/15.
*/
-public class WorkflowLoader extends AsyncTask<Object, Object, Object>{ //WorkflowLoaderMain {
+public class WorkflowLoader extends AsyncTask<String, Object, Object>{ //WorkflowLoaderMain {
private Context ctx;
private List<Workflow> userWorkflows;
- public static List<Workflow> loadedWorkflows;
private SwipeRefreshLayout refreshLayout;
- /* public WorkflowLoader(Context context) {
- super(context);
- ctx = context;
- loadedWorkflows = new ArrayList<Workflow>();
- userWorkflows = new ArrayList<Workflow>();
- }*/
-
public WorkflowLoader(Context context, SwipeRefreshLayout sw) {
this.ctx = context;
this.refreshLayout = sw;
this.userWorkflows = new ArrayList<Workflow>();
- loadedWorkflows = new ArrayList<Workflow>();
}
@Override
@@ -74,63 +65,18 @@ public class WorkflowLoader extends AsyncTask<Object, Object, Object>{ //Workflo
}
@Override
- public List<Workflow> doInBackground(Object[] objects) {
+ public List<Workflow> doInBackground(String[] pages) {
//start a network request to fetch user's workflows
- /*try {
- //for password protected urls use the user's credentials
- //Authenticator.setDefault(new TavernaPlayerAPI.Authenticator("taverna","taverna"));
-
- URL workflowurl = new URL(new TavernaPlayerAPI(ctx).PLAYER_WORKFLOW_URL);
- HttpURLConnection connection = (HttpURLConnection) workflowurl.openConnection();
- String userpass = "icep603@gmail.com" + ":" + "creationfox";
- String basicAuth = "Basic " + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT);
- //new String(Base64.encode(userpass.getBytes(),Base64.DEFAULT));
- connection.setRequestProperty ("Authorization", basicAuth);
- connection.setRequestProperty("Accept", "application/json");
- connection.setRequestMethod("GET");
- // connection.setDoInput(true);
- // connection.setDoOutput(true);
- connection.connect(); //send request
- Log.i("RESPONSE Code", ""+connection.getResponseCode());
- Log.i("RESPONSE Messsage", ""+connection.getResponseMessage());
- Log.i("Authorization ", ""+connection.getRequestProperty("Authorization"));
-
- InputStream dis = connection.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(dis));
- StringBuffer sb = new StringBuffer();
- String jsonData = "";
- while((jsonData = br.readLine()) != null){
- sb.append(jsonData);
- }
- dis.close();
- br.close();
- JSONArray jsonWorkflow = new JSONArray(sb.toString());
- for(int i=0; i<jsonWorkflow.length();i++){
- JSONObject js = jsonWorkflow.getJSONObject(i);
- Log.i("JSON ", js.toString(2));
- JSONObject authorJson = js.getJSONObject("user");
- String title = js.getString("title");
- String description = js.getString("description");
- String url = js.getString("url");
- long id = js.getLong("id");
- userWorkflows.add(new Workflow(ctx,title,">"+authorJson.getString("name"),description,id,url));
- }
- return userWorkflows;
- } catch (JSONException | IOException e) {
- e.printStackTrace();
- }*/
IRule wkflowRule = new MyExperimentXmlParserRules.WorkflowRule(IRule.Type.ATTRIBUTE, "/workflows/workflow", "resource", "uri","id", "version");
IRule workflowNameRule = new MyExperimentXmlParserRules.WorkflowRule(IRule.Type.CHARACTER, "/workflows/workflow");
WorkflowParser xmlParser = new WorkflowParser(new IRule[]{wkflowRule, workflowNameRule});
try {
- URL workflowurl = new URL("http://www.myexperiment.org/workflows.xml");
+ URL workflowurl = new URL("http://www.myexperiment.org/workflows.xml?page="+Integer.parseInt((pages[0])));
HttpURLConnection connection = (HttpURLConnection) workflowurl.openConnection();
connection.setRequestMethod("GET");
connection.connect(); //send request
-
- Log.i("RESPONSE Code", ""+connection.getResponseCode());
- Log.i("RESPONSE Messsage", ""+connection.getResponseMessage());
+ Log.i("WorkflowLoader","Loading workflows page = "+pages[0]);
InputStream dis = connection.getInputStream();
xmlParser.parse(dis, this.userWorkflows);
@@ -145,44 +91,9 @@ public class WorkflowLoader extends AsyncTask<Object, Object, Object>{ //Workflo
return this.userWorkflows;
}
-/*
- @Override
- public void onCanceled(List<Workflow> data) {
- super.onCanceled(data);
- }
-
- @Override
- public boolean isStarted() {
- return super.isStarted();
- }
-
- @Override
- protected void onStartLoading() {
- //if there is data available, deliver it at once
- if(userWorkflows != null)
- deliverResult(userWorkflows);
- else{
- forceLoad();
- }
- }
-
- @Override
- public void deliverResult(List<Workflow> data) {
- if(isStarted()){
- super.deliverResult(data);
-
- }
- }
-
- @Override
- protected void onStopLoading() {
- cancelLoad();
- }
-*/
-
@Override
protected void onPostExecute(Object o) {
refreshLayout.setRefreshing(false);
-// System.out.println("Workflow Count: "+this.userWorkflows.size());
+ System.out.println("Workflow Count: "+this.userWorkflows.size());
}
}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/5569845c/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 6e2b402..f9c19fc 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
@@ -335,7 +335,7 @@ public class MyExperimentXmlParserRules {
this.workflow.setWorkflow_title(text);
this.workflow.setWorkflow_author("");
wlist.add(this.workflow);
- WorkflowLoader.loadedWorkflows.add(this.workflow);
+ //WorkflowLoader.loadedWorkflows.add(this.workflow);
((List<Workflow>)workflowListObject).add(this.workflow);
this.workflow = null;
}