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/06/25 12:00:29 UTC

[5/6] incubator-taverna-mobile git commit: Optimise search and fixed crash bug during search

Optimise search and fixed crash bug during search


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/1b07fee5
Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/tree/1b07fee5
Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/diff/1b07fee5

Branch: refs/heads/master
Commit: 1b07fee59d296826b6547a324a23509edb937903
Parents: 045fab5
Author: larrytech7 <la...@gmail.com>
Authored: Wed Jun 24 19:10:46 2015 +0100
Committer: larrytech7 <la...@gmail.com>
Committed: Wed Jun 24 19:10:46 2015 +0100

----------------------------------------------------------------------
 .../mobile/adapters/WorkflowAdapter.java        |  16 +-
 .../mobile/fragments/WorkflowItemFragment.java  |  89 +---------
 .../mobile/utils/MyExperimentXmlParser.java     | 168 -------------------
 .../taverna/mobile/utils/WorkflowLoader.java    | 101 +----------
 .../taverna/mobile/utils/WorkflowParser.java    |  50 ------
 .../utils/xmlparsers/MyExperimentXmlParser.java | 146 ++++++++++++++++
 .../mobile/utils/xmlparsers/WorkflowParser.java |  35 ++++
 .../main/res/layout/workflow_item_layout.xml    |   9 +-
 8 files changed, 207 insertions(+), 407 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1b07fee5/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 b2c17f4..ce4e4c9 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
@@ -76,6 +76,7 @@ public class WorkflowAdapter extends RecyclerView.Adapter<WorkflowAdapter.ViewHo
     public WorkflowAdapter(Context c){
         context = c;
         workflow = new ArrayList<Workflow>();
+        favDB = new Workflow_DB(context, WORKFLOW_FAVORITE_KEY);
     }
 
     @Override
@@ -115,10 +116,6 @@ public class WorkflowAdapter extends RecyclerView.Adapter<WorkflowAdapter.ViewHo
         final Intent it = new Intent();
         it.setClass(context, WorkflowDetailActivity.class);
         it.putExtra("workflowid", workflow.get(i).getId());
-        /*it.putExtra("author", workflow.get(i).getWorkflow_author());
-        it.putExtra("title",title);
-        it.putExtra("description",desc_full);
-        it.putExtra("url", wkflow_url);*/
         WorkflowdetailFragment.WORKFLO_ID = workflow.get(i).getId();
 
         viewHolder.btn_view_workflow.setOnClickListener(new View.OnClickListener() {
@@ -131,7 +128,7 @@ public class WorkflowAdapter extends RecyclerView.Adapter<WorkflowAdapter.ViewHo
                 ((Activity) context).overridePendingTransition(android.R.anim.slide_in_left, android.R.anim.fade_out);
             }
         });
-        viewHolder.btn_download_workflow.setOnClickListener(new View.OnClickListener() {
+        /*viewHolder.btn_download_workflow.setOnClickListener(new View.OnClickListener() {
 
             @Override
             public void onClick(View view) {
@@ -151,14 +148,15 @@ public class WorkflowAdapter extends RecyclerView.Adapter<WorkflowAdapter.ViewHo
                     e.printStackTrace();
                 }
             }
-        });
+        });*/
         viewHolder.btn_mark_workflow.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
                 boolean saved =  favDB.save();
-                if(saved)
-                    Toast.makeText(context,"Workflow marked as favorite",Toast.LENGTH_SHORT).show();
-                else
+                if(saved) {
+                    Toast.makeText(context, "Workflow marked as favorite", Toast.LENGTH_SHORT).show();
+                    viewHolder.btn_mark_workflow.setCompoundDrawables(context.getResources().getDrawable(android.R.drawable.btn_star_big_on),null,null,null);
+                }else
                     Toast.makeText(context,"Error!, please try again",Toast.LENGTH_SHORT).show();
             }
         });

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1b07fee5/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 4457366..e48a6ba 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
@@ -28,7 +28,6 @@ import android.app.Activity;
 import android.app.ProgressDialog;
 import android.app.SearchManager;
 import android.content.Context;
