← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~trb143/openlp/Android2 into lp:openlp

 

Tim Bentley has proposed merging lp:~trb143/openlp/Android2 into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)

For more details, see:
https://code.launchpad.net/~trb143/openlp/Android2/+merge/249748

Fixes the persistence of the userid and password.
Password needs to be re-entered after browser reset.

tested with android client as well.

lp:~trb143/openlp/bug-1416528a (revision 2492)
[SUCCESS] http://ci.openlp.org/job/Branch-01-Pull/946/
[SUCCESS] http://ci.openlp.org/job/Branch-02-Functional-Tests/872/
[FAILURE] http://ci.openlp.org/job/Branch-03-Interface-Tests/817/

Stopped a crosswalk bug
-- 
Your team OpenLP Core is requested to review the proposed merge of lp:~trb143/openlp/Android2 into lp:openlp.
=== added file '.bzrignore'
--- .bzrignore	1970-01-01 00:00:00 +0000
+++ .bzrignore	2015-02-14 09:49:11 +0000
@@ -0,0 +1,9 @@
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/app/build
+/.idea
+/.bzr

=== renamed file '.bzrignore' => '.bzrignore.moved'
=== added file '.gitignore'
--- .gitignore	1970-01-01 00:00:00 +0000
+++ .gitignore	2015-02-14 09:49:11 +0000
@@ -0,0 +1,6 @@
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build

=== added file 'OpenLP2.iml'
--- OpenLP2.iml	1970-01-01 00:00:00 +0000
+++ OpenLP2.iml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="java-gradle" name="Java-Gradle">
+      <configuration>
+        <option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.gradle" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
+

=== added directory 'app'
=== added file 'app/.gitignore'
--- app/.gitignore	1970-01-01 00:00:00 +0000
+++ app/.gitignore	2015-02-14 09:49:11 +0000
@@ -0,0 +1,1 @@
+/build

=== added file 'app/app.iml'
--- app/app.iml	1970-01-01 00:00:00 +0000
+++ app/app.iml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="OpenLP2" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="android-gradle" name="Android-Gradle">
+      <configuration>
+        <option name="GRADLE_PROJECT_PATH" value=":app" />
+      </configuration>
+    </facet>
+    <facet type="android" name="Android">
+      <configuration>
+        <option name="SELECTED_BUILD_VARIANT" value="debug" />
+        <option name="SELECTED_TEST_ARTIFACT" value="_android_test_" />
+        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
+        <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
+        <option name="ASSEMBLE_TEST_TASK_NAME" value="assembleDebugTest" />
+        <option name="SOURCE_GEN_TASK_NAME" value="generateDebugSources" />
+        <option name="TEST_SOURCE_GEN_TASK_NAME" value="generateDebugTestSources" />
+        <option name="ALLOW_USER_CONFIGURATION" value="false" />
+        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
+        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
+        <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res" />
+        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager" inherit-compiler-output="false">
+    <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
+    <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/debug" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/test/debug" isTestSource="true" generated="true" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/test/debug" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/generated/test/debug" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/jni" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/jni" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/jni" isTestSource="true" />
+      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundles" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/coverage-instrumented-classes" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dependency-cache" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/dex-cache" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jacoco" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javaResources" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/libs" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/lint" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/ndk" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
+      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
+      <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
+      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
+    </content>
+    <orderEntry type="jdk" jdkName="Android API 21 Platform" jdkType="Android SDK" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" exported="" name="appcompat-v7-21.0.3" level="project" />
+    <orderEntry type="library" exported="" name="support-v4-21.0.3" level="project" />
+    <orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />
+    <orderEntry type="library" exported="" name="android-async-http-1.4.6" level="project" />
+  </component>
+</module>
+

=== added file 'app/build.gradle'
--- app/build.gradle	1970-01-01 00:00:00 +0000
+++ app/build.gradle	2015-02-14 09:49:11 +0000
@@ -0,0 +1,29 @@
+apply plugin: 'com.android.application'
+
+project.archivesBaseName = 'OpenLP'
+
+android {
+    compileSdkVersion 21
+    buildToolsVersion "21.1.2"
+
+    defaultConfig {
+        applicationId "org.openlp.android2"
+        minSdkVersion 15
+        targetSdkVersion 21
+        versionCode 2
+        versionName "2.0"
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+        }
+    }
+}
+
+dependencies {
+    compile fileTree(include: ['*.jar'], dir: 'libs')
+    compile 'com.android.support:appcompat-v7:21.0.3'
+    compile 'com.android.support:support-v4:21.0.3'
+    compile 'com.loopj.android:android-async-http:1.4.6'
+}

=== added directory 'app/libs'
=== added file 'app/proguard-rules.pro'
--- app/proguard-rules.pro	1970-01-01 00:00:00 +0000
+++ app/proguard-rules.pro	2015-02-14 09:49:11 +0000
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in /home/tim/android-sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}

=== added directory 'app/src'
=== added directory 'app/src/androidTest'
=== added directory 'app/src/androidTest/java'
=== added directory 'app/src/androidTest/java/org'
=== added directory 'app/src/androidTest/java/org/openlp'
=== added directory 'app/src/androidTest/java/org/openlp/android2'
=== added file 'app/src/androidTest/java/org/openlp/android2/ApplicationTest.java'
--- app/src/androidTest/java/org/openlp/android2/ApplicationTest.java	1970-01-01 00:00:00 +0000
+++ app/src/androidTest/java/org/openlp/android2/ApplicationTest.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,13 @@
+package org.openlp.android2;
+
+import android.app.Application;
+import android.test.ApplicationTestCase;
+
+/**
+ * <a href="http://d.android.com/tools/testing/testing_android.html";>Testing Fundamentals</a>
+ */
+public class ApplicationTest extends ApplicationTestCase<Application> {
+    public ApplicationTest() {
+        super(Application.class);
+    }
+}
\ No newline at end of file

=== added directory 'app/src/main'
=== added file 'app/src/main/AndroidManifest.xml'
--- app/src/main/AndroidManifest.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/AndroidManifest.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android";
+    package="org.openlp.android2" >
+
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+
+    <application
+        android:allowBackup="true"
+        android:icon="@drawable/ic_launcher"
+        android:label="@string/app_name"
+        android:theme="@style/AppTheme" >
+        <activity
+            android:name=".OpenLP"
+            android:label="@string/app_name" >
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
+        </activity>
+        <activity
+            android:name=".activities.SettingsActivity"
+            android:label="@string/title_activity_settings"
+            android:parentActivityName=".OpenLP" >
+            <meta-data
+                android:name="android.support.PARENT_ACTIVITY"
+                android:value="org.openlp.android2.OpenLP" />
+        </activity>
+
+    </application>
+
+</manifest>

=== added directory 'app/src/main/java'
=== added directory 'app/src/main/java/org'
=== added directory 'app/src/main/java/org/openlp'
=== added directory 'app/src/main/java/org/openlp/android2'
=== added file 'app/src/main/java/org/openlp/android2/OpenLP.java'
--- app/src/main/java/org/openlp/android2/OpenLP.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/OpenLP.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,259 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+import android.support.v7.app.ActionBarActivity;
+import android.app.ActionBar;
+import android.app.Fragment;
+import android.app.FragmentManager;
+
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.support.v4.widget.DrawerLayout;
+
+import org.openlp.android2.activities.SettingsActivity;
+import org.openlp.android2.common.NavigationOptions;
+import org.openlp.android2.dialogs.AlertDisplayDialog;
+import org.openlp.android2.dialogs.BlankDisplayDialog;
+import org.openlp.android2.fragments.AboutFragment;
+import org.openlp.android2.fragments.HomeFragment;
+import org.openlp.android2.fragments.LiveListFragment;
+import org.openlp.android2.fragments.LiveWebFragment;
+import org.openlp.android2.fragments.NavigationDrawerFragment;
+import org.openlp.android2.fragments.ServiceListFragment;
+import org.openlp.android2.fragments.StageWebFragment;
+
+
+public class OpenLP extends ActionBarActivity
+        implements NavigationDrawerFragment.NavigationDrawerCallbacks {
+
+    /**
+     * Fragment managing the behaviors, interactions and presentation of the navigation drawer.
+     */
+    private NavigationDrawerFragment mNavigationDrawerFragment;
+
+    /**
+     * Used to store the last screen title. For use in {@link #restoreActionBar()}.
+     */
+    private final String LOG_TAG = OpenLP.class.getName();
+    private CharSequence mTitle;
+    private boolean backArrowActive = false;
+    private Menu dropdownMenu;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.activity_main);
+
+        doPreferenceCheck();
+
+        mNavigationDrawerFragment = (NavigationDrawerFragment)
+                getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
+        mTitle = getTitle();
+
+        // Set up the drawer.
+        mNavigationDrawerFragment.setUp(
+                R.id.navigation_drawer,
+                (DrawerLayout) findViewById(R.id.drawer_layout));
+    }
+
+    private void doPreferenceCheck() {
+        SharedPreferences sharedPrefs = PreferenceManager
+                .getDefaultSharedPreferences(this);
+        if (sharedPrefs.getString(getString(R.string.key_host), "NONE").equals("NONE")
+                || sharedPrefs.getString(getString(R.string.key_host), null).equals(null)) {
+            Log.d(LOG_TAG,
+                    "URL preference not set. Starting preference activity...");
+            Intent preferenceIntent = new Intent(this, SettingsActivity.class);
+            startActivity(preferenceIntent);
+        }
+    }
+
+
+    @Override
+    public void onNavigationDrawerItemSelected(int position) {
+        // update the main content by replacing fragments
+        FragmentManager fragmentManager = getFragmentManager();
+        switch (position) {
+            case NavigationOptions.Home:
+                fragmentManager.beginTransaction()
+                        .replace(R.id.container, HomeFragment.newInstance())
+                        .commit();
+                mTitle = getString(R.string.home);
+                break;
+            case NavigationOptions.ServiceList:
+                fragmentManager.beginTransaction()
+                        .replace(R.id.container, ServiceListFragment.newInstance())
+                        .commit();
+                mTitle = getString(R.string.service_list);
+                break;
+            case NavigationOptions.LiveList:
+                fragmentManager.beginTransaction()
+                        .replace(R.id.container, LiveListFragment.newInstance())
+                        .commit();
+                mTitle = getString(R.string.live_list);
+                break;
+            case NavigationOptions.StageView:
+                fragmentManager.beginTransaction()
+                        .replace(R.id.container, StageWebFragment.newInstance())
+                        .commit();
+                mTitle = getString(R.string.stage_view);
+                break;
+            case NavigationOptions.LiveView:
+                fragmentManager.beginTransaction()
+                        .replace(R.id.container, LiveWebFragment.newInstance())
+                        .commit();
+                mTitle = getString(R.string.live_view);
+                break;
+        }
+        menuVisible();
+    }
+
+    public void restoreActionBar() {
+
+        try {
+            ActionBar actionBar = getActionBar();
+            //actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+            actionBar.setDisplayShowTitleEnabled(true);
+            actionBar.setTitle(mTitle);
+        } catch (Exception e) {
+            //noop
+        }
+    }
+
+    public void setMenuActive(){
+        backArrowActive = true;
+    }
+
+    public void menuVisible() {
+        if (dropdownMenu != null){
+            MenuItem checkable = dropdownMenu.findItem(R.id.action_back);
+            if (checkable != null) {
+                if (backArrowActive) {
+                    checkable.setVisible(true);
+                } else {
+                    checkable.setVisible(false);
+                }
+            }
+        }
+        backArrowActive = false;
+        //restoreActionBar();
+    }
+
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        if (!mNavigationDrawerFragment.isDrawerOpen()) {
+            // Only show items in the action bar relevant to this screen
+            // if the drawer is not showing. Otherwise, let the drawer
+            // decide what to show in the action bar.
+            getMenuInflater().inflate(R.menu.open_l, menu);
+            restoreActionBar();
+            return true;
+        }
+        return super.onCreateOptionsMenu(menu);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        // Handle action bar item clicks here. The action bar will
+        // automatically handle clicks on the Home/Up button, so long
+        // as you specify a parent activity in AndroidManifest.xml.
+        Intent intent;
+        switch (item.getItemId()) {
+            case R.id.action_back:
+                onNavigationDrawerItemSelected(NavigationOptions.ServiceList);
+                return true;
+            case R.id.action_preferences:
+                intent = new Intent(this, SettingsActivity.class);
+                startActivity(intent);
+                return true;
+            case R.id.action_refresh:
+                if (this.mTitle.equals(getString(R.string.service_list))) {
+                    ServiceListFragment fragment = (ServiceListFragment)
+                            getFragmentManager().findFragmentById(R.id.container);
+                    fragment.refreshDisplay();
+                } else if (this.mTitle.equals(getString(R.string.live_list)) ) {
+                    LiveListFragment fragment = (LiveListFragment)
+                            getFragmentManager().findFragmentById(R.id.container);
+                    fragment.refreshDisplay();
+                }
+                return true;
+            case R.id.action_blank:
+                new BlankDisplayDialog().show(getFragmentManager(), "BlankDialog");
+                return true;
+            case R.id.action_alert:
+                new AlertDisplayDialog().show(getFragmentManager(), "AlertDialog");
+                return true;
+            case R.id.action_about:
+                getFragmentManager().beginTransaction().replace(R.id.container,
+                        new AboutFragment()).commit();
+            default:
+                return super.onOptionsItemSelected(item);
+        }
+    }
+
+    /**
+     * A placeholder fragment containing a simple view.
+     */
+    public static class PlaceholderFragment extends Fragment {
+        /**
+         * The fragment argument representing the section number for this
+         * fragment.
+         */
+        private static final String ARG_SECTION_NUMBER = "section_number";
+
+        /**
+         * Returns a new instance of this fragment for the given section
+         * number.
+         */
+        public static PlaceholderFragment newInstance(int sectionNumber) {
+            PlaceholderFragment fragment = new PlaceholderFragment();
+            Bundle args = new Bundle();
+            args.putInt(ARG_SECTION_NUMBER, sectionNumber);
+            fragment.setArguments(args);
+            return fragment;
+        }
+
+        public PlaceholderFragment() {
+        }
+
+        @Override
+        public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                                 Bundle savedInstanceState) {
+            return inflater.inflate(R.layout.fragment_main, container, false);
+        }
+
+        @Override
+        public void onAttach(Activity activity) {
+            super.onAttach(activity);
+            //((OpenLP) activity).onSectionAttached(
+            //        getArguments().getInt(ARG_SECTION_NUMBER));
+        }
+    }
+
+}

