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/22 12:28:17 UTC

[05/12] incubator-taverna-mobile git commit: Implemented running workflows over Taverna Player. Fixed downloading workflow indicator

Implemented running workflows over Taverna Player. Fixed downloading workflow indicator


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

Branch: refs/heads/master
Commit: 78ee0be76ba3befd6433319ac33e9258ff08a8ce
Parents: 4f660cb
Author: larrytech7 <la...@gmail.com>
Authored: Tue Jun 16 12:56:37 2015 +0100
Committer: larrytech7 <la...@gmail.com>
Committed: Tue Jun 16 12:56:37 2015 +0100

----------------------------------------------------------------------
 .../activities/DashboardMainActivity.java       |   9 +-
 .../WorkflowDownloadReceiver.java               |   4 +-
 .../mobile/fragments/WorkflowItemFragment.java  |  50 ++--
 .../workflowdetails/WorkflowdetailFragment.java | 238 ++++++++++++++++++-
 .../mobile/tavernamobile/TavernaPlayerAPI.java  |   2 +-
 .../mobile/utils/WorkflowDownloadManager.java   |   4 +-
 app/src/main/res/layout/fragment_item_grid.xml  |   7 +-
 app/src/main/res/layout/fragment_item_list.xml  |   2 +-
 app/src/main/res/values/strings.xml             |   1 +
 9 files changed, 267 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/78ee0be7/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java b/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java
index 35a073d..5ff0640 100644
--- a/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java
+++ b/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java
@@ -56,7 +56,7 @@ import org.apache.taverna.mobile.fragments.WorkflowItemFragment;
 import java.io.File;
 
 public class DashboardMainActivity extends ActionBarActivity
