openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #26125
[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