=== added directory 'app/src/main/java/org/openlp/android2/activities'
=== added file 'app/src/main/java/org/openlp/android2/activities/SettingsActivity.java'
--- app/src/main/java/org/openlp/android2/activities/SettingsActivity.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/activities/SettingsActivity.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,220 @@
+package org.openlp.android2.activities;
+
+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.PreferenceCategory;
+import android.preference.PreferenceFragment;
+import android.preference.PreferenceManager;
+
+import org.openlp.android2.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 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);
+
+        // Add 'notifications' preferences, and a corresponding header.
+        PreferenceCategory fakeHeader = new PreferenceCategory(this);
+        fakeHeader.setTitle(R.string.connection_configuration);
+        getPreferenceScreen().addPreference(fakeHeader);
+        addPreferencesFromResource(R.xml.pref_notification);
+
+        // 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("key_text_size"));
+        bindPreferenceSummaryToValue(findPreference("key_connection_timeout"));
+        bindPreferenceSummaryToValue(findPreference("key_host"));
+        bindPreferenceSummaryToValue(findPreference("key_port"));
+        bindPreferenceSummaryToValue(findPreference("key_userid"));
+        bindPreferenceSummaryToValue(findPreference("key_password"));
+
+    }
+
+    /**
+     * {@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);
+        }
+    }
+
+    @Override
+    protected boolean isValidFragment (String fragmentName) {
+        return true;
+    }
+
+    /**
+     * 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("key_text_size"));
+        }
+
+    }
+
+    /**
+     * This fragment shows notification preferences only. It is used when the
+     * activity is showing a two-pane settings UI.
+     */
+    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+    public static class NotificationPreferenceFragment extends PreferenceFragment {
+        @Override
+        public void onCreate(Bundle savedInstanceState) {
+            super.onCreate(savedInstanceState);
+            addPreferencesFromResource(R.xml.pref_notification);
+
+            // 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("key_connection_timeout"));
+            bindPreferenceSummaryToValue(findPreference("key_host"));
+            bindPreferenceSummaryToValue(findPreference("key_port"));
+            bindPreferenceSummaryToValue(findPreference("key_userid"));
+            bindPreferenceSummaryToValue(findPreference("key_password"));
+        }
+    }
+}

=== added directory 'app/src/main/java/org/openlp/android2/api'
=== added file 'app/src/main/java/org/openlp/android2/api/Api.java'
--- app/src/main/java/org/openlp/android2/api/Api.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/api/Api.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,125 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.api;
+
+/**
+ * <h1>Routes:</h1>
+ * <p/>
+ * <p/>
+ * <pre>
+ * ``/``
+ * Go to the web interface.
+ *
+ * ``/files/{filename}``
+ *
+ * ``/api/poll``
+ * {"results": {"type": "controller"}}
+ * Or, if there were no results, False::
+ * {"results": False}
+ *
+ * ``/api/display/{hide|show}``
+ * Blank or unblank the screen.
+ *
+ * ``/api/alert``
+ * {"request": {"text": "<your alert text>"}}
+ * ``/api/controller/{live|preview}/{action}``
+ * ``next``
+ * Load the next slide.
+ *
+ * ``previous``
+ * Load the previous slide.
+ *
+ * ``set``
+ * Set a specific slide. Requires an id return in a JSON-encoded dict like
+ * this::
+ *
+ * {"request": {"id": 1}}
+ *
+ * ``first``
+ * Load the first slide.
+ *
+ * ``last``
+ * Load the last slide.
+ *
+ * ``text``
+ * Fetches the text of the current song. The output is a JSON-encoded
+ * dict which looks like this::
+ *
+ * {"result": {"slides": ["...", "..."]}}
+ *
+ * ``/api/service/{action}``
+ * Perform ``{action}`` on the service manager (e.g. go live). Data is
+ * passed as a json-encoded ``data`` parameter. Valid actions are:
+ *
+ * ``next``
+ * Load the next item in the service.
+ *
+ * ``previous``
+ *
+ * ``set``
+ * Set a specific item in the service. Requires an id returned in a
+ * JSON-encoded dict like this::
+ *
+ * {"request": {"id": 1}}
+ *
+ * ``list``
+ * Request a list of items in the service. Returns a list of items in the
+ * current service in a JSON-encoded dict like this::
+ *
+ * {"results": {"items": [{...}, {...}]}}
+ * """
+ * </pre>
+ */
+
+public interface Api {
+
+    public final String LIVE_BASE = "/api/controller/live/";
+    public final String LIVE_NEXT = "/api/controller/live/next";
+    public final String LIVE_PREVIOUS = "/api/controller/live/previous";
+    public final String LIVE_TEXT = "/api/controller/live/text";
+    public final String LIVE_SET = "/api/controller/live/set?data=";
+    public final String STAGE_VIEW = "/stage";
+    public final String LIVE_VIEW = "/main";
+
+    public final String SERVICE_LIST = "/api/service/list";
+    public final String SERVICE_SET = "/api/service/set?data=";
+
+    public final String DISPLAY_SHOW = "/api/display/show";
+    public final String DISPLAY_BLANK = "/api/display/blank";
+    public final String DISPLAY_THEME = "/api/display/theme";
+    public final String DISPLAY_DESKTOP = "/api/display/desktop";
+    public final String POLL_STATUS = "/api/poll";
+
+    public final String ALERT = "/api/alert?data=";
+
+    public final String SEARCHABLE_PLUGINS = "/api/plugin/search";
+    /**
+     * This is a special string that uses the String.format() method. See
+     * {@link String#format(String, Object...)}
+     */
+    public final String SEARCH_PLUGIN_FORMATTED = "/api/%s/search?data=";
+    /**
+     * Match intent extra key with regex since multiple plugins can be inserted
+     */
+    public final String SEARCH_PLUGIN_ADD = "/api/%s/add?data=";
+    /**
+     * Match intent extra key with regex since multiple plugins can be inserted
+     */
+    public final String SEARCH_PLUGIN_LIVE = "/api/%s/live?data=";
+}

=== added directory 'app/src/main/java/org/openlp/android2/common'
=== added file 'app/src/main/java/org/openlp/android2/common/JsonHelpers.java'
--- app/src/main/java/org/openlp/android2/common/JsonHelpers.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/common/JsonHelpers.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,55 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.common;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONStringer;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+public class JsonHelpers {
+
+    private static String LOG_TAG = JsonHelpers.class.getName();
+
+    public static String createRequestJSON(String key, String value) throws JSONHandlerException {
+        try {
+            String responseJSON;
+            JSONObject jo = new JSONObject();
+            jo.put(key, value);
+            responseJSON = new JSONStringer().object().key("request").value(jo)
+                    .endObject().toString();
+            responseJSON = URLEncoder.encode(responseJSON, "UTF-8");
+            return responseJSON;
+        } catch (JSONException e) {
+            throw new JSONHandlerException(e);
+        } catch (UnsupportedEncodingException e) {
+            throw new JSONHandlerException(e);
+        }
+    }
+
+    public static class JSONHandlerException extends Exception {
+        private static final long serialVersionUID = -6772307308404816615L;
+
+        public JSONHandlerException(Throwable throwable) {
+            super(throwable);
+        }
+    }
+}

=== added file 'app/src/main/java/org/openlp/android2/common/NavigationOptions.java'
--- app/src/main/java/org/openlp/android2/common/NavigationOptions.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/common/NavigationOptions.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,27 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.common;
+
+public class NavigationOptions{
+    public final static int Home = 0;
+    public final static int ServiceList = 1;
+    public final static int LiveList = 2;
+    public final static int StageView = 3;
+    public final static int LiveView = 4;
+}

=== added file 'app/src/main/java/org/openlp/android2/common/OpenLPDialog.java'
--- app/src/main/java/org/openlp/android2/common/OpenLPDialog.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/common/OpenLPDialog.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,75 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.common;
+
+import android.app.DialogFragment;
+import android.content.Context;
+import android.util.Log;
+import android.widget.Toast;
+import com.loopj.android.http.AsyncHttpClient;
+import com.loopj.android.http.TextHttpResponseHandler;
+import org.apache.http.Header;
+import org.openlp.android2.R;
+import org.openlp.android2.api.Api;
+
+
+abstract public class OpenLPDialog extends DialogFragment {
+
+    private final String LOG_TAG = OpenLPDialog.class.getName();
+    protected String calledURL;
+    protected OpenLPHttpClient httpClient;
+    protected Context context;
+
+    private static AsyncHttpClient client = new AsyncHttpClient();
+
+    protected void populateDisplay(String responseString) {}
+    protected void processUpdate(String responseString) {}
+    protected void errorDisplay(int statusCode, String responseString) {}
+
+    protected void triggerTextRequest(String url) {
+        calledURL = url;
+        Log.d(LOG_TAG, "Trigger Request for url " + url);
+        String callurl = String.format("%s%s", httpClient.getAbsoluteUrl(client), url );
+        client.get(callurl, null, new TextHttpResponseHandler() {
+            @Override
+            public void onSuccess(int statusCode, Header[] headers, String responseString) {
+                // called when response HTTP status is "200 OK"
+                manageResponse(responseString);
+            }
+            @Override
+            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
+                // called when response HTTP status is "4XX" (eg. 401, 403, 404)
+                if (statusCode == 401) {
+                    Toast.makeText(context, R.string.httpreturn_unauthorised, Toast.LENGTH_LONG).show();
+                } else {
+                    Toast.makeText(context, R.string.unable, Toast.LENGTH_LONG).show();
+                }
+                errorDisplay(statusCode, responseString);
+            }
+        });
+    }
+
+    public void manageResponse(String response) {
+        if (calledURL.equals(Api.POLL_STATUS)) {
+            populateDisplay(response);
+        }else {
+            processUpdate(response);
+        }
+    }
+}