-        implements NavigationDrawerFragment.NavigationDrawerCallbacks, WorkflowItemFragment.OnWorkflowSelectedListener, FavoriteFragment.FavoriteItemSelected {
+        implements NavigationDrawerFragment.NavigationDrawerCallbacks, FavoriteFragment.FavoriteItemSelected {
 
     /**
      * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
@@ -252,13 +252,6 @@ public class DashboardMainActivity extends ActionBarActivity
     }
 
     @Override
-    public void onWorkflowSelected(int id) {
-        //send all details to the next Activity which should display the Workflow details in full
-        startActivity(new Intent(this, WorkflowDetailActivity.class));
-
-    }
-
-    @Override
     public void onFavoriteItemSelected(int position) {
         //trigger when a favorite item is selected.
         startActivity(new Intent(this, WorkflowDetailActivity.class));

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/78ee0be7/app/src/main/java/org/apache/taverna/mobile/broadcastreceivers/WorkflowDownloadReceiver.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/broadcastreceivers/WorkflowDownloadReceiver.java b/app/src/main/java/org/apache/taverna/mobile/broadcastreceivers/WorkflowDownloadReceiver.java
index 8bc2468..0657b46 100644
--- a/app/src/main/java/org/apache/taverna/mobile/broadcastreceivers/WorkflowDownloadReceiver.java
+++ b/app/src/main/java/org/apache/taverna/mobile/broadcastreceivers/WorkflowDownloadReceiver.java
@@ -47,11 +47,11 @@ public class WorkflowDownloadReceiver extends BroadcastReceiver {
         query.setFilterById(receivedID);
         Cursor cur = mgr.query(query);
         int index = cur.getColumnIndex(DownloadManager.COLUMN_STATUS);
-        String workflow = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
+//        String workflow = cur.getString(cur.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
 
         if(cur.moveToFirst()) {
             if(cur.getInt(index) == DownloadManager.STATUS_SUCCESSFUL){
-                wdm.sendNotification(workflow+context.getResources().getString(R.string.downloadcomplete));
+                wdm.sendNotification(context.getResources().getString(R.string.downloadcomplete));
             }else{
                 wdm.sendNotification(context.getResources().getString(R.string.downloadfailed));
             }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/78ee0be7/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 5793b33..49acbe5 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
@@ -56,8 +56,6 @@ import java.util.List;
  * Large screen devices (such as tablets) are supported by replacing the ListView
  * with a GridView.
  * <p/>
- * Activities containing this fragment MUST implement the {@link org.apache.taverna.mobile.fragments.WorkflowItemFragment.OnWorkflowSelectedListener}
- * interface.
  */
 public class WorkflowItemFragment extends Fragment implements android.app.LoaderManager.LoaderCallbacks<List<Workflow>>, SwipeRefreshLayout.OnRefreshListener {
 
@@ -72,8 +70,6 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
     private String mParam1;
     private String mParam2;
 
-    private OnWorkflowSelectedListener mListener;
-
     /**
      * The fragment's ListView/GridView.
      */
@@ -133,12 +129,11 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
         mListView = (RecyclerView) view.findViewById(android.R.id.list);
         mListView.setHasFixedSize(true);
         mListView.setLayoutManager(new LinearLayoutManager(getActivity()));
-        getActivity().getLoaderManager().initLoader(0,null,this);
          if(workflowAdapter.getItemCount() == 0){
             setEmptyText("No Workflows available");
-            mListView.swapAdapter(workflowAdapter, false);
+            mListView.swapAdapter(workflowAdapter, true);
         }else {
-            mListView.setAdapter(workflowAdapter);
+            mListView.swapAdapter(workflowAdapter,true);
              mListView.setAnimation(in);
         }
         return view;
@@ -148,13 +143,26 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
     public void onAttach(Activity activity) {
         super.onAttach(activity);
         try {
-            mListener = (OnWorkflowSelectedListener) activity;
+
             ((DashboardMainActivity) activity).onSectionAttached(1);
         } catch (ClassCastException e) {
             throw new ClassCastException(activity.toString()
                     + " must implement OnFragmentInteractionListener");
         }
     }
+
+    /**
+     * 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();
+        getActivity().getLoaderManager().initLoader(0,null,this);
+    }
+
     /**
      * Initialize the contents of the Activity's standard options menu.  You
      * should place your menu items in to <var>menu</var>.  For this method
@@ -209,7 +217,6 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
     @Override
     public void onDetach() {
         super.onDetach();
-        mListener = null;
     }
 
     /**
@@ -241,37 +248,20 @@ public class WorkflowItemFragment extends Fragment implements android.app.Loader
     @Override
     public void onLoadFinished(android.content.Loader<List<Workflow>> loader, List<Workflow> workflows) {
         swipeRefreshLayout.setRefreshing(false);
-        loader.stopLoading();
         workflowAdapter = new WorkflowAdapter(getActivity(), workflows);
-        if(workflows.size() > 0)
-            mListView.swapAdapter(workflowAdapter, true);
+        mListView.swapAdapter(workflowAdapter, true);
 
     }
 
     @Override
     public void onLoaderReset(android.content.Loader<List<Workflow>> listLoader) {
-        listLoader.reset();
-        mListView.swapAdapter(null, false);
+        //listLoader.reset();
+//        mListView.swapAdapter(null, true);
     }
 
     @Override
     public void onRefresh() {
-        getActivity().getLoaderManager().initLoader(0,null,this);
-    }
-
-    /**
-     * This interface must be implemented by activities that contain this
-     * fragment to allow an interaction in this fragment to be communicated
-     * to the activity and potentially other fragments contained in that
-     * activity.
-     * <p/>
-     * See the Android Training lesson <a href=
-     * "http://developer.android.com/training/basics/fragments/communicating.html"
-     * >Communicating with Other Fragments</a> for more information.
-     */
-    public interface OnWorkflowSelectedListener {
-        // TODO: Update argument type and name
-        public void onWorkflowSelected(int workflowPosition);
+        getActivity().getLoaderManager().restartLoader(0, null, this);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/78ee0be7/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragment.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragment.java b/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragment.java
index 2a173c3..656ea90 100644
--- a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragment.java
+++ b/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragment.java
@@ -25,36 +25,54 @@ package org.apache.taverna.mobile.fragments.workflowdetails;
  */
 
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.app.DownloadManager;
 import android.app.LoaderManager;
 import android.app.ProgressDialog;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.Loader;
 import android.database.Cursor;
 import android.media.Image;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Environment;
 import android.preference.PreferenceManager;
 import android.support.annotation.Nullable;
 import android.support.v4.app.Fragment;
+import android.util.Base64;
+import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
+import android.widget.EditText;
 import android.widget.ImageView;
+import android.widget.LinearLayout;
 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.tavernamobile.Workflow;
 import org.apache.taverna.mobile.utils.DetailsLoader;
 import org.apache.taverna.mobile.utils.WorkflowDownloadManager;
+import org.json.JSONArray;
+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;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
 import java.util.prefs.PreferenceChangeEvent;
 
 /**
@@ -69,6 +87,9 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
     private DownloadManager downloadManager;
     View rootView;
     private ProgressDialog progressDialog;
+    public AlertDialog runDialog;
+    public AlertDialog.Builder alertDialogBuilder;
+    private String download_url;
     public static long WORKFLO_ID;
 
     /**
@@ -89,13 +110,15 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
-
+        long workflowid = getActivity().getIntent().getLongExtra("workflowid", 0);
         rootView = inflater.inflate(R.layout.fragment_workflow_detail, container, false);
         progressDialog = new ProgressDialog(getActivity());
         progressDialog.setMessage(getActivity().getResources().getString(R.string.loading));
         progressDialog.setCancelable(true);
-        WORKFLO_ID = getActivity().getIntent().getLongExtra("workflowid", 0);
+        WORKFLO_ID = workflowid;
 
+        Button createRun = (Button) rootView.findViewById(R.id.run_wk);
+        createRun.setOnClickListener(this);
         Button download = (Button) rootView.findViewById(R.id.download_wk);
         download.setOnClickListener(this);
         downloadManager = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
@@ -118,6 +141,7 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
         switch(view.getId()){
             case R.id.run_wk:
                 //TODO implement functionality to issue a run request to the Taverna PLAYER to run the current workflow
+                new WorkflowRunTask(getActivity()).execute(""+WORKFLO_ID);
                 break;
             case R.id.download_wk:
                 // start the android Download manager to start downloading a remote workflow file
@@ -125,7 +149,7 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
                 try {
                     dmgr.downloadWorkflow(new File(PreferenceManager.getDefaultSharedPreferences(getActivity()).getString(
                                     DashboardMainActivity.APP_DIRECTORY_NAME, "/")),
-                            "");
+                            download_url);
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
@@ -162,7 +186,7 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
     @Override
     public void onLoadFinished(Loader<Workflow> workflowLoader, Workflow workflow) {
         TextView author = (TextView) rootView.findViewById(R.id.wkf_author);
-            author.append("->"+workflow.getWorkflow_author());
+            author.append("->" + workflow.getWorkflow_author());
         TextView title = (TextView) rootView.findViewById(R.id.wtitle);
             title.setText(workflow.getWorkflow_title());
         TextView desc = (TextView) rootView.findViewById(R.id.wdescription);
@@ -173,6 +197,7 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
             updated.append(workflow.getWorkflow_datemodified());
     //    ImageView preview = (ImageView) rootView.findViewById(R.id.wkf_image);
           //  preview.setImageURI(Uri.parse(workflow.getWorkflow_remote_url()));
+        download_url =workflow.getWorkflow_remote_url();
       //  progressDialog.cancel();
         progressDialog.dismiss();
     }
@@ -181,4 +206,209 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
     public void onLoaderReset(Loader<Workflow> workflowLoader) {
         workflowLoader.reset();
     }
+
+    //create and return a new TextView
+    public TextView createTextView(Context mcontetx, String placeholder){
+        TextView tv = new TextView(mcontetx);
+        tv.setText(placeholder);
+        tv.setMinLines(2);
+
+        return tv;
+    }
+
+    //create and return a new EdiText view
+    public EditText createEditText(Context ctx, int i){
+        EditText edt;
+        edt = new EditText(ctx);
+        edt.setHint("Enter Value");
+        edt.setMinLines(2);
+        edt.setId(i);
+        return edt;
+    }
+//fetch and compute the framework on which the run inputs are to be built and entered
+    private class WorkflowRunTask extends AsyncTask<String, Void, String>{
+
+        private Context context;
+
+        private WorkflowRunTask(Context context) {
+            this.context = context;
+        }
+
+        @Override
+        protected void onPreExecute() {
+            super.onPreExecute();
+            progressDialog.setMessage(this.context.getResources().getString(R.string.fetchrun));
+            progressDialog.show();
+        }
+
+        @Override
+        protected String doInBackground(String... params) {
+            StringBuffer sb = new StringBuffer();
+            try {
+
+                URL workflowurl = new URL(TavernaPlayerAPI.PLAYER_RUN_FRAMEWORK_URL+params[0]);
+                HttpURLConnection connection = (HttpURLConnection) workflowurl.openConnection();
+                String userpass = "icep603@gmail.com" + ":" + "creationfox";
+                String basicAuth = "Basic " + Base64.encodeToString(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));
+
+                String jsonData = "";
+                while ((jsonData = br.readLine()) != null) {
+                    sb.append(jsonData);
+                }
+                dis.close();
+                br.close();
+                return sb.toString();
+
+            }catch (IOException ex){
+                ex.printStackTrace();
+            }
+            return sb.toString();
+        }
+
+        @Override
+        protected void onPostExecute(String result) {
+            //show the skeleton to the user in a dialog box
+            final Context ctx = this.context;
+            final LinearLayout ll = new LinearLayout(ctx);
+            ll.setOrientation(LinearLayout.VERTICAL);
+
+            try {
+                final JSONObject json = new JSONObject(result); //main server response json
+                JSONObject mjson = json.getJSONObject("run"); //main framework response json
+                String name = mjson.getString("name"); //a name that can be configured or edited for the new run to be created
+                ll.addView(createTextView(ctx, name));
+                final JSONArray attr_array = mjson.getJSONArray("inputs_attributes");
+                for(int i=0; i<attr_array.length(); i++){
+                    JSONObject obj = attr_array.getJSONObject(i);
+                    ll.addView(createTextView(ctx, obj.getString("name")));
+                    ll.addView(createEditText(ctx, i));
+                }
+
+                alertDialogBuilder = new AlertDialog.Builder(ctx);
+                alertDialogBuilder.setView(ll);
+ //               alertDialogBuilder.setMessage(result);
+                alertDialogBuilder.setIcon(ctx.getResources().getDrawable(R.mipmap.ic_launcher));
+                alertDialogBuilder.setTitle("New Run");
+                alertDialogBuilder.setPositiveButton("Execute", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialogInterface, int i) {
+                        int n = attr_array.length();
+                        for(int j=0; j<n; j++){
+                            try {
+                                EditText inputText = (EditText) ll.findViewById(j);
+                                String value = inputText.getText().toString();//get input entry entered by the user
+                                JSONObject jojb = attr_array.getJSONObject(j); //get the input attributes provided by the skeleton
+                                jojb.put("value", value); //replace value field in object with the entry provided by the user
+                                attr_array.put(j, jojb); //replace the input entry with the new name/input json object
+
+                            } catch (JSONException e) {
+                                e.printStackTrace();
+                            }
+
+                        }
+                        try {
+                            json.put("inputs_attributes", attr_array);
+                            Log.i("RUN FRAMEWORK", json.toString(2));
+                            new RunTask(ctx).execute(json.toString());
+                        } catch (JSONException e) {
+                            e.printStackTrace();
+                        }
+
+                    }
+                });
+                alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+
+                    @Override
+                    public void onClick(DialogInterface dialogInterface, int i) {
+                        dialogInterface.dismiss();
+                    }
+                });
+
+                runDialog = alertDialogBuilder.create();
+
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+            progressDialog.dismiss();
+
+            runDialog.show();
+        }
+    }
+    //Send request for the execution of a run on the server through the player
+    private class RunTask extends AsyncTask<String, Void, String>{
+
+        private Context context;
+
+        private RunTask(Context ctx) {
+            this.context = ctx;
+        }
+
+        @Override
+        protected void onPreExecute() {
+            super.onPreExecute();
+        }
+
+        @Override
+        protected String doInBackground(String... params) {
+            StringBuffer sb = new StringBuffer();
+            try {
+
+                URL workflowurl = new URL(TavernaPlayerAPI.PLAYER_RUN_URL);
+                HttpURLConnection connection = (HttpURLConnection) workflowurl.openConnection();
+                String userpass = "icep603@gmail.com" + ":" + "creationfox";
+                String basicAuth = "Basic " + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT);
+
+                connection.setRequestProperty("Authorization", basicAuth);
+                connection.setRequestProperty("Accept", "application/json");
+                connection.setRequestProperty("Content-Type", "application/json");
+                connection.setRequestMethod("POST");
+                // connection.setDoInput(true);
+                //  connection.setDoOutput(true);
+                connection.connect(); //send request
+
+                DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
+                dos.writeBytes(params[0]);//write post data which is a formatted json data representing inputs to a run
+                //dos.writeUTF("");
+                dos.flush();
+                dos.close();
+
+                InputStream dis = connection.getInputStream();
+                BufferedReader br = new BufferedReader(new InputStreamReader(dis));
+
+                String jsonData = "";
+                while ((jsonData = br.readLine()) != null) {
+                    sb.append(jsonData);
+                }
+                dis.close();
+                br.close();
+                Log.i("RESPONSE Code", "" + connection.getResponseCode());
+                Log.i("RESPONSE Messsage", "" + connection.getResponseMessage());
+                Log.i("Authorization ", "" + connection.getRequestProperty("Authorization"));
+
+                return sb.toString();
+
+            }catch (IOException ex){
+                ex.printStackTrace();
+            }
+            return sb.toString();
+        }
+
+        @Override
+        protected void onPostExecute(String s) {
+            Log.i("RUN OutPut", s);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/78ee0be7/app/src/main/java/org/apache/taverna/mobile/tavernamobile/TavernaPlayerAPI.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/tavernamobile/TavernaPlayerAPI.java b/app/src/main/java/org/apache/taverna/mobile/tavernamobile/TavernaPlayerAPI.java
index d3e1e40..85874a8 100644
--- a/app/src/main/java/org/apache/taverna/mobile/tavernamobile/TavernaPlayerAPI.java
+++ b/app/src/main/java/org/apache/taverna/mobile/tavernamobile/TavernaPlayerAPI.java
@@ -11,7 +11,7 @@ public class TavernaPlayerAPI {
     public static final String SERVER_BASE_URL = "http://heater.cs.man.ac.uk:8090/taverna-2.5.4/";
     public static final String PLAYER_WORKFLOW_URL = PLAYER_BASE_URL+"workflows/";
     public static final String PLAYER_RUN_URL = PLAYER_BASE_URL+"runs/";
-    public static final String PLAYER_RUN_IMAGE_URL = PLAYER_RUN_URL+"new?workflow_id="; //returns a json 'framework' used for creating runs for the given workflow
+    public static final String PLAYER_RUN_FRAMEWORK_URL = PLAYER_RUN_URL+"new?workflow_id="; //returns a json 'framework' used for creating runs for the given workflow
 
 
     public TavernaPlayerAPI() {

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/78ee0be7/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowDownloadManager.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowDownloadManager.java b/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowDownloadManager.java
index ea32477..8364e42 100644
--- a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowDownloadManager.java
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowDownloadManager.java
@@ -85,9 +85,9 @@ public class WorkflowDownloadManager {
             request.setDestinationUri(destinationurl);
             request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED |
                     DownloadManager.Request.VISIBILITY_VISIBLE);
-            request.allowScanningByMediaScanner();
 
-            long id = downloadManager.enqueue(request);
+            long id = this.downloadManager.enqueue(request);
+
             if(id != 0)
                 sendNotification(this.context.getResources().getString(R.string.downloadprogress));
          /*   int status = cur.getInt(cur.getColumnIndex(DownloadManager.COLUMN_STATUS));

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/78ee0be7/app/src/main/res/layout/fragment_item_grid.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/fragment_item_grid.xml b/app/src/main/res/layout/fragment_item_grid.xml
index 82d8c0d..31600d2 100644
--- a/app/src/main/res/layout/fragment_item_grid.xml
+++ b/app/src/main/res/layout/fragment_item_grid.xml
@@ -22,7 +22,10 @@ limitations under the License.
    <!-- <GridView android:id="@+id/gridlist"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:numColumns="2">-->
+        android:numColumns="2">-->   <android.support.v4.widget.SwipeRefreshLayout
+    android:id="@+id/refresh"
+    android:layout_height="match_parent"
+    android:layout_width="match_parent">
         <android.support.v7.widget.RecyclerView
             xmlns:recycler_view="http://schemas.android.com/apk/res-auto"
             android:id="@android:id/list"
@@ -32,7 +35,7 @@ limitations under the License.
             android:background="@color/button_material_light"
             ></android.support.v7.widget.RecyclerView>
        <!-- </GridView>-->
-
+</android.support.v4.widget.SwipeRefreshLayout>
     <TextView android:id="@android:id/empty"
         android:layout_width="match_parent"
         android:layout_height="match_parent"

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/78ee0be7/app/src/main/res/layout/fragment_item_list.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/fragment_item_list.xml b/app/src/main/res/layout/fragment_item_list.xml
index 9852dfb..19aa79e 100644
--- a/app/src/main/res/layout/fragment_item_list.xml
+++ b/app/src/main/res/layout/fragment_item_list.xml
@@ -36,7 +36,7 @@ limitations under the License.
         android:id="@android:id/list"
         android:theme="@style/Theme.AppCompat.Light"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="match_parent"
         android:background="@color/button_material_light"
         >
 

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/78ee0be7/app/src/main/res/values/strings.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e7b2221..e9ac67c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -79,5 +79,6 @@ limitations under the License.
     <string name="seemore"> See more &amp;raquo</string>
     <string name="loading">Loading details</string>
     <string name="loadworkflows">Loading Workflows</string>
+    <string name="fetchrun">Fetching run components </string>
 
 </resources>