-import android.content.Intent;
 import android.os.Bundle;
 import android.support.v4.app.Fragment;
 import android.support.v4.widget.SwipeRefreshLayout;
@@ -36,7 +35,6 @@ import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
 import android.support.v7.widget.SearchView;
 import android.util.Log;
-import android.view.ContextMenu;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
@@ -46,13 +44,11 @@ import android.view.ViewGroup;
 import android.view.animation.Animation;
 import android.view.animation.AnimationUtils;
 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.adapters.WorkflowAdapter;
 import org.apache.taverna.mobile.tavernamobile.Workflow;
-import org.apache.taverna.mobile.utils.WorkflowDataCallback;
 import org.apache.taverna.mobile.utils.WorkflowLoader;
 
 import java.util.ArrayList;
@@ -65,8 +61,7 @@ import java.util.List;
  * with a GridView.
  * <p/>
  */
-public class WorkflowItemFragment extends Fragment implements android.app.LoaderManager.LoaderCallbacks<List<Workflow>>,
-        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";
@@ -166,12 +161,6 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
         rootView = null;
     }
 
-    /**
-     * Called when the fragment is visible to the user and actively running.
-     * This is generally
-     * tied to {@link android.app.Activity#onResume() Activity.onResume} of the containing
-     * Activity's lifecycle.
-     */
     @Override
     public void onResume() {
         super.onResume();
@@ -183,23 +172,10 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
             //Toast.makeText(getActivity(), "Query = " + query, Toast.LENGTH_SHORT).show();
             performSearch(workflowAdapter,query);
         }else*/
-        new WorkflowLoader(getActivity(),mListView,swipeRefreshLayout).execute();
+        new WorkflowLoader(getActivity(), swipeRefreshLayout).execute();
         //    getActivity().getLoaderManager().initLoader(0,null,this).forceLoad();
     }
 
-    /**
-     * Initialize the contents of the Activity's standard options menu.  You
-     * should place your menu items in to <var>menu</var>.  For this method
-     * to be called, you must have first called {@link #setHasOptionsMenu}.  See
-     * {@link android.app.Activity#onCreateOptionsMenu(android.view.Menu) Activity.onCreateOptionsMenu}
-     * for more information.
-     *
-     * @param menu     The options menu in which you place your items.
-     * @param inflater
-     * @see #setHasOptionsMenu
-     * @see #onPrepareOptionsMenu
-     * @see #onOptionsItemSelected
-     */
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         super.onCreateOptionsMenu(menu, inflater);
@@ -220,27 +196,10 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
         }
     }
 
-    /**
-     * This hook is called whenever an item in your options menu is selected.
-     * The default implementation simply returns false to have the normal
-     * processing happen (calling the item's Runnable or sending a message to
-     * its Handler as appropriate).  You can use this method for any items
-     * for which you would like to do processing without those other
-     * facilities.
-     * <p/>
-     * <p>Derived classes should call through to the base class for it to
-     * perform the default menu handling.
-     *
-     * @param item The menu item that was selected.
-     * @return boolean Return false to allow normal menu processing to
-     * proceed, true to consume it here.
-     * @see #onCreateOptionsMenu
-     */
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if(item.getTitle().equals("Refresh")){
-            new WorkflowLoader(getActivity(), mListView, swipeRefreshLayout).execute();
-//            getActivity().getLoaderManager().restartLoader(0, null, this).forceLoad();
+            new WorkflowLoader(getActivity(),swipeRefreshLayout).execute();
             return true;
         }
         return super.onOptionsItemSelected(item);
@@ -251,11 +210,6 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
         super.onDetach();
     }
 