=== added file 'app/src/main/java/org/openlp/android2/common/OpenLPFragment.java'
--- app/src/main/java/org/openlp/android2/common/OpenLPFragment.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/common/OpenLPFragment.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,87 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.common;
+
+
+import android.app.ListFragment;
+import android.content.Context;
+import android.util.Log;
+import android.view.View;
+
+import android.widget.ListView;
+import android.widget.Toast;
+import com.loopj.android.http.AsyncHttpClient;
+import com.loopj.android.http.TextHttpResponseHandler;
+import org.apache.http.Header;
+import org.openlp.android2.R;
+
+abstract public class OpenLPFragment extends ListFragment{
+
+    private String LOG_TAG = OpenLPFragment.class.getName();
+    public Context context;
+    protected String calledURL;
+    protected OpenLPHttpClient httpClient;
+    protected String updateUrl;
+
+    abstract public void itemClicked(int position);
+
+    @Override
+    public void onListItemClick(ListView l, View v, int position, long id) {
+        super.onListItemClick(l, v, position, id);
+        itemClicked(position);
+    }
+
+    private static AsyncHttpClient client = new AsyncHttpClient();
+
+    protected void refreshDisplay(){}
+    protected void populateDisplay(String responseString) {}
+    protected void processUpdate(String responseString) {}
+    protected void errorDisplay(int statusCode, String responseString) {}
+
+    protected void triggerTextRequest(String url) {
+        calledURL = url;
+        Log.d(LOG_TAG, "Trigger Request for url " + url);
+        String callurl = String.format("%s%s", httpClient.getAbsoluteUrl(client), url );
+        client.get(callurl, null, new TextHttpResponseHandler() {
+            @Override
+            public void onSuccess(int statusCode, Header[] headers, String responseString) {
+                // called when response HTTP status is "200 OK"
+                manageResponse(responseString);
+            }
+            @Override
+            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
+                // called when response HTTP status is "4XX" (eg. 401, 403, 404)
+                if (statusCode == 401) {
+                    Toast.makeText(context, R.string.httpreturn_unauthorised, Toast.LENGTH_LONG).show();
+                } else {
+                    Toast.makeText(context, R.string.unable, Toast.LENGTH_LONG).show();
+                }
+                errorDisplay(statusCode, responseString);
+            }
+        });
+    }
+
+    public void manageResponse(String response) {
+        if (calledURL.equals(updateUrl)) {
+            populateDisplay(response);
+        }else {
+            processUpdate(response);
+        }
+    }
+}

=== added file 'app/src/main/java/org/openlp/android2/common/OpenLPHttpClient.java'
--- app/src/main/java/org/openlp/android2/common/OpenLPHttpClient.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/common/OpenLPHttpClient.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,97 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.common;
+
+
+import java.security.KeyStore;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+import android.util.Log;
+import com.loopj.android.http.AsyncHttpClient;
+import org.openlp.android2.R;
+
+/**
+ * Personalised HttpClient to be used throughout OpenLP with customisable
+ * parameters.
+ */
+public class OpenLPHttpClient {
+
+    private final String LOG_TAG = OpenLPHttpClient.class.getName();
+    private Context context;
+    private Boolean useSSL = Boolean.FALSE;
+
+    public OpenLPHttpClient(Context context) {
+        this.context = context;
+    }
+
+    public String getAbsoluteUrl(AsyncHttpClient client) {
+
+        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+
+        String urlBase = getBaseUrl();
+
+        Log.d(LOG_TAG, "Base Url set to " + urlBase);
+
+        String userid = sharedPrefs.getString(context.getString(R.string.key_userid), "openlp");
+
+        String password = sharedPrefs.getString(context.getString(R.string.key_password), "password");
+
+        Log.d(LOG_TAG, "Credentials set to " + userid + " : " + password);
+        client.setBasicAuth(userid,password);
+
+        int connectionTimeout = context.getResources().getInteger(
+                R.integer.connectionTimeoutDefaultValue);
+
+        if (sharedPrefs.getBoolean(context.getString(R.string.key_enable_custom_timeout), false)) {
+            Log.d(LOG_TAG, "Overriding Connection and Socket timeouts");
+
+            connectionTimeout = sharedPrefs.getInt(context.getString(R.string.key_connection_timeout),
+                   context.getResources().getInteger(R.integer.connectionTimeoutDefaultValue)
+            );
+        }
+        client.setTimeout(connectionTimeout);
+        if (useSSL){
+            try {
+                KeyStore trustStore = KeyStore.getInstance((KeyStore.getDefaultType()));
+                trustStore.load(null, null);
+                OpenLPSSLSocketFactory sf = new OpenLPSSLSocketFactory(trustStore);
+                sf.setHostnameVerifier((OpenLPSSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER));
+                client.setSSLSocketFactory(sf);
+            }
+            catch (Exception e){
+                //
+            }
+        }
+        return urlBase;
+    }
+
+    public String getBaseUrl(){
+        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+
+        useSSL =sharedPrefs.getBoolean(context.getString(R.string.key_ssl_use), false);
+        String host = sharedPrefs.getString(context.getString(R.string.key_host),
+                context.getString(R.string.host_default_value));
+        String port = sharedPrefs.getString(context.getString(R.string.key_port), "4316");
+
+        return String.format("http%s://%s:%s", useSSL ? "s" : "", host, port);
+
+    }
+
+}

=== added file 'app/src/main/java/org/openlp/android2/common/OpenLPHttpReturn.java'
--- app/src/main/java/org/openlp/android2/common/OpenLPHttpReturn.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/common/OpenLPHttpReturn.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,61 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.common;
+
+import android.content.Context;
+import org.openlp.android2.R;
+
+public class OpenLPHttpReturn {
+    private int return_code = 0;
+    private String data = null;
+    private Context context;
+
+    public OpenLPHttpReturn() {
+        this.return_code = -1;
+        this.data = "";
+        this.context = null;
+    }
+
+    public OpenLPHttpReturn(int return_code, String data, Context context) {
+        this.return_code = return_code;
+        this.data = data;
+        this.context = context;
+    }
+
+    public String getData() {
+        return this.data;
+    }
+
+    public boolean isError() {
+        return return_code != 0;
+    }
+
+    public boolean isSecurityError() {
+        return return_code == 401;
+    }
+
+    public String getErrorMessage(String message) {
+        return return_code == 401 ? this.context.getString(R.string.httpreturn_unauthorised) : message;
+    }
+
+    @Override
+    public String toString() {
+        return "HttpReturn{" + "data='" + data + '\'' + ", return code=" + return_code + '}';
+    }
+}

=== added file 'app/src/main/java/org/openlp/android2/common/OpenLPSSLSocketFactory.java'
--- app/src/main/java/org/openlp/android2/common/OpenLPSSLSocketFactory.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/common/OpenLPSSLSocketFactory.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,66 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.common;
+
+import org.apache.http.conn.ssl.SSLSocketFactory;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.net.Socket;
+import java.net.UnknownHostException;
+import java.security.*;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+/**
+ * Created by tim on 14/11/14.
+ */
+public class OpenLPSSLSocketFactory extends SSLSocketFactory {
+    SSLContext sslContext = SSLContext.getInstance("TLS");
+
+    public OpenLPSSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
+        super(truststore);
+
+        TrustManager tm = new X509TrustManager() {
+            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+            }
+
+            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+            }
+
+            public X509Certificate[] getAcceptedIssuers() {
+                return null;
+            }
+        };
+
+        sslContext.init(null, new TrustManager[] { tm }, null);
+    }
+
+    @Override
+    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
+        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
+    }
+
+    @Override
+    public Socket createSocket() throws IOException {
+        return sslContext.getSocketFactory().createSocket();
+    }
+}

=== added directory 'app/src/main/java/org/openlp/android2/dialogs'
=== added file 'app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java'
--- app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,107 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.dialogs;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+import org.openlp.android2.R;
+import org.openlp.android2.api.Api;
+import org.openlp.android2.common.JsonHelpers;
+import org.openlp.android2.common.OpenLPDialog;
+import org.openlp.android2.common.OpenLPHttpClient;
+
+public class AlertDisplayDialog extends OpenLPDialog {
+    private final String LOG_TAG = AlertDisplayDialog.class.getName();
+    public AlertDialog dialog;
+
+    /**
+     * The system calls this only when creating the layout in a dialog.
+     */
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        // The only reason you might override this method when using onCreateView() is
+        // to modify any dialog characteristics. For example, the dialog includes a
+        // title by default, but your custom layout might not need it. So here you can
+        // remove the dialog title, but you must call the superclass to get the Dialog.
+
+        context = getActivity();
+        httpClient = new OpenLPHttpClient(context);
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+        // Get the layout inflater
+        LayoutInflater inflater = getActivity().getLayoutInflater();
+
+        // Inflate and set the layout for the dialog
+        // Pass null as the parent view because its going in the dialog layout
+        View view = inflater.inflate(R.layout.alert_display_dialog, null);
+        builder.setView(view);
+
+        builder.setPositiveButton(R.string.cancel, new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int id) {
+                AlertDisplayDialog.this.getDialog().cancel();
+            }
+        });
+        builder.setNegativeButton(R.string.process, new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog1, int id) {
+                EditText text = (EditText) dialog.findViewById(R.id.alertText);
+                requestAlert(text.getText().toString());
+            }
+        });
+        dialog = builder.create();
+        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
+            @Override
+            public void onShow(DialogInterface dialogI) {
+                Button btnNegative = dialog.getButton(Dialog.BUTTON_NEGATIVE);
+                btnNegative.setTextSize(20);
+                Button btnPositive = dialog.getButton(Dialog.BUTTON_POSITIVE);
+                btnPositive.setTextSize(20);
+            }
+        });
+        return dialog;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        Log.d(LOG_TAG, "Resuming...");
+    }
+
+    public void processUpdate(String response) {
+        Toast.makeText(context, "Alert Requested", Toast.LENGTH_SHORT).show();
+    }
+
+    public void requestAlert(String text) {
+        try {
+            String request = JsonHelpers.createRequestJSON("text", text);
+            triggerTextRequest(String.format("%s%s", Api.ALERT, request));
+            Log.d(LOG_TAG, String.format("Setting list data. apiBase(%s), text(%s)", Api.ALERT, text));
+        } catch (JsonHelpers.JSONHandlerException e) {
+            e.printStackTrace();
+            Toast.makeText(context, "Request Failed", Toast.LENGTH_SHORT).show();
+        }
+    }
+}

=== added file 'app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java'
--- app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,154 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.dialogs;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.openlp.android2.R;
+import org.openlp.android2.api.Api;
+
+import org.openlp.android2.common.OpenLPDialog;
+import org.openlp.android2.common.OpenLPHttpClient;
+
+public class BlankDisplayDialog extends OpenLPDialog {
+    private final String LOG_TAG = BlankDisplayDialog.class.getName();
+    public AlertDialog dialog;
+    Button desktop;
+    Button screen;
+    Button theme;
+    Button reset;
+
+    /**
+     * The system calls this only when creating the layout in a dialog.
+     */
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        // The only reason you might override this method when using onCreateView() is
+        // to modify any dialog characteristics. For example, the dialog includes a
+        // title by default, but your custom layout might not need it. So here you can
+        // remove the dialog title, but you must call the superclass to get the Dialog.
+
+        context = getActivity();
+        httpClient = new OpenLPHttpClient(context);
+
+        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+        // Get the layout inflater
+        LayoutInflater inflater = getActivity().getLayoutInflater();
+
+        // Inflate and set the layout for the dialog
+        // Pass null as the parent view because its going in the dialog layout
+        View view = inflater.inflate(R.layout.blank_display_dialog, null);
+        builder.setView(view);
+
+        reset = (Button) view.findViewById(R.id.buttonReset);
+        reset.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                triggerTextRequest(Api.DISPLAY_SHOW);
+            }
+        });
+        screen = (Button) view.findViewById(R.id.buttonScreen);
+        screen.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                triggerTextRequest(Api.DISPLAY_BLANK);
+            }
+        });
+        theme = (Button) view.findViewById(R.id.buttonTheme);
+        theme.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                triggerTextRequest(Api.DISPLAY_THEME);
+            }
+        });
+        desktop = (Button) view.findViewById(R.id.buttonDesktop);
+        desktop.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                triggerTextRequest(Api.DISPLAY_DESKTOP);
+            }
+        });
+        builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+            public void onClick(DialogInterface dialog, int id) {
+                BlankDisplayDialog.this.getDialog().cancel();
+            }
+        });
+        dialog = builder.create();
+        dialog.setOnShowListener(new DialogInterface.OnShowListener() {
+            @Override
+            public void onShow(DialogInterface dialogI) {
+                Button btnNegative = dialog.getButton(Dialog.BUTTON_NEGATIVE);
+                btnNegative.setTextSize(20);
+            }
+        });
+        return dialog;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        Log.d(LOG_TAG, "Resuming...");
+        triggerTextRequest(Api.POLL_STATUS);
+        Log.d(LOG_TAG, "Resumed...");
+    }
+
+    public void processUpdate(String response) {
+        triggerTextRequest(Api.POLL_STATUS);
+    }
+
+    public void populateDisplay(String json) {
+        Log.d(LOG_TAG, "populateDisplay");
+        try {
+            JSONObject item = new JSONObject(json).getJSONObject("results");
+            if (item.getString("theme").equals("false") &
+                    item.getString("display").equals("false") &
+                    item.getString("blank").equals("false")) {
+                screen.setEnabled(true);
+                theme.setEnabled(true);
+                desktop.setEnabled(true);
+                reset.setEnabled(false);
+            } else {
+                screen.setEnabled(false);
+                theme.setEnabled(false);
+                desktop.setEnabled(false);
+                reset.setEnabled(true);
+            }
+        } catch (JSONException e) {
+            Log.e(LOG_TAG, "Exception with Json = " + json);
+            e.printStackTrace();
+        }
+    }
+
+    public void errorDisplay(int statusCode, String responseString) {
+        Log.d(LOG_TAG, String.format("URL Error status code %d text %s", statusCode, responseString));
+        screen.setEnabled(false);
+        theme.setEnabled(false);
+        desktop.setEnabled(false);
+        reset.setEnabled(false);
+    }
+}

