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 <larrya...@gmail.com> Authored: Tue Jun 16 12:56:37 2015 +0100 Committer: larrytech7 <larrya...@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 = "icep...@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 = "icep...@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 &raquo</string> <string name="loading">Loading details</string> <string name="loadworkflows">Loading Workflows</string> + <string name="fetchrun">Fetching run components </string> </resources>