diff --git a/OpenLP2.iml b/OpenLP2.iml index 09e9d22..ebb3cb4 100644 --- a/OpenLP2.iml +++ b/OpenLP2.iml @@ -8,7 +8,7 @@ - + diff --git a/app/app.iml b/app/app.iml index 81a46eb..1a4d498 100644 --- a/app/app.iml +++ b/app/app.iml @@ -12,10 +12,12 @@ - + - + @@ -35,12 +37,12 @@ - - - - - - + + + + + + @@ -69,6 +71,9 @@ + + + @@ -82,13 +87,13 @@ - + - - - + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 4a611f9..cb858be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,7 +10,7 @@ android { applicationId "org.openlp.android2" minSdkVersion 15 targetSdkVersion 22 - versionCode 2 + versionCode 4 versionName "2.0" } android { @@ -24,11 +24,22 @@ android { 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:22.2.0' - compile 'com.android.support:support-v4:22.2.0' + compile 'com.android.support:appcompat-v7:22.2.1' + compile 'com.android.support:support-v4:22.2.1' + compile 'com.android.support:design:22.2.1' compile 'com.loopj.android:android-async-http:1.4.6' + testCompile 'junit:junit:4.12' + testCompile 'org.easytesting:fest:1.0.16' + testCompile 'com.squareup:fest-android:1.0.8' + testCompile('org.robolectric:robolectric:3.0-rc2') { + exclude group: 'commons-logging', module: 'commons-logging' + exclude group: 'org.apache.httpcomponents', module: 'httpclient' + } } +} \ No newline at end of file diff --git a/app/src/androidTest/java/org/openlp/android2/ApplicationTest.java b/app/src/androidTest/java/org/openlp/android2/ApplicationTest.java deleted file mode 100644 index 308a5e6..0000000 --- a/app/src/androidTest/java/org/openlp/android2/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.openlp.android2; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/app/src/main/java/org/openlp/android2/OpenLP.java b/app/src/main/java/org/openlp/android2/OpenLP.java index 98de6ce..5312d6b 100644 --- a/app/src/main/java/org/openlp/android2/OpenLP.java +++ b/app/src/main/java/org/openlp/android2/OpenLP.java @@ -31,6 +31,7 @@ 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; @@ -74,13 +75,15 @@ public class OpenLP extends ActionBarActivity 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. * */ - private void doPreferenceCheck() { + protected void doPreferenceCheck() { SharedPreferences sharedPrefs = PreferenceManager .getDefaultSharedPreferences(this); if (sharedPrefs.getString(getString(R.string.key_host), "NONE").equals("NONE") @@ -118,23 +121,29 @@ public class OpenLP extends ActionBarActivity .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()) + .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()) + .replace(R.id.container_left, ServiceListFragment.newInstance(), "servicelist") .commit(); fragmentManager.beginTransaction() .replace(R.id.container_right, LiveListFragment.newInstance()) .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(); @@ -142,6 +151,8 @@ public class OpenLP extends ActionBarActivity .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(); @@ -149,6 +160,8 @@ public class OpenLP extends ActionBarActivity .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; } } @@ -253,4 +266,14 @@ public class OpenLP extends ActionBarActivity 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 index a078c91..427c03d 100644 --- a/app/src/main/java/org/openlp/android2/activities/SettingsActivity.java +++ b/app/src/main/java/org/openlp/android2/activities/SettingsActivity.java @@ -167,8 +167,7 @@ public class SettingsActivity extends PreferenceActivity { // Set the listener to watch for value changes. preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); - // Trigger the listener immediately with the preference's - // current value. + // Trigger the listener immediately with the preference's current value. sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager .getDefaultSharedPreferences(preference.getContext()) diff --git a/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java b/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java index 3c2aa9d..6a6d769 100644 --- a/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java +++ b/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java @@ -30,6 +30,7 @@ import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.TextHttpResponseHandler; import org.apache.http.Header; import org.openlp.android2.R; +import org.openlp.android2.api.Api; abstract public class OpenLPFragment extends ListFragment{ @@ -83,4 +84,14 @@ abstract public class OpenLPFragment extends ListFragment{ processUpdate(response, notInError); } } + + 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/OpenLPHttpClient.java b/app/src/main/java/org/openlp/android2/common/OpenLPHttpClient.java index 5b26711..e1384a4 100644 --- a/app/src/main/java/org/openlp/android2/common/OpenLPHttpClient.java +++ b/app/src/main/java/org/openlp/android2/common/OpenLPHttpClient.java @@ -62,9 +62,9 @@ public class OpenLPHttpClient { if (sharedPrefs.getBoolean(context.getString(R.string.key_enable_custom_timeout), false)) { Log.d(LOG_TAG, "Overriding Connection and Socket timeouts"); - connectionTimeout = sharedPrefs.getInt(context.getString(R.string.key_connection_timeout), - context.getResources().getInteger(R.integer.connectionTimeoutDefaultValue) - ); + connectionTimeout = Integer.parseInt(sharedPrefs.getString(context.getString(R.string.key_connection_timeout), + String.valueOf(context.getResources().getInteger(R.integer.connectionTimeoutDefaultValue)) + )); } client.setTimeout(connectionTimeout); if (useSSL){ @@ -85,7 +85,7 @@ public class OpenLPHttpClient { public String getBaseUrl(){ SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - useSSL =sharedPrefs.getBoolean(context.getString(R.string.key_ssl_use), false); + useSSL = sharedPrefs.getBoolean(context.getString(R.string.key_ssl_use), false); String host = sharedPrefs.getString(context.getString(R.string.key_host), context.getString(R.string.host_default_value)); String port = sharedPrefs.getString(context.getString(R.string.key_port), "4316"); diff --git a/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java b/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java index a44feef..833e264 100644 --- a/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java +++ b/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java @@ -27,6 +27,8 @@ 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; @@ -38,10 +40,10 @@ import org.openlp.android2.common.OpenLPHttpClient; public class BlankDisplayDialog extends OpenLPDialog { private final String LOG_TAG = BlankDisplayDialog.class.getName(); public AlertDialog dialog; - Button desktop; - Button screen; - Button theme; - Button reset; + RadioButton desktop; + RadioButton screen; + RadioButton theme; + RadioButton reset; /** * The system calls this only when creating the layout in a dialog. @@ -65,28 +67,28 @@ public class BlankDisplayDialog extends OpenLPDialog { View view = inflater.inflate(R.layout.blank_display_dialog, null); builder.setView(view); - reset = (Button) view.findViewById(R.id.buttonReset); + reset = (RadioButton) view.findViewById(R.id.buttonReset); reset.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { triggerTextRequest(Api.DISPLAY_SHOW); } }); - screen = (Button) view.findViewById(R.id.buttonScreen); + screen = (RadioButton) view.findViewById(R.id.buttonScreen); screen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { triggerTextRequest(Api.DISPLAY_BLANK); } }); - theme = (Button) view.findViewById(R.id.buttonTheme); + theme = (RadioButton) view.findViewById(R.id.buttonTheme); theme.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { triggerTextRequest(Api.DISPLAY_THEME); } }); - desktop = (Button) view.findViewById(R.id.buttonDesktop); + desktop = (RadioButton) view.findViewById(R.id.buttonDesktop); desktop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -122,21 +124,22 @@ public class BlankDisplayDialog extends OpenLPDialog { } public void populateDisplay(String json) { - Log.d(LOG_TAG, "populateDisplay"); + Log.d(LOG_TAG, "populateDisplay : " + json ); + reset_display(); try { JSONObject item = new JSONObject(json).getJSONObject("results"); - if (item.getString("theme").equals("false") & - item.getString("display").equals("false") & - item.getString("blank").equals("false")) { - screen.setEnabled(true); - theme.setEnabled(true); - desktop.setEnabled(true); - reset.setEnabled(false); + if (item.getString("theme").equals("true")){ + theme.setChecked(true); } else { - screen.setEnabled(false); - theme.setEnabled(false); - desktop.setEnabled(false); - reset.setEnabled(true); + 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); @@ -146,9 +149,13 @@ public class BlankDisplayDialog extends OpenLPDialog { public void errorDisplay(int statusCode, String responseString) { Log.d(LOG_TAG, String.format("URL Error status code %d text %s", statusCode, responseString)); - screen.setEnabled(false); - theme.setEnabled(false); - desktop.setEnabled(false); - reset.setEnabled(false); + 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/fragments/AboutFragment.java b/app/src/main/java/org/openlp/android2/fragments/AboutFragment.java index d95f054..cbf551c 100644 --- a/app/src/main/java/org/openlp/android2/fragments/AboutFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/AboutFragment.java @@ -55,7 +55,7 @@ public class AboutFragment extends Fragment { html.append(" © 2004-").append(date).append(" Raoul Snyman\n"); html.append(getString(R.string.about_display_5)); html.append(" © 2004-").append(date); - html.append("\nTim Bentley, Johan Mynhardt"); + html.append("\nTim Bentley, Tomas Groth, Johan Mynhardt"); html.append("\n\n\n"); html.append(getString(R.string.about_display_6)); html.append("\n"); diff --git a/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java b/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java index b575069..3717a68 100644 --- a/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java @@ -23,6 +23,7 @@ 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; @@ -139,7 +140,14 @@ public class LiveListFragment extends OpenLPFragment { } }; setListAdapter(adapter); - getListView().setSelection(selected - 1); + + 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"); } diff --git a/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java b/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java index ef5f729..c72ed7a 100644 --- a/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java @@ -24,6 +24,7 @@ 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; @@ -44,6 +45,7 @@ import org.openlp.android2.common.OpenLPHttpClient; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; public class ServiceListFragment extends OpenLPFragment { @@ -167,10 +169,17 @@ public class ServiceListFragment extends OpenLPFragment { text1.setTypeface(null, Typeface.NORMAL); } 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"); } 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_menu_white.png b/app/src/main/res/drawable-hdpi/ic_menu_white.png index 9cb0348..775fa19 100644 Binary files a/app/src/main/res/drawable-hdpi/ic_menu_white.png and b/app/src/main/res/drawable-hdpi/ic_menu_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_menu_white.png b/app/src/main/res/drawable-mdpi/ic_menu_white.png index 193185f..bdeecd4 100644 Binary files a/app/src/main/res/drawable-mdpi/ic_menu_white.png and b/app/src/main/res/drawable-mdpi/ic_menu_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_menu_white.png b/app/src/main/res/drawable-xhdpi/ic_menu_white.png index 623d147..238cfd6 100644 Binary files a/app/src/main/res/drawable-xhdpi/ic_menu_white.png and b/app/src/main/res/drawable-xhdpi/ic_menu_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_menu_white.png b/app/src/main/res/drawable-xxhdpi/ic_menu_white.png index 48ae218..59aca7c 100644 Binary files a/app/src/main/res/drawable-xxhdpi/ic_menu_white.png and b/app/src/main/res/drawable-xxhdpi/ic_menu_white.png differ diff --git a/app/src/main/res/drawable/customborder.xml b/app/src/main/res/drawable/customborder.xml index a1613c6..e657938 100644 --- a/app/src/main/res/drawable/customborder.xml +++ b/app/src/main/res/drawable/customborder.xml @@ -1,10 +1,11 @@ - + - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 684abf0..5bfe684 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,31 +8,59 @@ - - + + android:id="@+id/container" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + + - - + + + + + + + + 3000 14 + diff --git a/app/src/main/res/values/keyStrings.xml b/app/src/main/res/values/keyStrings.xml index f8ff4ac..578fe53 100644 --- a/app/src/main/res/values/keyStrings.xml +++ b/app/src/main/res/values/keyStrings.xml @@ -1,4 +1,5 @@ + key_auto_scroll key_enable_custom_timeout key_connection_timeout key_text_size diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d26c2e7..df5a823 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -26,25 +26,29 @@ Select a value (milliseconds) Username Set Custom Timeout - Select the required blank type - Blank display to Desktop - Reset Display - Blank display to Blank - Blank display to Theme + 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 - LiveView + Live View Open navigation drawer Close navigation drawer + Next None Port + Previous Process Service List Stage View - Display Text Size Select display text size Change the Service text size Settings diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml index d6eac61..5ffe891 100644 --- a/app/src/main/res/xml/pref_general.xml +++ b/app/src/main/res/xml/pref_general.xml @@ -8,4 +8,10 @@ android:summary="@string/text_size_summary" android:title="@string/text_size" /> + + diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml index 6f57afb..d0c4461 100644 --- a/app/src/main/res/xml/pref_headers.xml +++ b/app/src/main/res/xml/pref_headers.xml @@ -4,7 +4,7 @@
+ android:title="@string/display_settings" />