=== added directory 'app/src/main/java/org/openlp/android2/fragments'
=== added file 'app/src/main/java/org/openlp/android2/fragments/AboutFragment.java'
--- app/src/main/java/org/openlp/android2/fragments/AboutFragment.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/fragments/AboutFragment.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,70 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.fragments;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import org.openlp.android2.R;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class AboutFragment extends Fragment {
+
+    public AboutFragment() {
+        // Empty constructor required for fragment subclasses
+    }
+
+    public static AboutFragment newInstance() {
+        return new AboutFragment();
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
+        View view = inflater.inflate(R.layout.fragment_about, container, false);
+
+        String date = new SimpleDateFormat("yyyy").format(new Date());
+
+        StringBuilder html = new StringBuilder();
+        html.append(getString(R.string.about_display_1));
+        html.append("\n");
+        html.append(getString(R.string.about_display_2));
+        html.append(" http://www.openlp.org";);
+        html.append("\n\n\n");
+        html.append(getString(R.string.about_display_4));
+        html.append(" © 2004-").append(date).append(" Raoul Snyman\n");
+        html.append(getString(R.string.about_display_5));
+        html.append(" © 2004-").append(date);
+        html.append("\nTim Bentley, Johan Mynhardt");
+        html.append("\n\n\n");
+        html.append(getString(R.string.about_display_6));
+        html.append("\n");
+        html.append(getString(R.string.about_display_7));
+        html.append("\n");
+        html.append(getString(R.string.about_display_8));
+
+        ((TextView) view.findViewById(R.id.about_text)).setText(html);
+
+        return view;
+    }
+}
\ No newline at end of file

=== added file 'app/src/main/java/org/openlp/android2/fragments/HomeFragment.java'
--- app/src/main/java/org/openlp/android2/fragments/HomeFragment.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/fragments/HomeFragment.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,58 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.fragments;
+
+import android.app.Fragment;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import org.openlp.android2.R;
+
+
+public class HomeFragment extends Fragment {
+    private View displayView;
+
+    public HomeFragment() {
+        // Empty constructor required for fragment subclasses
+    }
+
+    public static HomeFragment newInstance() {
+         return new HomeFragment();
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
+        displayView = inflater.inflate(R.layout.fragment_home, container, false);
+        displayIcon();
+        return displayView;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        displayIcon();
+    }
+
+    private void displayIcon(){
+        int imageId = getResources().getIdentifier("openlp_splash_screen","drawable", getActivity().getPackageName());
+        ((ImageView) displayView.findViewById(R.id.home_image)).setImageResource(imageId);
+    }
+}

=== added file 'app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java'
--- app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,173 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.fragments;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.os.Bundle;
+import android.content.SharedPreferences;
+import android.text.Html;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListAdapter;
+import android.widget.SimpleAdapter;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.openlp.android2.R;
+import org.openlp.android2.api.Api;
+import org.openlp.android2.common.JsonHelpers;
+import org.openlp.android2.common.OpenLPFragment;
+import org.openlp.android2.common.OpenLPHttpClient;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+
+public class LiveListFragment extends OpenLPFragment {
+
+    private int selected = 0;
+
+    private String LOG_TAG = LiveListFragment.class.getName();
+
+    public static LiveListFragment newInstance() {
+        return new LiveListFragment();
+    }
+
+    /**
+     * Mandatory empty constructor for the fragment manager to instantiate the
+     * fragment (e.g. upon screen orientation changes).
+     */
+    public LiveListFragment() {
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        context = getActivity();
+        updateUrl = Api.LIVE_TEXT;
+        httpClient = new OpenLPHttpClient(context);
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+    @Override
+    public void populateDisplay(String json) {
+        Log.i(LOG_TAG, "populate_display - entry");
+        List<HashMap<String, String>> aList = new ArrayList<HashMap<String, String>>();
+        selected = 0;
+
+        try {
+            JSONArray items = new JSONObject(json).getJSONObject("results").getJSONArray("slides");
+            for (int i = 0; i < items.length(); ++i) {
+                JSONObject item = items.getJSONObject(i);
+
+                HashMap<String, String> hm = new HashMap<String, String>();
+                hm.put("tag", item.getString("tag"));
+                if (item.getString("selected").equals("true")) {
+                    selected = i;
+                }
+                hm.put("liveListNormal", Html.fromHtml(item.getString("html")).toString());
+                aList.add(hm);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        // Keys used in Hashmap
+        String[] from = {"tag", "liveListNormal", "liveListSelected"};
+
+        // Ids of views in live_list_fragment
+        int[] to = {R.id.tag, R.id.liveListNormal, R.id.liveListSelected};
+
+        SharedPreferences prefs = context.getSharedPreferences(
+                context.getString(R.string.key_shared_preferences),
+                Context.MODE_PRIVATE);
+
+        final int size = Integer.parseInt(prefs.getString(
+                context.getString(R.string.key_text_size),
+                String.valueOf(context.getResources().getInteger(
+                        R.integer.textSizeDefaultValue))));
+
+        // Instantiating an adapter to store each items
+        ListAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), aList,
+                R.layout.fragment_livelist, from, to) {
+            public View getView(int position, View convertView, ViewGroup parent) {
+                View view = super.getView(position, convertView, parent);
+                TextView text1 = (TextView) view.findViewById(R.id.tag);
+                text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
+                TextView text2 = (TextView) view.findViewById(R.id.liveListNormal);
+                text2.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
+                if (selected == position) {
+                    text2.setTextColor(Color.parseColor("#000000"));
+                    text2.setTypeface(null, Typeface.BOLD_ITALIC);
+                }
+                return view;
+
+            }
+        };
+        setListAdapter(adapter);
+        getListView().setSelection(selected - 1);
+        Log.i(LOG_TAG, "populate_display - exit");
+    }
+
+
+    @Override
+    public void refreshDisplay() {
+        Log.d(LOG_TAG, "Resuming...");
+        triggerTextRequest(Api.LIVE_TEXT);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        Log.d(LOG_TAG, "Resuming...");
+        triggerTextRequest(Api.LIVE_TEXT);
+        Log.d(LOG_TAG, "Resumed...");
+    }
+
+    public void processUpdate(String response) {
+        triggerTextRequest(Api.LIVE_TEXT);
+    }
+
+    public void itemClicked(int position) {
+        try {
+            String request = JsonHelpers.createRequestJSON("id", Integer.toString(position));
+            triggerTextRequest(String.format("%s%s", Api.LIVE_SET, request));
+            Log.d(LOG_TAG, String.format("Setting list data. apiBase(%s), position(%s)",
+                    Api.LIVE_SET, position));
+            Toast.makeText(getActivity().getBaseContext(), "Display Item selected", Toast.LENGTH_SHORT).show();
+        } catch (JsonHelpers.JSONHandlerException e) {
+            e.printStackTrace();
+            Toast.makeText(getActivity().getBaseContext(), "Request Failed", Toast.LENGTH_SHORT).show();
+        }
+    }
+
+}

=== added file 'app/src/main/java/org/openlp/android2/fragments/LiveWebFragment.java'
--- app/src/main/java/org/openlp/android2/fragments/LiveWebFragment.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/fragments/LiveWebFragment.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,33 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.fragments;
+
+import org.openlp.android2.api.Api;
+
+public class LiveWebFragment extends WebFragment {
+    public LiveWebFragment() {
+        super();
+        curURL = Api.LIVE_VIEW;
+    }
+
+    public static LiveWebFragment newInstance() {
+        return new LiveWebFragment();
+    }
+}
+

=== added file 'app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java'
--- app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,332 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.fragments;
+
+import android.graphics.drawable.ColorDrawable;
+import android.support.v7.app.ActionBarActivity;
+import android.app.Activity;
+import android.support.v7.app.ActionBar;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.ActionBarDrawerToggle;
+import android.support.v4.view.GravityCompat;
+import android.support.v4.widget.DrawerLayout;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ListAdapter;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+import android.widget.Toast;
+
+import org.openlp.android2.R;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * Fragment used for managing interactions for and presentation of a navigation drawer.
+ * See the <a href="https://developer.android.com/design/patterns/navigation-drawer.html#Interaction";>
+ * design guidelines</a> for a complete explanation of the behaviors implemented here.
+ */
+public class NavigationDrawerFragment extends Fragment {
+
+    /**
+     * Remember the position of the selected item.
+     */
+    private static final String STATE_SELECTED_POSITION = "selected_navigation_drawer_position";
+
+    /**
+     * Per the design guidelines, you should show the drawer on launch until the user manually
+     * expands it. This shared preference tracks this.
+     */
+    private static final String PREF_USER_LEARNED_DRAWER = "navigation_drawer_learned";
+
+    /**
+     * A pointer to the current callbacks instance (the Activity).
+     */
+    private NavigationDrawerCallbacks mCallbacks;
+
+    /**
+     * Helper component that ties the action bar to the navigation drawer.
+     */
+    private ActionBarDrawerToggle mDrawerToggle;
+
+    private DrawerLayout mDrawerLayout;
+    private ListView mDrawerListView;
+    private View mFragmentContainerView;
+
+    private int mCurrentSelectedPosition = 0;
+    private boolean mFromSavedInstanceState;
+    private boolean mUserLearnedDrawer;
+
+    public NavigationDrawerFragment() {
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // Read in the flag indicating whether or not the user has demonstrated awareness of the
+        // drawer. See PREF_USER_LEARNED_DRAWER for details.
+        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
+        mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);
+
+        if (savedInstanceState != null) {
+            mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION);
+            mFromSavedInstanceState = true;
+        }
+
+        // Select either the default item (0) or the last selected item.
+        selectItem(mCurrentSelectedPosition);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        // Indicate that this fragment would like to influence the set of actions in the action bar.
+        setHasOptionsMenu(true);
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+                             Bundle savedInstanceState) {
+        mDrawerListView = (ListView) inflater.inflate(
+                R.layout.fragment_navigation_drawer, container, false);
+        mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+                selectItem(position);
+            }
+        });
+
+        List<HashMap<String, String>> aList = new ArrayList<HashMap<String, String>>();
+        HashMap<String, String> hm = new HashMap<String, String>();
+        hm.put("title", getString(R.string.home));
+        hm.put("icon", Integer.toString(R.drawable.ic_home));
+        aList.add(hm);
+
+        HashMap<String, String> hm1 = new HashMap<String, String>();
+        hm1.put("title", getString(R.string.service_list));
+        hm1.put("icon", Integer.toString(R.drawable.ic_inbox));
+        aList.add(hm1);
+
+        HashMap<String, String> hm2 = new HashMap<String, String>();
+        hm2.put("title", getString(R.string.live_list));
+        hm2.put("icon", Integer.toString(R.drawable.ic_list));
+        aList.add(hm2);
+
+        HashMap<String, String> hm3 = new HashMap<String, String>();
+        hm3.put("title", getString(R.string.stage_view));
+        hm3.put("icon", Integer.toString(R.drawable.ic_local_play));
+        aList.add(hm3);
+
+        HashMap<String, String> hm4 = new HashMap<String, String>();
+        hm4.put("title", getString(R.string.live_view));
+        hm4.put("icon", Integer.toString(R.drawable.ic_desktop_windows));
+        aList.add(hm4);
+
+        // Keys used in Hashmap
+        String[] from = {"icon", "title"};
+
+        // Ids of views in service_list_fragment
+        int[] to = {R.id.drawer_icon, R.id.drawer_text};
+
+        ListAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), aList,
+                R.layout.fragment_navigation_drawer_list, from, to);
+
+        mDrawerListView.setAdapter(adapter);
+        mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
+        return mDrawerListView;
+    }
+
+    public boolean isDrawerOpen() {
+        return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(mFragmentContainerView);
+    }
+
+    /**
+     * Users of this fragment must call this method to set up the navigation drawer interactions.
+     *
+     * @param fragmentId   The android:id of this fragment in its activity's layout.
+     * @param drawerLayout The DrawerLayout containing this fragment's UI.
+     */
+    public void setUp(int fragmentId, DrawerLayout drawerLayout) {
+        mFragmentContainerView = getActivity().findViewById(fragmentId);
+        mDrawerLayout = drawerLayout;
+
+        // set a custom shadow that overlays the main content when the drawer opens
+        mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
+        // set up the drawer's list view with items and click listener
+
+        ActionBar actionBar = getActionBar();
+        actionBar.setDisplayHomeAsUpEnabled(true);
+        actionBar.setHomeButtonEnabled(true);
+        actionBar.setBackgroundDrawable(new ColorDrawable(0xFF000000));
+
+        // ActionBarDrawerToggle ties together the the proper interactions
+        // between the navigation drawer and the action bar app icon.
+        mDrawerToggle = new ActionBarDrawerToggle(
+                getActivity(),                    /* host Activity */
+                mDrawerLayout,                    /* DrawerLayout object */
+                R.drawable.ic_drawer,             /* nav drawer image to replace 'Up' caret */
+                R.string.navigation_drawer_open,  /* "open drawer" description for accessibility */
+                R.string.navigation_drawer_close  /* "close drawer" description for accessibility */
+        ) {
+            @Override
+            public void onDrawerClosed(View drawerView) {
+                super.onDrawerClosed(drawerView);
+                if (!isAdded()) {
+                    return;
+                }
+
+                getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
+            }
+
+            @Override
+            public void onDrawerOpened(View drawerView) {
+                super.onDrawerOpened(drawerView);
+                if (!isAdded()) {
+                    return;
+                }
+
+                if (!mUserLearnedDrawer) {
+                    // The user manually opened the drawer; store this flag to prevent auto-showing
+                    // the navigation drawer automatically in the future.
+                    mUserLearnedDrawer = true;
+                    SharedPreferences sp = PreferenceManager
+                            .getDefaultSharedPreferences(getActivity());
+                    sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
+                }
+
+                getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu()
+            }
+        };
+
+        // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
+        // per the navigation drawer design guidelines.
+        if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
+            mDrawerLayout.openDrawer(mFragmentContainerView);
+        }
+
+        // Defer code dependent on restoration of previous instance state.
+        mDrawerLayout.post(new Runnable() {
+            @Override
+            public void run() {
+                mDrawerToggle.syncState();
+            }
+        });
+
+        mDrawerLayout.setDrawerListener(mDrawerToggle);
+    }
+
+    private void selectItem(int position) {
+        mCurrentSelectedPosition = position;
+        if (mDrawerListView != null) {
+            mDrawerListView.setItemChecked(position, true);
+        }
+        if (mDrawerLayout != null) {
+            mDrawerLayout.closeDrawer(mFragmentContainerView);
+        }
+        if (mCallbacks != null) {
+            mCallbacks.onNavigationDrawerItemSelected(position);
+        }
+    }
+
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
+        try {
+            mCallbacks = (NavigationDrawerCallbacks) activity;
+        } catch (ClassCastException e) {
+            throw new ClassCastException("Activity must implement NavigationDrawerCallbacks.");
+        }
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+        mCallbacks = null;
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition);
+    }
+
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        // Forward the new configuration the drawer toggle component.
+        mDrawerToggle.onConfigurationChanged(newConfig);
+    }
+
+    @Override
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        // If the drawer is open, show the global app actions in the action bar. See also
+        // showGlobalContextActionBar, which controls the top-left area of the action bar.
+        if (mDrawerLayout != null && isDrawerOpen()) {
+            inflater.inflate(R.menu.global, menu);
+            showGlobalContextActionBar();
+        }
+        super.onCreateOptionsMenu(menu, inflater);
+    }
+
+    @Override
+    public boolean onOptionsItemSelected(MenuItem item) {
+        if (mDrawerToggle.onOptionsItemSelected(item)) {
+            return true;
+        }
+
+        return super.onOptionsItemSelected(item);
+    }
+
+    /**
+     * Per the navigation drawer design guidelines, updates the action bar to show the global app
+     * 'context', rather than just what's in the current screen.
+     */
+    private void showGlobalContextActionBar() {
+        ActionBar actionBar = getActionBar();
+        actionBar.setDisplayShowTitleEnabled(true);
+        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+        actionBar.setTitle(R.string.app_name);
+    }
+
+    private ActionBar getActionBar() {
+        return ((ActionBarActivity) getActivity()).getSupportActionBar();
+    }
+
+    /**
+     * Callbacks interface that all activities using this fragment must implement.
+     */
+    public static interface NavigationDrawerCallbacks {
+        /**
+         * Called when an item in the navigation drawer is selected.
+         */
+        void onNavigationDrawerItemSelected(int position);
+    }
+}

