diff --git a/OpenLP2.iml b/OpenLP2.iml
new file mode 100644
index 0000000..ebb3cb4
--- /dev/null
+++ b/OpenLP2.iml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/app.iml b/app/app.iml
new file mode 100644
index 0000000..2d7a8c7
--- /dev/null
+++ b/app/app.iml
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ generateDebugSources
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..9618dc9
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,42 @@
+apply plugin: 'com.android.application'
+project.archivesBaseName = 'OpenLP'
+android {
+ compileSdkVersion 25
+ buildToolsVersion "25"
+
+ defaultConfig {
+ applicationId "org.openlp.android2"
+ minSdkVersion 16
+ targetSdkVersion 25
+ versionCode 6
+ versionName "2.0"
+ vectorDrawables.useSupportLibrary = true
+ }
+ android {
+ lintOptions {
+ ignore 'MissingTranslation'
+ }
+ }
+ buildTypes {
+ debug {
+ debuggable true
+ }
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+ testOptions {
+ unitTests.returnDefaultValues = true
+ }
+
+ dependencies {
+ compile fileTree(include: ['*.jar'], dir: 'libs')
+ compile 'com.android.support:appcompat-v7:25.0.0'
+ compile 'com.android.support:support-v4:25.0.0'
+ compile 'com.android.support:design:25.0.0'
+ }
+}
+dependencies {
+ compile files('libs/classes.jar')
+}
\ No newline at end of file
diff --git a/app/libs/classes.jar b/app/libs/classes.jar
new file mode 100644
index 0000000..791fe0b
Binary files /dev/null and b/app/libs/classes.jar differ
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..015b793
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -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 *;
+#}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..e927bbc
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/org/openlp/android2/OpenLP.java b/app/src/main/java/org/openlp/android2/OpenLP.java
new file mode 100644
index 0000000..e09a0cb
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/OpenLP.java
@@ -0,0 +1,302 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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.content.Intent;
+import android.content.SharedPreferences;
+import android.content.res.Configuration;
+import android.preference.PreferenceManager;
+import android.support.v7.app.ActionBarActivity;
+import android.app.ActionBar;
+import android.app.FragmentManager;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.support.v4.widget.DrawerLayout;
+import android.view.WindowManager;
+
+import org.openlp.android2.activities.SettingsActivity;
+import org.openlp.android2.common.NavigationOptions;
+import org.openlp.android2.common.OpenLPURLBuilder;
+import org.openlp.android2.common.StateHolder;
+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.SearchFragment;
+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;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ OpenLPURLBuilder.getInstance().setContext(this);
+ StateHolder.getInstance().setContext(this);
+
+ 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));
+
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ }
+
+ /**
+ * Check the preferences have been set at startup and if not redirect them to be set.
+ *
+ */
+ protected 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);
+ }
+ }
+
+ /**
+ * Handle configuration change.
+ *
+ * @param newConfig The new Config.
+ */
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ }
+
+ /**
+ * Handle the selection of the Navigation Menu
+ *
+ * @param position Which item has been selected.
+ */
+ @Override
+ public void onNavigationDrawerItemSelected(int position) {
+ // update the main content by replacing fragments
+ FragmentManager fragmentManager = getFragmentManager();
+ switch (position) {
+ case NavigationOptions.Home:
+ singleTab();
+ fragmentManager.beginTransaction()
+ .replace(R.id.container, HomeFragment.newInstance())
+ .commit();
+ mTitle = getString(R.string.home);
+ toggerContainer(R.id.next_button, View.GONE);
+ toggerContainer(R.id.prev_button, View.GONE);
+ break;
+ case NavigationOptions.ServiceList:
+ singleTab();
+ fragmentManager.beginTransaction()
+ .replace(R.id.container, ServiceListFragment.newInstance(), "servicelist")
+ .commit();
+ mTitle = getString(R.string.service_list);
+ toggerContainer(R.id.next_button, View.VISIBLE);
+ toggerContainer(R.id.prev_button, View.VISIBLE);
+ break;
+ case NavigationOptions.LiveList:
+ duelTab();
+ fragmentManager.beginTransaction()
+ .replace(R.id.container_left, ServiceListFragment.newInstance(), "servicelist")
+ .commit();
+ fragmentManager.beginTransaction()
+ .replace(R.id.container_right, LiveListFragment.newInstance(), "livelist")
+ .commit();
+ mTitle = getString(R.string.live_list);
+ toggerContainer(R.id.next_button, View.VISIBLE);
+ toggerContainer(R.id.prev_button, View.VISIBLE);
+ break;
+ case NavigationOptions.StageView:
+ singleTab();
+ fragmentManager.beginTransaction()
+ .replace(R.id.container, StageWebFragment.newInstance())
+ .commit();
+ mTitle = getString(R.string.stage_view);
+ toggerContainer(R.id.next_button, View.GONE);
+ toggerContainer(R.id.prev_button, View.GONE);
+ break;
+ case NavigationOptions.LiveView:
+ singleTab();
+ fragmentManager.beginTransaction()
+ .replace(R.id.container, LiveWebFragment.newInstance())
+ .commit();
+ mTitle = getString(R.string.live_view);
+ toggerContainer(R.id.next_button, View.GONE);
+ toggerContainer(R.id.prev_button, View.GONE);
+ break;
+ case NavigationOptions.Search:
+ singleTab();
+ fragmentManager.beginTransaction()
+ .replace(R.id.container, SearchFragment.newInstance())
+ .commit();
+ mTitle = getString(R.string.action_search);
+ toggerContainer(R.id.next_button, View.GONE);
+ toggerContainer(R.id.prev_button, View.GONE);
+ break;
+ default:
+ singleTab();
+ fragmentManager.beginTransaction()
+ .replace(R.id.container, HomeFragment.newInstance())
+ .commit();
+ mTitle = getString(R.string.home);
+ toggerContainer(R.id.next_button, View.GONE);
+ toggerContainer(R.id.prev_button, View.GONE);
+ break;
+ }
+ }
+
+ /**
+ * Set Display to allow for Duel Columns
+ */
+ protected void duelTab(){
+ toggerContainer(R.id.container, View.GONE);
+ toggerContainer(R.id.container_right, View.VISIBLE);
+ toggerContainer(R.id.container_left, View.VISIBLE);
+ }
+
+ /**
+ * Set Display to allow for Single Columns
+ */
+ protected void singleTab(){
+ toggerContainer(R.id.container_right, View.GONE);
+ toggerContainer(R.id.container_left, View.GONE);
+ toggerContainer(R.id.container, View.VISIBLE);
+ }
+
+ /**
+ *
+ * @param container The container id to be accesses
+ * @param direction What visibility to use on the container
+ */
+ protected void toggerContainer(int container, int direction){
+ View cTainer = this.findViewById(container);
+ if (cTainer != null) {
+ cTainer.setVisibility(direction);
+ }
+ }
+
+ public void restoreActionBar() {
+ try {
+ ActionBar actionBar = getActionBar();
+ //actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
+ actionBar.setDisplayShowTitleEnabled(true);
+ actionBar.setTitle(mTitle);
+ } catch (Exception e) {
+ //noop
+ }
+ }
+
+ @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_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))) {
+ refreshServiceFragment(R.id.container);
+ } else if (this.mTitle.equals(getString(R.string.live_list)) ) {
+ refreshServiceFragment(R.id.container_left);
+ refreshLiveFragment(R.id.container_right);
+ }
+ 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);
+ }
+ }
+ public void refreshLiveFragment(int container){
+ LiveListFragment fragment = (LiveListFragment)
+ getFragmentManager().findFragmentById(container);
+ if (fragment != null) {
+ fragment.refreshDisplay();
+ }
+ }
+ public void refreshServiceFragment(int container){
+ ServiceListFragment fragment = (ServiceListFragment)
+ getFragmentManager().findFragmentById(container);
+ if (fragment != null) {
+ fragment.refreshDisplay();
+ }
+ }
+
+ public void next(View view) {
+ ServiceListFragment serviceListFragment = (ServiceListFragment) getFragmentManager().findFragmentByTag("servicelist");
+ serviceListFragment.next();
+ }
+
+ public void previous(View view) {
+ ServiceListFragment serviceListFragment = (ServiceListFragment) getFragmentManager().findFragmentByTag("servicelist");
+ serviceListFragment.previous();
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/activities/SettingsActivity.java b/app/src/main/java/org/openlp/android2/activities/SettingsActivity.java
new file mode 100644
index 0000000..427c03d
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/activities/SettingsActivity.java
@@ -0,0 +1,219 @@
+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.
+ *
+ * See
+ * Android Design: Settings for design guidelines and the Settings
+ * API Guide 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 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"));
+ }
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/api/Api.java b/app/src/main/java/org/openlp/android2/api/Api.java
new file mode 100644
index 0000000..1dc9fd1
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/api/Api.java
@@ -0,0 +1,125 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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;
+
+/**
+ * Routes:
+ *
+ *
+ *
+ * ``/``
+ * 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": ""}}
+ * ``/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": [{...}, {...}]}}
+ * """
+ *
+ */
+
+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=";
+}
diff --git a/app/src/main/java/org/openlp/android2/common/JsonHelpers.java b/app/src/main/java/org/openlp/android2/common/JsonHelpers.java
new file mode 100644
index 0000000..bcc6a2f
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/common/JsonHelpers.java
@@ -0,0 +1,58 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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.util.Log;
+
+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");
+ Log.d(LOG_TAG, String.format("createRequestJSON: %s : %s : %s", key, value, responseJSON));
+ 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);
+ }
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/common/NavigationOptions.java b/app/src/main/java/org/openlp/android2/common/NavigationOptions.java
new file mode 100644
index 0000000..cd8b159
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/common/NavigationOptions.java
@@ -0,0 +1,28 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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;
+ public final static int Search = 5;
+}
diff --git a/app/src/main/java/org/openlp/android2/common/OpenLPDialog.java b/app/src/main/java/org/openlp/android2/common/OpenLPDialog.java
new file mode 100644
index 0000000..a19b8cd
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/common/OpenLPDialog.java
@@ -0,0 +1,124 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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.android.volley.AuthFailureError;
+import com.android.volley.ClientError;
+import com.android.volley.DefaultRetryPolicy;
+import com.android.volley.NetworkError;
+import com.android.volley.NoConnectionError;
+import com.android.volley.ParseError;
+import com.android.volley.Request;
+import com.android.volley.Response;
+import com.android.volley.ServerError;
+import com.android.volley.TimeoutError;
+import com.android.volley.VolleyError;
+import com.android.volley.toolbox.StringRequest;
+
+import org.openlp.android2.R;
+import org.openlp.android2.api.Api;
+
+import java.util.HashMap;
+import java.util.Map;
+
+
+abstract public class OpenLPDialog extends DialogFragment {
+
+ private final String LOG_TAG = OpenLPDialog.class.getName();
+
+ protected Context context;
+ private String urlcalled;
+
+ protected void populateDisplay(String responseString) {
+ }
+
+ protected void processUpdate(String responseString) {
+ }
+
+ protected void errorDisplay(String responseString) {
+ }
+
+ protected void triggerTextRequest(final String urlbase) {
+ String url = RequestQueueService.getInstance(this.context).getUrl(urlbase);
+ urlcalled = urlbase;
+
+ StringRequest request = new StringRequest(
+ Request.Method.GET,
+ url,
+ listener,
+ errorListener) {
+
+ @Override
+ public Map getHeaders() throws AuthFailureError {
+ return createBasicAuthHeader("user", "passwd");
+ }
+ };
+ //Set a retry policy in case of SocketTimeout & ConnectionTimeout Exceptions.
+ // Volley does retry for you if you have specified the policy.
+ request.setRetryPolicy(new DefaultRetryPolicy(
+ RequestQueueService.getInstance(this.context).getConnectionTimeout(),
+ DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
+ request.setTag("OpenLP");
+ RequestQueueService.getInstance(this.context).addToRequestQueue(request);
+ }
+
+ Map createBasicAuthHeader(String username, String password) {
+ Map headers = new HashMap();
+ headers.put("Authorization", RequestQueueService.getInstance(context).getBasicAuth());
+
+ return headers;
+ }
+
+ Response.Listener listener = new Response.Listener() {
+ @Override
+ public void onResponse(String response) {
+ if (urlcalled.equals(Api.POLL_STATUS)) {
+ populateDisplay(response);
+ } else {
+ processUpdate(response);
+ }
+ }
+ };
+
+ Response.ErrorListener errorListener = new Response.ErrorListener() {
+ @Override
+ public void onErrorResponse(VolleyError error) {
+ Log.d(LOG_TAG, String.format("Call response error = %s", error.toString()));
+ if (error instanceof NetworkError) {
+ } else if (error instanceof ClientError) {
+ } else if (error instanceof ServerError) {
+ } else if (error instanceof AuthFailureError) {
+ Toast.makeText(context, R.string.httpreturn_unauthorised,
+ Toast.LENGTH_LONG).show();
+ } else if (error instanceof ParseError) {
+ } else if (error instanceof NoConnectionError) {
+ } else if (error instanceof TimeoutError) {
+ }
+ Toast.makeText(context, R.string.unable,
+ Toast.LENGTH_LONG).show();
+ errorDisplay(error.toString());
+
+ }
+ };
+}
diff --git a/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java b/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java
new file mode 100644
index 0000000..9fd3578
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java
@@ -0,0 +1,138 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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.android.volley.AuthFailureError;
+import com.android.volley.ClientError;
+import com.android.volley.DefaultRetryPolicy;
+import com.android.volley.NetworkError;
+import com.android.volley.NoConnectionError;
+import com.android.volley.ParseError;
+import com.android.volley.Request;
+import com.android.volley.Response;
+import com.android.volley.ServerError;
+import com.android.volley.TimeoutError;
+import com.android.volley.VolleyError;
+import com.android.volley.toolbox.StringRequest;
+import org.openlp.android2.R;
+import org.openlp.android2.api.Api;
+
+import java.util.HashMap;
+import java.util.Map;
+
+abstract public class OpenLPFragment extends ListFragment{
+
+ private String LOG_TAG = OpenLPFragment.class.getName();
+ public Context context;
+ protected String urlcalled;
+ 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);
+ }
+
+ protected void refreshDisplay(){}
+ protected void populateDisplay(String responseString, boolean inError) {}
+ protected void processUpdate(String responseString, boolean inError) {}
+
+ protected void triggerTextRequest(final String urlbase) {
+ String url = RequestQueueService.getInstance(this.context).getUrl(urlbase);
+ updateUrl = urlbase;
+
+ StringRequest request = new StringRequest(
+ Request.Method.GET,
+ url,
+ listener,
+ errorListener) {
+
+ @Override
+ public Map getHeaders() throws AuthFailureError {
+ return createBasicAuthHeader("user", "passwd");
+ }
+ };
+ //Set a retry policy in case of SocketTimeout & ConnectionTimeout Exceptions.
+ // Volley does retry for you if you have specified the policy.
+ request.setRetryPolicy(new DefaultRetryPolicy(
+ RequestQueueService.getInstance(this.context).getConnectionTimeout(),
+ DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
+ request.setTag("OpenLP");
+ RequestQueueService.getInstance(this.context).addToRequestQueue(request);
+ }
+
+ Map createBasicAuthHeader(String username, String password) {
+ Map headers = new HashMap();
+ headers.put("Authorization", RequestQueueService.getInstance(context).getBasicAuth());
+
+ return headers;
+ }
+
+ Response.Listener listener = new Response.Listener() {
+ @Override
+ public void onResponse(String response) {
+ if (urlcalled.equals(updateUrl)) {
+ populateDisplay(response, true);
+ } else {
+ processUpdate(response, true);
+ }
+ }
+ };
+
+ Response.ErrorListener errorListener = new Response.ErrorListener() {
+ @Override
+ public void onErrorResponse(VolleyError error) {
+ Log.d(LOG_TAG, String.format("Call response error = %s", error.toString()));
+ if (error instanceof NetworkError) {
+ } else if (error instanceof ClientError) {
+ } else if (error instanceof ServerError) {
+ } else if (error instanceof AuthFailureError) {
+ Toast.makeText(context, R.string.httpreturn_unauthorised,
+ Toast.LENGTH_LONG).show();
+ } else if (error instanceof ParseError) {
+ } else if (error instanceof NoConnectionError) {
+ } else if (error instanceof TimeoutError) {
+ }
+ Toast.makeText(context, R.string.unable,
+ Toast.LENGTH_LONG).show();
+
+ }
+ };
+
+ public void next() {
+ Log.d(LOG_TAG, "Going to next slide");
+ triggerTextRequest(Api.LIVE_NEXT);
+ }
+
+ public void previous() {
+ Log.d(LOG_TAG, "Going to previous slide");
+ triggerTextRequest(Api.LIVE_PREVIOUS);
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java b/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java
new file mode 100644
index 0000000..8e9867e
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java
@@ -0,0 +1,86 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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 android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+import android.util.Base64;
+import android.util.Log;
+
+import org.openlp.android2.R;
+
+public class OpenLPURLBuilder {
+ private final String LOG_TAG = OpenLPURLBuilder.class.getName();
+ private Context context;
+
+ private static OpenLPURLBuilder ourInstance = new OpenLPURLBuilder();
+
+ public static OpenLPURLBuilder getInstance() {
+ return ourInstance;
+ }
+
+ private OpenLPURLBuilder() {
+ }
+
+ public void setContext(Context context) {
+ this.context = context;
+ }
+
+ public int getConnectionTimeout() {
+
+ SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+
+ 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 = Integer.parseInt(sharedPrefs.getString(context.getString(R.string.key_connection_timeout),
+ String.valueOf(context.getResources().getInteger(R.integer.connectionTimeoutDefaultValue))
+ ));
+ }
+ return connectionTimeout;
+ }
+
+ public String getBasicAuth(){
+
+ SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+ 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);
+
+ String credentials = userid + ":" + password;
+ return "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.DEFAULT);
+ }
+
+ public String getBaseUrl(){
+
+ SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+
+ 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", host, port);
+
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/common/RequestQueueService.java b/app/src/main/java/org/openlp/android2/common/RequestQueueService.java
new file mode 100644
index 0000000..8285389
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/common/RequestQueueService.java
@@ -0,0 +1,99 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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 android.graphics.Bitmap;
+import android.util.Base64;
+import android.util.LruCache;
+
+import com.android.volley.AuthFailureError;
+import com.android.volley.Request;
+import com.android.volley.RequestQueue;
+import com.android.volley.toolbox.HurlStack;
+import com.android.volley.toolbox.ImageLoader;
+import com.android.volley.toolbox.Volley;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class RequestQueueService {
+
+ private static RequestQueueService mInstance;
+ private RequestQueue mRequestQueue;
+ private ImageLoader mImageLoader;
+ private static Context mCtx;
+
+ private RequestQueueService(Context context) {
+ mCtx = context;
+ mRequestQueue = getRequestQueue();
+
+ mImageLoader = new ImageLoader(mRequestQueue,
+ new ImageLoader.ImageCache() {
+ private final LruCache cache = new LruCache(20);
+
+ @Override
+ public Bitmap getBitmap(String url) {
+ return cache.get(url);
+ }
+
+ @Override
+ public void putBitmap(String url, Bitmap bitmap) {
+ cache.put(url, bitmap);
+ }
+ });
+ }
+
+ public static synchronized RequestQueueService getInstance(Context context) {
+ if (mInstance == null) {
+ mInstance = new RequestQueueService(context);
+ }
+ return mInstance;
+ }
+
+ public RequestQueue getRequestQueue() {
+ if (mRequestQueue == null) {
+ // getApplicationContext() is key, it keeps you from leaking the
+ // Activity or BroadcastReceiver if someone passes one in.
+ mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
+ }
+ return mRequestQueue;
+ }
+
+ public String getUrl(String url){
+ return String.format("%s%s", OpenLPURLBuilder.getInstance().getBaseUrl(), url );
+ }
+
+ public String getBasicAuth(){
+ return OpenLPURLBuilder.getInstance().getBasicAuth();
+ }
+
+ public int getConnectionTimeout(){
+ return OpenLPURLBuilder.getInstance().getConnectionTimeout();
+ }
+
+ public void addToRequestQueue(Request req) {
+ getRequestQueue().add(req);
+ }
+
+ public ImageLoader getImageLoader() {
+ return mImageLoader;
+ }
+}
+
diff --git a/app/src/main/java/org/openlp/android2/common/StateHolder.java b/app/src/main/java/org/openlp/android2/common/StateHolder.java
new file mode 100644
index 0000000..ab26175
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/common/StateHolder.java
@@ -0,0 +1,22 @@
+package org.openlp.android2.common;
+
+import android.content.Context;
+
+/**
+ * Created by tim on 14/08/16.
+ */
+public class StateHolder {
+ private static StateHolder ourInstance = new StateHolder();
+ private static Context context;
+
+ public static StateHolder getInstance() {
+ return ourInstance;
+ }
+
+ private StateHolder() {
+ }
+
+ public void setContext(Context context) {
+ this.context = context;
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java b/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java
new file mode 100644
index 0000000..52f824e
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java
@@ -0,0 +1,105 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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;
+
+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();
+
+ 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();
+ }
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java b/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java
new file mode 100644
index 0000000..93fca1b
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java
@@ -0,0 +1,159 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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 android.widget.RadioButton;
+
+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;
+
+public class BlankDisplayDialog extends OpenLPDialog {
+ private final String LOG_TAG = BlankDisplayDialog.class.getName();
+
+ public AlertDialog dialog;
+ RadioButton desktop;
+ RadioButton screen;
+ RadioButton theme;
+ RadioButton 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();
+ 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 = (RadioButton) view.findViewById(R.id.buttonReset);
+ reset.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ triggerTextRequest(Api.DISPLAY_SHOW);
+ }
+ });
+ screen = (RadioButton) view.findViewById(R.id.buttonScreen);
+ screen.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ triggerTextRequest(Api.DISPLAY_BLANK);
+ }
+ });
+ theme = (RadioButton) view.findViewById(R.id.buttonTheme);
+ theme.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ triggerTextRequest(Api.DISPLAY_THEME);
+ }
+ });
+ desktop = (RadioButton) 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 : " + json );
+ reset_display();
+ try {
+ JSONObject item = new JSONObject(json).getJSONObject("results");
+ if (item.getString("theme").equals("true")){
+ theme.setChecked(true);
+ } else {
+ if (item.getString("blank").equals("true")){
+ screen.setChecked(true);
+ } else{
+ if (item.getString("display").equals("true")){
+ desktop.setChecked(true);
+ } else{
+ reset.setChecked(true);
+ }
+ }
+ }
+ } catch (JSONException e) {
+ Log.e(LOG_TAG, "Exception with Json = " + json);
+ e.printStackTrace();
+ }
+ }
+
+ public void errorDisplay(String responseString) {
+ Log.d(LOG_TAG, String.format("URL Error text %s", responseString));
+ reset_display();
+ }
+
+ private void reset_display(){
+ screen.setChecked(false);
+ theme.setChecked(false);
+ desktop.setChecked(false);
+ reset.setChecked(false);
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java b/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java
new file mode 100644
index 0000000..35d71fe
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java
@@ -0,0 +1,135 @@
+/******************************************************************************
+ * 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.RadioButton;
+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;
+
+public class SearchSelectionDialog extends OpenLPDialog {
+ private final String LOG_TAG = SearchSelectionDialog.class.getName();
+ public AlertDialog dialog;
+ private String key;
+ private String plugin;
+ private String text;
+ private RadioButton sendLive;
+ private RadioButton addToService;
+
+ /**
+ * 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.
+
+ key = getArguments().getString("key");
+ plugin = getArguments().getString("plugin");
+ text = getArguments().getString("text");
+
+ Log.d(LOG_TAG, String.format("onCreateDialog %s : %s : %s", key, plugin, text));
+
+ context = getActivity();
+
+ 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.search_action_dialog, null);
+ builder.setView(view);
+
+ sendLive = (RadioButton) view.findViewById(R.id.buttonLive);
+ sendLive.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ createLive();
+ SearchSelectionDialog.this.getDialog().cancel();
+ }
+ });
+
+ addToService = (RadioButton) view.findViewById(R.id.buttonService);
+ addToService.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ createService();
+ SearchSelectionDialog.this.getDialog().cancel();
+ }
+ });
+
+ builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ SearchSelectionDialog.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...");
+ }
+
+ public void createLive() {
+ try {
+ String request = JsonHelpers.createRequestJSON("id", text);
+ String url = String.format(Api.SEARCH_PLUGIN_LIVE, plugin.toLowerCase());
+ triggerTextRequest(String.format("%s%s", url, request));
+ Log.d(LOG_TAG, String.format("Setting list data. apiBase(%s), text(%s)", Api.SEARCH_PLUGIN_LIVE, request));
+ } catch (JsonHelpers.JSONHandlerException e) {
+ e.printStackTrace();
+ Toast.makeText(context, "Request Failed", Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ public void createService() {
+ try {
+ String request = JsonHelpers.createRequestJSON("id", text);
+ String url = String.format(Api.SEARCH_PLUGIN_ADD, plugin.toLowerCase());
+ triggerTextRequest(String.format("%s%s", url, request));
+ Log.d(LOG_TAG, String.format("Setting list data. apiBase(%s), text(%s)", Api.SEARCH_PLUGIN_ADD, text));
+ } catch (JsonHelpers.JSONHandlerException e) {
+ e.printStackTrace();
+ Toast.makeText(context, "Request Failed", Toast.LENGTH_SHORT).show();
+ }
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/fragments/AboutFragment.java b/app/src/main/java/org/openlp/android2/fragments/AboutFragment.java
new file mode 100644
index 0000000..06c674a
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/fragments/AboutFragment.java
@@ -0,0 +1,70 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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, Tomas Groth, 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
diff --git a/app/src/main/java/org/openlp/android2/fragments/HomeFragment.java b/app/src/main/java/org/openlp/android2/fragments/HomeFragment.java
new file mode 100644
index 0000000..cc51a62
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/fragments/HomeFragment.java
@@ -0,0 +1,58 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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);
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java b/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java
new file mode 100644
index 0000000..48403c8
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java
@@ -0,0 +1,189 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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.preference.PreferenceManager;
+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 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();
+ urlcalled = Api.LIVE_TEXT;
+ return super.onCreateView(inflater, container, savedInstanceState);
+ }
+
+ @Override
+ public void populateDisplay(String json, boolean notInError) {
+ Log.i(LOG_TAG, "populate_display - entry");
+ List> aList = new ArrayList>();
+ selected = 0;
+
+ if (notInError) {
+
+ try {
+ JSONArray items = new JSONObject(json).getJSONObject("results").getJSONArray("slides");
+ for (int i = 0; i < items.length(); ++i) {
+ JSONObject item = items.getJSONObject(i);
+
+ HashMap hm = new HashMap();
+ 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) {
+ Log.e(LOG_TAG,json);
+ e.printStackTrace();
+ }
+ }
+
+ // Keys used in Hashmap
+ String[] from = {"line", "tag", "liveListNormal", "liveListSelected"};
+
+ // Ids of views in live_list_fragment
+ int[] to = {R.id.line, 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 line = (TextView) view.findViewById(R.id.line);
+ TextView text1 = (TextView) view.findViewById(R.id.tag);
+ if (text1 != null) {
+ text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
+ }
+ TextView text2 = (TextView) view.findViewById(R.id.liveListNormal);
+ if (text2 != null) {
+ text2.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
+ if (selected == position) {
+ text2.setTypeface(null, Typeface.BOLD_ITALIC);
+ // line.setBackgroundColor(0xffffff);
+ } else {
+ text2.setTypeface(null, Typeface.NORMAL);
+ // line.setBackgroundColor(0xffffff);
+ }
+ }
+ return view;
+
+ }
+ };
+ setListAdapter(adapter);
+
+ SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+ Boolean autoscroll =
+ sharedPrefs.getBoolean(context.getString(R.string.key_auto_scroll), false);
+
+ if (autoscroll){
+ 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, boolean inError) {
+ 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));
+ } catch (JsonHelpers.JSONHandlerException e) {
+ e.printStackTrace();
+ Toast.makeText(getActivity().getBaseContext(), "Request Failed", Toast.LENGTH_SHORT).show();
+ }
+ }
+
+}
diff --git a/app/src/main/java/org/openlp/android2/fragments/LiveWebFragment.java b/app/src/main/java/org/openlp/android2/fragments/LiveWebFragment.java
new file mode 100644
index 0000000..53ced25
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/fragments/LiveWebFragment.java
@@ -0,0 +1,33 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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();
+ }
+}
+
diff --git a/app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java b/app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java
new file mode 100644
index 0000000..f6039bc
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java
@@ -0,0 +1,344 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.os.Build;
+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 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
+ * design guidelines 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> aList = new ArrayList>();
+ HashMap hm = new HashMap();
+ hm.put("title", getString(R.string.home));
+ hm.put("icon", Integer.toString(R.drawable.ic_home_black));
+ aList.add(hm);
+
+ HashMap hm1 = new HashMap();
+ hm1.put("title", getString(R.string.service_list));
+ hm1.put("icon", Integer.toString(R.drawable.ic_view_list_black));
+ aList.add(hm1);
+
+ HashMap hm2 = new HashMap();
+ hm2.put("title", getString(R.string.live_list));
+ hm2.put("icon", Integer.toString(R.drawable.ic_list_black));
+ aList.add(hm2);
+
+ HashMap hm3 = new HashMap();
+ hm3.put("title", getString(R.string.stage_view));
+ hm3.put("icon", Integer.toString(R.drawable.ic_live_tv_black));
+ aList.add(hm3);
+
+ HashMap hm4 = new HashMap();
+ hm4.put("title", getString(R.string.live_view));
+ hm4.put("icon", Integer.toString(R.drawable.ic_ondemand_video_black));
+ aList.add(hm4);
+
+ HashMap hm5 = new HashMap();
+ hm5.put("title", getString(R.string.action_search));
+ hm5.put("icon", Integer.toString(R.drawable.ic_search_black));
+ aList.add(hm5);
+
+ // 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);
+ // OpenLP Blue
+ actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#4d7bd8")));
+ getActionBar().setDisplayHomeAsUpEnabled(true); // also required
+ if (Build.VERSION.SDK_INT >= 18) {
+ getActionBar().setHomeAsUpIndicator(
+ getResources().getDrawable(R.drawable.ic_menu_white));
+ }
+
+ // 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_menu_white, /* 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);
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java
new file mode 100644
index 0000000..f652d57
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java
@@ -0,0 +1,357 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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.DialogFragment;
+import android.app.Fragment;
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.inputmethod.EditorInfo;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.EditText;
+import android.widget.ListView;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.android.volley.AuthFailureError;
+import com.android.volley.ClientError;
+import com.android.volley.DefaultRetryPolicy;
+import com.android.volley.NetworkError;
+import com.android.volley.NoConnectionError;
+import com.android.volley.ParseError;
+import com.android.volley.Request;
+import com.android.volley.Response;
+import com.android.volley.ServerError;
+import com.android.volley.TimeoutError;
+import com.android.volley.VolleyError;
+import com.android.volley.toolbox.StringRequest;
+
+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.RequestQueueService;
+import org.openlp.android2.dialogs.SearchSelectionDialog;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+
+ */
+public class SearchFragment extends Fragment {
+
+ private final String LOG_TAG = SearchFragment.class.getName();
+ private Spinner spinner;
+ public Context context;
+ protected String calledURL;
+ protected String updateUrl;
+ protected String searchedPlugin;
+ protected Map pluginMap = new HashMap();
+
+ public SearchFragment() {
+ Log.d(LOG_TAG, "Constructor");
+ }
+
+ public static SearchFragment newInstance() {
+ SearchFragment fragment = new SearchFragment();
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ context = getActivity();
+ updateUrl = Api.SEARCHABLE_PLUGINS;
+ View view = inflater.inflate(R.layout.fragment_search, container, false);
+ spinner = (Spinner) view.findViewById(R.id.search_spinner);
+ triggerTextRequest(Api.SEARCHABLE_PLUGINS);
+
+ // Add search listener to text field
+ final EditText editText = (EditText) view.findViewById(R.id.search_text);
+ editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
+ @Override
+ public boolean onEditorAction(TextView tv, int actionId, KeyEvent event) {
+ if (actionId == EditorInfo.IME_ACTION_SEARCH) {
+ // Now close the keyboard as finished with
+ View view = getActivity().getCurrentFocus();
+ if (view != null) {
+ InputMethodManager imm =
+ (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
+ imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
+ }
+ searchedPlugin = pluginMap.get(spinner.getSelectedItem().toString());
+ requestSearch(tv.getText().toString());
+ return true;
+ }
+ return false;
+ }
+ });
+ spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
+ /**
+ * Called when a new item is selected (in the Spinner)
+ */
+ public void onItemSelected(AdapterView> parent, View view,
+ int pos, long id) {
+ editText.setText("");
+ }
+ public void onNothingSelected(AdapterView> parent) {
+ // Do nothing, just another required interface callback
+ }
+
+ });
+ return view;
+ }
+
+ @Override
+ public void onDetach() {
+ super.onDetach();
+ }
+
+ private void populatePluginList(String response, Boolean notInError) {
+ Log.i(LOG_TAG, "populatePluginList - entry");
+ List categories = new ArrayList();
+ pluginMap.clear();
+
+ if (notInError) {
+ try {
+ JSONArray items = new JSONObject(response).getJSONObject("results").getJSONArray("items");
+ for (int i = 0; i < items.length(); ++i) {
+ JSONArray item = items.getJSONArray(i);
+ categories.add(item.get(1).toString());
+ pluginMap.put(item.get(1).toString(), item.get(0).toString());
+ }
+ } catch (JSONException e) {
+ Log.e(LOG_TAG, response);
+ e.printStackTrace();
+ }
+ ArrayAdapter LTRadapter = new ArrayAdapter(getActivity(),
+ R.layout.spinner_list_item, categories);
+ LTRadapter.setDropDownViewResource(R.layout.spinner_dropdown_item);
+ spinner.setAdapter(LTRadapter);
+ Log.i(LOG_TAG, "populatePluginList - exit");
+ }
+ }
+
+ protected void triggerTextRequest(String urlbase) {
+ Log.d(LOG_TAG, "Trigger Request for url " + urlbase);
+ String url = RequestQueueService.getInstance(this.context).getUrl(urlbase);
+ calledURL = urlbase;
+
+ StringRequest request = new StringRequest(
+ Request.Method.GET,
+ url,
+ listener,
+ errorListener) {
+
+ @Override
+ public Map getHeaders() throws AuthFailureError {
+ return createBasicAuthHeader("user", "passwd");
+ }
+ };
+ //Set a retry policy in case of SocketTimeout & ConnectionTimeout Exceptions.
+ // Volley does retry for you if you have specified the policy.
+ request.setRetryPolicy(new DefaultRetryPolicy(
+ RequestQueueService.getInstance(this.context).getConnectionTimeout(),
+ DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
+ request.setTag("OpenLP");
+ RequestQueueService.getInstance(this.context).addToRequestQueue(request);
+ }
+
+ Map createBasicAuthHeader(String username, String password) {
+ Map headers = new HashMap();
+ headers.put("Authorization", RequestQueueService.getInstance(context).getBasicAuth());
+
+ return headers;
+ }
+
+ Response.Listener listener = new Response.Listener() {
+ @Override
+ public void onResponse(String response) {
+ if (calledURL.equals(updateUrl)) {
+ populatePluginList(response, true);
+ } else {
+ populateListDisplay(response, true);
+ }
+ }
+ };
+
+ Response.ErrorListener errorListener = new Response.ErrorListener() {
+ @Override
+ public void onErrorResponse(VolleyError error) {
+ Log.d(LOG_TAG, String.format("Call response error = %s", error.toString()));
+ if (error instanceof NetworkError) {
+ } else if (error instanceof ClientError) {
+ } else if (error instanceof ServerError) {
+ } else if (error instanceof AuthFailureError) {
+ Toast.makeText(context, R.string.httpreturn_unauthorised,
+ Toast.LENGTH_LONG).show();
+ } else if (error instanceof ParseError) {
+ } else if (error instanceof NoConnectionError) {
+ } else if (error instanceof TimeoutError) {
+ }
+ Toast.makeText(context, R.string.unable,
+ Toast.LENGTH_LONG).show();
+
+ }
+ };
+
+ public void requestSearch(String text) {
+ updateUrl = Api.SEARCH_PLUGIN_FORMATTED;
+ try {
+ String request = JsonHelpers.createRequestJSON("text", text);
+ String url = String.format(Api.SEARCH_PLUGIN_FORMATTED, searchedPlugin);
+ triggerTextRequest(String.format("%s%s", url, request));
+ Log.d(LOG_TAG, String.format("Search request. apiBase(%s), text(%s)", searchedPlugin, text));
+ } catch (JsonHelpers.JSONHandlerException e) {
+ e.printStackTrace();
+ Toast.makeText(context, "Search Request Failed", Toast.LENGTH_SHORT).show();
+ }
+ }
+
+ public void populateListDisplay(String json, boolean notInError) {
+ Log.i(LOG_TAG, "populateListDisplay - entry");
+ ListView list = (ListView) getActivity().findViewById(R.id.searchListView);
+ final ArrayList listitems = new ArrayList();
+ if (notInError) {
+ try {
+ JSONArray items = new JSONObject(json).getJSONObject("results").getJSONArray("items");
+ Log.d(LOG_TAG,items.toString());
+ for (int i = 0; i < items.length(); ++i) {
+ JSONArray item = items.getJSONArray(i);
+ listitems.add(item);
+ }
+ } catch (JSONException e) {
+ Log.e(LOG_TAG, json);
+ e.printStackTrace();
+ }
+ }
+
+ final StableArrayAdapter adapter = new StableArrayAdapter(context,
+ android.R.layout.simple_list_item_1,
+ listitems);
+
+
+ list.setAdapter(adapter);
+ list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+
+ @Override
+ public void onItemClick(AdapterView> parent, final View view,
+ int position, long id) {
+ final JSONArray item = (JSONArray) parent.getItemAtPosition(position);
+ //Toast.makeText(context, "Item Pressed " + String.valueOf(position) + item,
+ // Toast.LENGTH_SHORT).show();
+ String it = "";
+ try {
+ Log.i(LOG_TAG, "list.setOnItemClickListener" + item);
+ it = item.get(0).toString();
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ Bundle args = new Bundle();
+ args.putString("plugin", searchedPlugin);
+ args.putString("text", it);
+ args.putString("key", Long.toString(id));
+ DialogFragment SSDFragment = new SearchSelectionDialog();
+ SSDFragment.setArguments(args);
+ SSDFragment.show(getFragmentManager(), "TAG");
+
+ }
+ });
+ Log.i(LOG_TAG, "populateListDisplay - exit");
+ }
+
+ public class StableArrayAdapter extends ArrayAdapter {
+
+ HashMap mIdMap = new HashMap();
+
+ public StableArrayAdapter(Context context,
+ int textViewResourceId,
+ List objects) {
+ super(context, textViewResourceId, objects);
+
+ for (int i = 0; i < objects.size(); ++i) {
+ JSONArray item = objects.get(i);
+ try {
+ mIdMap.put(item.get(1).toString(), i);
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ // Get the data item for this position
+ //User user = getItem(position);
+ String item = null;
+ try {
+ item = getItem(position).get(1).toString();
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ // Check if an existing view is being reused, otherwise inflate the view
+ if (convertView == null) {
+ convertView = LayoutInflater.from(getContext()).inflate(R.layout.search_result_row,
+ parent, false);
+ }
+ // Lookup view for data population
+ TextView tvItem = (TextView) convertView.findViewById(R.id.searchListRow);
+ // Populate the data into the template view using the data object
+ tvItem.setText(item);
+ // Return the completed view to render on screen
+ return convertView;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ String item = null;
+ try {
+ item = getItem(position).get(1).toString();
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ return mIdMap.get(item);
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return true;
+ }
+
+ }
+
+}
diff --git a/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java b/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java
new file mode 100644
index 0000000..1be47b0
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java
@@ -0,0 +1,201 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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.graphics.Color;
+import android.graphics.Typeface;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+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.OpenLPFragment;
+
+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 int selected = 0;
+
+ public ServiceListFragment() {
+ }
+
+ public static ServiceListFragment newInstance() {
+ ServiceListFragment fragment = new ServiceListFragment();
+ return fragment;
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ context = getActivity();
+ urlcalled = Api.SERVICE_LIST;
+ return super.onCreateView(inflater, container, savedInstanceState);
+ }
+
+ @Override
+ public void onActivityCreated(Bundle savedInstanceState) {
+ super.onActivityCreated(savedInstanceState);
+ }
+
+ @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, boolean inError) {
+ triggerTextRequest(Api.SERVICE_LIST);
+ ((OpenLP) getActivity()).refreshLiveFragment(R.id.container_right);
+ }
+
+ @Override
+ public void populateDisplay(String json, boolean notInError) {
+ Log.i(LOG_TAG, "populate_display - entry");
+ List> aList = new ArrayList>();
+
+ if (notInError) {
+ try {
+ JSONArray items = new JSONObject(json).getJSONObject("results").getJSONArray("items");
+
+ for (int i = 0; i < items.length(); ++i) {
+ JSONObject item = items.getJSONObject(i);
+
+ HashMap hm = new HashMap();
+ 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));
+ }
+ if (item.getString("selected").equals("true")) {
+ selected = i;
+ }
+ hm.put("title", item.getString("title"));
+ aList.add(hm);
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Keys used in Hashmap
+ String[] from = {"line","icon", "title"};
+
+ // Ids of views in service_list_fragment
+ int[] to = {R.id.servicelistLine, 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 line = (TextView) view.findViewById(R.id.servicelistLine);
+ TextView text1 = (TextView) view.findViewById(R.id.serviceListText);
+ text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
+ if (selected == position) {
+ text1.setTextColor(Color.parseColor("#000000"));
+ text1.setTypeface(null, Typeface.BOLD_ITALIC);
+ line.setBackgroundColor(0xffffff);
+ } else{
+ text1.setTypeface(null, Typeface.NORMAL);
+ line.setBackgroundColor(0xffffff);
+ }
+ return view;
+ }
+ };
+
+ setListAdapter(adapter);
+
+ SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
+ Boolean autoscroll =
+ sharedPrefs.getBoolean(context.getString(R.string.key_auto_scroll), false);
+
+ if (autoscroll){
+ getListView().setSelection(selected - 1);
+ }
+ Log.i(LOG_TAG, "populate_display - exit");
+ }
+
+ public void itemClicked(int position) {
+ try {
+ String request = JsonHelpers.createRequestJSON("id", Integer.toString(position));
+ triggerTextRequest(String.format("%s%s", Api.SERVICE_SET, request));
+ Log.d(LOG_TAG, String.format("Setting list data. apiBase(%s), position(%s)",
+ Api.SERVICE_SET, position));
+ } catch (JsonHelpers.JSONHandlerException e) {
+ e.printStackTrace();
+ Toast.makeText(context, "Request Failed", Toast.LENGTH_SHORT).show();
+ }
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/fragments/StageWebFragment.java b/app/src/main/java/org/openlp/android2/fragments/StageWebFragment.java
new file mode 100644
index 0000000..64a0ef9
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/fragments/StageWebFragment.java
@@ -0,0 +1,34 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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();
+ }
+}
diff --git a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java
new file mode 100644
index 0000000..20400d9
--- /dev/null
+++ b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java
@@ -0,0 +1,78 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2016 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.webkit.WebView;
+import android.webkit.WebViewClient;
+import org.openlp.android2.R;
+import org.openlp.android2.common.OpenLPURLBuilder;
+
+public class WebFragment extends Fragment {
+
+ protected String curURL;
+ 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) {
+
+ 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", OpenLPURLBuilder.getInstance().getBaseUrl(), curURL));
+ }
+ return view;
+ }
+
+ @Override
+ public void onDestroyView() {
+ if (webview != null) {
+ webview.destroy();
+ }
+ super.onDestroyView();
+ }
+
+ public class webClient extends WebViewClient {
+ @Override
+ public boolean shouldOverrideUrlLoading(WebView view, String url) {
+ return false;
+ }
+ }
+}
diff --git a/app/src/main/res/drawable-hdpi/drawer_shadow.9.png b/app/src/main/res/drawable-hdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..236bff5
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/drawer_shadow.9.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_add_alert_white.png b/app/src/main/res/drawable-hdpi/ic_add_alert_white.png
new file mode 100644
index 0000000..f169577
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_add_alert_white.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_apps_white.png b/app/src/main/res/drawable-hdpi/ic_apps_white.png
new file mode 100644
index 0000000..1ab7303
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_apps_white.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_arrow_back_white.png b/app/src/main/res/drawable-hdpi/ic_arrow_back_white.png
new file mode 100644
index 0000000..de7a9d2
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_arrow_back_white.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_arrow_forward_white.png b/app/src/main/res/drawable-hdpi/ic_arrow_forward_white.png
new file mode 100644
index 0000000..3d58929
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_arrow_forward_white.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_drawer.png b/app/src/main/res/drawable-hdpi/ic_drawer.png
new file mode 100644
index 0000000..c59f601
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_drawer.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_edit.png b/app/src/main/res/drawable-hdpi/ic_edit.png
new file mode 100644
index 0000000..6ed4351
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_edit.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_home_black.png b/app/src/main/res/drawable-hdpi/ic_home_black.png
new file mode 100644
index 0000000..2e86cc2
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_home_black.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_image.png b/app/src/main/res/drawable-hdpi/ic_image.png
new file mode 100644
index 0000000..b69c520
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_image.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_launcher.png b/app/src/main/res/drawable-hdpi/ic_launcher.png
new file mode 100755
index 0000000..23d8940
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_list_black.png b/app/src/main/res/drawable-hdpi/ic_list_black.png
new file mode 100644
index 0000000..d94b45a
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_list_black.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_live_tv_black.png b/app/src/main/res/drawable-hdpi/ic_live_tv_black.png
new file mode 100644
index 0000000..efb4fcb
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_live_tv_black.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_local_movies.png b/app/src/main/res/drawable-hdpi/ic_local_movies.png
new file mode 100644
index 0000000..d368c95
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_local_movies.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_menu_white.png b/app/src/main/res/drawable-hdpi/ic_menu_white.png
new file mode 100644
index 0000000..775fa19
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_menu_white.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_my_library_books.png b/app/src/main/res/drawable-hdpi/ic_my_library_books.png
new file mode 100644
index 0000000..0d4aa30
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_my_library_books.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_my_library_music.png b/app/src/main/res/drawable-hdpi/ic_my_library_music.png
new file mode 100644
index 0000000..e583029
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_my_library_music.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_ondemand_video_black.png b/app/src/main/res/drawable-hdpi/ic_ondemand_video_black.png
new file mode 100644
index 0000000..604868f
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_ondemand_video_black.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_refresh_white.png b/app/src/main/res/drawable-hdpi/ic_refresh_white.png
new file mode 100644
index 0000000..1692d8a
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_refresh_white.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_search_black.png b/app/src/main/res/drawable-hdpi/ic_search_black.png
new file mode 100644
index 0000000..3ae490e
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_search_black.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_search_white.png b/app/src/main/res/drawable-hdpi/ic_search_white.png
new file mode 100644
index 0000000..abbb989
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_search_white.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_settings_display_white.png b/app/src/main/res/drawable-hdpi/ic_settings_display_white.png
new file mode 100644
index 0000000..6e2f3e7
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_settings_display_white.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_video_collection.png b/app/src/main/res/drawable-hdpi/ic_video_collection.png
new file mode 100644
index 0000000..e63c808
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_video_collection.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_view_list_black.png b/app/src/main/res/drawable-hdpi/ic_view_list_black.png
new file mode 100644
index 0000000..ae702bb
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_view_list_black.png differ
diff --git a/app/src/main/res/drawable-hdpi/openlp_splash_screen.png b/app/src/main/res/drawable-hdpi/openlp_splash_screen.png
new file mode 100644
index 0000000..d413fdd
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/openlp_splash_screen.png differ
diff --git a/app/src/main/res/drawable-mdpi/drawer_shadow.9.png b/app/src/main/res/drawable-mdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..ffe3a28
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/drawer_shadow.9.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_add_alert_white.png b/app/src/main/res/drawable-mdpi/ic_add_alert_white.png
new file mode 100644
index 0000000..b142c69
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_add_alert_white.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_apps_white.png b/app/src/main/res/drawable-mdpi/ic_apps_white.png
new file mode 100644
index 0000000..95e1f49
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_apps_white.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_arrow_back_white.png b/app/src/main/res/drawable-mdpi/ic_arrow_back_white.png
new file mode 100644
index 0000000..43026ba
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_arrow_back_white.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_arrow_forward_white.png b/app/src/main/res/drawable-mdpi/ic_arrow_forward_white.png
new file mode 100644
index 0000000..8e09de1
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_arrow_forward_white.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_drawer.png b/app/src/main/res/drawable-mdpi/ic_drawer.png
new file mode 100644
index 0000000..1ed2c56
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_drawer.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_edit.png b/app/src/main/res/drawable-mdpi/ic_edit.png
new file mode 100644
index 0000000..4c95bd5
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_edit.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_home_black.png b/app/src/main/res/drawable-mdpi/ic_home_black.png
new file mode 100644
index 0000000..dcdcfc0
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_home_black.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_image.png b/app/src/main/res/drawable-mdpi/ic_image.png
new file mode 100644
index 0000000..56cba79
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_image.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_launcher.png b/app/src/main/res/drawable-mdpi/ic_launcher.png
new file mode 100755
index 0000000..71a9c7e
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_list_black.png b/app/src/main/res/drawable-mdpi/ic_list_black.png
new file mode 100644
index 0000000..ceb9fc2
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_list_black.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_live_tv_black.png b/app/src/main/res/drawable-mdpi/ic_live_tv_black.png
new file mode 100644
index 0000000..0827fb9
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_live_tv_black.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_local_movies.png b/app/src/main/res/drawable-mdpi/ic_local_movies.png
new file mode 100644
index 0000000..8002dfb
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_local_movies.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_menu_white.png b/app/src/main/res/drawable-mdpi/ic_menu_white.png
new file mode 100644
index 0000000..bdeecd4
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_menu_white.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_my_library_books.png b/app/src/main/res/drawable-mdpi/ic_my_library_books.png
new file mode 100644
index 0000000..771ad19
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_my_library_books.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_my_library_music.png b/app/src/main/res/drawable-mdpi/ic_my_library_music.png
new file mode 100644
index 0000000..5af747a
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_my_library_music.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_ondemand_video_black.png b/app/src/main/res/drawable-mdpi/ic_ondemand_video_black.png
new file mode 100644
index 0000000..5a9aa2a
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_ondemand_video_black.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_refresh_white.png b/app/src/main/res/drawable-mdpi/ic_refresh_white.png
new file mode 100644
index 0000000..1989184
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_refresh_white.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_search_black.png b/app/src/main/res/drawable-mdpi/ic_search_black.png
new file mode 100644
index 0000000..6381902
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_search_black.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_search_white.png b/app/src/main/res/drawable-mdpi/ic_search_white.png
new file mode 100644
index 0000000..bfc3e39
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_search_white.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_settings_display_white.png b/app/src/main/res/drawable-mdpi/ic_settings_display_white.png
new file mode 100644
index 0000000..4b06e65
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_settings_display_white.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_video_collection.png b/app/src/main/res/drawable-mdpi/ic_video_collection.png
new file mode 100644
index 0000000..b878309
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_video_collection.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_view_list_black.png b/app/src/main/res/drawable-mdpi/ic_view_list_black.png
new file mode 100644
index 0000000..c15537a
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_view_list_black.png differ
diff --git a/app/src/main/res/drawable-xhdpi/drawer_shadow.9.png b/app/src/main/res/drawable-xhdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..fabe9d9
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/drawer_shadow.9.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_add_alert_white.png b/app/src/main/res/drawable-xhdpi/ic_add_alert_white.png
new file mode 100644
index 0000000..34d898b
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_add_alert_white.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_apps_white.png b/app/src/main/res/drawable-xhdpi/ic_apps_white.png
new file mode 100644
index 0000000..5fee17f
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_apps_white.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_arrow_back_white.png b/app/src/main/res/drawable-xhdpi/ic_arrow_back_white.png
new file mode 100644
index 0000000..d3bf066
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_arrow_back_white.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_arrow_forward_white.png b/app/src/main/res/drawable-xhdpi/ic_arrow_forward_white.png
new file mode 100644
index 0000000..0152b5a
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_arrow_forward_white.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_drawer.png b/app/src/main/res/drawable-xhdpi/ic_drawer.png
new file mode 100644
index 0000000..a5fa74d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_drawer.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_edit.png b/app/src/main/res/drawable-xhdpi/ic_edit.png
new file mode 100644
index 0000000..0c0fd76
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_edit.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_home_black.png b/app/src/main/res/drawable-xhdpi/ic_home_black.png
new file mode 100644
index 0000000..04e2b26
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_home_black.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_image.png b/app/src/main/res/drawable-xhdpi/ic_image.png
new file mode 100644
index 0000000..c5cb5e9
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_image.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher.png b/app/src/main/res/drawable-xhdpi/ic_launcher.png
new file mode 100755
index 0000000..15f7d0b
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_list_black.png b/app/src/main/res/drawable-xhdpi/ic_list_black.png
new file mode 100644
index 0000000..e1f03b4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_list_black.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_live_tv_black.png b/app/src/main/res/drawable-xhdpi/ic_live_tv_black.png
new file mode 100644
index 0000000..67fc4e6
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_live_tv_black.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_local_movies.png b/app/src/main/res/drawable-xhdpi/ic_local_movies.png
new file mode 100644
index 0000000..25f3f5d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_local_movies.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_menu_white.png b/app/src/main/res/drawable-xhdpi/ic_menu_white.png
new file mode 100644
index 0000000..238cfd6
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_menu_white.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_my_library_books.png b/app/src/main/res/drawable-xhdpi/ic_my_library_books.png
new file mode 100644
index 0000000..3ba5a0e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_my_library_books.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_my_library_music.png b/app/src/main/res/drawable-xhdpi/ic_my_library_music.png
new file mode 100644
index 0000000..e812dd7
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_my_library_music.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_ondemand_video_black.png b/app/src/main/res/drawable-xhdpi/ic_ondemand_video_black.png
new file mode 100644
index 0000000..8bb06ea
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_ondemand_video_black.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_refresh_white.png b/app/src/main/res/drawable-xhdpi/ic_refresh_white.png
new file mode 100644
index 0000000..f5beca2
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_refresh_white.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_search_black.png b/app/src/main/res/drawable-xhdpi/ic_search_black.png
new file mode 100644
index 0000000..21be572
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_search_black.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_search_white.png b/app/src/main/res/drawable-xhdpi/ic_search_white.png
new file mode 100644
index 0000000..dd5adfc
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_search_white.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_settings_display_white.png b/app/src/main/res/drawable-xhdpi/ic_settings_display_white.png
new file mode 100644
index 0000000..6fe1bad
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_settings_display_white.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_video_collection.png b/app/src/main/res/drawable-xhdpi/ic_video_collection.png
new file mode 100644
index 0000000..755ddb4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_video_collection.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_view_list_black.png b/app/src/main/res/drawable-xhdpi/ic_view_list_black.png
new file mode 100644
index 0000000..7c1506b
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_view_list_black.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png b/app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png
new file mode 100644
index 0000000..b91e9d7
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/drawer_shadow.9.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_add_alert_white.png b/app/src/main/res/drawable-xxhdpi/ic_add_alert_white.png
new file mode 100644
index 0000000..5ae57c4
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_add_alert_white.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_apps_white.png b/app/src/main/res/drawable-xxhdpi/ic_apps_white.png
new file mode 100644
index 0000000..5bf8616
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_apps_white.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_arrow_back_white.png b/app/src/main/res/drawable-xxhdpi/ic_arrow_back_white.png
new file mode 100644
index 0000000..65c39a0
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_arrow_back_white.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_arrow_forward_white.png b/app/src/main/res/drawable-xxhdpi/ic_arrow_forward_white.png
new file mode 100644
index 0000000..0a0ddcb
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_arrow_forward_white.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_drawer.png b/app/src/main/res/drawable-xxhdpi/ic_drawer.png
new file mode 100644
index 0000000..9c4685d
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_drawer.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_edit.png b/app/src/main/res/drawable-xxhdpi/ic_edit.png
new file mode 100644
index 0000000..1361eed
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_edit.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_home_black.png b/app/src/main/res/drawable-xxhdpi/ic_home_black.png
new file mode 100644
index 0000000..d66401c
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_home_black.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_image.png b/app/src/main/res/drawable-xxhdpi/ic_image.png
new file mode 100644
index 0000000..cb187a9
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_image.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher.png b/app/src/main/res/drawable-xxhdpi/ic_launcher.png
new file mode 100755
index 0000000..ccf9910
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_list_black.png b/app/src/main/res/drawable-xxhdpi/ic_list_black.png
new file mode 100644
index 0000000..7ddaf52
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_list_black.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_live_tv_black.png b/app/src/main/res/drawable-xxhdpi/ic_live_tv_black.png
new file mode 100644
index 0000000..dc8aa6d
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_live_tv_black.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_local_movies.png b/app/src/main/res/drawable-xxhdpi/ic_local_movies.png
new file mode 100644
index 0000000..002c7b4
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_local_movies.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_local_play.png b/app/src/main/res/drawable-xxhdpi/ic_local_play.png
new file mode 100644
index 0000000..a866277
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_local_play.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_white.png b/app/src/main/res/drawable-xxhdpi/ic_menu_white.png
new file mode 100644
index 0000000..59aca7c
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_menu_white.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_my_library_books.png b/app/src/main/res/drawable-xxhdpi/ic_my_library_books.png
new file mode 100644
index 0000000..cec53f5
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_my_library_books.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_my_library_music.png b/app/src/main/res/drawable-xxhdpi/ic_my_library_music.png
new file mode 100644
index 0000000..35cf46f
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_my_library_music.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_ondemand_video_black.png b/app/src/main/res/drawable-xxhdpi/ic_ondemand_video_black.png
new file mode 100644
index 0000000..8962da3
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_ondemand_video_black.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_refresh_white.png b/app/src/main/res/drawable-xxhdpi/ic_refresh_white.png
new file mode 100644
index 0000000..c0e74dd
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_refresh_white.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_search_black.png b/app/src/main/res/drawable-xxhdpi/ic_search_black.png
new file mode 100644
index 0000000..a5e7a9c
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_search_black.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_search_white.png b/app/src/main/res/drawable-xxhdpi/ic_search_white.png
new file mode 100644
index 0000000..4cce1d9
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_search_white.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_settings_display_white.png b/app/src/main/res/drawable-xxhdpi/ic_settings_display_white.png
new file mode 100644
index 0000000..05d138d
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_settings_display_white.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_video_collection.png b/app/src/main/res/drawable-xxhdpi/ic_video_collection.png
new file mode 100644
index 0000000..275c64f
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_video_collection.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_view_list_black.png b/app/src/main/res/drawable-xxhdpi/ic_view_list_black.png
new file mode 100644
index 0000000..90591cc
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_view_list_black.png differ
diff --git a/app/src/main/res/drawable/custom_border.xml b/app/src/main/res/drawable/custom_border.xml
new file mode 100644
index 0000000..f613773
--- /dev/null
+++ b/app/src/main/res/drawable/custom_border.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/search_list.xml b/app/src/main/res/drawable/search_list.xml
new file mode 100644
index 0000000..c75b725
--- /dev/null
+++ b/app/src/main/res/drawable/search_list.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout-xlarge/fragment_livelist_list.xml b/app/src/main/res/layout-xlarge/fragment_livelist_list.xml
new file mode 100644
index 0000000..7ffcd85
--- /dev/null
+++ b/app/src/main/res/layout-xlarge/fragment_livelist_list.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..f0eff4c
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_open_lp.xml b/app/src/main/res/layout/activity_open_lp.xml
new file mode 100644
index 0000000..075dbc4
--- /dev/null
+++ b/app/src/main/res/layout/activity_open_lp.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/alert_display_dialog.xml b/app/src/main/res/layout/alert_display_dialog.xml
new file mode 100644
index 0000000..1221fbc
--- /dev/null
+++ b/app/src/main/res/layout/alert_display_dialog.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/blank_display_dialog.xml b/app/src/main/res/layout/blank_display_dialog.xml
new file mode 100644
index 0000000..a7f7397
--- /dev/null
+++ b/app/src/main/res/layout/blank_display_dialog.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml
new file mode 100644
index 0000000..ce62439
--- /dev/null
+++ b/app/src/main/res/layout/fragment_about.xml
@@ -0,0 +1,9 @@
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_empty.xml b/app/src/main/res/layout/fragment_empty.xml
new file mode 100644
index 0000000..5b483d2
--- /dev/null
+++ b/app/src/main/res/layout/fragment_empty.xml
@@ -0,0 +1,6 @@
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
new file mode 100644
index 0000000..974c838
--- /dev/null
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -0,0 +1,22 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_item_list.xml b/app/src/main/res/layout/fragment_item_list.xml
new file mode 100644
index 0000000..dc2e589
--- /dev/null
+++ b/app/src/main/res/layout/fragment_item_list.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_livelist_list.xml b/app/src/main/res/layout/fragment_livelist_list.xml
new file mode 100644
index 0000000..9f13d27
--- /dev/null
+++ b/app/src/main/res/layout/fragment_livelist_list.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml
new file mode 100644
index 0000000..cb95de8
--- /dev/null
+++ b/app/src/main/res/layout/fragment_main.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_navigation_drawer.xml b/app/src/main/res/layout/fragment_navigation_drawer.xml
new file mode 100644
index 0000000..c05742d
--- /dev/null
+++ b/app/src/main/res/layout/fragment_navigation_drawer.xml
@@ -0,0 +1,5 @@
+
diff --git a/app/src/main/res/layout/fragment_navigation_drawer_list.xml b/app/src/main/res/layout/fragment_navigation_drawer_list.xml
new file mode 100644
index 0000000..50ff6f5
--- /dev/null
+++ b/app/src/main/res/layout/fragment_navigation_drawer_list.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_search.xml b/app/src/main/res/layout/fragment_search.xml
new file mode 100644
index 0000000..fe7c04e
--- /dev/null
+++ b/app/src/main/res/layout/fragment_search.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_service_list.xml b/app/src/main/res/layout/fragment_service_list.xml
new file mode 100644
index 0000000..56d6025
--- /dev/null
+++ b/app/src/main/res/layout/fragment_service_list.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_servicelist_list.xml b/app/src/main/res/layout/fragment_servicelist_list.xml
new file mode 100644
index 0000000..6cbee56
--- /dev/null
+++ b/app/src/main/res/layout/fragment_servicelist_list.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_web.xml b/app/src/main/res/layout/fragment_web.xml
new file mode 100644
index 0000000..44b7c6f
--- /dev/null
+++ b/app/src/main/res/layout/fragment_web.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/search_action_dialog.xml b/app/src/main/res/layout/search_action_dialog.xml
new file mode 100644
index 0000000..b210efb
--- /dev/null
+++ b/app/src/main/res/layout/search_action_dialog.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/search_result.xml b/app/src/main/res/layout/search_result.xml
new file mode 100644
index 0000000..684cb15
--- /dev/null
+++ b/app/src/main/res/layout/search_result.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/search_result_row.xml b/app/src/main/res/layout/search_result_row.xml
new file mode 100644
index 0000000..e378e2a
--- /dev/null
+++ b/app/src/main/res/layout/search_result_row.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/spinner_dropdown_item.xml b/app/src/main/res/layout/spinner_dropdown_item.xml
new file mode 100644
index 0000000..42fcee9
--- /dev/null
+++ b/app/src/main/res/layout/spinner_dropdown_item.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/spinner_list_item.xml b/app/src/main/res/layout/spinner_list_item.xml
new file mode 100644
index 0000000..d76b839
--- /dev/null
+++ b/app/src/main/res/layout/spinner_list_item.xml
@@ -0,0 +1,11 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/global.xml b/app/src/main/res/menu/global.xml
new file mode 100644
index 0000000..326a6a7
--- /dev/null
+++ b/app/src/main/res/menu/global.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/menu/menu_.xml b/app/src/main/res/menu/menu_.xml
new file mode 100644
index 0000000..0ec6df8
--- /dev/null
+++ b/app/src/main/res/menu/menu_.xml
@@ -0,0 +1,6 @@
+
+
+
diff --git a/app/src/main/res/menu/open_l.xml b/app/src/main/res/menu/open_l.xml
new file mode 100644
index 0000000..5314e4a
--- /dev/null
+++ b/app/src/main/res/menu/open_l.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml
new file mode 100644
index 0000000..ee41299
--- /dev/null
+++ b/app/src/main/res/values-af/strings.xml
@@ -0,0 +1,54 @@
+
+
+ OpenLP is \'n gratis kerk skyfievertoning sagteware
+ Besoek die OpenLP webwerf vir meer inligting
+ Kopiereg
+ Gedeeltelike kopiereg
+ Lisensie
+ Hierdie program is gratis; jy kan dit herversprei of verander volgens die GNU Algemene Publieke Lisensie se voorwaardes, wat gepubliseer is deur die Free Software Foundation; weergawe 2 van die lisensie.
+ Hierdie program word versprei met die hoop dat dit nuttig sal wees, maar SONDER ENIGE WAARBORG; selfs sonder \'n geimpliseerde waarborg dat dit TOEPASLIK IS VIR \'N SPESIFIEKE DOEL
+ Instellings
+ Aangaande
+ Waarskuwing
+ Terug
+ Voorkeure
+ Verfris
+ Soek
+ OpenLP
+ Kanselleer
+ Konfigureer Netwerk
+ Wagwoord
+ Bediener Inligting
+ Konneksie Tyd-uitloop
+ Kies \'n waarde (millisekondes)
+ Gebruikernaame
+ Stel pasgemaakte tyd afsnypunt
+ Kies die verlangde skerm
+ Vertoon Werkvlak agtergrond
+ Laat die gekose item toe om na die middel van die lys te beweeg
+ Vertoon lewendige skerm
+ Vertoon Verstelling
+ Vertoon slegs Swart skerm
+ Vertoon slegs Tema
+ Bekragtig Aangepasde Tyd-uitlope
+ Voer Afkondiging teks in
+ Laat skerms toe op outomatiese te sentreer
+ Tuis
+ Ongemagtigde Toegang, voer asb \'n geldige gebruikernaam en wagwoord in.
+ Lewendige Vertoonlys
+ Lewendige Kykskerm
+ Maak navigeer vouer oop
+ Sluit navigeer vouer
+ Volgende
+ Geen
+ Poort
+ Vorige
+ Voer uit
+ Orde van diens
+ Verhoog skerm
+ Kies die grootte van die vertoning-teks
+ Verander die Diens teks grootte
+ Instellings
+ Gasheer naam of IP
+ Kan nie die versoek uitvoer nie - gaan jou netwerk verstellings na
+
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
new file mode 100644
index 0000000..b7eb7e6
--- /dev/null
+++ b/app/src/main/res/values-bg/strings.xml
@@ -0,0 +1,25 @@
+
+
+ Копирайт
+ Копирайт за отделни части
+ Лиценз
+ Настройки
+ Относно
+ Сигнал
+ Предпочитания
+ Обнови
+ Търсене
+ OpenLP
+ Откажи
+ Времето за изчакване на свързването
+ Избери стойност (в милисекунди)
+ Активирай клиентски срокове
+ Начало
+ След.
+ Нищо
+ Порт
+ назад
+ Промени размера на текста за Службата
+ Настройки
+ Hostname или IP
+
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
new file mode 100644
index 0000000..5a23b84
--- /dev/null
+++ b/app/src/main/res/values-cs/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP je volně dostupná křesťanská prezentační aplikace
+ Pro více informací navštivte OpenLP stránky
+ Autorská práva
+ Částečná autorská práva
+ Licence
+ Tento program je svobodný software; můžete jej šířit a modifikovat podle ustanovení GNU General Public License, vydávané Free Software Foundation; a to podle verze 2 této licence
+ Tento program je šířen v naději, že bude užitečný, avšak BEZ JAKÉKOLI ZÁRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo VHODNOSTI PRO URČITÝ ÚČEL
+ Nastavení
+ O aplikaci
+ Upozornění
+ Zpět
+ Změnit zobrazení
+ Nastavení
+ Obnovit
+ Hledat
+ OpenLP
+ Zrušit
+ Nastavení sítě
+ Heslo
+ Podrobnosti serveru
+ Časový limit spojení
+ Vybrat hodnotu (milisekundy)
+ Uživatelské jméno
+ Nastavit uživatelský časový limit
+ Vybrat požadované zobrazení
+ Zobrazit pozadí plochy
+ Povolit vybrané položce rolovat na střed seznamu
+ Zobrazit naživo
+ Nastavení zobrazení
+ Zobrazit jen černou
+ Zobrazit jen motiv
+ Zapnout uživatelský časový limit
+ Vložit text upozornění
+ Povolit automatické centrování obrazovky
+ Domů
+ Neoprávněný přístup, zadejte prosím správné uživatelské jméno a heslo
+ Seznam naživo
+ Zobrazení naživo
+ Otevřít navigační panel
+ Zavřít navigační panel
+ Další
+ Žádný
+ Port
+ Předchozí
+ Zpracovat
+ Seznam služby
+ Zobrazení na pódiu
+ Vybrat velikost zobrazeného textu
+ Změnit velikost textu služby
+ Nastavení
+ Jméno počítače nebo IP
+ Není možné vykonat požadavek - prověřte nastavení sítě
+
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
new file mode 100644
index 0000000..ab1e067
--- /dev/null
+++ b/app/src/main/res/values-da/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP er et frit og gratis præsentationsprogram til kirker.
+ Besøg OpenLP\'s hjemmside for at lære mere
+ Ophavsret
+ Delvis ophavsret
+ Licens
+ Dette program er fri software; du kan redistribuere det og/eller ændre det under vilkårene angivet i GNU General Public License, som er udgivet af Free Software Foundation; udgave 2 af licensen.
+ Dette program er udgivet i håbet om at det må være brugbart, men UDEN NOGEN GARANTI; endda uden den underforståede garanti om SALGBARHED eller BRUGBARHED TIL ET BESTEMT FORMÅL.
+ Indstillinger
+ Om
+ Meddelelse
+ Tilbage
+ Skift skærm
+ Indstillinger
+ Opdatér
+ Søg
+ OpenLP
+ Annullér
+ Konfigurér netværk
+ Adgangskode
+ Serverdetaljer
+ Timeout for forbindelse
+ Vælg en værdi (millisekunder)
+ Brugernavn
+ Sæt brugerdefineret timeout
+ Vælg den ønskede skærm
+ Vis skrivebordsbaggrund
+ Tillad centrering af det valgte element
+ Vis fremvisningsskærm
+ Visningsindstillinger
+ Vis kun sort
+ Vis kun temabaggrund
+ Aktiver brugerdefinerede timeouts
+ Indtast meddelelsestekst
+ Tiilad autocentrering
+ Hjem
+ Adgang ikke godkendt. Indtast gyldigt brugernavn og adgangskode
+ Fremvisningsliste
+ Præsentationsvisning
+ Åbn navigationsskuffe
+ Luk navigationsskuffe
+ Næste
+ Ingen
+ Port
+ Forrige
+ Proces
+ Programoversigt
+ Scenevisning
+ Vælg tekststørrelse til visning
+ Ændr programmets tekststørrelse
+ Indstillinger
+ Værtsnavn eller IP
+ Kunne ikke udføre forespørsel - tjek netværksindstillingerne
+
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
new file mode 100644
index 0000000..81177c1
--- /dev/null
+++ b/app/src/main/res/values-de/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP ist eine freie Präsentationssoftware für Kirchen und Gemeinden.
+ Weitere Informationen sind auf der OpenLP Webseite zu finden.
+ Urheberrecht
+ Anteiliges Urheberrecht
+ Lizenz
+ Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License Version 2, herausgegeben von der Free Software Foundation, weitergeben und/oder modifizieren.
+ Dieses Programms wird in der Hoffnung zur Verfügung gestellt, dass es Ihnen von Nutzen sein wird, aber OHNE JEDE GEWÄHRLEISTUNG; auch ohne einer implizite Gewährleistung von MARKTREIFE oder der EIGNUNG FÜR EINEN BESTIMMTEN ZWECK
+ Einstellungen
+ Über
+ Hinweis
+ Zurück
+ Anzeige umschalten
+ Einstellungen
+ Aktualisieren
+ Suche
+ OpenLP
+ Abbruch
+ Netzwerk einrichten
+ Passwort
+ Server-Einstellungen
+ Verbindungzeit überschritten
+ Wähle einen Wert (in Millisekunden)
+ Benutzername
+ Setze benutzerdefiniertes Zeitlimit
+ Wähle die erforderlichen Ansicht
+ Bildschirmhintergrund anzeigen
+ Ausgewähltes Item mittig in Liste
+ Live-Ansicht anzeigen
+ Anzeigeeinstellung
+ Abdunkeln
+ Nur Design anzeigen
+ Aktiviere eigene Time-outs
+ Hinweis eingeben
+ Anzeigen automatisch zentrieren
+ Start
+ Zugriff nicht erlaubt, bitte einen gültigen Benutzernamen und das korrekte Passwort eingeben
+ Live Liste
+ Echtzeit-Anzeige
+ Navigationsleiste anzeigen
+ Navigationsleiste verbergen
+ Vorwärts
+ Nichts
+ Port
+ Zurück
+ Verarbeite
+ Ablaufliste
+ Bühnenansicht
+ Textgröße in der Ansicht auswählen
+ Textgröße des Ablaufs ändern
+ Einstellungen
+ Hostname oder IP
+ Anfrage konnte nicht verarbeitet werden - bitte die Netzwerkeinstellungen überprüfen
+
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
new file mode 100644
index 0000000..58156f3
--- /dev/null
+++ b/app/src/main/res/values-el/strings.xml
@@ -0,0 +1,25 @@
+
+
+ Πνευματικά δικαιώματα
+ Τμηματικά πνευματικά δικαιώματα
+ Άδεια
+ Ρυθμίσεις
+ Σχετικά
+ Ειδοποίηση
+ Πίσω
+ Προτιμήσεις
+ Ανανέωση
+ Αναζήτηση
+ OpenLP
+ Ακύρωση
+ Λήξη Σύνδεσης
+ Επιλέξτε μια τιμή (milliseconds)
+ Επιλέξτε τον απαιτούμενο τύπο κενής σελίδας
+ Ενεργοποίηση
+ Αρχική Σελίδα
+ Κανένα
+ Θύρα
+ Αλλάξτε το μέγεθος κειμένου της Λειτουργίας
+ Ρυθμίσεις
+ Hostname ή διεύθυνση IP
+
diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml
new file mode 100644
index 0000000..4781d34
--- /dev/null
+++ b/app/src/main/res/values-en-rGB/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP is free church presentation software
+ To find out more visit the OpenLP website
+ Copyright
+ Portions copyright
+ License
+ 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
+ Settings
+ About
+ Alert
+ Back
+ Toggle Display
+ Preferences
+ Refresh
+ Search
+ OpenLP
+ Cancel
+ Configure Network
+ Password
+ Server Details
+ Connection Timeout
+ Select a value (milliseconds)
+ Username
+ Set Custom Timeout
+ Select the required display
+ Display Desktop background
+ Allow the selected item to scroll to the centre of the list
+ Show Live display
+ Display Setting
+ Display Black only
+ Display Theme only
+ Enable Custom Timeouts
+ Enter Alert Text
+ Allow displays to auto center
+ Home
+ Unauthorised Access, please enter valid username and password
+ Live List
+ Live View
+ Open navigation drawer
+ Close navigation drawer
+ Next
+ None
+ Port
+ Previous
+ Process
+ Service List
+ Stage View
+ Select display text size
+ Change the Service text size
+ Settings
+ Hostname or IP
+ Unable to process request - check network settings
+
diff --git a/app/src/main/res/values-en-rZA/strings.xml b/app/src/main/res/values-en-rZA/strings.xml
new file mode 100644
index 0000000..aec71ad
--- /dev/null
+++ b/app/src/main/res/values-en-rZA/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP is free church presentation software
+ To find out more visit the OpenLP website
+ Copyright
+ Portions copyright
+ License
+ 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
+ Settings
+ About
+ Alert
+ Back
+ Toggle Display
+ Preferences
+ Refresh
+ Search
+ OpenLP
+ Cancel
+ Configure Network
+ Password
+ Server Details
+ Connection Timeout
+ Select a value (milliseconds)
+ Username
+ Set Custom Timeout
+ Select the required display
+ Display Desktop background
+ Allow the selected item to scroll to the centre of the list
+ Show Live display
+ Display Setting
+ Display Black only
+ Display Theme only
+ Enable Custom Timeouts
+ Enter Alert Text
+ Allow displays to auto centre
+ Home
+ Unauthorised Access, please enter valid username and password
+ Live List
+ Live View
+ Open navigation drawer
+ Close navigation drawer
+ Next
+ None
+ Port
+ Previous
+ Process
+ Service List
+ Stage View
+ Select display text size
+ Change the Service text size
+ Settings
+ Hostname or IP
+ Unable to process request - check network settings
+
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
new file mode 100644
index 0000000..375bb89
--- /dev/null
+++ b/app/src/main/res/values-es/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP es un software de proyección gratuito para iglesias.
+ Para más información sobre OpenLP visite el sitio web.
+ Copyright
+ Partes copyright
+ Licencia
+ Este es un programa gratuito; usted puede distribuirlo y/o modificarlo bajo los términos de GNU General Public License según la publicación de Free Software Foundation; versión 2 de la Licencia.
+ Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR.
+ Preferencias
+ Acerca de
+ Alerta
+ Atrás
+ Alternar Pantalla
+ Preferencias
+ Actualizar
+ Buscar
+ OpenLP
+ Cancelar
+ Configurar Red
+ Clave
+ Detalles de Servidor
+ Tiempo de espera de conexión
+ Seleccione un valor (en milisegundos)
+ Usuario
+ Tiempo de espera personalizado
+ Seleccionar la pantalla requerida
+ Mostrar Fondo del Escritorio
+ Permitir que el elemento actual se desplace hacia el centro de la lista
+ Mostrar pantalla En Vivo
+ Preferencias de pantalla
+ Mostrar Negro solamente
+ Mostrar Tema solamente
+ Permitir tiempos de espera personalizados
+ Ingrese Texto de Alerta
+ Permitir auto centrado de pantalla
+ Inicio
+ Acceso No Autorizado, ingrese usuario y clave válidos
+ Lista En Vivo
+ Vista En Vivo
+ Abrir cajón de navegación
+ Cerrar cajón de navegación
+ Siguiente
+ Ninguno
+ Puerto
+ Anterior
+ Procesar
+ Lista de Servicio
+ Vista de Escenario
+ Seleccione tamaño del texto
+ Cambia el tamaño de texto del Servicio
+ Preferencias
+ Nombre de host o IP
+ No se pudo procesar la solicitud - revise la configuración de red
+
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
new file mode 100644
index 0000000..f884ac0
--- /dev/null
+++ b/app/src/main/res/values-et/strings.xml
@@ -0,0 +1,52 @@
+
+
+ OpenLP on vaba kiriku esitlustarkvara
+ Rohkem saab teada OpenLP veebilehelt
+ Autoriõigused
+ Osalised autoriõigused
+ Litsents
+ Sätted
+ Rakendusest
+ Teade
+ Tagasi
+ Kuva vahetus
+ Eelistused
+ Värskenda
+ Otsi
+ OpenLP
+ Loobu
+ Seadista võrk
+ Parool
+ Serveri andmed
+ Ühenduse aegumine
+ Vali kestus (millisekundid)
+ Kasutajanimi
+ Päringu aegumine
+ Vali nõutud kuva
+ Töölaua tausta näitamine
+ Laivi kuva
+ Kuvasätted
+ Kuva musta
+ Kuva ainult teemat
+ Kohandatud aegumisegade kasutamine
+ Hoiatuse tekst
+ Kuvad võivad automaatselt paigutuda keskele
+ Kodu
+ Lubamatu ligipääs, palun sisesta õiged kasutajanimi ja parool.
+ Ekraanil
+ Ekraan
+ Ava navisahtel
+ Sulge navisahtel
+ Järgmine
+ Puudub
+ Port
+ Eelmine
+ Töötlemine
+ Teenistuste loend
+ Lavavaade
+ Teksti suurus
+ Vaikimisi teenistuse teksti suuruse muutmine
+ Sätted
+ Hostinimi või IP
+ Päringu töötlemine on võimatu - kontrolli võrgusätteid
+
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
new file mode 100644
index 0000000..8f049ce
--- /dev/null
+++ b/app/src/main/res/values-fi/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP on vapaalevitteinen seurakuntien esitysohjelmisto.
+ Lisätietoja löytyy OpenLP verkkosivulta
+ Tekijäinoikeudet
+ Osien tekijäinoikeudet
+ Lisenssi
+ Tämä ohjelma on vapaa, voit jakaa ja / tai muuttaa sitä ehtojen mukaisesti GNU General Public Licensen julkaissut Free Software Foundation, version 2 lisenssillä.
+ Tätä ohjelmaa levitetään siinä toivossa, että se olisi hyödyllinen, mutta ilman mitään takuuta; ilman edes hiljaista takuuta kaupallisesti hyväksyttävästä laadusta tai soveltuvuudesta tiettyyn tarkoitukseen.
+ Asetukset
+ Tietoja
+ Huomioviesti
+ Takaisin
+ Näytä tai piilota näyttö
+ Asetukset
+ Päivitä
+ Etsi
+ OpenLP
+ Peruuta
+ Verkon asetukset
+ Salasana
+ Palvelimen asetukset
+ Yhteyden aikakatkaisu
+ Valitse arvo (millisekuntia)
+ Käyttäjätunnus
+ Säädä mukautettu aikakatkaisu
+ Valitse vaadittu näyttölaite
+ Näytä työpöydän tausta
+ Salli valittavan nimikkeen vierittäminen luettelon keskimmäiseksi
+ Näytä Esitys näyttö
+ Näytön asetukset
+ Näytä vain pimennys
+ Näytä vain teema
+ Salli mukautetut viiveet
+ Kirjoita huomioviesti tähän
+ Salli näyttöjen automaattinen keskitys
+ Koti
+ Ei pääsyä, ole hyvä ja anna kelvollinen käyttäjätunnus ja salasana
+ Lista
+ Esitysnäkymä
+ Avaa navigointi
+ Sulje navigointi
+ Seuraava
+ Ei mitään
+ Portti
+ Edellinen
+ Prosessoi
+ Palveluluettelo
+ Lavanäyttö
+ Valitse näyttötekstin koko
+ Vaihda palvelun tekstikokoa
+ Asetukset
+ Koneen nimi tai IP
+ Pyyntöä ei voi käsitellä - tarkista verkkoasetukset
+
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000..9fcc28b
--- /dev/null
+++ b/app/src/main/res/values-fr/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP est un logiciel de projection libre
+ Pour en savoir plus visitez le site web d\'OpenLP
+ Copyright
+ Copyright partiel
+ Licence
+ Ce programme est un logiciel libre; vous pouvez le redistribuer et/ou le modifier au titre des clauses de la Licence Publique Générale GNU, telle que publiée par la Free Software Foundation; version 2 de la Licence.
+ Ce programme est distribué dans l\'espoir qu\'il sera utile, mais SANS AUCUNE GARANTIE ; sans même une garantie implicite de COMMERCIABILITÉ ou DE CONFORMITÉ À UNE UTILISATION PARTICULIÈRE.
+ Paramètres
+ A propos de
+ Alerte
+ Arrière
+ Afficher/Masquer
+ Préférences
+ Rafraîchir
+ Recherche
+ OpenLP
+ Annuler
+ Configuration du réseau
+ Mot de passe
+ Détails du serveur
+ Délai de connexion
+ Sélectionnez une valeur (millisecondes)
+ Nom d\'utilisateur
+ Définir un délai personnalisé
+ Sélectionner l\'affichage souhaité
+ Afficher le fond du bureau
+ Permettre à l\'élément sélectionné de défiler au centre de la liste
+ Afficher le direct
+ Paramètres d\'affichage
+ Afficher un écran noir
+ Afficher uniquement le thème
+ Activer le délai personnalisé
+ Entrer le message d\'alerte
+ Permettre les affichages au centre
+ Accueil
+ Accès refusé, veuillez entrer un nom d\'utilisateur et un mot de passe valide
+ Liste du direct
+ Vue du direct
+ Ouvrir le tiroir de navigation
+ Fermer le tiroir de navigation
+ Suivant
+ Rien
+ Port
+ Précédent
+ Processus
+ Liste du service
+ Prompteur
+ Sélectionner la taille du texte
+ Modifier la taille du texte du service
+ Paramètres
+ Nom d\'hôte ou IP
+ Impossible d\'effectuer la demande - vérifiez les paramètres réseau
+
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
new file mode 100644
index 0000000..eeeb58c
--- /dev/null
+++ b/app/src/main/res/values-hu/strings.xml
@@ -0,0 +1,55 @@
+
+
+ Az OpenLP egy templomi/gyülekezeti vetítő szoftver.
+ További információk az OpenLP-ről a weboldalon
+ Szerzői jog
+ Részleges szerzői jog
+ Licenc
+ Ez egy szabad szoftver; terjeszthető illetve módosítható a GNU Általános Közreadási Feltételek dokumentumában leírtak szerint - 2. verzió -, melyet a Szabad Szoftver Alapítvány ad ki
+ Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb GARANCIA NÉLKÜL, az eladhatóságra vagy valamely célra való alkalmazhatóságra való származtatott garanciát is beleértve
+ Beállítások
+ Névjegy
+ Riasztás
+ Vissza
+ Megjelenítés átváltása
+ Beállítások
+ Frissítés
+ Keresés
+ OpenLP
+ Mégsem
+ Hálózat beállítása
+ Jelszó
+ Szerver részletek
+ Kapcsolódási időtúllépés
+ Érték választása (milliszekundum)
+ Felhasználói név
+ Egyéni időtúllépés beállítása
+ Kívánt megjelenés kiválasztása
+ Asztal hátterének megjelenítése
+ Görgetés a lista közepére a kijelölt elemhez
+ Élő adás megjelenítése
+ Megjelenítési beállítás
+ Elsötétített képernyő megjelenítése
+ Téma megjelenítése
+ Egyéni időtúllépés engedélyezése
+ Riasztási üzenet megadása
+ Megjelenés automatikus középre igazítása
+ Kezdőlap
+ Engedély nélküli hozzáférés, érvényes a felhasználói név és a jelszó?
+ Élő lista
+ Élő nézet
+ Menü megnyitása
+ Menü bezárása
+ Következő
+ Nincs
+ Portszám
+ Előző
+ Folyamatban
+ Sorrend
+ Színpadi nézet
+ Betűméret választása
+ Sorrend betűméretének módosítása
+ Beállítások
+ Gépnév vagy IP-cím
+ A kérés feldolgozhatatlan ‒ a hálózati beállítások ellenőrzése javasolt
+
diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml
new file mode 100644
index 0000000..bc17607
--- /dev/null
+++ b/app/src/main/res/values-id/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP adalah perangkat lunak presentasi gratis untuk gereja
+ Untuk mengetahui lebih lanjut, kunjungi situs OpenLP
+ Hak Cipta
+ Bagian hak cipta
+ Lisensi
+ Program ini adalah perangkat lunak gratis; Anda dapat menyebarluaskannya dan / atau memodifikasinya di bawah ketentuan GNU General Public License sebagaimana diterbitkan oleh Free Software Foundation; versi 2 dari Lisensi tersebut.
+ Program ini disebarluaskan dengan harapan bahwa akan berguna, tetapi TANPA JAMINAN APAPUN; bahkan tanpa jaminan yang termasuk pada PERDAGANGAN atau KECOCOKAN UNTUK SUATU TUJUAN TERTENTU.
+ Setelan
+ Tentang
+ Peringatan
+ Kembali
+ Ganti Tampilan
+ Pilihan
+ Segarkan-ulang
+ Penelusuran
+ OpenLP
+ Batal
+ Mengkonfigurasi Jaringan
+ Kata sandi
+ Rincian Server
+ Batas-Waktu Sambungan
+ Pilih sebuah nilai (milidetik)
+ Nama Pengguna
+ Setel Batas-waktu Kustom
+ Pilih tampilan yang dibutuhkan
+ Tampilkan latar Desktop
+ Izinkan butir terpilih untuk digulir ke tengah daftar
+ Tampilkan tampilan Tayang
+ Setelan Tampilan
+ Tampilkan Layar Hitam saja
+ Tampilkan Tema saja
+ Aktifkan Batas-Waktu Kustom
+ Masukkan Teks Peringatan
+ Izinkan semua tampilan diposisikan ke tengah secara otomatis
+ Beranda
+ Akses Tidak sah, silakan masukkan nama pengguna dan kata sandi yang valid
+ Daftar Tayang
+ Tinjauan Tayang
+ Buka penarik navigasi
+ Tutup penarik navigasi
+ Selanjutnya
+ Tidak sama sekali
+ Port
+ Sebelumnya
+ Proses
+ Daftar Layanan
+ Tinjuan Bertahap
+ Pilih tampilan ukuran teks
+ Ubah ukuran teks Layanan
+ Setelan
+ Nama Host atau IP
+ Tidak dapat memproses permintaan - periksa setelan jaringan
+
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
new file mode 100644
index 0000000..6322f06
--- /dev/null
+++ b/app/src/main/res/values-it/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP è un software libero di presentazione per le Chiese
+ Per saperne di più visita il sito Web OpenLP
+ Copyright
+ Porzioni di copyright
+ Licenza
+ Questo è un software libero; può essere redistribuito e/o modificato nei termini della GNU General Public License come pubblicato dalla Free Software Foundation; vesione 2 della licenza
+ Questo programma è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA, senza neppure l\'implicita garanzia della COMMERCIABILITA\' o IDONEITA\' PER UN PARTICOLARE SCOPO
+ Impostazioni
+ Informazioni
+ Avviso
+ Indietro
+ Attiva/disattiva visualizzazione
+ Preferenze
+ Aggiorna
+ Ricerca
+ OpenLP
+ Annulla
+ Configura Rete
+ Password
+ Dettagli Server
+ Timeout Connessione
+ Seleziona un valore (millisecondi)
+ Nome Utente
+ Imposta Timeout personalizzato
+ Selezionare il monitor desiderato
+ Visualizza sfondo Desktop
+ Consentire l\'elemento selezionato di scorrere al centro dell\'elenco
+ Visualizzazione Live Show
+ Impostazione Visualizzazione
+ Solo Schermo Nero
+ Visualizza solo il Tema
+ Abilitare i timeout personalizzati
+ Inserisci il testo Avviso
+ Consenti la visualizzazione al centro automaticamente
+ Inizio
+ Accesso non consentito, prego inserire un nome utente e password valida
+ Elenco LIVE
+ Visualizza LIVE
+ Apri sezione navigazione
+ Chiudi sezione navigazione
+ Successivo
+ Nessuno
+ Porta
+ Precedente
+ Elabora
+ Elenco Servizio
+ Visualizza Palco
+ Selezionare la dimensione testo di visualizzazione
+ Modificare le dimensioni del testo di servizio
+ Impostazioni
+ Hostname o IP
+ Impossibile elaborare la richiesta - controllare le impostazioni di rete
+
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
new file mode 100644
index 0000000..0492d4e
--- /dev/null
+++ b/app/src/main/res/values-ja/strings.xml
@@ -0,0 +1,39 @@
+
+
+ OpenLPは無償の教会プレゼンテーション用ソフトです。
+ 詳しくはOpenLPウェブサイトをご覧ください。
+ 著作権
+ 追加の著作権
+ ライセンス
+ このプログラムはフリーソフトウェアです。あなたはこれを、フリーソフトウェア財団によって発行された GNU 一般公衆利用許諾契約書バージョン2の定める条件の下で再頒布または改変することができます。
+ このプログラムは有用であることを願って頒布されますが、*全くの無保証* です。商業可能性の保証や特定の目的への適合性は、言外に示されたものも含め全く存在しません。
+ 設定
+ 情報
+ 警告
+ 戻る
+ 設定
+ 再読込
+ 検索
+ OpenLP
+ キャンセル
+ ネットワーク設定
+ パスワード
+ サーバの詳細
+ 接続タイムアウト
+ 値を選択 (ミリ秒)
+ ユーザ名
+ 任意のタイムアウト時間を設定する
+ 任意のタイムアウトを有効にする
+ 警告文を入力
+ ホーム
+ 認証が必要です。ユーザ名とパスワードを入力してください。
+ ライブ一覧
+ 次
+ 無し
+ ポート
+ 前
+ 文字の大きさを選択
+ 礼拝テキストの大きさを変更します
+ 設定
+ ホスト名またはIPアドレス
+
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
new file mode 100644
index 0000000..75b4d4f
--- /dev/null
+++ b/app/src/main/res/values-ko/strings.xml
@@ -0,0 +1,15 @@
+
+
+ 라이선스
+ 설정
+ 정보
+ 알림
+ 뒤로
+ 새로 고침
+ 검색
+ 취소
+ 처음
+ 다음
+ 포트
+ 설정
+
diff --git a/app/src/main/res/values-large/refs.xml b/app/src/main/res/values-large/refs.xml
new file mode 100644
index 0000000..04ab57e
--- /dev/null
+++ b/app/src/main/res/values-large/refs.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
new file mode 100644
index 0000000..6ec47d6
--- /dev/null
+++ b/app/src/main/res/values-lt/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP yra, bažnyčioms skirta, nemokama pristatymų programinė įranga
+ Norėdami sužinoti daugiau, aplankykite OpenLP svetainę
+ Autorių Teisės
+ Autorių Teisių dalys
+ Licencija
+ Ši programa yra nemokama programinė įranga; jūs galite ją platinti ir/arba modifikuoti remdamiesi Free Software Foundation paskelbtomis GNU Bendrosios Viešosios Licencijos sąlygomis; licencijos 2 versija.
+ Ši programa platinama, tikintis, kad ji bus naudinga, tačiau BE JOKIŲ GARANTIJŲ; netgi be numanomos PARDAVIMO ar TINKAMUMO TAM TIKRAM TIKSLUI GARANTIJOS
+ Nustatymus
+ Apie
+ Įspėjimas
+ Grįžti
+ Perjungti Ekraną
+ Nuostatos
+ Įkelti iš naujo
+ Paieška
+ OpenLP
+ Atšaukti
+ Konfigūruoti Tinklą
+ Slaptažodis
+ Išsamiau apie Serverį
+ Sujungimo Laiko Limitas
+ Pasirinkite reikšmę (milisekundėmis)
+ Vartotojo vardas
+ Nustatyti Pasirinktiną Laukimo Laiką
+ Pasirinkite reikiamą ekraną
+ Rodyti Darbalaukio foną
+ Leisti slinkti pasirinktą elementą į sąrašo centrą
+ Rodyti Gyvai ekraną
+ Ekrano Nustatymas
+ Rodyti tik Juodą
+ Rodyti tik Temą
+ Įjungti Pasirinktinius Laiko Limitus
+ Įveskite Įspėjimo Tekstą
+ Leisti automatiškai centruoti ekranus
+ Pradžia
+ Neleistina Prieiga, prašome įvesti teisingą vartotojo vardą bei slaptažodį
+ Sąrašas Gyvai
+ Gyvas Rodinys
+ Atidaryti naršymo stalčių
+ Uždaryti naršymo stalčių
+ Kitas
+ Joks
+ Prievadas
+ Ankstesnis
+ Vykdyti
+ Pamaldų Programos Sąrašas
+ Scenos Rodinys
+ Pasirinkite rodomo teksto dydį
+ Keisti Pamaldų programos teksto dydį
+ Nustatymus
+ Kompiuterio vardas arba IP
+ Negalima apdoroti užklausos - patikrinkite tinklo nustatymus
+
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
new file mode 100644
index 0000000..5c2f28e
--- /dev/null
+++ b/app/src/main/res/values-lv/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP ir bezmaksas prezentāciju programma baznīcām
+ Lai uzzinātu vairāk, apmeklējiet mājaslapu
+ Autortiesības
+ Daļu autortiesības
+ Licence
+ Šī ir bezmaksas programma. Jūs varat to izplatīt vai mainīt pēc GNU publiskās licences noteikumiem, kas publicēti Free Software Foundation, 2. versijas licencē.
+ Šī programma ir izplatīta ar cerību, ka tā būs noderīga, bet be jebkādām garantijām par tās noderīgumu mērķim vai ienesīgumu.
+ Iestatījumi
+ Par
+ Ziņojums
+ Atgriezties
+ Pārslēgt displeju
+ Iestatījumi
+ Atsvaidzināt
+ Meklēt
+ OpenLP
+ Atcelt
+ Tīkla konfigurācija
+ Parole
+ Servera iestatījumi
+ Savienojuma noildze
+ Izvēlieties vērtību (milisekundes)
+ Lietotājvārds
+ Izvēlieties vēlamo noildzi
+ Izvēlieties nepieciešamo displeju
+ Parādīt fona attēlu
+ Atļaut šim elementa pārvietoties uz saraksta centru
+ Parādīt displeju
+ Ekrāna iestatījumi
+ Attēlot melnu ekrānu
+ Attēlot tēmas attēlu
+ Iespējot pielāgotās noildzes
+ Ievadiet ziņojuma tekstu
+ Atļaut ekrānam iecentrēties automatiski.
+ Sākums
+ Pieeja liegta! Lūdzu ievadiet pareizu lietotājvārdu un paroli.
+ Saraksts demonstrēšanai
+ Attēls ekrānā
+ Atvērt navigācijas slaidni
+ Aizvērt navigācijas slaidni
+ Nākamais
+ Nekas
+ Ports
+ Iepriekšējais
+ Process
+ Saraksts
+ Skatuves ekrāns
+ Izvēlieties teksta lielumu
+ Izvēlieties dievkalpojuma teksta lielumu
+ Iestatījumi
+ Vārds vai IP adrese
+ Nav iespējams apstrādāt pieprasījumu - pārbaudiet tīkla iestatījumus.
+
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
new file mode 100644
index 0000000..dd45d13
--- /dev/null
+++ b/app/src/main/res/values-mk/strings.xml
@@ -0,0 +1,5 @@
+
+
+ Лиценца
+ Предупредување
+
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
new file mode 100644
index 0000000..5ada11b
--- /dev/null
+++ b/app/src/main/res/values-ml/strings.xml
@@ -0,0 +1,4 @@
+
+
+ ജാഗ്രത
+
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
new file mode 100644
index 0000000..bc8c43c
--- /dev/null
+++ b/app/src/main/res/values-nb/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP er en gratis presentasjonsprogramvare for menigheter
+ For videre opplysninger besøk OpenLP sin hjemmeside
+ Copyright
+ Andel av opphavsrett
+ Lisens
+ Dette programmet er gratis programvare; du kan redistribuere det og/eller endre det under betingelsene i GNU General Public License versjon 2, publisert av Free Software Foundation
+ Dette programmet er distribuert i det håp at det vil være nyttig, men UTEN NOEN FORM FOR GARANTI; heller ingen underforståtte garanti om SALGBARHET eller ANVENDELIGHET FOR ET SPESIELT FORMÅL.
+ Innstillinger
+ Om
+ Melding
+ Tilbake
+ Skifte skjermvisning
+ Innstillinger
+ Oppdater
+ Søk
+ OpenLP
+ Avbryt
+ Konfigurer nettverk
+ Passord
+ Serverditaljer
+ Tidsavbrudd for tilkobling
+ Velg en verdi (millisekund)
+ Brukernavn
+ Angi egendefinert tidsavbrudd
+ Velg ønsket visning
+ Vis skrivebordsbakgrunn
+ Tillat valgt punkt å rulle til midt på listen
+ Vis aktivt bilde
+ Skjerminnstilling
+ Vis sort skjerm
+ Vis tema
+ Aktiver egendefinerte tidsavbrudd
+ Skriv meldingstekst
+ Tillat automatisk sentrering av skjermene
+ Hjem
+ Ikke godkjent tilgang, vennligst skriv gyldig brukernavn og passord
+ Framvisningsliste
+ Skjermvisning
+ Åpne navigasjonsmenyen
+ Lukke navigasjonsmenyen
+ Neste
+ Ingen
+ Port
+ Forrige
+ Behandle
+ Møteprogramliste
+ Scenevisning
+ Velg tekststørrelse i skjerm
+ Endre tekststørrelsen i møteprogrammet
+ Innstillinger
+ Vertsnavn eller IP
+ Kan ikke behandle forespørselen - sjekk nettverksinnstillingene
+
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
new file mode 100644
index 0000000..af5c18d
--- /dev/null
+++ b/app/src/main/res/values-nl/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP is gratis presentatiesoftware voor kerken
+ Lees meer over OpenLP op de website
+ Copyright
+ Onderdelen copyright
+ Licentie
+ 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
+ Instellingen
+ Over
+ Waarschuwing
+ Terug
+ Scherm leegmaken
+ Voorkeuren
+ Vernieuwen
+ Zoek
+ OpenLP
+ Annuleer
+ Netwerk instellen
+ Wachtwoord
+ Serverdetails
+ Verbindingstimeout
+ Selecteer een waarde (milliseconden)
+ Gebruikersnaam
+ Aangepaste timeout instellen
+ Selecteer het verplichte scherm
+ Toon Desktop achtergrond
+ Toegang geven aan geselecteerde items om naar het midden van de lijst te scrollen
+ Toon live scherm
+ Beeldscherminstellingen
+ Toon alleen zwart
+ Toon alleen thema
+ Aangepaste timeouts toestaan
+ Voer waarschuwingstekst in
+ Schermen toegang geven tot auto center
+ Startpagina
+ Geen toegang, voer juiste gebruikersnaam en wachtwoord in
+ Live lijst
+ Live kijken
+ Open navigatiemenu
+ Sluit navigatiemenu
+ Volgende
+ Niet
+ Poort
+ Vorige
+ Verwerken
+ Liturgie lijst
+ Podiumweergave
+ Selecteer schermtekstgrootte
+ Verander lettergrootte liturgie
+ Instellingen
+ Hostname of IP adres
+ Kon aanvraag niet behandelen - controleer netwerkinstellingen
+
diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml
new file mode 100644
index 0000000..cadb6f2
--- /dev/null
+++ b/app/src/main/res/values-nn/strings.xml
@@ -0,0 +1,12 @@
+
+
+ Innstillingar.
+ Varsling
+ OpenLP
+ Tidsavbrot for tilkopling
+ Oppgje ein verdi i millisekund
+ Neste
+ Port
+ Førre
+ Innstillingar.
+
diff --git a/app/src/main/res/values-pap/strings.xml b/app/src/main/res/values-pap/strings.xml
new file mode 100644
index 0000000..48880b4
--- /dev/null
+++ b/app/src/main/res/values-pap/strings.xml
@@ -0,0 +1,18 @@
+
+
+ Derecho di outor
+ Lisensia
+ Konfigurashon
+ Informashon
+ Aviso
+ Preferensia
+ Buska
+ OpenLP
+ Permití Timeout adaptá
+ Sigiente
+ Niun
+ Port
+ Bai bèk
+ Konfigurashon
+ Hostname òf IP
+
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
new file mode 100644
index 0000000..c240f96
--- /dev/null
+++ b/app/src/main/res/values-pl/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP jest wolnym programem do obsługi kościelnego projektora
+ Dowiedz się więcej na stronie OpenLP
+ Prawa autorskie
+ Cząstkowe prawa autorskie
+ Licencja
+ Ten program jest wolnym oprogramowaniem; możesz go rozprzestrzeniać lub modyfikować zgodnie z zasadami Powszechnej Licencji Publicznej GNU, wydanej przez Fundację Wolnego Oprogramowania; zgodnie z 2 wersją tej Licencji
+ Ten program jest rozpowszechniany w nadziei, że będzie pożyteczny, ale BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ
+ Ustawienia
+ O programie
+ Komunikat
+ Wróć
+ Przełącz Ekran
+ Preferencje
+ Odśwież
+ Szukaj
+ OpenLP
+ Anuluj
+ Konfiguruj sieć
+ Hasło
+ Szczegóły serwera
+ Limit czasowy połączenia
+ Wybierz wartość (milisekundy)
+ Nazwa użytkownika
+ Ustaw inny limit czasowy
+ Wybierz wyświetlacz
+ Wyświetl tło ekranu
+ Pozwól wybranemu elementowi przewinąć do środka listy
+ Pokaż Ekran
+ Ustawienia wyświetlania
+ Wyświetl czarny ekran
+ Wyświetl tylko motyw
+ Niestandardowy limit czasu
+ Wpisz tekst komunikatu
+ Pozwól na autowyśrodkowanie
+ Home
+ Nieuprawniony dostęp, proszę wprowadź nazwę użytkownika oraz hasło.
+ Plan nabożeństwa
+ Ekran
+ Otwórz zakładkę nawigacji
+ Zamknij zakładkę nawigacji
+ Następny
+ Nic
+ Port
+ Poprzedni
+ Wyświetl
+ Plan Nabożeństwa
+ Scena
+ Wybierz rozmiar wyświetlanego tekstu
+ Zmień rozmiar czcionki w Planie Nabożeństwa
+ Ustawienia
+ Nazwa hosta lub IP
+ Nie można wykonać żądania - sprawdź ustawienia sieciowe
+
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000..ce397dc
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,55 @@
+
+
+ O OpenLP é um software livre para exibições em igrejas
+ Para saber mais visite o site do OpenLP
+ Direitos Autorais
+ Partes copyright
+ Licença
+ Este programa é um software livre; você pode redistribui-lo e/ou modifica-lo dentro dos termos da Licença Pública Geral GNU como publicada pela Fundação do Software Livre; na versão 2 da Licença.
+ Este programa é distribuido na esperança que será útil, mas SEM NENHUMA GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO PARA UM DETERMINADO FIM. Veja abaixo para maiores detalhes.
+ Configurações
+ Sobre
+ Alertar
+ Voltar
+ Alternar Monitor
+ Preferências
+ Atualizar
+ Busca
+ OpenLP
+ Cancelar
+ Configurar Rede
+ Senha
+ Detalhes do Servidor
+ Tempo limite de conexão
+ Selecione um valor (em milissegundos)
+ Usuário
+ Ativar Timeout Personalizado
+ Selecione o monitor requerido
+ Exibir Plano de Fundo da Área de Trabalho
+ Permitir ao item selecionado se deslocar ao centro da lista
+ Mostrar Visualização Ao Vivo
+ Configurações de Exibição
+ Exibir Tela Preta
+ Exibir Tema
+ Habilitar Timeouts personalizados
+ Digitar Texto de Alerta
+ Auto-centralizar slides na tela
+ Home
+ Acesso não autorizado, por favor, digite usuário e senha válidos
+ Lista Ao Vivo
+ Ao vivo
+ Abrir painel de navegação
+ Fechar painel de navegação
+ Próximo
+ Nenhum
+ Porta
+ Anterior
+ Processo
+ Lista de Serviço
+ Visualização de Palco
+ Selecionar tamanho do monitor de exibição
+ Alterar o tamanho do texto de culto
+ Configurações
+ Hostname ou IP
+ Não é possível processar o pedido - verifique as configurações de rede
+
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
new file mode 100644
index 0000000..fdb4389
--- /dev/null
+++ b/app/src/main/res/values-ro/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP este un program gratuit de prezentare pentru biserică
+ Pentru a afla mai multe vizitați pagina web OpenLP
+ Drepturi de autor
+ Drepturi de autor pentru bucăți
+ Licența
+ Acest program este gratuit; puteți să îl redistribuiți și/sau să îl modificați în termenii GNU General Public License cum au fost publicați de Free Software Foundation; versiunea 2 a Liceței
+ Acest program este distribuit în speranța că va fi folositor, dar FĂRĂ NICI O GARANȚIE; nici măcar a garanției implicite de COMERCIALIZARE sau POTRIVIRE PENTRU UN ANUMIT SCOP
+ Setări
+ Despre
+ Anunț
+ Înapoi
+ Schimbă Ecranul
+ Preferințe
+ Reîncărcare
+ Căutare
+ OpenLP
+ Anulare
+ Configurează Rețeaua
+ Parola
+ Detalii Server
+ Conexiunea a expirat
+ Selectați o valoare (milisecunde)
+ Nume utilizator
+ Stabiliți timp personalizat de expirare
+ Selectați ecranul necesar
+ Afișați fundalul spațiului de lucru
+ Permite elementului selectat să se deplaseze în mijlocul listei
+ Afișați ecranul \"În direct\"
+ Setare de Afișare
+ Afișați numai negru
+ Afișați numai tema
+ Activează timp de expirare personalizat
+ Introduceți textul Anunțului
+ Permite ecranelor să se auto-centreze
+ Acasă
+ Acces neautorizat, vă rog introduceți numele de utilizator și parola corecte.
+ Lista În direct
+ Vizualizare În direct
+ Deschide bara de navigare
+ Închide bara de navigare
+ Următor
+ nimic
+ Port
+ Anterior
+ Proces
+ Lista de Serviciu
+ Vizualizare pentru Scenă
+ Selectați mărimea textului afișat
+ Schimbați mărimea textului Serviciului
+ Setări
+ Hostname sau IP
+ Nu se poate procesa cererea - verificați setările de rețea
+
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000..44c5123
--- /dev/null
+++ b/app/src/main/res/values-ru/strings.xml
@@ -0,0 +1,42 @@
+
+
+ OpenLP является бесплатным церковным программным обеспечением для презентаций
+ Чтобы узнать больше, посетите веб-сайт OpenLP
+ Авторские права
+ Portions copyright
+ Лицензия
+ Эта программа является свободным программным обеспечением; Вы можете распространять и / или изменять его в соответствии с условиями GNU General Public License, опубликованной Фондом свободного программного обеспечения, версия 2 Лицензии
+ Эта программа распространяется в надежде, что она будет полезной, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемых гарантий КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНЫХ ЦЕЛЕЙ
+ Параметры
+ О програме
+ Оповещение
+ Черный
+ Переключите экран
+ Настройки
+ Обновить
+ Поиск
+ OpenLP
+ Отмена
+ Настроить сеть
+ Пароль
+ Параметры сервера
+ Время ожидания соединения
+ Выберите значение (в миллисекундах)
+ Установить пользовательский тайм-аут
+ Включить пользовательские тайм-ауты
+ Введите текст оповещения
+ Домой
+ Вид прямого эфира
+ Следующий
+ Ничего
+ Порт
+ Предыдущий
+ Выполнение
+ Список служения
+ Вид сцены
+ Выберите размер текста
+ Изменить размер текста Служения
+ Параметры
+ Имя хоста или IP
+ Невозможно выполнить запрос - проверьте настройки сети
+
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
new file mode 100644
index 0000000..ebf8106
--- /dev/null
+++ b/app/src/main/res/values-sk/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP je voľne dostupná kresťanská prezentačná aplikácia.
+ Pre viac informácií navštívte OpenLP web
+ Autorské práva
+ Čiastočné autorské práva
+ Licencia
+ Tento program je slobodný software; môžete ho šířiť a modifikovať podľa ustanovení GNU General Public License, vydávanej Free Software Foundation; a to podľa verze 2 tejto licencie
+ Tento program je šírený v nádeji, že bude užitočný, avšak BEZ AKÉJKOĽVEK ZÁRUKY; neposkytujú sa ani odvodené záruky PREDAJNOSTI alebo VHODNOSTI PRE URČITÝ ÚČEL
+ Nastavenia
+ O aplikácii
+ Upozornenie
+ Naspäť
+ Zmeniť zobrazenie
+ Nastavenia
+ Obnoviť
+ Hľadať
+ OpenLP
+ Zrušiť
+ Nastavenie sieťe
+ Heslo
+ Podrobnosti servera
+ Časový limit spojenia
+ Vybrať hodnotu (milisekundy)
+ Používateľské meno
+ Nastaviť užívateľský časový limiť
+ Vybrať požadované zobrazenie
+ Zobraziť pozadie plochy
+ Povoliť vybratej položke rolovať na stred zoznamu
+ Zobraziť naživo
+ Nastavenie zobrazenia
+ Zobraziť len čiernu
+ Zobraziť len motív
+ Zapnúť užívateľský časový limit
+ Zadať text upozornenia
+ Povoliť automatické centrovanie obrazovky
+ Domov
+ Nepovolený prístup, prosím zadajte správne používateľské meno a heslo
+ Zoznam naživo
+ Zobrazenie naživo
+ Otvoriť navigačný panel
+ Zatvoriť navigačný panel
+ Nasledujúci
+ Žiadny
+ Port
+ Predchádzajúci
+ Spracovať
+ Správca Služby
+ Pódiové zobrazenie
+ Vybrať veľkosť zobrazeného textu
+ Zmeniť veľkosť textu služby
+ Nastavenia
+ Názov počítača alebo IP
+ Nie je možné vykonať požiadavku - skontrolujte nastavenie siete
+
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
new file mode 100644
index 0000000..305c725
--- /dev/null
+++ b/app/src/main/res/values-sl/strings.xml
@@ -0,0 +1,13 @@
+
+
+ Licenca
+ Nastavitve
+ Opozorilo
+ Osveži
+ Išči
+ OpenLP
+ Prekliči
+ Port
+ Nastavitve
+ Hostname ali IP
+
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
new file mode 100644
index 0000000..c757504
--- /dev/null
+++ b/app/src/main/res/values-sq/strings.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
new file mode 100644
index 0000000..fb4afca
--- /dev/null
+++ b/app/src/main/res/values-sv/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP är fri mjukvara för kyrkpresentation
+ För mer information, besök OpenLP:s webbplats
+ Copyright
+ Del-copyright
+ Licens
+ Det här programmet är fri mjukvara; du får sprida den vidare och/eller ändra i den under villkoren i GNU General Public License så som publicerade av Free Software Foundation; version 2 av licensen.
+ Det här programmet ges ut i hopp om att det kan vara användbart, men UTAN NÅGON GARANTI; inte ens någon underförstådd garanti vid köp eller lämplighet för ett särskilt ändamål.
+ Inställningar
+ Om
+ Meddelande
+ Tillbaka
+ Växla visning
+ Alternativ
+ Uppdatera
+ Sök
+ OpenLP
+ Avbryt
+ Konfigurera nätverk
+ Lösenord
+ Serverinställningar
+ Anslutningstimeout
+ Välj ett värde (millisekunder)
+ Användarnamn
+ Ställ in egen timeout
+ Välj bildläge
+ Visa skrivbordsbakgrund
+ Tillåt den valda posten att automatiskt scrolla till mitten på listan
+ Visa live-bild
+ Bildinställningar
+ Visa endast svart skärm
+ Visa endast tema
+ Aktivera egna timeouter
+ Ange meddelandetext
+ Tillåt skärmar att centrera automatiskt
+ Hem
+ Anslutning nekad, kontrollera användarnamn och lösenord
+ Live-lista
+ Live-bild
+ Öppna navigeringsmeny
+ Stäng navigeringsmeny
+ Nästa
+ Inga
+ Port
+ Föregående
+ Visa
+ Körschema
+ Scenbild
+ Välj bildens textstorlek
+ Ändra körschemats textstorlek
+ Inställningar
+ Värdnamn eller IP-adress
+ Kunde inte hantera förfrågan - kontrollera nätverksinställningarna
+
diff --git a/app/src/main/res/values-sw600dp/refs.xml b/app/src/main/res/values-sw600dp/refs.xml
new file mode 100644
index 0000000..2ec568f
--- /dev/null
+++ b/app/src/main/res/values-sw600dp/refs.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-tlh/strings.xml b/app/src/main/res/values-tlh/strings.xml
new file mode 100644
index 0000000..c757504
--- /dev/null
+++ b/app/src/main/res/values-tlh/strings.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
new file mode 100644
index 0000000..061b1d8
--- /dev/null
+++ b/app/src/main/res/values-tr/strings.xml
@@ -0,0 +1,5 @@
+
+
+ Uyarı
+ OpenLP
+
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
new file mode 100644
index 0000000..d67b03a
--- /dev/null
+++ b/app/src/main/res/values-uk/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP це безкоштовна програма для презентацій в церкві
+ Щоб дізнатися більше, відвідайте веб-сайт OpenLP
+ Авторське право:
+ Часткове авторське право
+ Ліцензія
+ Ця програма є вільним програмним забезпеченням; ви можете розповсюджувати та/або змінювати його відповідно до умов GNU General Public License, виданої Фондом вільного програмного забезпечення, версія 2 Ліцензії
+ Ця програма поширюється в надії, що вона буде корисною, але БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ; навіть без гарантій КОМЕРЦІЙНОЇ ЦІННОСТІ чи ПРИДАТНОСТІ ДЛЯ КОНКРЕТНИХ ЦІЛЕЙ
+ Налаштування
+ Про
+ Сповіщення
+ Назад
+ Переключити Дисплей
+ Уподобання
+ Оновити
+ Пошук
+ OpenLP
+ Скасувати
+ Налаштування Мережі
+ Пароль
+ Деталі Сервера
+ Час очікування з\'єднання
+ Виберіть значення (в мілісекундах)
+ Ім\'я користувача:
+ Втановити інший Час Очікування
+ Виберіть потрібний дисплей
+ Обрати фон для робочого столу дисплея
+ Дозволити вибраний елемент, щоб перейти до центру списку
+ Показати основний дисплей
+ Налаштування Дисплею
+ Тільки Чорний дисплей
+ Тільки Тема дисплею
+ Обрати інший Час Очікування
+ Введіть Текст Сповіщення
+ Дозволити дисплей в центрі
+ Дім
+ Несанкціонований доступ будь ласка, введіть правильне ім\'я користувача та пароль
+ Список Перегляду
+ Режим Живого Перегляду
+ Відкрити вікно навігації
+ Закрити вікно навігації
+ Наступний
+ Ні
+ Порт
+ Попередній
+ Процес
+ Список Служб
+ Поставити Прегляд
+ Виберіть розмір тексту для дисплею
+ Змінити розмір шрифту для служби
+ Налаштування
+ Ім\'я хосту або IP
+ Не вдається обробити запит - перевірте налаштування мережі
+
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
new file mode 100644
index 0000000..c757504
--- /dev/null
+++ b/app/src/main/res/values-vi/strings.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml
new file mode 100644
index 0000000..63fc816
--- /dev/null
+++ b/app/src/main/res/values-w820dp/dimens.xml
@@ -0,0 +1,6 @@
+
+
+ 64dp
+
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..fe6df6a
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,55 @@
+
+
+ OpenLP是免費的教會簡報軟體
+ 要了解詳情,請參閱 OpenLP 網站
+ 版權
+ 程序版權
+ 許可協議
+ 這個程序是自由軟體,你可以遵照自由軟體基金會出版的 GNU通用公共許可證條款第2版來修改和重新發佈這個軟體
+ 這個程式是在期望它是可行的情況下發布, 但是沒有任何擔保,甚至沒有暗示的適用性或針對於特定用途的保障。
+ 設定
+ 關於
+ 警告
+ 退後
+ 切換顯示
+ 偏好設定
+ 重新整理
+ 搜尋
+ OpenLP
+ 取消
+ 設定網路
+ 密碼
+ 聚會細節
+ 連接逾時
+ 選擇數值(毫秒)
+ 帳號
+ 自訂逾時
+ 選擇需要的顯示畫面
+ 顯示桌面背景
+ 允許所選擇的項目捲動到清單的中間
+ 顯示現場Live
+ 顯示設定
+ 僅顯示黑幕
+ 僅顯示主題
+ 開啟自訂逾時
+ 輸入警報文字
+ 允許自動置中顯示
+ 首頁
+ 未經授權的連結,請輸入有效的帳號和密碼
+ 現場Live清單
+ Live 顯示
+ 打開隱藏式側選單
+ 關閉隱藏式側選單
+ 下一個
+ 無
+ 連接埠
+ 前一個
+ 程序
+ 聚會清單
+ 舞台查看
+ 選擇顯示字體尺存
+ 更改聚會文字大小
+ 設定
+ 主機名或IP
+ 無法處理請求 - 請檢查網路設定
+
diff --git a/app/src/main/res/values/backgroundTimeouts.xml b/app/src/main/res/values/backgroundTimeouts.xml
new file mode 100644
index 0000000..90af49f
--- /dev/null
+++ b/app/src/main/res/values/backgroundTimeouts.xml
@@ -0,0 +1,22 @@
+
+
+ - @string/none
+ - 1
+ - 2
+ - 5
+ - 10
+ - 15
+ - 20
+ - 30
+
+
+ - 0
+ - 1000
+ - 2000
+ - 5000
+ - 10000
+ - 15000
+ - 20000
+ - 30000
+
+
diff --git a/app/src/main/res/values/defaultValues.xml b/app/src/main/res/values/defaultValues.xml
new file mode 100644
index 0000000..98d878b
--- /dev/null
+++ b/app/src/main/res/values/defaultValues.xml
@@ -0,0 +1,12 @@
+
+
+ 192.168.0.1
+ 4316
+ userid
+ password
+
+
+ 3000
+ 14
+
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..074e7a0
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,9 @@
+
+
+ 16dp
+ 16dp
+
+
+ 240dp
+
diff --git a/app/src/main/res/values/httpClientTimeoutValues.xml b/app/src/main/res/values/httpClientTimeoutValues.xml
new file mode 100644
index 0000000..048503a
--- /dev/null
+++ b/app/src/main/res/values/httpClientTimeoutValues.xml
@@ -0,0 +1,16 @@
+
+
+ - 3000
+ - 4000
+ - 5000
+ - 8000
+ - 10000
+
+
+ - 3000
+ - 4000
+ - 5000
+ - 8000
+ - 10000
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/keyStrings.xml b/app/src/main/res/values/keyStrings.xml
new file mode 100644
index 0000000..9afc890
--- /dev/null
+++ b/app/src/main/res/values/keyStrings.xml
@@ -0,0 +1,11 @@
+
+ key_auto_scroll
+ key_enable_custom_timeout
+ key_connection_timeout
+ key_text_size
+ key_host
+ key_port
+ key_userid
+ key_password
+ key_shared_preferences
+
diff --git a/app/src/main/res/values/refs.xml b/app/src/main/res/values/refs.xml
new file mode 100644
index 0000000..6fcf429
--- /dev/null
+++ b/app/src/main/res/values/refs.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ - @layout/fragment_servicelist_list
+ - @layout/fragment_livelist_list
+
+
+ - @layout/fragment_item_list
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..b17bd88
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,61 @@
+
+
+ OpenLP is free church presentation software
+ To find out more visit the OpenLP website
+ Copyright
+ Portions copyright
+ License
+ 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
+ Settings
+ About
+ Alert
+ Back
+ Toggle Display
+ Preferences
+ Refresh
+ Search
+ OpenLP
+ Cancel
+ Configure Network
+ Password
+ Server Details
+ Connection Timeout
+ Select a value (milliseconds)
+ Username
+ Set Custom Timeout
+ Select the required display
+ Display Desktop background
+ Allow the selected item to scroll to the centre of the list
+ Live display
+ Display Setting
+ Display Black only
+ Display Theme only
+ Enable Custom Timeouts
+ Enter Alert Text
+ Allow displays to auto center
+ Home
+ Unauthorised Access, please enter valid username and password
+ Live List
+ Live View
+ Open navigation drawer
+ Close navigation drawer
+ Next
+ None
+ Port
+ Previous
+ Process
+ Search Text
+ Select Plugin
+ Service List
+ Search Results
+ Send Live
+ Add to Service
+ Showing Results for \'%s\'
+ Stage View
+ Select display text size
+ Change the Service text size
+ Settings
+ Hostname or IP
+ Unable to process request - check network settings
+
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..766ab99
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/values/textSize.xml b/app/src/main/res/values/textSize.xml
new file mode 100644
index 0000000..94b52ac
--- /dev/null
+++ b/app/src/main/res/values/textSize.xml
@@ -0,0 +1,22 @@
+
+
+ - 6
+ - 8
+ - 10
+ - 12
+ - 14
+ - 16
+ - 18
+ - 20
+
+
+ - 6
+ - 8
+ - 10
+ - 12
+ - 14
+ - 16
+ - 18
+ - 20
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml
new file mode 100644
index 0000000..5c84e5e
--- /dev/null
+++ b/app/src/main/res/xml/pref_general.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml
new file mode 100644
index 0000000..d0c4461
--- /dev/null
+++ b/app/src/main/res/xml/pref_headers.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/pref_notification.xml b/app/src/main/res/xml/pref_notification.xml
new file mode 100644
index 0000000..33606e5
--- /dev/null
+++ b/app/src/main/res/xml/pref_notification.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..ef7ae5a
--- /dev/null
+++ b/build.gradle
@@ -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:2.2.2'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ jcenter()
+ }
+}
diff --git a/fixssl.iml b/fixssl.iml
new file mode 100644
index 0000000..9b1c62e
--- /dev/null
+++ b/fixssl.iml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..1d3591c
--- /dev/null
+++ b/gradle.properties
@@ -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
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..8c0fb64
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..a611e19
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri Sep 16 06:02:15 BST 2016
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..91a7e26
--- /dev/null
+++ b/gradlew
@@ -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 "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..aec9973
--- /dev/null
+++ b/gradlew.bat
@@ -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
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'