-    /**
-     * The default content for this Fragment has a TextView that is shown when
-     * the list is empty. If you would like to change the text, call this method
-     * to supply the text it should use.
-     */
     public void setEmptyText(CharSequence emptyText) {
         View emptyView = mListView.getChildAt(2);
 
@@ -271,42 +225,17 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
         Log.i("Count", ""+wk.getItemCount());
         for(int i=0; i< wk.getItemCount(); i++) {
             Workflow workflow = wk.getItem(i);
-            if(search.toLowerCase().contains(workflow.getWorkflow_author().toLowerCase())
-                    || search.contains(workflow.getWorkflow_title().toLowerCase())){
+            if( search.contains(workflow.getWorkflow_title().toLowerCase())){
                 ladapter.addWorkflow(workflow);
             }
         }
-        mListView.swapAdapter(ladapter, true);
-       /// Toast.makeText(getActivity(), "Query = " + search, Toast.LENGTH_SHORT).show();
-    }
-
-    @Override
-    public android.content.Loader<List<Workflow>> onCreateLoader(int id, Bundle args) {
-        swipeRefreshLayout.setRefreshing(true);
-        return null;
-        //return new WorkflowLoader(getActivity());
-    }
-
-    @Override
-    public void onLoadFinished(android.content.Loader<List<Workflow>> loader, List<Workflow> workflows) {
-        swipeRefreshLayout.setRefreshing(false);
-        Toast.makeText(getActivity(), "loader finished", Toast.LENGTH_SHORT).show();
-        workflowAdapter= new WorkflowAdapter(getActivity(), workflows);
-        WorkflowItemFragment.searchAdpater = workflowAdapter;
-        //mListView.swapAdapter(workflowAdapter, true);
-    }
-
-    @Override
-    public void onLoaderReset(android.content.Loader<List<Workflow>> listLoader) {
-        listLoader.reset();
-//        mListView.swapAdapter(null, true);
+        mListView.setAdapter(ladapter);
+//        mListView.swapAdapter(ladapter, true);
     }
 
     @Override
     public void onRefresh() {
-
-        new WorkflowLoader(getActivity(), mListView, swipeRefreshLayout).execute();
-        //getActivity().getLoaderManager().restartLoader(0, null, this).forceLoad();
+        new WorkflowLoader(getActivity(),swipeRefreshLayout).execute();
     }
 
     @Override
@@ -325,9 +254,9 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
         ((Activity)cx).runOnUiThread(new Runnable() {
             @Override
             public void run() {
-                WorkflowItemFragment.mListView.setAdapter(new WorkflowAdapter(cx, data));
+                WorkflowItemFragment.searchAdpater = new WorkflowAdapter(cx,data);
+                WorkflowItemFragment.mListView.setAdapter(WorkflowItemFragment.searchAdpater);
             }
         });
-
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1b07fee5/app/src/main/java/org/apache/taverna/mobile/utils/MyExperimentXmlParser.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/MyExperimentXmlParser.java b/app/src/main/java/org/apache/taverna/mobile/utils/MyExperimentXmlParser.java
deleted file mode 100644
index 26893f7..0000000
--- a/app/src/main/java/org/apache/taverna/mobile/utils/MyExperimentXmlParser.java
+++ /dev/null
@@ -1,168 +0,0 @@
-package org.apache.taverna.mobile.utils;
-/**
- * Apache Taverna Mobile
- * Copyright 2015 The Apache Software Foundation
-
- * This product includes software developed at
- * The Apache Software Foundation (http://www.apache.org/).
-
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import android.text.util.Linkify;
-
-import com.thebuzzmedia.sjxp.XMLParser;
-import com.thebuzzmedia.sjxp.rule.DefaultRule;
-
-import org.apache.taverna.mobile.tavernamobile.Workflow;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by Larry Akah on 6/23/15.
- */
-public class MyExperimentXmlParser {
-
-    //parse a single workflow from myexperiment
-    public static final class WorkflowItemRule extends DefaultRule{
-
-        /**
-         * Create a new rule with the given values.
-         *
-         * @param type           The type of the rule.
-         * @param locationPath   The location path of the element to target in the XML.
-         * @param attributeNames An optional list of attribute names to parse values for if the
-         *                       type of this rule is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#ATTRIBUTE}.
-         * @throws IllegalArgumentException if <code>type</code> is <code>null</code>, if
-         *                                            <code>locationPath</code> is <code>null</code> or empty, if
-         *                                            <code>type</code> is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#ATTRIBUTE} and
-         *                                            <code>attributeNames</code> is <code>null</code> or empty or
-         *                                            if <code>type</code> is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#CHARACTER} and
-         *                                            <code>attributeNames</code> <strong>is not</strong>
-         *                                            <code>null</code> or empty.
-         */
-        public WorkflowItemRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
-            super(Type.CHARACTER, "http://www.myexperiment.org/workflows.xml", "workflow");
-        }
-
-        /**
-         * Default no-op implementation. Please override with your own logic.
-         *
-         * @param parser
-         * @param index
-         * @param value
-         * @param userObject
-         * @see com.thebuzzmedia.sjxp.rule.IRule#handleParsedAttribute(com.thebuzzmedia.sjxp.XMLParser, int, String, Object)
-         */
-        @Override
-        public void handleParsedAttribute(XMLParser parser, int index, String value, Object userObject) {
-            switch(index){
-                case 0:
-                    break;
-                case 1:
-                    break;
-                case 2:
-                    break;
-                case 3:
-                    break;
-
-            }
-        }
-    }
-
-    /**
-     * parse workflows from myExperiment
-     */
-    public final static class WorkflowRule extends DefaultRule{
-        Workflow workflow;
-        List<Workflow>  wlist;
-        static String uri,version,desc;
-        static String url=uri=version=desc="";
-        static long id = 0;
-        /**
-         * Create a new rule with the given values.
-         *
-         * @param type           The type of the rule.
-         * @param locationPath   The location path of the element to target in the XML.
-         * @param attributeNames An optional list of attribute names to parse values for if the
-         *                       type of this rule is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#ATTRIBUTE}.
-         * @throws IllegalArgumentException if <code>type</code> is <code>null</code>, if
-         *                                            <code>locationPath</code> is <code>null</code> or empty, if
-         *                                            <code>type</code> is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#ATTRIBUTE} and
-         *                                            <code>attributeNames</code> is <code>null</code> or empty or
-         *                                            if <code>type</code> is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#CHARACTER} and
-         *                                            <code>attributeNames</code> <strong>is not</strong>
-         *                                            <code>null</code> or empty.
-         */
-        public WorkflowRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
-            super(type, locationPath, attributeNames);
-            this.workflow = new Workflow();
-            wlist = new ArrayList<>();
-        }
-        //instantiated to parse xml data for a given workflow
-        public WorkflowRule(Type type, String path, int id, String attributenames){
-            super(type,path,attributenames);
-        }
-
-        @Override
-        public void handleParsedAttribute(XMLParser parser, int index, String value, Object userObject) {
-
-            switch(index){
-                case 0:
-                    System.out.println("Workflow Resource: "+value); url = value;
-                    desc = "To view workflow on the web, click "+value;
-//                    this.workflow.setWorkflow_web_url(value);
-//                    this.workflow.setWorkflow_description("To view workflow on the web, click "+value);
-                    break;
-                case 1:
-                    System.out.println("Workflow uri: "+value); //uri for detailed workflow
-                    uri = value;
-//                    this.workflow.setWorkflow_remote_url(value);
-                    break;
-                case 2:
-                    System.out.println("Workflow id: "+value);
-                    id = Integer.parseInt(value);
-//                    this.workflow.setId(Integer.parseInt(value));
-                    break;
-                case 3:
-                    System.out.println("Workflow version: "+value);
-                    version = value;
-               //     this.workflow.setWorkflow_versions(value);
-                    break;
-            }
-
-        }
-
-        @Override
-        public void handleParsedCharacters(XMLParser parser, String text, Object workflowListObject) {
-            //add the title to the workflow and add it to the workflow list
-            this.workflow = new Workflow("", desc, id, url);
-            this.workflow.setWorkflow_title(text);
-            this.workflow.setWorkflow_author("");
-            wlist.add(this.workflow);
-            WorkflowLoader.loadedWorkflows.add(this.workflow);
-            System.out.println("static Workflow Count: " + WorkflowLoader.loadedWorkflows.size());
-            ((List<Workflow>)workflowListObject).add(this.workflow);
-            this.workflow = null;
-
-        }
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1b07fee5/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 3071f88..3eb272f 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
@@ -23,29 +23,20 @@ package org.apache.taverna.mobile.utils;
  * specific language governing permissions and limitations
  * under the License.
  */
-import android.app.Activity;
 import android.content.Context;
 import android.os.AsyncTask;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.widget.RecyclerView;
-import android.util.Base64;
 import android.util.Log;
 
-import com.thebuzzmedia.sjxp.XMLParser;
-import com.thebuzzmedia.sjxp.rule.DefaultRule;
 import com.thebuzzmedia.sjxp.rule.IRule;
 
-import org.apache.taverna.mobile.adapters.WorkflowAdapter;
-import org.apache.taverna.mobile.tavernamobile.TavernaPlayerAPI;
 import org.apache.taverna.mobile.tavernamobile.Workflow;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
+import org.apache.taverna.mobile.utils.xmlparsers.MyExperimentXmlParser;
+import org.apache.taverna.mobile.utils.xmlparsers.WorkflowParser;
 
-import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
 import java.net.ProtocolException;
@@ -61,7 +52,6 @@ public class WorkflowLoader extends AsyncTask<Object, Object, Object>{ //Workflo
     private Context ctx;
     private List<Workflow> userWorkflows;
     public static List<Workflow> loadedWorkflows;
-    private RecyclerView recyclerView;
     private SwipeRefreshLayout refreshLayout;
 
   /*  public WorkflowLoader(Context context) {
@@ -71,9 +61,8 @@ public class WorkflowLoader extends AsyncTask<Object, Object, Object>{ //Workflo
         userWorkflows = new ArrayList<Workflow>();
     }*/
 
-    public WorkflowLoader(Context context, RecyclerView rc, SwipeRefreshLayout sw) {
+    public WorkflowLoader(Context context, SwipeRefreshLayout sw) {
         this.ctx = context;
-        this.recyclerView = rc;
         this.refreshLayout = sw;
         this.userWorkflows = new ArrayList<Workflow>();
         loadedWorkflows = new ArrayList<Workflow>();
@@ -134,7 +123,7 @@ public class WorkflowLoader extends AsyncTask<Object, Object, Object>{ //Workflo
         }*/
         IRule wkflowRule = new MyExperimentXmlParser.WorkflowRule(IRule.Type.ATTRIBUTE, "/workflows/workflow", "resource", "uri","id", "version");
         IRule workflowNameRule = new MyExperimentXmlParser.WorkflowRule(IRule.Type.CHARACTER, "/workflows/workflow");
-        WorkflowParser xmlParser = new WorkflowParser(new IRule[]{wkflowRule, workflowNameRule}, recyclerView, this.ctx);
+        WorkflowParser xmlParser = new WorkflowParser(new IRule[]{wkflowRule, workflowNameRule});
         try {
             URL workflowurl = new URL("http://www.myexperiment.org/workflows.xml");
             HttpURLConnection connection = (HttpURLConnection) workflowurl.openConnection();
@@ -146,7 +135,6 @@ public class WorkflowLoader extends AsyncTask<Object, Object, Object>{ //Workflo
 
             InputStream dis = connection.getInputStream();
             xmlParser.parse(dis, this.userWorkflows);
-            Thread.sleep(4000);//4sec delay so that parsing completes
 
         }catch (MalformedURLException e) {
             e.printStackTrace();
@@ -154,10 +142,7 @@ public class WorkflowLoader extends AsyncTask<Object, Object, Object>{ //Workflo
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
         }
-       // return WorkflowLoader.loadedWorkflows;
         return this.userWorkflows;
     }
 
@@ -200,83 +185,5 @@ public class WorkflowLoader extends AsyncTask<Object, Object, Object>{ //Workflo
     protected void onPostExecute(Object o) {
         refreshLayout.setRefreshing(false);
         System.out.println("Workflow Count: "+this.userWorkflows.size());
-      //  recyclerView.setAdapter(new WorkflowAdapter(this.ctx, (List<Workflow>) o));
-    }
-
-    class WorkflowRule extends DefaultRule {
-        Workflow workflow;
-
-        /**
-         * Create a new rule with the given values.
-         *
-         * @param type           The type of the rule.
-         * @param locationPath   The location path of the element to target in the XML.
-         * @param attributeNames An optional list of attribute names to parse values for if the
-         *                       type of this rule is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#ATTRIBUTE}.
-         * @throws IllegalArgumentException if <code>type</code> is <code>null</code>, if
-         *                                            <code>locationPath</code> is <code>null</code> or empty, if
-         *                                            <code>type</code> is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#ATTRIBUTE} and
-         *                                            <code>attributeNames</code> is <code>null</code> or empty or
-         *                                            if <code>type</code> is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#CHARACTER} and
-         *                                            <code>attributeNames</code> <strong>is not</strong>
-         *                                            <code>null</code> or empty.
-         */
-        public WorkflowRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
-            super(type, locationPath, attributeNames);
-            workflow = new Workflow();
-        }
-        //instantiated to parse xml data for a given workflow
-        public WorkflowRule(Type type, String path, int id, String attributenames){
-            super(type,path,attributenames);
-        }
-
-        /**
-         * Default no-op implementation. Please override with your own logic.
-         *
-         * @param parser
-         * @param index
-         * @param value
-         * @param userObject
-         * @see com.thebuzzmedia.sjxp.rule.IRule#handleParsedAttribute(com.thebuzzmedia.sjxp.XMLParser, int, String, Object)
-         */
-        @Override
-        public void handleParsedAttribute(XMLParser parser, int index, String value, Object userObject) {
-            switch(index){
-                case 0:
-                    System.out.println("Workflow Resource: "+value);
-                    workflow.setWorkflow_web_url(value);
-                    workflow.setWorkflow_description("To view workflow on the web, click "+value);
-                    break;
-                case 1:
-                    System.out.println("Workflow uri: "+value); //uri for detailed workflow
-                    workflow.setWorkflow_remote_url(value);
-                    break;
-                case 2:
-                    System.out.println("Workflow id: "+value);
-                    workflow.setId(Integer.parseInt(value));
-                    break;
-                case 3:
-                    System.out.println("Workflow version: "+value);
-                    workflow.setWorkflow_versions(value);
-                    break;
-            }
-        }
-
-        /**
-         * Default no-op implementation. Please override with your own logic.
-         *
-         * @param parser
-         * @param text
-         * @param workflowListObject
-         * @see com.thebuzzmedia.sjxp.rule.IRule#handleParsedCharacters(com.thebuzzmedia.sjxp.XMLParser, String, Object)
-         */
-        @Override
-        public void handleParsedCharacters(XMLParser parser, String text, Object workflowListObject) {
-            //add the title to the workflow and add it to the workflow list
-            workflow.setWorkflow_title(text);
-            workflow.setWorkflow_author("");
-            workflow = new Workflow();
-            ((List<Workflow>)workflowListObject).add(workflow);
-        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1b07fee5/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowParser.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowParser.java b/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowParser.java
deleted file mode 100644
index cc74955..0000000
--- a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowParser.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.apache.taverna.mobile.utils;
-
-import android.content.Context;
-import android.support.v7.widget.RecyclerView;
-
-import com.thebuzzmedia.sjxp.XMLParser;
-import com.thebuzzmedia.sjxp.XMLParserException;
-import com.thebuzzmedia.sjxp.rule.IRule;
-
-import org.apache.taverna.mobile.adapters.WorkflowAdapter;
-import org.apache.taverna.mobile.fragments.WorkflowItemFragment;
-import org.apache.taverna.mobile.tavernamobile.Workflow;
-
-import java.util.List;
-
-/**
- * Workflow end document class for detecting when the complete list of workflows have been read out
- * Created by Larry Akah on 6/24/15.
- */
-public class WorkflowParser extends XMLParser implements WorkflowDataCallback{
-
-    private RecyclerView recyclerView;
-    private Context mcontext;
-
-    public WorkflowParser(IRule[] rules) throws IllegalArgumentException, XMLParserException {
-        super(rules);
-    }
-
-    public WorkflowParser(IRule[] rules, RecyclerView recyclerv, Context c){
-        super(rules);
-        this.recyclerView = recyclerv;
-        this.mcontext = c;
-    }
-
-    @Override
-    protected void doEndDocument(Object userObject) {
-  //      super.doEndDocument(userObject);
-    //bind workflows to the adapter;
-//        onWorkflowDataReady((List<Workflow>) userObject);
-        WorkflowItemFragment.updateWorkflowUI((List<Workflow>) userObject);
-    }
-
-    @Override
-    public void onWorkflowDataReady(List<Workflow> data) {
-     //   this.recyclerView.setAdapter(new WorkflowAdapter(mcontext, data));
-        for(Workflow w:data){
-            System.out.println(w.getId());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1b07fee5/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParser.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParser.java b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParser.java
new file mode 100644
index 0000000..69791d5
--- /dev/null
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParser.java
@@ -0,0 +1,146 @@
+package org.apache.taverna.mobile.utils.xmlparsers;
+/**
+ * Apache Taverna Mobile
+ * Copyright 2015 The Apache Software Foundation
+
+ * This product includes software developed at
+ * The Apache Software Foundation (http://www.apache.org/).
+
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import com.thebuzzmedia.sjxp.XMLParser;
+import com.thebuzzmedia.sjxp.rule.DefaultRule;
+
+import org.apache.taverna.mobile.tavernamobile.Workflow;
+import org.apache.taverna.mobile.utils.WorkflowLoader;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by Larry Akah on 6/23/15.
+ */
+public class MyExperimentXmlParser {
+
+    //parse a single workflow from myexperiment
+    public static final class WorkflowItemRule extends DefaultRule{
+
+        /**
+         * Create a new rule with the given values.
+         *
+         * @param type           The type of the rule.
+         * @param locationPath   The location path of the element to target in the XML.
+         * @param attributeNames An optional list of attribute names to parse values for if the
+         *                       type of this rule is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#ATTRIBUTE}.
+         * @throws IllegalArgumentException if <code>type</code> is <code>null</code>, if
+         *                                            <code>locationPath</code> is <code>null</code> or empty, if
+         *                                            <code>type</code> is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#ATTRIBUTE} and
+         *                                            <code>attributeNames</code> is <code>null</code> or empty or
+         *                                            if <code>type</code> is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#CHARACTER} and
+         *                                            <code>attributeNames</code> <strong>is not</strong>
+         *                                            <code>null</code> or empty.
+         */
+        public WorkflowItemRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(Type.CHARACTER, "http://www.myexperiment.org/workflows.xml", "workflow");
+        }
+
+        /**
+         * Default no-op implementation. Please override with your own logic.
+         *
+         * @param parser
+         * @param index
+         * @param value
+         * @param userObject
+         * @see com.thebuzzmedia.sjxp.rule.IRule#handleParsedAttribute(com.thebuzzmedia.sjxp.XMLParser, int, String, Object)
+         */
+        @Override
+        public void handleParsedAttribute(XMLParser parser, int index, String value, Object userObject) {
+            switch(index){
+                case 0:
+                    break;
+                case 1:
+                    break;
+                case 2:
+                    break;
+                case 3:
+                    break;
+
+            }
+        }
+    }
+
+    /**
+     * parse workflows from myExperiment
+     */
+    public final static class WorkflowRule extends DefaultRule{
+        Workflow workflow;
+        List<Workflow>  wlist;
+        static String uri,version,desc;
+        static String url=uri=version=desc="";
+        static long id = 0;
+
+        public WorkflowRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+            this.workflow = new Workflow();
+            wlist = new ArrayList<>();
+        }
+        //instantiated to parse xml data for a given workflow
+        public WorkflowRule(Type type, String path, int id, String attributenames){
+            super(type,path,attributenames);
+        }
+
+        @Override
+        public void handleParsedAttribute(XMLParser parser, int index, String value, Object userObject) {
+
+            switch(index){
+                case 0:
+                    System.out.println("Workflow Resource: "+value); url = value;
+                    desc = "To view workflow on the web, click "+value;
+                    break;
+                case 1:
+                    System.out.println("Workflow uri: "+value);
+                    uri = value;
+                    break;
+                case 2:
+                    System.out.println("Workflow id: "+value);
+                    id = Integer.parseInt(value);
+                    break;
+                case 3:
+                    System.out.println("Workflow version: "+value);
+                    version = value;
+                    break;
+            }
+        }
+
+        @Override
+        public void handleParsedCharacters(XMLParser parser, String text, Object workflowListObject) {
+            //add the  workflow to the workflow list
+            this.workflow = new Workflow("", desc, id, url);
+            this.workflow.setWorkflow_title(text);
+            this.workflow.setWorkflow_author("");
+            wlist.add(this.workflow);
+            WorkflowLoader.loadedWorkflows.add(this.workflow);
+            System.out.println("static Workflow Count: " + WorkflowLoader.loadedWorkflows.size());
+            ((List<Workflow>)workflowListObject).add(this.workflow);
+            this.workflow = null;
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1b07fee5/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowParser.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowParser.java b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowParser.java
new file mode 100644
index 0000000..f349805
--- /dev/null
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowParser.java
@@ -0,0 +1,35 @@
+package org.apache.taverna.mobile.utils.xmlparsers;
+
+import com.thebuzzmedia.sjxp.XMLParser;
+import com.thebuzzmedia.sjxp.XMLParserException;
+import com.thebuzzmedia.sjxp.rule.IRule;
+
+import org.apache.taverna.mobile.fragments.WorkflowItemFragment;
+import org.apache.taverna.mobile.tavernamobile.Workflow;
+import org.apache.taverna.mobile.utils.WorkflowDataCallback;
+
+import java.util.List;
+
+/**
+ * Workflow end document class for detecting when the complete list of workflows have been read out
+ * Created by Larry Akah on 6/24/15.
+ */
+
+public class WorkflowParser extends XMLParser implements WorkflowDataCallback {
+
+    public WorkflowParser(IRule[] rules) throws IllegalArgumentException, XMLParserException {
+        super(rules);
+    }
+
+    @Override
+    protected void doEndDocument(Object userObject) {
+        WorkflowItemFragment.updateWorkflowUI((List<Workflow>) userObject);
+    }
+
+    @Override
+    public void onWorkflowDataReady(List<Workflow> data) {
+        for(Workflow w:data){
+            System.out.println(w.getId());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1b07fee5/app/src/main/res/layout/workflow_item_layout.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/workflow_item_layout.xml b/app/src/main/res/layout/workflow_item_layout.xml
index 4324bcf..da42247 100644
--- a/app/src/main/res/layout/workflow_item_layout.xml
+++ b/app/src/main/res/layout/workflow_item_layout.xml
@@ -135,7 +135,8 @@ limitations under the License.
                 style="android:buttonBarButtonStyle"
                 android:text="@string/workflow_read"
                 android:background="#33b5e5"
-                android:drawableLeft="@android:drawable/ic_menu_view" />
+                android:drawableLeft="@android:drawable/ic_menu_view"
+                android:layout_marginLeft="3dp" />
             <Button
                 android:id="@+id/button_download_workflow"
                 android:layout_width="wrap_content"
@@ -147,7 +148,8 @@ limitations under the License.
                 android:text="@string/workflow_download"
                 android:drawableLeft="@drawable/download"
                 android:layout_marginLeft="2dp"
-                android:layout_marginRight="2dp" />
+                android:layout_marginRight="2dp"
+                android:visibility="gone" />
             <Button
                 android:id="@+id/button_mark_workflow"
                 android:layout_width="wrap_content"
@@ -157,7 +159,8 @@ limitations under the License.
                 android:background="#33b5e5"
                 android:text="@string/workflow_mark"
                 android:drawableLeft="@android:drawable/btn_star_big_off"
-                style="android:buttonBarButtonStyle"/>
+                style="android:buttonBarButtonStyle"
+                android:layout_marginLeft="3dp" />
             </LinearLayout>
     </LinearLayout>