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:18 UTC

[06/12] incubator-taverna-mobile git commit: Implemented app preferences to configure Taverna player and server portals

Implemented app preferences to configure Taverna player and server portals


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

Branch: refs/heads/master
Commit: 1fcf1fe647dc38b8c70e370111c65c754af933e9
Parents: 78ee0be
Author: larrytech7 <la...@gmail.com>
Authored: Tue Jun 16 16:43:37 2015 +0100
Committer: larrytech7 <la...@gmail.com>
Committed: Tue Jun 16 16:43:37 2015 +0100

----------------------------------------------------------------------
 app/src/main/AndroidManifest.xml                |  11 +-
 app/src/main/ic_dashboard_home-web.png          | Bin 0 -> 2121 bytes
 .../activities/DashboardMainActivity.java       |  11 +-
 .../mobile/activities/SettingsActivity.java     | 244 +++++++++++++++++++
 .../mobile/adapters/SliderMenuAdapter.java      |  18 +-
 .../fragments/NavigationDrawerFragment.java     |   1 +
 .../workflowdetails/WorkflowAboutFragment.java  |   1 -
 .../workflowdetails/WorkflowdetailFragment.java |   7 +-
 .../mobile/tavernamobile/TavernaPlayerAPI.java  |  42 +++-
 .../taverna/mobile/utils/DetailsLoader.java     |  10 +-
 .../taverna/mobile/utils/WorkflowRunHelper.java |  30 ---
 .../main/res/mipmap-hdpi/ic_dashboard_home.png  | Bin 0 -> 224 bytes
 .../main/res/mipmap-mdpi/ic_dashboard_home.png  | Bin 0 -> 273 bytes
 .../main/res/mipmap-xhdpi/ic_dashboard_home.png | Bin 0 -> 371 bytes
 .../res/mipmap-xxhdpi/ic_dashboard_home.png     | Bin 0 -> 566 bytes
 .../res/mipmap-xxxhdpi/ic_dashboard_home.png    | Bin 0 -> 659 bytes
 .../res/values/strings_activity_settings.xml    |  22 ++
 app/src/main/res/xml/pref_general.xml           |  33 +++
 app/src/main/res/xml/pref_headers.xml           |   9 +
 19 files changed, 380 insertions(+), 59 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/AndroidManifest.xml
----------------------------------------------------------------------
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7db3bdb..5d1c634 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -67,9 +67,18 @@ limitations under the License.
             android:enabled="true"
             android:exported="true" >
             <intent-filter>
-                <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
+                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
             </intent-filter>
         </receiver>
+
+        <activity
+            android:name=".activities.SettingsActivity"
+            android:label="@string/title_activity_settings"
+            android:parentActivityName="org.apache.taverna.mobile.activities.DashboardMainActivity" >
+            <meta-data
+                android:name="android.support.PARENT_ACTIVITY"
+                android:value="org.apache.taverna.mobile.activities.DashboardMainActivity" />
+        </activity>
     </application>
 
 </manifest>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/ic_dashboard_home-web.png
----------------------------------------------------------------------
diff --git a/app/src/main/ic_dashboard_home-web.png b/app/src/main/ic_dashboard_home-web.png
new file mode 100644
index 0000000..5810950
Binary files /dev/null and b/app/src/main/ic_dashboard_home-web.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/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 5ff0640..7624082 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
@@ -110,7 +110,7 @@ public class DashboardMainActivity extends ActionBarActivity
         // update the main content by replacing fragments
         FragmentManager fragmentManager = getSupportFragmentManager();
         switch(position+1){
-            case 1:
+            case 1://return home
                 fragmentManager.beginTransaction()
                         .replace(R.id.container, WorkflowItemFragment.newInstance("param1", "param2"))
                         .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
@@ -145,7 +145,11 @@ public class DashboardMainActivity extends ActionBarActivity
                         .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                         .commit();
                 break;
-            case 5: //logout user
+            case 5://open settings/preference activity
+                startActivity(new Intent(this, SettingsActivity.class));
+                overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);
+                break;
+            case 6: //logout user
                 this.finish();
                 break;
             default:
@@ -178,6 +182,9 @@ public class DashboardMainActivity extends ActionBarActivity
                 mTitle = getString(R.string.title_about);
                 break;
             case 5:
+                mTitle = getString(R.string.title_activity_settings);
+                break;
+            case 6:
                 mTitle = getString(R.string.title_exit);
                 break;
         }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/java/org/apache/taverna/mobile/activities/SettingsActivity.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/activities/SettingsActivity.java b/app/src/main/java/org/apache/taverna/mobile/activities/SettingsActivity.java
new file mode 100644
index 0000000..4a5048d
--- /dev/null
+++ b/app/src/main/java/org/apache/taverna/mobile/activities/SettingsActivity.java
@@ -0,0 +1,244 @@
+package org.apache.taverna.mobile.activities;
+/**
+ * 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.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.Bundle;
+import android.preference.ListPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceManager;
+import android.support.annotation.NonNull;
+import android.support.v4.app.NavUtils;
+import android.view.MenuItem;
+
+import org.apache.taverna.mobile.R;
+
+import java.util.List;
+
+/**
+ * A {@link PreferenceActivity} that presents a set of application settings. On
+ * handset devices, settings are presented as a single list. On tablets,
+ * settings are split by category, with category headers shown to the left of
+ * the list of settings.
+ * <p/>
+ * See <a href="http://developer.android.com/design/patterns/settings.html">
+ * Android Design: Settings</a> for design guidelines and the <a
+ * href="http://developer.android.com/guide/topics/ui/settings.html">Settings
+ * API Guide</a> for more information on developing a Settings UI.
+ */
+public class SettingsActivity extends PreferenceActivity {
+    /**
+     * Determines whether to always show the simplified settings UI, where
+     * settings are presented in a single list. When false, settings are shown
+     * as a master/detail two-pane view on tablets. When true, a single pane is
+     * shown on tablets.
+     */
+    private static final boolean ALWAYS_SIMPLE_PREFS = false;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+       // setupActionBar();
+    }
+
+    /**
+     * Set up the {@link android.app.ActionBar}, if the API is available.
+     */
+  /*  @NonNull
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    private void setupActionBar() {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
+            // Show the Up button in the action bar.
+            getActionBar().setDisplayHomeAsUpEnabled(true);
+        }
+    }
+*/
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        int id = item.getItemId();
+        if (id == android.R.id.home) {
+            // This ID represents the Home or Up button. In the case of this
+            // activity, the Up button is shown. Use NavUtils to allow users
+            // to navigate up one level in the application structure. For
+            // more details, see the Navigation pattern on Android Design:
+            //
+            // http://developer.android.com/design/patterns/navigation.html#up-vs-back
+            //
+            // TODO: If Settings has multiple levels, Up should navigate up
+            // that hierarchy.
+            NavUtils.navigateUpFromSameTask(this);
+            return true;
+        }
+        return super.onOptionsItemSelected(item);
+    }
+
+    @Override
+    protected void onPostCreate(Bundle savedInstanceState) {
+        super.onPostCreate(savedInstanceState);
+
+        setupSimplePreferencesScreen();
+    }
+
+    /**
+     * Shows the simplified settings UI if the device configuration if the
+     * device configuration dictates that a simplified, single-pane UI should be
+     * shown.
+     */
+    private void setupSimplePreferencesScreen() {
+        if (!isSimplePreferences(this)) {
+            return;
+        }
+
+        // In the simplified UI, fragments are not used at all and we instead
+        // use the older PreferenceActivity APIs.
+
+        // Add 'general' preferences.
+        addPreferencesFromResource(R.xml.pref_general);
+
+        // Bind the summaries of EditText/List/Dialog/Ringtone preferences to
+        // their values. When their values change, their summaries are updated
+        // to reflect the new value, per the Android Design guidelines.
+        bindPreferenceSummaryToValue(findPreference("pref_server_url"));
+        bindPreferenceSummaryToValue(findPreference("pref_player_url"));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean onIsMultiPane() {
+        return isXLargeTablet(this) && !isSimplePreferences(this);
+    }
+
+    /**
+     * Helper method to determine if the device has an extra-large screen. For
+     * example, 10" tablets are extra-large.
+     */
+    private static boolean isXLargeTablet(Context context) {
+        return (context.getResources().getConfiguration().screenLayout
+                & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
+    }
+
+    /**
+     * Determines whether the simplified settings UI should be shown. This is
+     * true if this is forced via {@link #ALWAYS_SIMPLE_PREFS}, or the device
+     * doesn't have newer APIs like {@link PreferenceFragment}, or the device
+     * doesn't have an extra-large screen. In these cases, a single-pane
+     * "simplified" settings UI should be shown.
+     */
+    private static boolean isSimplePreferences(Context context) {
+        return ALWAYS_SIMPLE_PREFS
+                || Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB
+                || !isXLargeTablet(context);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    public void onBuildHeaders(List<Header> target) {
+        if (!isSimplePreferences(this)) {
+            loadHeadersFromResource(R.xml.pref_headers, target);
+        }
+    }
+
+    /**
+     * A preference value change listener that updates the preference's summary
+     * to reflect its new value.
+     */
+    private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
+        @Override
+        public boolean onPreferenceChange(Preference preference, Object value) {
+            String stringValue = value.toString();
+
+            if (preference instanceof ListPreference) {
+                // For list preferences, look up the correct display value in
+                // the preference's 'entries' list.
+                ListPreference listPreference = (ListPreference) preference;
+                int index = listPreference.findIndexOfValue(stringValue);
+
+                // Set the summary to reflect the new value.
+                preference.setSummary(
+                        index >= 0
+                                ? listPreference.getEntries()[index]
+                                : null);
+
+            }  else {
+                // For all other preferences, set the summary to the value's
+                // simple string representation.
+                preference.setSummary(stringValue);
+            }
+            return true;
+        }
+    };
+
+    /**
+     * Binds a preference's summary to its value. More specifically, when the
+     * preference's value is changed, its summary (line of text below the
+     * preference title) is updated to reflect the value. The summary is also
+     * immediately updated upon calling this method. The exact display format is
+     * dependent on the type of preference.
+     *
+     * @see #sBindPreferenceSummaryToValueListener
+     */
+    private static void bindPreferenceSummaryToValue(Preference preference) {
+        // Set the listener to watch for value changes.
+        preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
+
+        // Trigger the listener immediately with the preference's
+        // current value.
+        sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
+                PreferenceManager
+                        .getDefaultSharedPreferences(preference.getContext())
+                        .getString(preference.getKey(), ""));
+    }
+
+    /**
+     * This fragment shows general preferences only. It is used when the
+     * activity is showing a two-pane settings UI.
+     */
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    public static class GeneralPreferenceFragment extends PreferenceFragment {
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            addPreferencesFromResource(R.xml.pref_general);
+
+            // Bind the summaries of EditText/List/Dialog/Ringtone preferences
+            // to their values. When their values change, their summaries are
+            // updated to reflect the new value, per the Android Design
+            // guidelines.
+            bindPreferenceSummaryToValue(findPreference("pref_server_url"));
+            bindPreferenceSummaryToValue(findPreference("pref_player_url"));
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/java/org/apache/taverna/mobile/adapters/SliderMenuAdapter.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/adapters/SliderMenuAdapter.java b/app/src/main/java/org/apache/taverna/mobile/adapters/SliderMenuAdapter.java
index 9a68189..9b702a1 100644
--- a/app/src/main/java/org/apache/taverna/mobile/adapters/SliderMenuAdapter.java
+++ b/app/src/main/java/org/apache/taverna/mobile/adapters/SliderMenuAdapter.java
@@ -68,22 +68,12 @@ public class SliderMenuAdapter extends BaseAdapter{
     public View getView(int i, View view, ViewGroup viewGroup) {
 
         View menuitemview = LayoutInflater.from(context).inflate(R.layout.menu_item_layout, viewGroup, false);
-       /* if(view != null ) {
-            ViewHolder vh = (ViewHolder) view.getTag();
-            if (vh == null) {
-                ViewHolder v = new ViewHolder(menuitemview);
-                view.setTag(v);
-                return getView(i,view,viewGroup);
-            } else {
-                vh.menuitem.setText(dataItems.get(i));
-                vh.menuicon.setImageResource(R.drawable.gear_icon);
-            }
-        }*/
+
         ImageView menuicon = (ImageView) menuitemview.findViewById(R.id.menuIcon);
         TextView menuitem = (TextView) menuitemview.findViewById(R.id.menuItemText);
         switch(i +1){
             case 1:
-                menuicon.setImageResource(R.mipmap.ic_workflows);
+                menuicon.setImageResource(R.mipmap.ic_dashboard_home);
                 menuitem.setText(dataItems.get(i));
                 break;
             case 2:
@@ -99,6 +89,10 @@ public class SliderMenuAdapter extends BaseAdapter{
                 menuitem.setText(dataItems.get(i));
                 break;
             case 5:
+                menuicon.setImageResource(R.mipmap.ic_workflows);
+                menuitem.setText(dataItems.get(i));
+                break;
+            case 6:
                 menuicon.setImageResource(R.mipmap.ic_logout);
                 menuitem.setText(dataItems.get(i));
                 break;

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/java/org/apache/taverna/mobile/fragments/NavigationDrawerFragment.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/fragments/NavigationDrawerFragment.java b/app/src/main/java/org/apache/taverna/mobile/fragments/NavigationDrawerFragment.java
index e936d1e..f3aaed0 100644
--- a/app/src/main/java/org/apache/taverna/mobile/fragments/NavigationDrawerFragment.java
+++ b/app/src/main/java/org/apache/taverna/mobile/fragments/NavigationDrawerFragment.java
@@ -138,6 +138,7 @@ public class NavigationDrawerFragment extends Fragment {
         mlist.add(getString(R.string.title_openworkflow));
         mlist.add(getString(R.string.title_usage));
         mlist.add(getString(R.string.title_about));
+        mlist.add(getString(R.string.title_activity_settings));
         mlist.add(getString(R.string.title_exit));
 
         mDrawerListView.setAdapter(new SliderMenuAdapter(getActivity(), mlist));

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowAboutFragment.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowAboutFragment.java b/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowAboutFragment.java
index e54cdaf..c8f1e64 100644
--- a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowAboutFragment.java
+++ b/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowAboutFragment.java
@@ -84,5 +84,4 @@ public class WorkflowAboutFragment extends Fragment {
         return inflater.inflate(R.layout.fragment_workflow_about, container, false);
     }
 
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/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 656ea90..3068791 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
@@ -246,7 +246,7 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
             StringBuffer sb = new StringBuffer();
             try {
 
-                URL workflowurl = new URL(TavernaPlayerAPI.PLAYER_RUN_FRAMEWORK_URL+params[0]);
+                URL workflowurl = new URL(new TavernaPlayerAPI(this.context).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);
@@ -359,6 +359,8 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
         @Override
         protected void onPreExecute() {
             super.onPreExecute();
+            progressDialog.setMessage("Creating new run for the workflow");
+            progressDialog.show();
         }
 
         @Override
@@ -366,7 +368,7 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
             StringBuffer sb = new StringBuffer();
             try {
 
-                URL workflowurl = new URL(TavernaPlayerAPI.PLAYER_RUN_URL);
+                URL workflowurl = new URL(new TavernaPlayerAPI(this.context).PLAYER_RUN_URL);
                 HttpURLConnection connection = (HttpURLConnection) workflowurl.openConnection();
                 String userpass = "icep603@gmail.com" + ":" + "creationfox";
                 String basicAuth = "Basic " + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT);
@@ -409,6 +411,7 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
         @Override
         protected void onPostExecute(String s) {
             Log.i("RUN OutPut", s);
+            progressDialog.dismiss();
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/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 85874a8..9697fb8 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
@@ -1,5 +1,8 @@
 package org.apache.taverna.mobile.tavernamobile;
 
+import android.content.Context;
+import android.preference.PreferenceManager;
+
 import java.net.PasswordAuthentication;
 
 /**
@@ -7,14 +10,41 @@ import java.net.PasswordAuthentication;
  */
 public class TavernaPlayerAPI {
 
-    public static final String PLAYER_BASE_URL = "http://heater.cs.man.ac.uk:3000/";
-    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_FRAMEWORK_URL = PLAYER_RUN_URL+"new?workflow_id="; //returns a json 'framework' used for creating runs for the given workflow
+    public static String PLAYER_BASE_URL = "http://heater.cs.man.ac.uk:3000/";
+    public static String SERVER_BASE_URL = "http://heater.cs.man.ac.uk:8090/taverna-2.5.4/";
+    public static String PLAYER_WORKFLOW_URL = PLAYER_BASE_URL+"workflows/";
+    public static String PLAYER_RUN_URL = PLAYER_BASE_URL+"runs/";
+    public static 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(Context context) {
+        String server = PreferenceManager.getDefaultSharedPreferences(context).getString("pref_server_url","/");
+        String player = PreferenceManager.getDefaultSharedPreferences(context).getString("pref_player_url","/");
+        PLAYER_BASE_URL = player;
+        SERVER_BASE_URL = server;
+        PLAYER_WORKFLOW_URL = PLAYER_BASE_URL+"workflows/";
+        PLAYER_RUN_URL = PLAYER_BASE_URL+"runs/";
+        PLAYER_RUN_FRAMEWORK_URL = PLAYER_RUN_URL+"new?workflow_id=";
+    }
+
+    public static String getPLAYER_BASE_URL() {
+        return PLAYER_BASE_URL;
+    }
 
+    public static String getSERVER_BASE_URL() {
+        return SERVER_BASE_URL;
+    }
+
+    public static String getPLAYER_WORKFLOW_URL() {
+        return PLAYER_WORKFLOW_URL;
+    }
+
+    public static String getPLAYER_RUN_URL() {
+        return PLAYER_RUN_URL;
+    }
 
-    public TavernaPlayerAPI() {
+    public static String getPLAYER_RUN_FRAMEWORK_URL() {
+        return PLAYER_RUN_FRAMEWORK_URL;
     }
 
     public static class Authenticator extends java.net.Authenticator{

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/java/org/apache/taverna/mobile/utils/DetailsLoader.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/DetailsLoader.java b/app/src/main/java/org/apache/taverna/mobile/utils/DetailsLoader.java
index 08d69bf..f0998fc 100644
--- a/app/src/main/java/org/apache/taverna/mobile/utils/DetailsLoader.java
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/DetailsLoader.java
@@ -75,19 +75,19 @@ public class DetailsLoader extends AsyncTaskLoader<Workflow> {
 
             switch (this.lt){
                 case TYPE_WORKFLOW_DETAIL:
-                    workflowurl = new URL(TavernaPlayerAPI.PLAYER_WORKFLOW_URL+this.wid);
+                    workflowurl = new URL(new TavernaPlayerAPI(this.context).PLAYER_WORKFLOW_URL+this.wid);
                     break;
                 case TYPE_RUN_HISTORY:
-                    workflowurl = new URL(TavernaPlayerAPI.PLAYER_RUN_URL);
+                    workflowurl = new URL(new TavernaPlayerAPI(this.context).PLAYER_RUN_URL);
                     break;
                 case TYPE_POLICY:
-                    workflowurl = new URL(TavernaPlayerAPI.SERVER_BASE_URL);
+                    workflowurl = new URL(new TavernaPlayerAPI(this.context).SERVER_BASE_URL);
                     break;
                 case TYPE_ABOUT_WORKFLOW:
-                    workflowurl = new URL(TavernaPlayerAPI.PLAYER_WORKFLOW_URL);
+                    workflowurl = new URL(new TavernaPlayerAPI(this.context).PLAYER_WORKFLOW_URL);
                     break;
                 default:
-                    workflowurl = new URL(TavernaPlayerAPI.PLAYER_WORKFLOW_URL);
+                    workflowurl = new URL(new TavernaPlayerAPI(this.context).PLAYER_WORKFLOW_URL);
                     break;
             }
             HttpURLConnection connection = (HttpURLConnection) workflowurl.openConnection();

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowRunHelper.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowRunHelper.java b/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowRunHelper.java
deleted file mode 100644
index f450bca..0000000
--- a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowRunHelper.java
+++ /dev/null
@@ -1,30 +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.
- */
-/**
- * Created by root on 6/11/15.
- */
-public class WorkflowRunHelper {
-}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/res/mipmap-hdpi/ic_dashboard_home.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/mipmap-hdpi/ic_dashboard_home.png b/app/src/main/res/mipmap-hdpi/ic_dashboard_home.png
new file mode 100644
index 0000000..841a7b4
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_dashboard_home.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/res/mipmap-mdpi/ic_dashboard_home.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/mipmap-mdpi/ic_dashboard_home.png b/app/src/main/res/mipmap-mdpi/ic_dashboard_home.png
new file mode 100644
index 0000000..373ae1f
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_dashboard_home.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/res/mipmap-xhdpi/ic_dashboard_home.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/mipmap-xhdpi/ic_dashboard_home.png b/app/src/main/res/mipmap-xhdpi/ic_dashboard_home.png
new file mode 100644
index 0000000..d41aa64
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_dashboard_home.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/res/mipmap-xxhdpi/ic_dashboard_home.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_dashboard_home.png b/app/src/main/res/mipmap-xxhdpi/ic_dashboard_home.png
new file mode 100644
index 0000000..f197418
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_dashboard_home.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/res/mipmap-xxxhdpi/ic_dashboard_home.png
----------------------------------------------------------------------
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_dashboard_home.png b/app/src/main/res/mipmap-xxxhdpi/ic_dashboard_home.png
new file mode 100644
index 0000000..08e4ec6
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_dashboard_home.png differ

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/res/values/strings_activity_settings.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/values/strings_activity_settings.xml b/app/src/main/res/values/strings_activity_settings.xml
new file mode 100644
index 0000000..9469b98
--- /dev/null
+++ b/app/src/main/res/values/strings_activity_settings.xml
@@ -0,0 +1,22 @@
+<resources>
+    <string name="title_activity_settings">Settings</string>
+
+    <!-- Strings related to Settings -->
+
+    <!-- Example General settings -->
+    <string name="pref_header_general">General</string>
+
+    <!-- Login status info-->
+    <string name="pref_remainLogged_in">Remain Logged-in</string>
+    <string name="pref_login_description">Decide whether or not to be automatically logged-in when next the app starts</string>
+    <!-- Player Portal url info -->
+    <string name="pref_player_default"> http://heater.cs.man.ac.uk:3000/</string>   <!-- default value -->
+    <string name="pref_player_title">Configure Taverna player portal</string>
+    <string name="pref_player_des">Configure a different player URL for the app to use. End with the mount point(/)</string>
+
+    <!-- Server Portal url info -->
+    <string name="pref_server_default"> http://heater.cs.man.ac.uk:8090/taverna-2.5.4/</string>   <!-- default value -->
+    <string name="pref_server_title">Configure Taverna Server </string>
+    <string name="pref_server_des">Configure a different Taverna Server for the app</string>
+
+</resources>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/res/xml/pref_general.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml
new file mode 100644
index 0000000..cfa5985
--- /dev/null
+++ b/app/src/main/res/xml/pref_general.xml
@@ -0,0 +1,33 @@
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <CheckBoxPreference
+        android:key="pref_logged_in"
+        android:title="@string/pref_remainLogged_in"
+        android:summary="@string/pref_login_description"
+        android:defaultValue="true" />
+
+    <!-- NOTE: EditTextPreference accepts EditText attributes. -->
+    <!-- NOTE: EditTextPreference's summary should be set to its value by the activity code. -->
+    <EditTextPreference
+        android:key="pref_player_url"
+        android:title="@string/pref_player_title"
+        android:summary="@string/pref_player_des"
+        android:defaultValue="@string/pref_player_default"
+        android:selectAllOnFocus="true"
+        android:inputType="textCapWords"
+        android:capitalize="words"
+        android:singleLine="true"
+        android:maxLines="1" />
+    <EditTextPreference
+        android:key="pref_server_url"
+        android:title="@string/pref_server_title"
+        android:summary="@string/pref_server_des"
+        android:defaultValue="@string/pref_server_default"
+        android:selectAllOnFocus="true"
+        android:inputType="textCapWords"
+        android:capitalize="words"
+        android:singleLine="true"
+        android:maxLines="1" />
+
+
+</PreferenceScreen>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/1fcf1fe6/app/src/main/res/xml/pref_headers.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml
new file mode 100644
index 0000000..e50e89f
--- /dev/null
+++ b/app/src/main/res/xml/pref_headers.xml
@@ -0,0 +1,9 @@
+<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- These settings headers are only used on tablets. -->
+
+    <header
+        android:fragment="org.apache.taverna.mobile.activities.SettingsActivity$GeneralPreferenceFragment"
+        android:title="@string/pref_header_general" />
+
+</preference-headers>