=== added file 'app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java'
--- app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,202 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.fragments;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.util.Log;
+import android.util.TypedValue;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.*;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.openlp.android2.OpenLP;
+import org.openlp.android2.R;
+
+import org.openlp.android2.api.Api;
+import org.openlp.android2.common.JsonHelpers;
+import org.openlp.android2.common.NavigationOptions;
+import org.openlp.android2.common.OpenLPFragment;
+import org.openlp.android2.common.OpenLPHttpClient;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+
+public class ServiceListFragment extends OpenLPFragment {
+
+    private final String LOG_TAG = ServiceListFragment.class.getName();
+    private boolean noScreenUpdate = false;
+    private boolean isDoubleClick = false;
+
+    public ServiceListFragment() {
+    }
+
+    public static ServiceListFragment newInstance() {
+        ServiceListFragment fragment = new ServiceListFragment();
+        return fragment;
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        context = getActivity();
+        noScreenUpdate = false;
+        isDoubleClick = false;
+        updateUrl = Api.SERVICE_LIST;
+        httpClient = new OpenLPHttpClient(context);
+        return super.onCreateView(inflater, container, savedInstanceState);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        AdapterView.OnItemLongClickListener listener = new AdapterView.OnItemLongClickListener() {
+            @Override
+            public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int position, long id) {
+                Toast.makeText(getActivity().getBaseContext(), "Long Clicked ", Toast.LENGTH_SHORT).show();
+                itemClicked(position);
+                noScreenUpdate = true;
+                isDoubleClick = true;
+                ((OpenLP) getActivity()).setMenuActive();
+                ((OpenLP) getActivity()).onNavigationDrawerItemSelected(NavigationOptions.LiveList);
+                ((OpenLP) getActivity()).restoreActionBar();
+                return false;
+            }
+        };
+        getListView().setOnItemLongClickListener(listener);
+    }
+
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
+    }
+
+    @Override
+    public void onDetach() {
+        super.onDetach();
+    }
+
+    @Override
+    public void refreshDisplay(){
+        Log.d(LOG_TAG, "Resuming...");
+        triggerTextRequest(Api.SERVICE_LIST);
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        Log.d(LOG_TAG, "Resuming...");
+        triggerTextRequest(Api.SERVICE_LIST);
+        Log.d(LOG_TAG, "Resumed...");
+    }
+
+    public void processUpdate(String response) {
+        triggerTextRequest(Api.SERVICE_LIST);
+    }
+
+    @Override
+    public void populateDisplay(String json) {
+        Log.i(LOG_TAG, "populate_display - entry");
+        if (noScreenUpdate || isDoubleClick) {
+            noScreenUpdate = false;
+            return;
+        }
+        List<HashMap<String, String>> aList = new ArrayList<HashMap<String, String>>();
+
+        try {
+            JSONArray items = new JSONObject(json).getJSONObject("results").getJSONArray("items");
+
+            for (int i = 0; i < items.length(); ++i) {
+                JSONObject item = items.getJSONObject(i);
+
+                HashMap<String, String> hm = new HashMap<String, String>();
+                if (item.getString("plugin").equals("songs")) {
+                    hm.put("icon", Integer.toString(R.drawable.ic_my_library_music));
+                } else if (item.getString("plugin").equals("bibles")) {
+                    hm.put("icon", Integer.toString(R.drawable.ic_my_library_books));
+                } else if (item.getString("plugin").equals("media")) {
+                    hm.put("icon", Integer.toString(R.drawable.ic_local_movies));
+                } else if (item.getString("plugin").equals("presentations")) {
+                    hm.put("icon", Integer.toString(R.drawable.ic_video_collection));
+                } else if (item.getString("plugin").equals("images")) {
+                    hm.put("icon", Integer.toString(R.drawable.ic_image));
+                } else {
+                    hm.put("icon", Integer.toString(R.drawable.ic_edit));
+                }
+
+                hm.put("title", item.getString("title"));
+                aList.add(hm);
+            }
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+        // Keys used in Hashmap
+        String[] from = {"icon", "title"};
+
+        // Ids of views in service_list_fragment
+        int[] to = {R.id.icon, R.id.serviceListText};
+
+        SharedPreferences prefs = context.getSharedPreferences(
+                context.getString(R.string.key_shared_preferences),
+                Context.MODE_PRIVATE);
+
+        final int size = Integer.parseInt(prefs.getString(
+                context.getString(R.string.key_text_size),
+                String.valueOf(context.getResources().getInteger(
+                        R.integer.textSizeDefaultValue))));
+
+        // Instantiating an adapter to store each items
+        ListAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), aList,
+                R.layout.fragment_service_list, from, to) {
+            public View getView(int position, View convertView, ViewGroup parent) {
+                View view = super.getView(position, convertView, parent);
+                TextView text1 = (TextView) view.findViewById(R.id.serviceListText);
+                text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
+                return view;
+
+            }
+        };
+        setListAdapter(adapter);
+        Log.i(LOG_TAG, "populate_display - exit");
+    }
+
+    public void itemClicked(int position) {
+        try {
+            noScreenUpdate = true;
+            String request = JsonHelpers.createRequestJSON("id", Integer.toString(position));
+            triggerTextRequest(String.format("%s%s", Api.SERVICE_SET, request));
+            String message = String.format("Setting list data. apiBase(%s), position(%s)",
+                    Api.SERVICE_SET, position);
+            Log.d(LOG_TAG, message);
+            Toast.makeText(context, "Service Item selected", Toast.LENGTH_SHORT).show();
+        } catch (JsonHelpers.JSONHandlerException e) {
+            e.printStackTrace();
+            Toast.makeText(context, "Request Failed", Toast.LENGTH_SHORT).show();
+        }
+    }
+
+}

=== added file 'app/src/main/java/org/openlp/android2/fragments/StageWebFragment.java'
--- app/src/main/java/org/openlp/android2/fragments/StageWebFragment.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/fragments/StageWebFragment.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,34 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.fragments;
+
+import org.openlp.android2.api.Api;
+
+public class StageWebFragment extends WebFragment {
+
+    public StageWebFragment(){
+        super();
+        curURL = Api.STAGE_VIEW;
+    }
+
+
+    public static StageWebFragment newInstance() {
+        return new StageWebFragment();
+    }
+}

=== added file 'app/src/main/java/org/openlp/android2/fragments/WebFragment.java'
--- app/src/main/java/org/openlp/android2/fragments/WebFragment.java	1970-01-01 00:00:00 +0000
+++ app/src/main/java/org/openlp/android2/fragments/WebFragment.java	2015-02-14 09:49:11 +0000
@@ -0,0 +1,85 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2015 OpenLP Android Developers                           *
+ * --------------------------------------------------------------------------- *
+ * This program is free software; you can redistribute it and/or modify it     *
+ * under the terms of the GNU General Public License as published by the Free  *
+ * Software Foundation; version 2 of the License.                              *
+ *                                                                             *
+ * This program is distributed in the hope that it will be useful, but WITHOUT *
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       *
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    *
+ * more details.                                                               *
+ *                                                                             *
+ * You should have received a copy of the GNU General Public License along     *
+ * with this program; if not, write to the Free Software Foundation, Inc., 59  *
+ * Temple Place, Suite 330, Boston, MA 02111-1307 USA                          *
+ *******************************************************************************/
+package org.openlp.android2.fragments;
+
+import android.app.Fragment;
+import android.net.http.SslError;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.SslErrorHandler;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import org.openlp.android2.R;
+import org.openlp.android2.common.OpenLPHttpClient;
+
+public class WebFragment extends Fragment {
+
+    protected String curURL;
+    private OpenLPHttpClient httpClient;
+    private WebView webview;
+
+    public WebFragment(){
+        super();
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
+        httpClient = new OpenLPHttpClient(getActivity());
+        View view = inflater.inflate(R.layout.fragment_web, container, false);
+
+        if (curURL != null) {
+            webview = (WebView) view.findViewById(R.id.webPage);
+            webview.getSettings().setJavaScriptEnabled(true);
+            webview.getSettings().setBuiltInZoomControls(true);
+            webview.getSettings().setLoadWithOverviewMode(true);
+            webview.getSettings().setUseWideViewPort(true);
+            webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
+            webview.setScrollbarFadingEnabled(true);
+            webview.setWebViewClient(new webClient());
+            webview.loadUrl(String.format("%s%s", httpClient.getBaseUrl(), curURL));
+        }
+        return view;
+    }
+
+    @Override
+    public void onDestroyView() {
+        if (webview != null) {
+            webview.destroy();
+        }
+        super.onDestroyView();
+    }
+
+    private class webClient extends WebViewClient {
+        @Override
+        public boolean shouldOverrideUrlLoading(WebView view, String url) {
+            return false;
+        }
+        @Override
+        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+            handler.proceed(); // Ignore SSL certificate errors
+        }
+    }
+}

=== added directory 'app/src/main/res'
=== added directory 'app/src/main/res/drawable'
=== added directory 'app/src/main/res/drawable-hdpi'
=== added file 'app/src/main/res/drawable-hdpi/drawer_shadow.9.png'
Binary files app/src/main/res/drawable-hdpi/drawer_shadow.9.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/drawer_shadow.9.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_alarm_add.png'
Binary files app/src/main/res/drawable-hdpi/ic_alarm_add.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_alarm_add.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_arrow_back.png'
Binary files app/src/main/res/drawable-hdpi/ic_arrow_back.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_arrow_back.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_desktop_windows.png'
Binary files app/src/main/res/drawable-hdpi/ic_desktop_windows.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_desktop_windows.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_drawer.png'
Binary files app/src/main/res/drawable-hdpi/ic_drawer.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_drawer.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_edit.png'
Binary files app/src/main/res/drawable-hdpi/ic_edit.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_edit.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_home.png'
Binary files app/src/main/res/drawable-hdpi/ic_home.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_home.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_image.png'
Binary files app/src/main/res/drawable-hdpi/ic_image.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_image.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_inbox.png'
Binary files app/src/main/res/drawable-hdpi/ic_inbox.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_inbox.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_launcher.png'
Binary files app/src/main/res/drawable-hdpi/ic_launcher.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_launcher.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_list.png'
Binary files app/src/main/res/drawable-hdpi/ic_list.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_list.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_local_movies.png'
Binary files app/src/main/res/drawable-hdpi/ic_local_movies.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_local_movies.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_local_play.png'
Binary files app/src/main/res/drawable-hdpi/ic_local_play.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_local_play.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_my_library_books.png'
Binary files app/src/main/res/drawable-hdpi/ic_my_library_books.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_my_library_books.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_my_library_music.png'
Binary files app/src/main/res/drawable-hdpi/ic_my_library_music.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_my_library_music.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_refresh.png'
Binary files app/src/main/res/drawable-hdpi/ic_refresh.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_refresh.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_search.png'
Binary files app/src/main/res/drawable-hdpi/ic_search.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_search.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_settings_display.png'
Binary files app/src/main/res/drawable-hdpi/ic_settings_display.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_settings_display.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/ic_video_collection.png'
Binary files app/src/main/res/drawable-hdpi/ic_video_collection.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/ic_video_collection.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-hdpi/openlp_splash_screen.png'
Binary files app/src/main/res/drawable-hdpi/openlp_splash_screen.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-hdpi/openlp_splash_screen.png	2015-02-14 09:49:11 +0000 differ
=== added directory 'app/src/main/res/drawable-mdpi'
=== added file 'app/src/main/res/drawable-mdpi/drawer_shadow.9.png'
Binary files app/src/main/res/drawable-mdpi/drawer_shadow.9.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/drawer_shadow.9.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_alarm_add.png'
Binary files app/src/main/res/drawable-mdpi/ic_alarm_add.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_alarm_add.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_arrow_back.png'
Binary files app/src/main/res/drawable-mdpi/ic_arrow_back.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_arrow_back.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_desktop_windows.png'
Binary files app/src/main/res/drawable-mdpi/ic_desktop_windows.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_desktop_windows.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_drawer.png'
Binary files app/src/main/res/drawable-mdpi/ic_drawer.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_drawer.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_edit.png'
Binary files app/src/main/res/drawable-mdpi/ic_edit.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_edit.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_home.png'
Binary files app/src/main/res/drawable-mdpi/ic_home.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_home.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_image.png'
Binary files app/src/main/res/drawable-mdpi/ic_image.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_image.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_inbox.png'
Binary files app/src/main/res/drawable-mdpi/ic_inbox.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_inbox.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_launcher.png'
Binary files app/src/main/res/drawable-mdpi/ic_launcher.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_launcher.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_list.png'
Binary files app/src/main/res/drawable-mdpi/ic_list.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_list.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_local_movies.png'
Binary files app/src/main/res/drawable-mdpi/ic_local_movies.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_local_movies.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_local_play.png'
Binary files app/src/main/res/drawable-mdpi/ic_local_play.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_local_play.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_my_library_books.png'
Binary files app/src/main/res/drawable-mdpi/ic_my_library_books.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_my_library_books.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_my_library_music.png'
Binary files app/src/main/res/drawable-mdpi/ic_my_library_music.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_my_library_music.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_refresh.png'
Binary files app/src/main/res/drawable-mdpi/ic_refresh.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_refresh.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_search.png'
Binary files app/src/main/res/drawable-mdpi/ic_search.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_search.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_settings_display.png'
Binary files app/src/main/res/drawable-mdpi/ic_settings_display.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_settings_display.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-mdpi/ic_video_collection.png'
Binary files app/src/main/res/drawable-mdpi/ic_video_collection.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-mdpi/ic_video_collection.png	2015-02-14 09:49:11 +0000 differ
=== added directory 'app/src/main/res/drawable-xhdpi'
=== added file 'app/src/main/res/drawable-xhdpi/drawer_shadow.9.png'
Binary files app/src/main/res/drawable-xhdpi/drawer_shadow.9.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/drawer_shadow.9.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_alarm_add.png'
Binary files app/src/main/res/drawable-xhdpi/ic_alarm_add.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_alarm_add.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_arrow_back.png'
Binary files app/src/main/res/drawable-xhdpi/ic_arrow_back.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_arrow_back.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_desktop_windows.png'
Binary files app/src/main/res/drawable-xhdpi/ic_desktop_windows.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_desktop_windows.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_drawer.png'
Binary files app/src/main/res/drawable-xhdpi/ic_drawer.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_drawer.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_edit.png'
Binary files app/src/main/res/drawable-xhdpi/ic_edit.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_edit.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_home.png'
Binary files app/src/main/res/drawable-xhdpi/ic_home.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_home.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_image.png'
Binary files app/src/main/res/drawable-xhdpi/ic_image.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_image.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_inbox.png'
Binary files app/src/main/res/drawable-xhdpi/ic_inbox.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_inbox.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_launcher.png'
Binary files app/src/main/res/drawable-xhdpi/ic_launcher.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_launcher.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_list.png'
Binary files app/src/main/res/drawable-xhdpi/ic_list.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_list.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_local_movies.png'
Binary files app/src/main/res/drawable-xhdpi/ic_local_movies.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_local_movies.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_local_play.png'
Binary files app/src/main/res/drawable-xhdpi/ic_local_play.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_local_play.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_my_library_books.png'
Binary files app/src/main/res/drawable-xhdpi/ic_my_library_books.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_my_library_books.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_my_library_music.png'
Binary files app/src/main/res/drawable-xhdpi/ic_my_library_music.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_my_library_music.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_refresh.png'
Binary files app/src/main/res/drawable-xhdpi/ic_refresh.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_refresh.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_search.png'
Binary files app/src/main/res/drawable-xhdpi/ic_search.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_search.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_settings_display.png'
Binary files app/src/main/res/drawable-xhdpi/ic_settings_display.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_settings_display.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xhdpi/ic_video_collection.png'
Binary files app/src/main/res/drawable-xhdpi/ic_video_collection.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xhdpi/ic_video_collection.png	2015-02-14 09:49:11 +0000 differ
=== added directory 'app/src/main/res/drawable-xxhdpi'
=== added file 'app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png'
Binary files app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_alarm_add.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_alarm_add.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_alarm_add.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_arrow_back.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_arrow_back.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_arrow_back.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_desktop_windows.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_desktop_windows.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_desktop_windows.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_drawer.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_drawer.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_drawer.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_edit.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_edit.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_edit.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_home.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_home.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_home.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_image.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_image.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_image.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_inbox.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_inbox.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_inbox.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_launcher.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_launcher.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_launcher.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_list.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_list.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_list.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_local_movies.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_local_movies.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_local_movies.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_local_play.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_local_play.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_local_play.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_my_library_books.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_my_library_books.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_my_library_books.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_my_library_music.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_my_library_music.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_my_library_music.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_refresh.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_refresh.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_refresh.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_search.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_search.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_search.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_settings_display.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_settings_display.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_settings_display.png	2015-02-14 09:49:11 +0000 differ
=== added file 'app/src/main/res/drawable-xxhdpi/ic_video_collection.png'
Binary files app/src/main/res/drawable-xxhdpi/ic_video_collection.png	1970-01-01 00:00:00 +0000 and app/src/main/res/drawable-xxhdpi/ic_video_collection.png	2015-02-14 09:49:11 +0000 differ
=== added directory 'app/src/main/res/layout'
=== added directory 'app/src/main/res/layout-xlarge'
=== added file 'app/src/main/res/layout-xlarge/fragment_livelist_list.xml'
--- app/src/main/res/layout-xlarge/fragment_livelist_list.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout-xlarge/fragment_livelist_list.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android";
+        android:id="@+id/fragment_live_list_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="horizontal"
+        android:smoothScrollbar="true"
+        android:clickable="false"
+        android:longClickable="false">
+    <TextView
+            android:id="@+id/tag"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:textSize="14sp"
+            android:paddingTop="10dp"
+            android:paddingRight="5dp"
+            android:paddingLeft="5dp"
+            android:paddingBottom="10dp"
+            android:layout_weight="1"/>
+    <TextView
+            android:id="@+id/liveListNormal"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:textColor="#ff2a2a2a"
+            android:textSize="14sp"
+            android:paddingTop="10dp"
+            android:paddingBottom="10dp"
+            android:textStyle="normal"
+            android:layout_weight="1"/>
+    <TextView
+            android:id="@+id/liveListSelected"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:textColor="#000000"
+            android:textSize="14sp"
+            android:paddingTop="10dp"
+            android:paddingBottom="10dp"
+            android:textStyle="bold|italic"
+            android:layout_weight="1"/>
+</LinearLayout>

=== added file 'app/src/main/res/layout/activity_main.xml'
--- app/src/main/res/layout/activity_main.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/activity_main.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,31 @@
+<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
+<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:tools="http://schemas.android.com/tools";
+    android:id="@+id/drawer_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".MainActivity">
+
+    <!-- As the main content view, the view below consumes the entire
+         space available using match_parent in both dimensions. -->
+    <FrameLayout
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+    <!-- android:layout_gravity="start" tells DrawerLayout to treat
+         this as a sliding drawer on the left side for left-to-right
+         languages and on the right side for right-to-left languages.
+         If you're not building against API 17 or higher, use
+         android:layout_gravity="left" instead. -->
+    <!-- The drawer is given a fixed width in dp and extends the full height of
+         the container. -->
+    <fragment
+        android:id="@+id/navigation_drawer"
+        android:name="org.openlp.android2.fragments.NavigationDrawerFragment"
+        android:layout_width="@dimen/navigation_drawer_width"
+        android:layout_height="match_parent"
+        android:layout_gravity="start"
+        tools:layout="@layout/fragment_navigation_drawer" />
+
+</android.support.v4.widget.DrawerLayout>

=== added file 'app/src/main/res/layout/activity_open_lp.xml'
--- app/src/main/res/layout/activity_open_lp.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/activity_open_lp.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,31 @@
+<!-- A DrawerLayout is intended to be used as the top-level content view using match_parent for both width and height to consume the full space available. -->
+<android.support.v4.widget.DrawerLayout
+    xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:tools="http://schemas.android.com/tools";
+    android:id="@+id/drawer_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".OpenLP">
+
+    <!-- As the main content view, the view below consumes the entire
+         space available using match_parent in both dimensions. -->
+    <FrameLayout
+        android:id="@+id/container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+    <!-- android:layout_gravity="start" tells DrawerLayout to treat
+         this as a sliding drawer on the left side for left-to-right
+         languages and on the right side for right-to-left languages.
+         If you're not building against API 17 or higher, use
+         android:layout_gravity="left" instead. -->
+    <!-- The drawer is given a fixed width in dp and extends the full height of
+         the container. -->
+    <fragment android:id="@+id/navigation_drawer"
+        android:layout_width="@dimen/navigation_drawer_width"
+        android:layout_height="match_parent"
+        android:layout_gravity="start"
+        android:name="org.openlp.android2.fragments.NavigationDrawerFragment"
+        tools:layout="@layout/fragment_navigation_drawer" />
+
+</android.support.v4.widget.DrawerLayout>

=== added file 'app/src/main/res/layout/alert_display_dialog.xml'
--- app/src/main/res/layout/alert_display_dialog.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/alert_display_dialog.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+
+              android:orientation="vertical"
+              android:layout_width="fill_parent"
+              android:layout_height="fill_parent"
+              android:weightSum="1">
+
+    <TextView
+            android:layout_width="294dp"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:text="@string/enter_alert_text"
+            android:id="@+id/textView"
+            android:inputType="textLongMessage"
+            android:textStyle="bold|italic"
+            android:textSize="40px"
+            android:height="45px"/>
+
+    <EditText
+            android:id="@+id/alertText"
+            android:layout_width="290dp"
+            android:layout_height="wrap_content"/>
+</LinearLayout>
\ No newline at end of file

=== added file 'app/src/main/res/layout/blank_display_dialog.xml'
--- app/src/main/res/layout/blank_display_dialog.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/blank_display_dialog.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+
+              android:orientation="vertical"
+              android:layout_width="fill_parent"
+              android:layout_height="fill_parent"
+              android:weightSum="1">
+
+    <TextView
+            android:layout_width="294dp"
+            android:layout_height="wrap_content"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:text="@string/display_blank_summary"
+            android:id="@+id/textView"
+            android:textStyle="bold|italic"
+            android:textSize="40px"
+            android:height="45px"/>
+    <Button
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/display_reset"
+            android:id="@+id/buttonReset"
+            android:textSize="20sp"
+            android:height="40dp"
+            android:clickable="true"/>
+    <Button
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/display_screen"
+            android:id="@+id/buttonScreen"
+            android:textSize="20sp"
+            android:height="40dp"
+            android:clickable="true"/>
+    <Button
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/display_theme"
+            android:id="@+id/buttonTheme"
+            android:textSize="20sp"
+            android:height="40dp"
+            android:clickable="true"/>
+    <Button
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/display_desktop"
+            android:id="@+id/buttonDesktop"
+            android:textSize="20sp"
+            android:height="40dp"
+            android:clickable="true"/>
+
+</LinearLayout>
\ No newline at end of file

=== added file 'app/src/main/res/layout/fragment_about.xml'
--- app/src/main/res/layout/fragment_about.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_about.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,9 @@
+<TextView xmlns:android="http://schemas.android.com/apk/res/android";
+           android:id="@+id/about_text"
+           android:layout_width="fill_parent"
+           android:layout_height="fill_parent"
+           android:background="#000000"
+           android:gravity="center"
+           android:linksClickable="true"
+           android:padding="32dp"
+    android:textColor="#ffffffff" />
\ No newline at end of file

=== added file 'app/src/main/res/layout/fragment_home.xml'
--- app/src/main/res/layout/fragment_home.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_home.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,22 @@
+<!--
+  Copyright 2013 The Android Open Source Project
+
+  Licensed 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.
+  -->
+
+<ImageView xmlns:android="http://schemas.android.com/apk/res/android";
+           android:id="@+id/home_image"
+           android:layout_width="match_parent"
+           android:layout_height="match_parent"
+           android:gravity="center"
+           android:padding="32dp"/>
\ No newline at end of file

=== added file 'app/src/main/res/layout/fragment_livelist_grid.xml'
--- app/src/main/res/layout/fragment_livelist_grid.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_livelist_grid.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:tools="http://schemas.android.com/tools";
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="org.openlp.android2.fragments.LiveListFragment">
+
+    <GridView
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:numColumns="2" />
+
+    <LinearLayout
+            xmlns:android="http://schemas.android.com/apk/res/android";
+            android:id="@+id/fragment_live_list_layout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="horizontal"
+            android:smoothScrollbar="true"
+            android:clickable="false"
+            android:longClickable="false">
+        <TextView
+                android:id="@+id/tag"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:textSize="14sp"
+                android:paddingTop="10dp"
+                android:paddingRight="5dp"
+                android:paddingLeft="5dp"
+                android:paddingBottom="10dp"
+                android:layout_weight="1"/>
+        <TextView
+                android:id="@+id/liveListNormal"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:textColor="#ff2a2a2a"
+                android:textSize="14sp"
+                android:paddingTop="10dp"
+                android:paddingBottom="10dp"
+                android:textStyle="normal"
+                android:layout_weight="1"/>
+    </LinearLayout>
+
+</FrameLayout>

=== added file 'app/src/main/res/layout/fragment_livelist_list.xml'
--- app/src/main/res/layout/fragment_livelist_list.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_livelist_list.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android";
+        android:id="@+id/fragment_live_list_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="horizontal"
+        android:smoothScrollbar="true"
+        android:clickable="false"
+        android:longClickable="false">
+    <TextView
+            android:id="@+id/tag"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:textSize="14sp"
+            android:paddingTop="10dp"
+            android:paddingRight="5dp"
+            android:paddingLeft="5dp"
+            android:paddingBottom="10dp"
+            android:layout_weight="1"/>
+    <TextView
+            android:id="@+id/liveListNormal"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:textColor="#ff2a2a2a"
+            android:textSize="14sp"
+            android:paddingTop="10dp"
+            android:paddingBottom="10dp"
+            android:textStyle="normal"
+            android:layout_weight="1"/>
+    <TextView
+            android:id="@+id/liveListSelected"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:textColor="#000000"
+            android:textSize="14sp"
+            android:paddingTop="10dp"
+            android:paddingBottom="10dp"
+            android:textStyle="bold|italic"
+            android:layout_weight="1"/>
+</LinearLayout>

=== added file 'app/src/main/res/layout/fragment_main.xml'
--- app/src/main/res/layout/fragment_main.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_main.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,12 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:tools="http://schemas.android.com/tools"; android:layout_width="match_parent"
+    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
+    android:paddingRight="@dimen/activity_horizontal_margin"
+    android:paddingTop="@dimen/activity_vertical_margin"
+    android:paddingBottom="@dimen/activity_vertical_margin"
+    tools:context=".MainActivity$PlaceholderFragment">
+
+    <TextView android:id="@+id/section_label" android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+</RelativeLayout>

=== added file 'app/src/main/res/layout/fragment_navigation_drawer.xml'
--- app/src/main/res/layout/fragment_navigation_drawer.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_navigation_drawer.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,5 @@
+<ListView xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:tools="http://schemas.android.com/tools"; android:layout_width="match_parent"
+    android:layout_height="match_parent" android:choiceMode="singleChoice"
+    android:divider="@android:color/transparent" android:dividerHeight="0dp"
+    android:background="#cccc" tools:context=".NavigationDrawerFragment" />

=== added file 'app/src/main/res/layout/fragment_navigation_drawer_list.xml'
--- app/src/main/res/layout/fragment_navigation_drawer_list.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_navigation_drawer_list.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2010 The Android Open Source Project
+     Licensed 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.
+-->
+<RelativeLayout
+        xmlns:android="http://schemas.android.com/apk/res/android";
+        android:id="@+id/fragment_navigation_drawer_layout"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="horizontal"
+        android:smoothScrollbar="true"
+        android:clickable="false"
+        android:longClickable="false">
+
+    <ImageView
+            android:id="@+id/drawer_icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingTop="10dp"
+            android:paddingRight="5dp"
+            android:paddingLeft="5dp"
+            android:paddingStart="5dp"
+            android:paddingEnd="5dp"
+            android:paddingBottom="10dp"/>
+
+    <TextView
+            android:id="@+id/drawer_text"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="center_vertical"
+            android:textColor="#000000"
+            android:minHeight="?android:attr/listPreferredItemHeightSmall"
+            android:textAppearance="?android:attr/textAppearanceLarge"
+            android:paddingTop="20dp"
+            android:paddingRight="5dp"
+            android:paddingLeft="55dp"
+            android:paddingStart="55dp"
+            android:paddingEnd="5dp"
+            android:paddingBottom="10dp"/>
+
+
+</RelativeLayout>
\ No newline at end of file

=== added file 'app/src/main/res/layout/fragment_service_list.xml'
--- app/src/main/res/layout/fragment_service_list.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_service_list.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android";
+        android:id="@+id/fragmentservicelist"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="horizontal"
+        android:smoothScrollbar="true"
+        android:clickable="false"
+        android:longClickable="false"
+        >
+    <ImageView
+            android:id="@+id/icon"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:paddingTop="10dp"
+            android:paddingRight="5dp"
+            android:paddingEnd="5dp"
+            android:paddingLeft="5dp"
+            android:paddingBottom="10dp"
+            />
+    <TextView
+            android:id="@+id/serviceListText"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textStyle="bold"
+            android:textColor="#000000"
+            android:textSize="14sp"
+            android:paddingTop="10dp"
+            android:paddingRight="5dp"
+            android:paddingLeft="5dp"
+            android:paddingEnd="5dp"
+            android:paddingBottom="10dp"
+            />
+</LinearLayout>

=== added file 'app/src/main/res/layout/fragment_servicelist_grid.xml'
--- app/src/main/res/layout/fragment_servicelist_grid.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_servicelist_grid.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:tools="http://schemas.android.com/tools";
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="org.openlp.android2.fragments.ServiceListFragment">
+
+    <GridView
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:numColumns="2" />
+
+    <TextView
+        android:id="@android:id/empty"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center" />
+
+</FrameLayout>

=== added file 'app/src/main/res/layout/fragment_servicelist_list.xml'
--- app/src/main/res/layout/fragment_servicelist_list.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_servicelist_list.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:tools="http://schemas.android.com/tools";
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context="org.openlp.android2.fragments.ServiceListFragment">
+
+    <ListView
+        android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+    <TextView
+        android:id="@android:id/empty"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center" />
+
+</FrameLayout>

=== added file 'app/src/main/res/layout/fragment_web.xml'
--- app/src/main/res/layout/fragment_web.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/layout/fragment_web.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+              android:layout_width="fill_parent"
+              android:layout_height="fill_parent"
+              android:baselineAligned="false">
+    <WebView
+            android:id="@+id/webPage"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent" />
+
+</LinearLayout>
\ No newline at end of file

=== added directory 'app/src/main/res/menu'
=== added file 'app/src/main/res/menu/global.xml'
--- app/src/main/res/menu/global.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/menu/global.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,5 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:app="http://schemas.android.com/apk/res-auto";>
+    <item android:id="@+id/action_settings" android:title="@string/action_settings"
+        android:orderInCategory="100" app:showAsAction="never" />
+</menu>

=== added file 'app/src/main/res/menu/open_l.xml'
--- app/src/main/res/menu/open_l.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/menu/open_l.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,37 @@
+<menu xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:app="http://schemas.android.com/apk/res-auto";>
+    <item android:id="@+id/action_back"
+          android:checkable="true"
+          android:visible="false"
+          android:icon="@drawable/ic_arrow_back"
+          android:title="@string/action_back"
+          app:showAsAction="ifRoom" />
+    <item android:id="@+id/action_blank"
+          android:checkable="true"
+          android:visible="true"
+          android:icon="@drawable/ic_settings_display"
+          android:title="@string/action_blank"
+          app:showAsAction="ifRoom" />
+    <item android:id="@+id/action_alert"
+          android:checkable="true"
+          android:visible="true"
+          android:icon="@drawable/ic_alarm_add"
+          android:title="@string/action_alert"
+          app:showAsAction="ifRoom" />
+    <item android:id="@+id/action_refresh"
+          android:icon="@drawable/ic_refresh"
+          android:title="@string/action_refresh"
+          app:showAsAction="ifRoom" />
+    <item android:id="@+id/action_search"
+          android:icon="@drawable/ic_search"
+          android:title="@string/action_search"
+          app:showAsAction="never|withText" />
+    <item android:id="@+id/action_preferences"
+          android:icon="@android:drawable/ic_menu_preferences"
+          android:title="@string/action_preferences"
+          app:showAsAction="never|withText" />
+    <item android:id="@+id/action_about"
+          android:icon="@android:drawable/ic_menu_preferences"
+          android:title="@string/action_about"
+          app:showAsAction="never|withText" />
+</menu>

=== added directory 'app/src/main/res/values'
=== added directory 'app/src/main/res/values-w820dp'
=== added file 'app/src/main/res/values-w820dp/dimens.xml'
--- app/src/main/res/values-w820dp/dimens.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/values-w820dp/dimens.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,6 @@
+<resources>
+    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
+         (such as screen margins) for screens with more than 820dp of available width. This
+         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
+    <dimen name="activity_horizontal_margin">64dp</dimen>
+</resources>

=== added file 'app/src/main/res/values/backgroundTimeouts.xml'
--- app/src/main/res/values/backgroundTimeouts.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/values/backgroundTimeouts.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,22 @@
+<resources>
+	<string-array name="backgroundTimeEntries">
+		<item>@string/none</item>
+		<item>1</item>
+		<item>2</item>
+		<item>5</item>
+		<item>10</item>
+		<item>15</item>
+		<item>20</item>
+		<item>30</item>
+	</string-array>
+	<string-array name="backgroundTimeValues">
+		<item>0</item>
+		<item>1000</item>
+		<item>2000</item>
+		<item>5000</item>
+		<item>10000</item>
+		<item>15000</item>
+		<item>20000</item>
+		<item>30000</item>
+	</string-array>
+</resources>

=== added file 'app/src/main/res/values/defaultValues.xml'
--- app/src/main/res/values/defaultValues.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/values/defaultValues.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,11 @@
+<resources>
+    <!-- STRING -->
+    <string name="host_default_value">192.168.0.1</string>
+    <string name="port_default_value">4316</string>
+    <string name="userid_default_value">userid</string>
+    <string name="password_default_value">password</string>
+
+    <!-- INTEGER -->
+    <integer name="connectionTimeoutDefaultValue">3000</integer>
+    <integer name="textSizeDefaultValue">14</integer>
+</resources>

=== added file 'app/src/main/res/values/dimens.xml'
--- app/src/main/res/values/dimens.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/values/dimens.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,9 @@
+<resources>
+    <!-- Default screen margins, per the Android Design guidelines. -->
+    <dimen name="activity_horizontal_margin">16dp</dimen>
+    <dimen name="activity_vertical_margin">16dp</dimen>
+
+    <!-- Per the design guidelines, navigation drawers should be between 240dp and 320dp:
+         https://developer.android.com/design/patterns/navigation-drawer.html -->
+    <dimen name="navigation_drawer_width">240dp</dimen>
+</resources>

=== added file 'app/src/main/res/values/httpClientTimeoutValues.xml'
--- app/src/main/res/values/httpClientTimeoutValues.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/values/httpClientTimeoutValues.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,16 @@
+<resources>
+    <string-array name="socketValueEntries">
+		<item>3000</item>
+		<item>4000</item>
+		<item>5000</item>
+		<item>8000</item>
+		<item>10000</item>
+	</string-array>
+    <string-array name="socketValues">
+        <item>3000</item>
+        <item>4000</item>
+        <item>5000</item>
+        <item>8000</item>
+        <item>10000</item>
+    </string-array>
+</resources>
\ No newline at end of file

=== added file 'app/src/main/res/values/keyStrings.xml'
--- app/src/main/res/values/keyStrings.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/values/keyStrings.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,12 @@
+<resources>
+    <string name="key_enable_custom_timeout">key_enable_custom_timeout</string>
+    <string name="key_connection_timeout">key_connection_timeout</string>
+    <string name="key_text_size">key_text_size</string>
+    <string name="key_host">key_host</string>
+    <string name="key_port">key_port</string>
+    <string name="key_userid">key_userid</string>
+    <string name="key_password">key_password</string>
+    <string name="key_shared_preferences">key_shared_preferences</string>
+	<string name="key_ssl_use">key_ssl_use</string>
+
+</resources>

=== added file 'app/src/main/res/values/refs.xml'
--- app/src/main/res/values/refs.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/values/refs.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <!--
+    Layout alias to replace the single-pane version of the layout with a
+    two-pane version on Large screens.
+
+    For more on layout aliases, see:
+    http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters
+    -->
+    <item name="fragment_servicelist" type="layout">@layout/fragment_servicelist_list</item>
+    <item name="fragment_livelist" type="layout">@layout/fragment_livelist_list</item>
+
+</resources>
\ No newline at end of file

=== added file 'app/src/main/res/values/strings.xml'
--- app/src/main/res/values/strings.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/values/strings.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="about_display_1">OpenLP is free church presentation software</string>
+    <string name="about_display_2">Find out more about visit the OpenLP website_</string>
+    <string name="about_display_4">Copyright</string>
+    <string name="about_display_5">Portions copyright</string>
+    <string name="about_display_6">License</string>
+    <string name="about_display_7">This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License_</string>
+    <string name="about_display_8">This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE_</string>
+    <string name="action_settings">Settings</string>
+    <string name="action_about">About</string>
+    <string name="action_alert">Alert</string>
+    <string name="action_back">Back</string>
+    <string name="action_blank">Toggle Display</string>
+    <string name="action_preferences">Preferences</string>
+    <string name="action_refresh">Refresh</string>
+    <string name="action_search">Search</string>
+    <string name="app_name">OpenLP</string>
+    <string name="cancel">Cancel</string>
+    <string name="connection_configuration">Configure Network</string>
+    <string name="connection_password">Password</string>
+    <string name="connection_profile">Server Details</string>
+    <string name="connection_profile_ssl_use">Use HTTPS</string>
+    <string name="connection_profile_ssl_summary">Specify whether HTTPS should be used</string>
+    <string name="connection_timeout">Connection Timeout</string>
+    <string name="connection_timeout_summary">Select a value (milliseconds)</string>
+    <string name="connection_userid">Userid</string>
+    <string name="custom_timeout">Set Custom Timeout</string>
+    <string name="display_blank_summary">Select the required blank type</string>
+    <string name="display_desktop">Blank display to Desktop</string>
+    <string name="display_reset">Reset Display</string>
+    <string name="display_screen">Blank display to Blank</string>
+    <string name="display_theme">Blank display to Theme</string>
+    <string name="enable_custom_timeouts">Enable Custom Timeouts</string>
+    <string name="enter_alert_text">Enter Alert Text</string>
+    <string name="home">Home</string>    
+    <string name="httpreturn_unauthorised">Unauthorised Access, please enter valid userid and password</string>
+    <string name="live_list">Live List</string>
+    <string name="live_view">LiveView</string>
+    <string name="navigation_drawer_open">Open navigation drawer</string>
+    <string name="navigation_drawer_close">Close navigation drawer</string>
+    <string name="none">None</string>
+    <string name="port">Port</string>
+    <string name="process">Process</string>
+    <string name="service_list">Service List</string>
+    <string name="stage_view">Stage View</string>
+    <string name="text_size_type">Display Text Size</string>
+    <string name="text_size">Select display text size</string>
+    <string name="text_size_summary">Change the Service text size</string>
+    <string name="title_activity_settings">Settings</string>
+    <string name="url_hint">Hostname or IP</string>
+    <string name="unable">Unable to process request - check network settings</string>
+</resources>

=== added file 'app/src/main/res/values/styles.xml'
--- app/src/main/res/values/styles.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/values/styles.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,8 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+    </style>
+
+</resources>

=== added file 'app/src/main/res/values/textSize.xml'
--- app/src/main/res/values/textSize.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/values/textSize.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,22 @@
+<resources>
+    <string-array name="textSizeValueEntries">
+		<item>6</item>
+		<item>8</item>
+		<item>10</item>
+		<item>12</item>
+		<item>14</item>
+		<item>16</item>
+		<item>18</item>
+		<item>20</item>		
+	</string-array>
+    <string-array name="textSizeValues">
+		<item>6</item>
+		<item>8</item>
+		<item>10</item>
+		<item>12</item>
+		<item>14</item>
+		<item>16</item>
+		<item>18</item>
+		<item>20</item>		
+	</string-array>	
+</resources>
\ No newline at end of file

=== added directory 'app/src/main/res/xml'
=== added file 'app/src/main/res/xml/pref_general.xml'
--- app/src/main/res/xml/pref_general.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/xml/pref_general.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,11 @@
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android";>
+
+    <ListPreference
+        android:key="key_text_size"
+        android:defaultValue="@integer/textSizeDefaultValue"
+        android:entries="@array/textSizeValueEntries"
+        android:entryValues="@array/textSizeValues"
+        android:summary="@string/text_size_summary"
+        android:title="@string/text_size" />
+
+</PreferenceScreen>

=== added file 'app/src/main/res/xml/pref_headers.xml'
--- app/src/main/res/xml/pref_headers.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/xml/pref_headers.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,14 @@
+<preference-headers xmlns:android="http://schemas.android.com/apk/res/android";>
+
+    <!-- These settings headers are only used on tablets. -->
+
+    <header
+        android:fragment="org.openlp.android2.activities.SettingsActivity$GeneralPreferenceFragment"
+        android:title="@string/text_size_type" />
+
+    <header
+        android:fragment="org.openlp.android2.activities.SettingsActivity$NotificationPreferenceFragment"
+        android:title="@string/connection_configuration" />
+
+
+</preference-headers>

=== added file 'app/src/main/res/xml/pref_notification.xml'
--- app/src/main/res/xml/pref_notification.xml	1970-01-01 00:00:00 +0000
+++ app/src/main/res/xml/pref_notification.xml	2015-02-14 09:49:11 +0000
@@ -0,0 +1,59 @@
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android";>
+
+    <PreferenceCategory
+        android:key="pref_key_custom_timeout_setting"
+        android:title="@string/custom_timeout">
+        <CheckBoxPreference
+            android:key="@string/key_enable_custom_timeout"
+            android:title="@string/enable_custom_timeouts" />
+        <ListPreference
+            android:key="@string/key_connection_timeout"
+            android:defaultValue="@integer/connectionTimeoutDefaultValue"
+            android:dependency="@string/key_enable_custom_timeout"
+            android:entries="@array/socketValueEntries"
+            android:entryValues="@array/socketValues"
+            android:summary="@string/connection_timeout_summary"
+            android:title="@string/connection_timeout" />
+    </PreferenceCategory>
+
+    <PreferenceCategory
+        android:title="@string/connection_profile">
+
+        <EditTextPreference
+            android:key="@string/key_host"
+            android:title="@string/url_hint"
+            android:summary="@string/url_hint"
+            android:defaultValue="@string/host_default_value"
+            android:inputType="textUri" />
+
+        <EditTextPreference
+            android:key="@string/key_port"
+            android:title="@string/port"
+            android:summary="@string/port"
+            android:defaultValue="@string/port_default_value"
+            android:inputType="number" />
+
+        <CheckBoxPreference
+            android:key="@string/key_ssl_use"
+            android:title="@string/connection_profile_ssl_use"
+            android:summary="@string/connection_profile_ssl_summary"
+            android:defaultValue="false" />
+
+        <EditTextPreference
+            android:key="@string/key_userid"
+            android:title="@string/connection_userid"
+            android:summary="@string/userid_default_value"
+            android:defaultValue="@string/userid_default_value"
+            android:inputType="textNoSuggestions" />
+
+        <EditTextPreference
+            android:key="@string/key_password"
+            android:title="@string/connection_password"
+            android:summary="@string/password_default_value"
+            android:defaultValue="@string/password_default_value"
+            android:inputType="textVisiblePassword" />
+
+
+    </PreferenceCategory>
+
+</PreferenceScreen>

=== added file 'build.gradle'
--- build.gradle	1970-01-01 00:00:00 +0000
+++ build.gradle	2015-02-14 09:49:11 +0000
@@ -0,0 +1,19 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    repositories {
+        jcenter()
+    }
+    dependencies {
+        classpath 'com.android.tools.build:gradle:1.0.0'
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+allprojects {
+    repositories {
+        jcenter()
+    }
+}

=== added directory 'gradle'
=== added file 'gradle.properties'
--- gradle.properties	1970-01-01 00:00:00 +0000
+++ gradle.properties	2015-02-14 09:49:11 +0000
@@ -0,0 +1,18 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+# Default value: -Xmx10248m -XX:MaxPermSize=256m
+# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
\ No newline at end of file

=== added directory 'gradle/wrapper'
=== added file 'gradle/wrapper/gradle-wrapper.jar'
Binary files gradle/wrapper/gradle-wrapper.jar	1970-01-01 00:00:00 +0000 and gradle/wrapper/gradle-wrapper.jar	2015-02-14 09:49:11 +0000 differ
=== added file 'gradle/wrapper/gradle-wrapper.properties'
--- gradle/wrapper/gradle-wrapper.properties	1970-01-01 00:00:00 +0000
+++ gradle/wrapper/gradle-wrapper.properties	2015-02-14 09:49:11 +0000
@@ -0,0 +1,6 @@
+#Wed Apr 10 15:27:10 PDT 2013
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip

=== added file 'gradlew'
--- gradlew	1970-01-01 00:00:00 +0000
+++ gradlew	2015-02-14 09:49:11 +0000
@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

=== added file 'gradlew.bat'
--- gradlew.bat	1970-01-01 00:00:00 +0000
+++ gradlew.bat	2015-02-14 09:49:11 +0000
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega

=== added file 'settings.gradle'
--- settings.gradle	1970-01-01 00:00:00 +0000
+++ settings.gradle	2015-02-14 09:49:11 +0000
@@ -0,0 +1,1 @@
+include ':app'


Follow ups