From b75b563e9d3bad890d1444b9e4a7bf76cfb95ac9 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 15 May 2016 17:48:52 +0100 Subject: [PATCH 01/18] fixed code --- app/app.iml | 53 ++++--- app/build.gradle | 23 ++-- app/libs/classes.jar | Bin 0 -> 92315 bytes .../main/java/org/openlp/android2/OpenLP.java | 2 + .../openlp/android2/common/NukeSSLCerts.java | 77 +++++++++++ .../openlp/android2/common/OpenLPDialog.java | 129 ++++++++++++------ .../android2/common/OpenLPFragment.java | 105 +++++++++----- .../android2/common/OpenLPHttpClient.java | 97 ------------- .../android2/common/OpenLPHttpReturn.java | 61 --------- .../common/OpenLPSSLSocketFactory.java | 66 --------- .../android2/common/RequestQueueService.java | 101 ++++++++++++++ .../android2/dialogs/AlertDisplayDialog.java | 2 - .../android2/dialogs/BlankDisplayDialog.java | 8 +- .../android2/fragments/LiveListFragment.java | 4 +- .../fragments/ServiceListFragment.java | 5 +- .../android2/fragments/WebFragment.java | 6 +- .../drawable-hdpi/openlp_splash_screen.png | Bin 57089 -> 63024 bytes app/src/main/res/menu/open_l.xml | 4 - build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 20 files changed, 396 insertions(+), 353 deletions(-) create mode 100644 app/libs/classes.jar create mode 100644 app/src/main/java/org/openlp/android2/common/NukeSSLCerts.java delete mode 100644 app/src/main/java/org/openlp/android2/common/OpenLPHttpClient.java delete mode 100644 app/src/main/java/org/openlp/android2/common/OpenLPHttpReturn.java delete mode 100644 app/src/main/java/org/openlp/android2/common/OpenLPSSLSocketFactory.java create mode 100644 app/src/main/java/org/openlp/android2/common/RequestQueueService.java diff --git a/app/app.iml b/app/app.iml index 78d7daa..fc630d9 100644 --- a/app/app.iml +++ b/app/app.iml @@ -1,5 +1,5 @@ - + @@ -12,10 +12,7 @@ - + @@ -36,13 +33,13 @@ - + - + @@ -50,6 +47,15 @@ + + + + + + + + + @@ -57,6 +63,7 @@ + @@ -64,35 +71,47 @@ + + + + + + + + + + + - - - - - - - + + + + + + - - + + + + - + diff --git a/app/build.gradle b/app/build.gradle index 830724a..ba4bda1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,5 @@ apply plugin: 'com.android.application' - project.archivesBaseName = 'OpenLP' - android { compileSdkVersion 22 buildToolsVersion "21.1.2" @@ -26,20 +24,15 @@ android { } testOptions { unitTests.returnDefaultValues = true -} + } -dependencies { - compile fileTree(include: ['*.jar'], dir: 'libs') - 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' + dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + 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' } } +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 0000000000000000000000000000000000000000..791fe0b4d7bb1ddde1d852352dc2f421d86e5bf5 GIT binary patch literal 92315 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

fSD%TO}sgzJxY0FzE|4 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�~3lB(4i*Ae=fNG_*>lMXOY~8 zKLokrQ|~80{BHqbLVr^M-uAQpCqi~Ez|glfld%0Q=IZw^lb5X|Dgoe6f#>H0Koko^3&{Li)K!*oy&$}T?vbHyV1?|OmI{=d+97@c2LqcPWZKm;eG7FgZ~=)uS%M~%l_9IWcTeV z53pK(WN`l94!&O$@pnSM)**UvZzRor|E~%CV}Y~Zsr_1H26*zYp=HEG0snJfaU zwMT~0|4H5RJMyphtM5A&c0~V*{6Gqd-|>IFdVAl=O(lO6|1Sse4?VblXZv>&zupqO zziF{X`9G3)c-;JY%iw z*&jvy_ptWgN&Omtbl)1>aX(7xKYLTZgw6hr{cGI7ee5>DN3kCWX!;%d*V8lddxAF= wdldW6UFC;+^Vfr%`#VRC(hq|EpJO 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 index 6a6d769..7da5ae3 100644 --- a/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java +++ b/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java @@ -26,18 +26,30 @@ import android.view.View; import android.widget.ListView; import android.widget.Toast; -import com.loopj.android.http.AsyncHttpClient; -import com.loopj.android.http.TextHttpResponseHandler; -import org.apache.http.Header; + +import 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 calledURL; - protected OpenLPHttpClient httpClient; + protected String urlcalled; protected String updateUrl; abstract public void itemClicked(int position); @@ -48,43 +60,72 @@ abstract public class OpenLPFragment extends ListFragment{ itemClicked(position); } - private static AsyncHttpClient client = new AsyncHttpClient(); - protected void refreshDisplay(){} protected void populateDisplay(String responseString, boolean inError) {} protected void processUpdate(String responseString, boolean inError) {} - protected void triggerTextRequest(String url) { - calledURL = url; - Log.d(LOG_TAG, "Trigger Request for url " + url); - String callurl = String.format("%s%s", httpClient.getAbsoluteUrl(client), url ); - client.get(callurl, null, new TextHttpResponseHandler() { + 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 void onSuccess(int statusCode, Header[] headers, String responseString) { - // called when response HTTP status is "200 OK" - manageResponse(responseString, true); + public Map getHeaders() throws AuthFailureError { + return createBasicAuthHeader("user", "passwd"); } - @Override - public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { - // called when response HTTP status is "4XX" (eg. 401, 403, 404) - if (statusCode == 401) { - Toast.makeText(context, R.string.httpreturn_unauthorised, Toast.LENGTH_LONG).show(); - } else { - Toast.makeText(context, R.string.unable, Toast.LENGTH_LONG).show(); - } - manageResponse(responseString, false); - } - }); + }; + //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); } - public void manageResponse(String response, boolean notInError) { - if (calledURL.equals(updateUrl)) { - populateDisplay(response, notInError); - }else { - processUpdate(response, notInError); - } + 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); diff --git a/app/src/main/java/org/openlp/android2/common/OpenLPHttpClient.java b/app/src/main/java/org/openlp/android2/common/OpenLPHttpClient.java deleted file mode 100644 index e1384a4..0000000 --- a/app/src/main/java/org/openlp/android2/common/OpenLPHttpClient.java +++ /dev/null @@ -1,97 +0,0 @@ -/****************************************************************************** - * OpenLP - Open Source Lyrics Projection * - * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * - * --------------------------------------------------------------------------- * - * This program is free software; you can redistribute it and/or modify it * - * under the terms of the GNU General Public License as published by the Free * - * Software Foundation; version 2 of the License. * - * * - * This program is distributed in the hope that it will be useful, but WITHOUT * - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * - * more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., 59 * - * Temple Place, Suite 330, Boston, MA 02111-1307 USA * - *******************************************************************************/ -package org.openlp.android2.common; - - -import java.security.KeyStore; -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import android.util.Log; -import com.loopj.android.http.AsyncHttpClient; -import org.openlp.android2.R; - -/** - * Personalised HttpClient to be used throughout OpenLP with customisable - * parameters. - */ -public class OpenLPHttpClient { - - private final String LOG_TAG = OpenLPHttpClient.class.getName(); - private Context context; - private Boolean useSSL = Boolean.FALSE; - - public OpenLPHttpClient(Context context) { - this.context = context; - } - - public String getAbsoluteUrl(AsyncHttpClient client) { - - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - - String urlBase = getBaseUrl(); - - Log.d(LOG_TAG, "Base Url set to " + urlBase); - - String userid = sharedPrefs.getString(context.getString(R.string.key_userid), "openlp"); - - String password = sharedPrefs.getString(context.getString(R.string.key_password), "password"); - - Log.d(LOG_TAG, "Credentials set to " + userid + " : " + password); - client.setBasicAuth(userid,password); - - int connectionTimeout = context.getResources().getInteger( - R.integer.connectionTimeoutDefaultValue); - - if (sharedPrefs.getBoolean(context.getString(R.string.key_enable_custom_timeout), false)) { - Log.d(LOG_TAG, "Overriding Connection and Socket timeouts"); - - connectionTimeout = Integer.parseInt(sharedPrefs.getString(context.getString(R.string.key_connection_timeout), - String.valueOf(context.getResources().getInteger(R.integer.connectionTimeoutDefaultValue)) - )); - } - client.setTimeout(connectionTimeout); - if (useSSL){ - try { - KeyStore trustStore = KeyStore.getInstance((KeyStore.getDefaultType())); - trustStore.load(null, null); - OpenLPSSLSocketFactory sf = new OpenLPSSLSocketFactory(trustStore); - sf.setHostnameVerifier((OpenLPSSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)); - client.setSSLSocketFactory(sf); - } - catch (Exception e){ - // - } - } - return urlBase; - } - - public String getBaseUrl(){ - SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - - useSSL = sharedPrefs.getBoolean(context.getString(R.string.key_ssl_use), false); - String host = sharedPrefs.getString(context.getString(R.string.key_host), - context.getString(R.string.host_default_value)); - String port = sharedPrefs.getString(context.getString(R.string.key_port), "4316"); - - return String.format("http%s://%s:%s", useSSL ? "s" : "", host, port); - - } - -} diff --git a/app/src/main/java/org/openlp/android2/common/OpenLPHttpReturn.java b/app/src/main/java/org/openlp/android2/common/OpenLPHttpReturn.java deleted file mode 100644 index 0f96c14..0000000 --- a/app/src/main/java/org/openlp/android2/common/OpenLPHttpReturn.java +++ /dev/null @@ -1,61 +0,0 @@ -/****************************************************************************** - * OpenLP - Open Source Lyrics Projection * - * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * - * --------------------------------------------------------------------------- * - * This program is free software; you can redistribute it and/or modify it * - * under the terms of the GNU General Public License as published by the Free * - * Software Foundation; version 2 of the License. * - * * - * This program is distributed in the hope that it will be useful, but WITHOUT * - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * - * more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., 59 * - * Temple Place, Suite 330, Boston, MA 02111-1307 USA * - *******************************************************************************/ -package org.openlp.android2.common; - -import android.content.Context; -import org.openlp.android2.R; - -public class OpenLPHttpReturn { - private int return_code = 0; - private String data = null; - private Context context; - - public OpenLPHttpReturn() { - this.return_code = -1; - this.data = ""; - this.context = null; - } - - public OpenLPHttpReturn(int return_code, String data, Context context) { - this.return_code = return_code; - this.data = data; - this.context = context; - } - - public String getData() { - return this.data; - } - - public boolean isError() { - return return_code != 0; - } - - public boolean isSecurityError() { - return return_code == 401; - } - - public String getErrorMessage(String message) { - return return_code == 401 ? this.context.getString(R.string.httpreturn_unauthorised) : message; - } - - @Override - public String toString() { - return "HttpReturn{" + "data='" + data + '\'' + ", return code=" + return_code + '}'; - } -} diff --git a/app/src/main/java/org/openlp/android2/common/OpenLPSSLSocketFactory.java b/app/src/main/java/org/openlp/android2/common/OpenLPSSLSocketFactory.java deleted file mode 100644 index a4f3ea3..0000000 --- a/app/src/main/java/org/openlp/android2/common/OpenLPSSLSocketFactory.java +++ /dev/null @@ -1,66 +0,0 @@ -/****************************************************************************** - * OpenLP - Open Source Lyrics Projection * - * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * - * --------------------------------------------------------------------------- * - * This program is free software; you can redistribute it and/or modify it * - * under the terms of the GNU General Public License as published by the Free * - * Software Foundation; version 2 of the License. * - * * - * This program is distributed in the hope that it will be useful, but WITHOUT * - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * - * more details. * - * * - * You should have received a copy of the GNU General Public License along * - * with this program; if not, write to the Free Software Foundation, Inc., 59 * - * Temple Place, Suite 330, Boston, MA 02111-1307 USA * - *******************************************************************************/ -package org.openlp.android2.common; - -import org.apache.http.conn.ssl.SSLSocketFactory; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; -import java.io.IOException; -import java.net.Socket; -import java.net.UnknownHostException; -import java.security.*; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; - -/** - * Created by tim on 14/11/14. - */ -public class OpenLPSSLSocketFactory extends SSLSocketFactory { - SSLContext sslContext = SSLContext.getInstance("TLS"); - - public OpenLPSSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { - super(truststore); - - TrustManager tm = new X509TrustManager() { - public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { - } - - public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { - } - - public X509Certificate[] getAcceptedIssuers() { - return null; - } - }; - - sslContext.init(null, new TrustManager[] { tm }, null); - } - - @Override - public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { - return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); - } - - @Override - public Socket createSocket() throws IOException { - return sslContext.getSocketFactory().createSocket(); - } -} 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..0412928 --- /dev/null +++ b/app/src/main/java/org/openlp/android2/common/RequestQueueService.java @@ -0,0 +1,101 @@ +/****************************************************************************** + * OpenLP - Open Source Lyrics Projection * + * --------------------------------------------------------------------------- * + * Copyright (c) 2011-2015 OpenLP Android Developers * + * --------------------------------------------------------------------------- * + * This program is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the Free * + * Software Foundation; version 2 of the License. * + * * + * This program is distributed in the hope that it will be useful, but WITHOUT * + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * + * more details. * + * * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., 59 * + * Temple Place, Suite 330, Boston, MA 02111-1307 USA * + *******************************************************************************/ +package org.openlp.android2.common; + +import android.content.Context; +import 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 OpenLPURLBuilder urlbuilder; + + private RequestQueueService(Context context) { + mCtx = context; + mRequestQueue = getRequestQueue(); + urlbuilder = new OpenLPURLBuilder(context); + + 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", urlbuilder.getBaseUrl(), url ); + } + + public String getBasicAuth(){ + return urlbuilder.getBasicAuth(); + } + + public int getConnectionTimeout(){ + return urlbuilder.getConnectionTimeout(); + } + + public void addToRequestQueue(Request req) { + getRequestQueue().add(req); + } + + public ImageLoader getImageLoader() { + return mImageLoader; + } +} + diff --git a/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java b/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java index 0a68677..0c23eee 100644 --- a/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java +++ b/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java @@ -32,7 +32,6 @@ import org.openlp.android2.R; import org.openlp.android2.api.Api; import org.openlp.android2.common.JsonHelpers; import org.openlp.android2.common.OpenLPDialog; -import org.openlp.android2.common.OpenLPHttpClient; public class AlertDisplayDialog extends OpenLPDialog { private final String LOG_TAG = AlertDisplayDialog.class.getName(); @@ -49,7 +48,6 @@ public class AlertDisplayDialog extends OpenLPDialog { // remove the dialog title, but you must call the superclass to get the Dialog. context = getActivity(); - httpClient = new OpenLPHttpClient(context); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // Get the layout inflater 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 833e264..8a6fd7d 100644 --- a/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java +++ b/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java @@ -35,10 +35,10 @@ import org.openlp.android2.R; import org.openlp.android2.api.Api; import org.openlp.android2.common.OpenLPDialog; -import org.openlp.android2.common.OpenLPHttpClient; public class BlankDisplayDialog extends OpenLPDialog { private final String LOG_TAG = BlankDisplayDialog.class.getName(); + public AlertDialog dialog; RadioButton desktop; RadioButton screen; @@ -56,8 +56,6 @@ public class BlankDisplayDialog extends OpenLPDialog { // remove the dialog title, but you must call the superclass to get the Dialog. context = getActivity(); - httpClient = new OpenLPHttpClient(context); - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); // Get the layout inflater LayoutInflater inflater = getActivity().getLayoutInflater(); @@ -147,8 +145,8 @@ 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)); + public void errorDisplay(String responseString) { + Log.d(LOG_TAG, String.format("URL Error text %s", responseString)); reset_display(); } 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 3717a68..8793b5c 100644 --- a/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java @@ -42,7 +42,6 @@ import org.openlp.android2.R; import org.openlp.android2.api.Api; import org.openlp.android2.common.JsonHelpers; import org.openlp.android2.common.OpenLPFragment; -import org.openlp.android2.common.OpenLPHttpClient; import java.util.ArrayList; import java.util.HashMap; @@ -73,8 +72,7 @@ public class LiveListFragment extends OpenLPFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { context = getActivity(); - updateUrl = Api.LIVE_TEXT; - httpClient = new OpenLPHttpClient(context); + urlcalled = Api.LIVE_TEXT; return super.onCreateView(inflater, container, savedInstanceState); } 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 c72ed7a..91152cb 100644 --- a/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java @@ -40,12 +40,10 @@ import org.openlp.android2.R; import org.openlp.android2.api.Api; import org.openlp.android2.common.JsonHelpers; import org.openlp.android2.common.OpenLPFragment; -import org.openlp.android2.common.OpenLPHttpClient; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Map; public class ServiceListFragment extends OpenLPFragment { @@ -64,8 +62,7 @@ public class ServiceListFragment extends OpenLPFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { context = getActivity(); - updateUrl = Api.SERVICE_LIST; - httpClient = new OpenLPHttpClient(context); + urlcalled = Api.SERVICE_LIST; return super.onCreateView(inflater, container, savedInstanceState); } diff --git a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java index fdffb41..b441836 100644 --- a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java @@ -28,12 +28,10 @@ import android.webkit.SslErrorHandler; import android.webkit.WebView; import android.webkit.WebViewClient; import org.openlp.android2.R; -import org.openlp.android2.common.OpenLPHttpClient; public class WebFragment extends Fragment { protected String curURL; - private OpenLPHttpClient httpClient; private WebView webview; public WebFragment(){ @@ -47,7 +45,7 @@ public class WebFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { - httpClient = new OpenLPHttpClient(getActivity()); + View view = inflater.inflate(R.layout.fragment_web, container, false); if (curURL != null) { @@ -59,7 +57,7 @@ public class WebFragment extends Fragment { webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); webview.setScrollbarFadingEnabled(true); webview.setWebViewClient(new webClient()); - webview.loadUrl(String.format("%s%s", httpClient.getBaseUrl(), curURL)); + //webview.loadUrl(String.format("%s%s", httpClient.getBaseUrl(), curURL)); } return view; } diff --git a/app/src/main/res/drawable-hdpi/openlp_splash_screen.png b/app/src/main/res/drawable-hdpi/openlp_splash_screen.png index 618e47c6eb86f856f098a58fbfe5dccf9bdbb5c0..d413fdd5b27bbe635cbfd325009c10b178d4359a 100644 GIT binary patch literal 63024 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 literal 57089 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

  • m`3t!*3(D_*`~|n& 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 !oCZ#Hy0fN7PniVvQ&1N{EclUyHVit{b*I^7j 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 i56}?u|9!#jzh - Date: Sun, 15 May 2016 17:51:14 +0100 Subject: [PATCH 02/18] fix year --- .../main/java/org/openlp/android2/OpenLP.java | 2 +- .../java/org/openlp/android2/api/Api.java | 2 +- .../openlp/android2/common/JsonHelpers.java | 2 +- .../android2/common/NavigationOptions.java | 2 +- .../openlp/android2/common/NukeSSLCerts.java | 2 +- .../openlp/android2/common/OpenLPDialog.java | 2 +- .../android2/common/OpenLPFragment.java | 2 +- .../android2/common/OpenLPURLBuilder.java | 78 +++++++++++++++++++ .../android2/common/RequestQueueService.java | 2 +- .../android2/dialogs/AlertDisplayDialog.java | 2 +- .../android2/dialogs/BlankDisplayDialog.java | 2 +- .../android2/fragments/AboutFragment.java | 2 +- .../android2/fragments/HomeFragment.java | 2 +- .../android2/fragments/LiveListFragment.java | 2 +- .../android2/fragments/LiveWebFragment.java | 2 +- .../fragments/NavigationDrawerFragment.java | 2 +- .../fragments/ServiceListFragment.java | 2 +- .../android2/fragments/StageWebFragment.java | 2 +- .../android2/fragments/WebFragment.java | 2 +- 19 files changed, 96 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java diff --git a/app/src/main/java/org/openlp/android2/OpenLP.java b/app/src/main/java/org/openlp/android2/OpenLP.java index baf65b0..51ac9da 100644 --- a/app/src/main/java/org/openlp/android2/OpenLP.java +++ b/app/src/main/java/org/openlp/android2/OpenLP.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/api/Api.java b/app/src/main/java/org/openlp/android2/api/Api.java index ca81188..1dc9fd1 100644 --- a/app/src/main/java/org/openlp/android2/api/Api.java +++ b/app/src/main/java/org/openlp/android2/api/Api.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/common/JsonHelpers.java b/app/src/main/java/org/openlp/android2/common/JsonHelpers.java index a46ac09..d06ffc7 100644 --- a/app/src/main/java/org/openlp/android2/common/JsonHelpers.java +++ b/app/src/main/java/org/openlp/android2/common/JsonHelpers.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/common/NavigationOptions.java b/app/src/main/java/org/openlp/android2/common/NavigationOptions.java index b231c3c..80f8dbf 100644 --- a/app/src/main/java/org/openlp/android2/common/NavigationOptions.java +++ b/app/src/main/java/org/openlp/android2/common/NavigationOptions.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/common/NukeSSLCerts.java b/app/src/main/java/org/openlp/android2/common/NukeSSLCerts.java index 511ddb8..bd11174 100644 --- a/app/src/main/java/org/openlp/android2/common/NukeSSLCerts.java +++ b/app/src/main/java/org/openlp/android2/common/NukeSSLCerts.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/common/OpenLPDialog.java b/app/src/main/java/org/openlp/android2/common/OpenLPDialog.java index 8f4d592..a19b8cd 100644 --- a/app/src/main/java/org/openlp/android2/common/OpenLPDialog.java +++ b/app/src/main/java/org/openlp/android2/common/OpenLPDialog.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * 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 7da5ae3..9fd3578 100644 --- a/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java +++ b/app/src/main/java/org/openlp/android2/common/OpenLPFragment.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * 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..a9c1084 --- /dev/null +++ b/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.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.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; + + public OpenLPURLBuilder(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); + + Boolean useSSL = sharedPrefs.getBoolean(context.getString(R.string.key_ssl_use), false); + String host = sharedPrefs.getString(context.getString(R.string.key_host), + context.getString(R.string.host_default_value)); + String port = sharedPrefs.getString(context.getString(R.string.key_port), "4316"); + + return String.format("http%s://%s:%s", useSSL ? "s" : "", host, port); + + } +} diff --git a/app/src/main/java/org/openlp/android2/common/RequestQueueService.java b/app/src/main/java/org/openlp/android2/common/RequestQueueService.java index 0412928..bdff433 100644 --- a/app/src/main/java/org/openlp/android2/common/RequestQueueService.java +++ b/app/src/main/java/org/openlp/android2/common/RequestQueueService.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java b/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java index 0c23eee..52f824e 100644 --- a/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java +++ b/app/src/main/java/org/openlp/android2/dialogs/AlertDisplayDialog.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * 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 8a6fd7d..93fca1b 100644 --- a/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java +++ b/app/src/main/java/org/openlp/android2/dialogs/BlankDisplayDialog.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * 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 cbf551c..06c674a 100644 --- a/app/src/main/java/org/openlp/android2/fragments/AboutFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/AboutFragment.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/fragments/HomeFragment.java b/app/src/main/java/org/openlp/android2/fragments/HomeFragment.java index ffd41b2..cc51a62 100644 --- a/app/src/main/java/org/openlp/android2/fragments/HomeFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/HomeFragment.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * 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 8793b5c..82bd5e1 100644 --- a/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/fragments/LiveWebFragment.java b/app/src/main/java/org/openlp/android2/fragments/LiveWebFragment.java index 7ff94dc..53ced25 100644 --- a/app/src/main/java/org/openlp/android2/fragments/LiveWebFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/LiveWebFragment.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java b/app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java index 6024cf6..98b6aaf 100644 --- a/app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * 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 91152cb..aecc7d3 100644 --- a/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/fragments/StageWebFragment.java b/app/src/main/java/org/openlp/android2/fragments/StageWebFragment.java index ede970e..64a0ef9 100644 --- a/app/src/main/java/org/openlp/android2/fragments/StageWebFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/StageWebFragment.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * diff --git a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java index b441836..ac8b892 100644 --- a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java @@ -1,7 +1,7 @@ /****************************************************************************** * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * - * Copyright (c) 2011-2015 OpenLP Android Developers * + * 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 * From da8a6cbb2b86daa26152f84ff112ed4f5e9e2c3b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 15 May 2016 19:24:46 +0100 Subject: [PATCH 03/18] merge in search --- .../main/java/org/openlp/android2/OpenLP.java | 19 +++++++++++++++++++ .../android2/common/NavigationOptions.java | 1 + .../fragments/NavigationDrawerFragment.java | 5 +++++ app/src/main/res/values/strings.xml | 8 ++++++-- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/openlp/android2/OpenLP.java b/app/src/main/java/org/openlp/android2/OpenLP.java index 51ac9da..34b7a3a 100644 --- a/app/src/main/java/org/openlp/android2/OpenLP.java +++ b/app/src/main/java/org/openlp/android2/OpenLP.java @@ -43,6 +43,7 @@ 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; @@ -165,6 +166,24 @@ public class OpenLP extends ActionBarActivity 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; } } diff --git a/app/src/main/java/org/openlp/android2/common/NavigationOptions.java b/app/src/main/java/org/openlp/android2/common/NavigationOptions.java index 80f8dbf..cd8b159 100644 --- a/app/src/main/java/org/openlp/android2/common/NavigationOptions.java +++ b/app/src/main/java/org/openlp/android2/common/NavigationOptions.java @@ -24,4 +24,5 @@ public class NavigationOptions{ 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/fragments/NavigationDrawerFragment.java b/app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java index 98b6aaf..2052e30 100644 --- a/app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/NavigationDrawerFragment.java @@ -152,6 +152,11 @@ public class NavigationDrawerFragment extends Fragment { 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"}; diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index df5a823..0d6bc72 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,14 +29,14 @@ Select the required display Display Desktop background Allow the selected item to scroll to the centre of the list - Show Live display + Live display Display Setting Display Black only Display Theme only Enable Custom Timeouts Enter Alert Text Allow displays to auto center - Home + Home Unauthorised Access, please enter valid username and password Live List Live View @@ -48,6 +48,10 @@ Previous Process Service List + Search Results + Send Live + Add to Service + Showing Results for \'%s\' Stage View Select display text size Change the Service text size From 26cd14c2b59154a82f1c1b953c6bb5437942646c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 13 Jun 2016 21:43:28 +0100 Subject: [PATCH 04/18] Update files --- app/app.iml | 16 ++-- .../main/java/org/openlp/android2/OpenLP.java | 2 - .../openlp/android2/common/NukeSSLCerts.java | 77 ------------------- .../android2/common/OpenLPURLBuilder.java | 3 +- .../android2/fragments/WebFragment.java | 6 -- app/src/main/res/values/keyStrings.xml | 2 - app/src/main/res/values/strings.xml | 2 - build.gradle | 2 +- 8 files changed, 10 insertions(+), 100 deletions(-) delete mode 100644 app/src/main/java/org/openlp/android2/common/NukeSSLCerts.java diff --git a/app/app.iml b/app/app.iml index fc630d9..8841e64 100644 --- a/app/app.iml +++ b/app/app.iml @@ -64,14 +64,6 @@ - - - - - - - - @@ -80,6 +72,14 @@ + + + + + + + + diff --git a/app/src/main/java/org/openlp/android2/OpenLP.java b/app/src/main/java/org/openlp/android2/OpenLP.java index 34b7a3a..a0818b8 100644 --- a/app/src/main/java/org/openlp/android2/OpenLP.java +++ b/app/src/main/java/org/openlp/android2/OpenLP.java @@ -35,7 +35,6 @@ import android.view.WindowManager; import org.openlp.android2.activities.SettingsActivity; import org.openlp.android2.common.NavigationOptions; -import org.openlp.android2.common.NukeSSLCerts; import org.openlp.android2.dialogs.AlertDisplayDialog; import org.openlp.android2.dialogs.BlankDisplayDialog; import org.openlp.android2.fragments.AboutFragment; @@ -66,7 +65,6 @@ public class OpenLP extends ActionBarActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - new NukeSSLCerts().nuke(); doPreferenceCheck(); diff --git a/app/src/main/java/org/openlp/android2/common/NukeSSLCerts.java b/app/src/main/java/org/openlp/android2/common/NukeSSLCerts.java deleted file mode 100644 index bd11174..0000000 --- a/app/src/main/java/org/openlp/android2/common/NukeSSLCerts.java +++ /dev/null @@ -1,77 +0,0 @@ -/****************************************************************************** - * 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 java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.X509Certificate; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - - -public class NukeSSLCerts { - protected static final String TAG = "NukeSSLCerts"; - - public static void nuke() { - try { - TrustManager[] trustAllCerts = new TrustManager[]{ - new X509TrustManager() { - public X509Certificate[] getAcceptedIssuers() { - X509Certificate[] myTrustedAnchors = new X509Certificate[0]; - return myTrustedAnchors; - } - - @Override - public void checkClientTrusted(X509Certificate[] certs, String authType) { - } - - @Override - public void checkServerTrusted(X509Certificate[] certs, String authType) { - } - } - }; - SSLContext sc = null; - try { - sc = SSLContext.getInstance("TLS"); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - try { - sc.init(null, trustAllCerts, new java.security.SecureRandom()); - } catch (KeyManagementException e) { - e.printStackTrace(); - } - HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); - // Create all-trusting host name verifier - HostnameVerifier allHostsValid = new HostnameVerifier() { - public boolean verify(String hostname, SSLSession session) { - return true; - } - }; - // Install the all-trusting host verifier - HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); - } catch (Exception e) { - } - } -} diff --git a/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java b/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java index a9c1084..3ba6c87 100644 --- a/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java +++ b/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java @@ -67,12 +67,11 @@ public class OpenLPURLBuilder { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); - Boolean useSSL = sharedPrefs.getBoolean(context.getString(R.string.key_ssl_use), false); String host = sharedPrefs.getString(context.getString(R.string.key_host), context.getString(R.string.host_default_value)); String port = sharedPrefs.getString(context.getString(R.string.key_port), "4316"); - return String.format("http%s://%s:%s", useSSL ? "s" : "", host, port); + return String.format("http://%s:%s", host, port); } } diff --git a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java index ac8b892..8857c5c 100644 --- a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java @@ -19,12 +19,10 @@ package org.openlp.android2.fragments; import android.app.Fragment; -import android.net.http.SslError; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.webkit.SslErrorHandler; import android.webkit.WebView; import android.webkit.WebViewClient; import org.openlp.android2.R; @@ -75,9 +73,5 @@ public class WebFragment extends Fragment { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } - @Override - public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { - handler.proceed(); // Ignore SSL certificate errors - } } } diff --git a/app/src/main/res/values/keyStrings.xml b/app/src/main/res/values/keyStrings.xml index 578fe53..9afc890 100644 --- a/app/src/main/res/values/keyStrings.xml +++ b/app/src/main/res/values/keyStrings.xml @@ -8,6 +8,4 @@ key_userid key_password key_shared_preferences - key_ssl_use - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0d6bc72..c4da2b5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -20,8 +20,6 @@ Configure Network Password Server Details - Use HTTPS - Specify whether HTTPS should be used Connection Timeout Select a value (milliseconds) Username diff --git a/build.gradle b/build.gradle index f6e9073..e220f0b 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:2.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 2d7ae5f1276bdc4c74c7091083fc016834ac5460 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 13 Jun 2016 21:43:38 +0100 Subject: [PATCH 05/18] add files --- .../dialogs/SearchSelectionDialog.java | 133 +++++++ .../android2/fragments/SearchFragment.java | 346 ++++++++++++++++++ .../res/drawable-hdpi/ic_search_black.png | Bin 0 -> 684 bytes .../res/drawable-mdpi/ic_search_black.png | Bin 0 -> 464 bytes .../res/drawable-xhdpi/ic_search_black.png | Bin 0 -> 868 bytes .../res/drawable-xxhdpi/ic_search_black.png | Bin 0 -> 1307 bytes app/src/main/res/layout/fragment_search.xml | 90 +++++ .../main/res/layout/search_action_dialog.xml | 40 ++ app/src/main/res/layout/search_result_row.xml | 18 + .../main/res/layout/spinner_dropdown_item.xml | 11 + app/src/main/res/layout/spinner_list_item.xml | 11 + fixssl.iml | 19 + 12 files changed, 668 insertions(+) create mode 100644 app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java create mode 100644 app/src/main/java/org/openlp/android2/fragments/SearchFragment.java create mode 100644 app/src/main/res/drawable-hdpi/ic_search_black.png create mode 100644 app/src/main/res/drawable-mdpi/ic_search_black.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_search_black.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_search_black.png create mode 100644 app/src/main/res/layout/fragment_search.xml create mode 100644 app/src/main/res/layout/search_action_dialog.xml create mode 100644 app/src/main/res/layout/search_result_row.xml create mode 100644 app/src/main/res/layout/spinner_dropdown_item.xml create mode 100644 app/src/main/res/layout/spinner_list_item.xml create mode 100644 fixssl.iml 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..2f76220 --- /dev/null +++ b/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java @@ -0,0 +1,133 @@ +/****************************************************************************** + * 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"); + + 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", key); + 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, text)); + } catch (JsonHelpers.JSONHandlerException e) { + e.printStackTrace(); + Toast.makeText(context, "Request Failed", Toast.LENGTH_SHORT).show(); + } + } + + public void createService() { + try { + String request = JsonHelpers.createRequestJSON("id", key); + 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/SearchFragment.java b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java new file mode 100644 index 0000000..c8d9962 --- /dev/null +++ b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java @@ -0,0 +1,346 @@ +/****************************************************************************** + * 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(); + protected ArrayList jsonCache = new ArrayList(); + + 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 + 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; + } + }); + 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"); + 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(); + } + } + + jsonCache = new ArrayList(); + final StableArrayAdapter adapter = new StableArrayAdapter(context, + android.R.layout.simple_list_item_1, + listitems, + jsonCache); + + 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 { + it = (String) item.get(1); + } catch (JSONException e) { + e.printStackTrace(); + } + Bundle args = new Bundle(); + args.putString("plugin", searchedPlugin); + args.putString("text", it); + args.putString("key", Long.toString(id)); + DialogFragment newFragment = new SearchSelectionDialog(); + newFragment.setArguments(args); + newFragment.show(getFragmentManager(), "TAG"); + + } + }); + Log.i(LOG_TAG, "populateListDisplay - exit"); + } + + private class StableArrayAdapter extends ArrayAdapter { + + HashMap mIdMap = new HashMap(); + + public StableArrayAdapter(Context context, + int textViewResourceId, + List objects, + ArrayList jsonCache) { + super(context, textViewResourceId, objects); + + for (int i = 0; i < objects.size(); ++i) { + JSONArray item = objects.get(i); + try { + jsonCache.add(item); + 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/res/drawable-hdpi/ic_search_black.png b/app/src/main/res/drawable-hdpi/ic_search_black.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae490ef9be0c727cdea0ff907723362d0ccf021 GIT binary patch literal 684 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 RLQVhx002ovPDHLkV1k|`TW0_O literal 0 HcmV?d00001 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..591aed8 --- /dev/null +++ b/app/src/main/res/layout/fragment_search.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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_row.xml b/app/src/main/res/layout/search_result_row.xml new file mode 100644 index 0000000..105f166 --- /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/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 From 06607d5f61297012454ec50216ae6cba83fc03c9 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 16 Sep 2016 06:09:26 +0100 Subject: [PATCH 06/18] Search cleanups --- app/app.iml | 10 -------- .../openlp/android2/common/StateHolder.java | 15 ++++++++++++ .../android2/fragments/SearchFragment.java | 1 + app/src/main/res/drawable/searchlist.xml | 11 +++++++++ app/src/main/res/layout/fragment_search.xml | 24 ++++++++++--------- app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/pref_notification.xml | 6 ----- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 9 files changed, 45 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/org/openlp/android2/common/StateHolder.java create mode 100644 app/src/main/res/drawable/searchlist.xml diff --git a/app/app.iml b/app/app.iml index 8841e64..a8c8c7e 100644 --- a/app/app.iml +++ b/app/app.iml @@ -82,7 +82,6 @@ - @@ -90,21 +89,12 @@ - - - - - - - - - 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..0d4f8f6 --- /dev/null +++ b/app/src/main/java/org/openlp/android2/common/StateHolder.java @@ -0,0 +1,15 @@ +package org.openlp.android2.common; + +/** + * Created by tim on 14/08/16. + */ +public class StateHolder { + private static StateHolder ourInstance = new StateHolder(); + + public static StateHolder getInstance() { + return ourInstance; + } + + private StateHolder() { + } +} diff --git a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java index c8d9962..d712c8c 100644 --- a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java @@ -237,6 +237,7 @@ public class SearchFragment extends Fragment { 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); diff --git a/app/src/main/res/drawable/searchlist.xml b/app/src/main/res/drawable/searchlist.xml new file mode 100644 index 0000000..f613773 --- /dev/null +++ b/app/src/main/res/drawable/searchlist.xml @@ -0,0 +1,11 @@ + + + + + + + \ 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 index 591aed8..c8c9c21 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -20,11 +20,11 @@ @@ -46,9 +46,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" - android:text="Search Text" - android:textSize="40px" - android:height="70px" + android:text="@string/search_text" + android:textSize="40sp" + android:height="70dp" android:id="@+id/search_value_desc" android:paddingLeft="30dp" android:paddingRight="30dp"/> @@ -61,8 +61,8 @@ style="@android:style/Animation.InputMethod" android:layout_weight="0.87" android:inputType="text" - android:textSize="40px" - android:height="70px" + android:textSize="40sp" + android:height="70dp" /> @@ -81,9 +81,11 @@ android:paddingRight="30dp" android:layout_marginTop="20dp" android:layout_marginBottom="20dp" - android:textSize="40px" - android:height="70px" - android:layout_weight="1"/> + android:textSize="40sp" + android:height="70dp" + android:layout_weight="1" + android:background="@drawable/searchlist"/> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c4da2b5..b17bd88 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -45,6 +45,8 @@ Port Previous Process + Search Text + Select Plugin Service List Search Results Send Live diff --git a/app/src/main/res/xml/pref_notification.xml b/app/src/main/res/xml/pref_notification.xml index aac55fa..33606e5 100644 --- a/app/src/main/res/xml/pref_notification.xml +++ b/app/src/main/res/xml/pref_notification.xml @@ -33,12 +33,6 @@ android:defaultValue="@string/port_default_value" android:inputType="number" /> - - Date: Mon, 19 Sep 2016 21:18:53 +0100 Subject: [PATCH 07/18] more style fixes --- app/app.iml | 13 +++++ app/src/main/res/drawable/searchlist.xml | 2 +- app/src/main/res/layout/fragment_search.xml | 61 ++++++++------------- build.gradle | 2 +- 4 files changed, 38 insertions(+), 40 deletions(-) diff --git a/app/app.iml b/app/app.iml index a8c8c7e..b77b354 100644 --- a/app/app.iml +++ b/app/app.iml @@ -32,12 +32,14 @@ + + @@ -82,6 +84,7 @@ + @@ -89,12 +92,22 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/searchlist.xml b/app/src/main/res/drawable/searchlist.xml index f613773..c75b725 100644 --- a/app/src/main/res/drawable/searchlist.xml +++ b/app/src/main/res/drawable/searchlist.xml @@ -7,5 +7,5 @@ android:top="10dp" android:bottom="10dp"/> - + \ 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 index c8c9c21..0407c07 100644 --- a/app/src/main/res/layout/fragment_search.xml +++ b/app/src/main/res/layout/fragment_search.xml @@ -12,59 +12,47 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - + android:layout_height="wrap_content"> + android:paddingRight="30dp" + android:layout_row="0" + android:layout_column="0"/> - - - - + android:layout_row="0" + android:layout_column="1"/> + android:paddingRight="30dp" + android:layout_row="1" + android:layout_column="0"/> - + android:textSize="22sp" + android:layout_row="1" + android:layout_column="1" + android:layout_width="fill_parent" /> + + diff --git a/build.gradle b/build.gradle index d14039d..b193299 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:2.2.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 39cb07860d6442ebba6d329785d52ac208c824c4 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 26 Sep 2016 21:09:10 +0100 Subject: [PATCH 08/18] Add singletons and fix views --- app/app.iml | 17 ++++++++--------- .../main/java/org/openlp/android2/OpenLP.java | 4 ++++ .../android2/common/OpenLPURLBuilder.java | 11 ++++++++++- .../android2/common/RequestQueueService.java | 8 +++----- .../org/openlp/android2/common/StateHolder.java | 7 +++++++ .../android2/fragments/SearchFragment.java | 2 +- .../openlp/android2/fragments/WebFragment.java | 3 ++- .../{customborder.xml => custom_border.xml} | 2 +- .../{searchlist.xml => search_list.xml} | 0 .../layout-xlarge/fragment_livelist_list.xml | 2 +- .../main/res/layout/fragment_livelist_list.xml | 2 +- app/src/main/res/layout/fragment_search.xml | 4 ++-- .../main/res/layout/fragment_service_list.xml | 2 +- 13 files changed, 41 insertions(+), 23 deletions(-) rename app/src/main/res/drawable/{customborder.xml => custom_border.xml} (87%) rename app/src/main/res/drawable/{searchlist.xml => search_list.xml} (100%) diff --git a/app/app.iml b/app/app.iml index b77b354..fa61479 100644 --- a/app/app.iml +++ b/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,10 +74,17 @@ + + + + + + + + - diff --git a/app/src/main/java/org/openlp/android2/OpenLP.java b/app/src/main/java/org/openlp/android2/OpenLP.java index a0818b8..222d328 100644 --- a/app/src/main/java/org/openlp/android2/OpenLP.java +++ b/app/src/main/java/org/openlp/android2/OpenLP.java @@ -35,6 +35,8 @@ 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; @@ -65,6 +67,8 @@ public class OpenLP extends ActionBarActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + OpenLPURLBuilder.getInstance().setContext(this); + StateHolder.getInstance().setContext(this); doPreferenceCheck(); diff --git a/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java b/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java index 3ba6c87..8e9867e 100644 --- a/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java +++ b/app/src/main/java/org/openlp/android2/common/OpenLPURLBuilder.java @@ -30,7 +30,16 @@ public class OpenLPURLBuilder { private final String LOG_TAG = OpenLPURLBuilder.class.getName(); private Context context; - public OpenLPURLBuilder(Context context) { + private static OpenLPURLBuilder ourInstance = new OpenLPURLBuilder(); + + public static OpenLPURLBuilder getInstance() { + return ourInstance; + } + + private OpenLPURLBuilder() { + } + + public void setContext(Context context) { this.context = context; } diff --git a/app/src/main/java/org/openlp/android2/common/RequestQueueService.java b/app/src/main/java/org/openlp/android2/common/RequestQueueService.java index bdff433..8285389 100644 --- a/app/src/main/java/org/openlp/android2/common/RequestQueueService.java +++ b/app/src/main/java/org/openlp/android2/common/RequestQueueService.java @@ -39,12 +39,10 @@ public class RequestQueueService { private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private static Context mCtx; - private OpenLPURLBuilder urlbuilder; private RequestQueueService(Context context) { mCtx = context; mRequestQueue = getRequestQueue(); - urlbuilder = new OpenLPURLBuilder(context); mImageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() { @@ -79,15 +77,15 @@ public class RequestQueueService { } public String getUrl(String url){ - return String.format("%s%s", urlbuilder.getBaseUrl(), url ); + return String.format("%s%s", OpenLPURLBuilder.getInstance().getBaseUrl(), url ); } public String getBasicAuth(){ - return urlbuilder.getBasicAuth(); + return OpenLPURLBuilder.getInstance().getBasicAuth(); } public int getConnectionTimeout(){ - return urlbuilder.getConnectionTimeout(); + return OpenLPURLBuilder.getInstance().getConnectionTimeout(); } public void addToRequestQueue(Request req) { diff --git a/app/src/main/java/org/openlp/android2/common/StateHolder.java b/app/src/main/java/org/openlp/android2/common/StateHolder.java index 0d4f8f6..ab26175 100644 --- a/app/src/main/java/org/openlp/android2/common/StateHolder.java +++ b/app/src/main/java/org/openlp/android2/common/StateHolder.java @@ -1,10 +1,13 @@ 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; @@ -12,4 +15,8 @@ public class StateHolder { private StateHolder() { } + + public void setContext(Context context) { + this.context = context; + } } diff --git a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java index d712c8c..4537172 100644 --- a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java @@ -232,7 +232,7 @@ public class SearchFragment extends Fragment { public void populateListDisplay(String json, boolean notInError) { Log.i(LOG_TAG, "populateListDisplay - entry"); - ListView list = (ListView) getActivity().findViewById(R.id.searchlistView); + ListView list = (ListView) getActivity().findViewById(R.id.searchListView); final ArrayList listitems = new ArrayList(); if (notInError) { try { diff --git a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java index 8857c5c..0c9d67e 100644 --- a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java @@ -26,6 +26,7 @@ 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 { @@ -55,7 +56,7 @@ public class WebFragment extends Fragment { webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); webview.setScrollbarFadingEnabled(true); webview.setWebViewClient(new webClient()); - //webview.loadUrl(String.format("%s%s", httpClient.getBaseUrl(), curURL)); + webview.loadUrl(String.format("%s%s", OpenLPURLBuilder.getInstance().getBaseUrl(), curURL)); } return view; } diff --git a/app/src/main/res/drawable/customborder.xml b/app/src/main/res/drawable/custom_border.xml similarity index 87% rename from app/src/main/res/drawable/customborder.xml rename to app/src/main/res/drawable/custom_border.xml index e657938..f613773 100644 --- a/app/src/main/res/drawable/customborder.xml +++ b/app/src/main/res/drawable/custom_border.xml @@ -6,6 +6,6 @@ android:right="10dp" android:top="10dp" android:bottom="10dp"/> - + \ No newline at end of file diff --git a/app/src/main/res/drawable/searchlist.xml b/app/src/main/res/drawable/search_list.xml similarity index 100% rename from app/src/main/res/drawable/searchlist.xml rename to app/src/main/res/drawable/search_list.xml diff --git a/app/src/main/res/layout-xlarge/fragment_livelist_list.xml b/app/src/main/res/layout-xlarge/fragment_livelist_list.xml index 115d451..161dae6 100644 --- a/app/src/main/res/layout-xlarge/fragment_livelist_list.xml +++ b/app/src/main/res/layout-xlarge/fragment_livelist_list.xml @@ -9,7 +9,7 @@ android:smoothScrollbar="true" android:clickable="false" android:longClickable="false" - android:background="@drawable/customborder"> + android:background="@drawable/custom_border"> + android:background="@drawable/custom_border"> + android:background="@drawable/search_list"/> diff --git a/app/src/main/res/layout/fragment_service_list.xml b/app/src/main/res/layout/fragment_service_list.xml index ad4e6fb..9b36e0e 100644 --- a/app/src/main/res/layout/fragment_service_list.xml +++ b/app/src/main/res/layout/fragment_service_list.xml @@ -9,7 +9,7 @@ android:smoothScrollbar="true" android:clickable="false" android:longClickable="false" - android:background="@drawable/customborder"> + android:background="@drawable/custom_border"> Date: Wed, 19 Oct 2016 19:41:22 +0100 Subject: [PATCH 09/18] search fixes --- app/build.gradle | 2 +- .../android2/fragments/SearchFragment.java | 19 ++++++++++--------- .../res/drawable/service_item_selected.xml | 14 ++++++++++++++ .../main/res/layout/fragment_service_list.xml | 2 +- build.gradle | 2 +- 5 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/drawable/service_item_selected.xml diff --git a/app/build.gradle b/app/build.gradle index ba4bda1..7bcff17 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ android { defaultConfig { applicationId "org.openlp.android2" - minSdkVersion 15 + minSdkVersion 16 targetSdkVersion 22 versionCode 5 versionName "2.0" diff --git a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java index 4537172..64e2ab1 100644 --- a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java @@ -77,7 +77,6 @@ public class SearchFragment extends Fragment { protected String updateUrl; protected String searchedPlugin; protected Map pluginMap = new HashMap(); - protected ArrayList jsonCache = new ArrayList(); public SearchFragment() { Log.d(LOG_TAG, "Constructor"); @@ -248,11 +247,10 @@ public class SearchFragment extends Fragment { } } - jsonCache = new ArrayList(); final StableArrayAdapter adapter = new StableArrayAdapter(context, android.R.layout.simple_list_item_1, - listitems, - jsonCache); + listitems); + list.setAdapter(adapter); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @@ -273,9 +271,9 @@ public class SearchFragment extends Fragment { args.putString("plugin", searchedPlugin); args.putString("text", it); args.putString("key", Long.toString(id)); - DialogFragment newFragment = new SearchSelectionDialog(); - newFragment.setArguments(args); - newFragment.show(getFragmentManager(), "TAG"); + DialogFragment SSDFragment = new SearchSelectionDialog(); + SSDFragment.setArguments(args); + SSDFragment.show(getFragmentManager(), "TAG"); } }); @@ -285,12 +283,13 @@ public class SearchFragment extends Fragment { private class StableArrayAdapter extends ArrayAdapter { HashMap mIdMap = new HashMap(); + ArrayList jsonCache = new ArrayList(); public StableArrayAdapter(Context context, int textViewResourceId, - List objects, - ArrayList jsonCache) { + List objects) { super(context, textViewResourceId, objects); + jsonCache = new ArrayList(); for (int i = 0; i < objects.size(); ++i) { JSONArray item = objects.get(i); @@ -310,6 +309,7 @@ public class SearchFragment extends Fragment { String item = null; try { item = getItem(position).get(1).toString(); + Log.i(LOG_TAG, "getView" + item); } catch (JSONException e) { e.printStackTrace(); } @@ -331,6 +331,7 @@ public class SearchFragment extends Fragment { String item = null; try { item = getItem(position).get(1).toString(); + Log.i(LOG_TAG, "getItemId" + item); } catch (JSONException e) { e.printStackTrace(); } diff --git a/app/src/main/res/drawable/service_item_selected.xml b/app/src/main/res/drawable/service_item_selected.xml new file mode 100644 index 0000000..5357740 --- /dev/null +++ b/app/src/main/res/drawable/service_item_selected.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/layout/fragment_service_list.xml b/app/src/main/res/layout/fragment_service_list.xml index 9b36e0e..1262401 100644 --- a/app/src/main/res/layout/fragment_service_list.xml +++ b/app/src/main/res/layout/fragment_service_list.xml @@ -24,7 +24,7 @@ android:id="@+id/serviceListText" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textStyle="bold" + android:textStyle="normal" android:textColor="#000000" android:textSize="14sp" android:paddingTop="10dp" diff --git a/build.gradle b/build.gradle index b193299..573f4fd 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' + classpath 'com.android.tools.build:gradle:2.2.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 1168fb8c0a1417d6b0e44ea748a4c0c0c6261fc3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 19 Oct 2016 21:43:00 +0100 Subject: [PATCH 10/18] more fixes --- app/app.iml | 48 ++++++++++++------- app/build.gradle | 13 ++--- .../android2/fragments/LiveListFragment.java | 7 +-- .../android2/fragments/SearchFragment.java | 6 +-- .../res/drawable/service_item_selected.xml | 14 ------ .../layout-xlarge/fragment_livelist_list.xml | 9 ++++ .../res/layout/fragment_livelist_list.xml | 11 ++++- 7 files changed, 63 insertions(+), 45 deletions(-) delete mode 100644 app/src/main/res/drawable/service_item_selected.xml diff --git a/app/app.iml b/app/app.iml index fa61479..934ab1b 100644 --- a/app/app.iml +++ b/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,14 +74,30 @@ + + + + + + + + - - - + + + + + + + + + + + @@ -110,12 +118,20 @@ - + - + + + + + + + - - - + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7bcff17..802dda6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,15 +1,16 @@ apply plugin: 'com.android.application' project.archivesBaseName = 'OpenLP' android { - compileSdkVersion 22 - buildToolsVersion "21.1.2" + compileSdkVersion 24 + buildToolsVersion "24.0.1" defaultConfig { applicationId "org.openlp.android2" minSdkVersion 16 - targetSdkVersion 22 + targetSdkVersion 24 versionCode 5 versionName "2.0" + vectorDrawables.useSupportLibrary = true } android { lintOptions { @@ -28,9 +29,9 @@ android { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') - 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.android.support:appcompat-v7:24.2.1' + compile 'com.android.support:support-v4:24.2.1' + compile 'com.android.support:design:24.2.1' } } dependencies { 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 82bd5e1..ec89048 100644 --- a/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java @@ -104,10 +104,10 @@ public class LiveListFragment extends OpenLPFragment { } // Keys used in Hashmap - String[] from = {"tag", "liveListNormal", "liveListSelected"}; + String[] from = {"line", "tag", "liveListNormal", "liveListSelected"}; // Ids of views in live_list_fragment - int[] to = {R.id.tag, R.id.liveListNormal, R.id.liveListSelected}; + 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), @@ -123,15 +123,16 @@ public class LiveListFragment extends OpenLPFragment { 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); text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); TextView text2 = (TextView) view.findViewById(R.id.liveListNormal); text2.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); if (selected == position) { - text2.setTextColor(Color.parseColor("#000000")); text2.setTypeface(null, Typeface.BOLD_ITALIC); } else{ text2.setTypeface(null, Typeface.NORMAL); + line.setBackgroundColor(0xffffff); } return view; diff --git a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java index 64e2ab1..4d2e906 100644 --- a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java @@ -263,6 +263,7 @@ public class SearchFragment extends Fragment { // Toast.LENGTH_SHORT).show(); String it = ""; try { + Log.i(LOG_TAG, "list.setOnItemClickListener" + item); it = (String) item.get(1); } catch (JSONException e) { e.printStackTrace(); @@ -283,18 +284,15 @@ public class SearchFragment extends Fragment { private class StableArrayAdapter extends ArrayAdapter { HashMap mIdMap = new HashMap(); - ArrayList jsonCache = new ArrayList(); public StableArrayAdapter(Context context, int textViewResourceId, List objects) { super(context, textViewResourceId, objects); - jsonCache = new ArrayList(); for (int i = 0; i < objects.size(); ++i) { JSONArray item = objects.get(i); try { - jsonCache.add(item); mIdMap.put(item.get(1).toString(), i); } catch (JSONException e) { e.printStackTrace(); @@ -309,7 +307,6 @@ public class SearchFragment extends Fragment { String item = null; try { item = getItem(position).get(1).toString(); - Log.i(LOG_TAG, "getView" + item); } catch (JSONException e) { e.printStackTrace(); } @@ -331,7 +328,6 @@ public class SearchFragment extends Fragment { String item = null; try { item = getItem(position).get(1).toString(); - Log.i(LOG_TAG, "getItemId" + item); } catch (JSONException e) { e.printStackTrace(); } diff --git a/app/src/main/res/drawable/service_item_selected.xml b/app/src/main/res/drawable/service_item_selected.xml deleted file mode 100644 index 5357740..0000000 --- a/app/src/main/res/drawable/service_item_selected.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout-xlarge/fragment_livelist_list.xml b/app/src/main/res/layout-xlarge/fragment_livelist_list.xml index 161dae6..7ffcd85 100644 --- a/app/src/main/res/layout-xlarge/fragment_livelist_list.xml +++ b/app/src/main/res/layout-xlarge/fragment_livelist_list.xml @@ -10,6 +10,15 @@ android:clickable="false" android:longClickable="false" android:background="@drawable/custom_border"> + - + Date: Wed, 19 Oct 2016 22:43:42 +0100 Subject: [PATCH 11/18] ore updates --- app/app.iml | 67 ++++++++++--------- app/build.gradle | 15 +++-- .../dialogs/SearchSelectionDialog.java | 2 +- .../android2/fragments/SearchFragment.java | 2 +- build.gradle | 2 +- 5 files changed, 46 insertions(+), 42 deletions(-) diff --git a/app/app.iml b/app/app.iml index 934ab1b..fe31142 100644 --- a/app/app.iml +++ b/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,22 +74,30 @@ + + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + @@ -118,20 +118,21 @@ - + - - - - - - - + + - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 802dda6..9d02b43 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' project.archivesBaseName = 'OpenLP' android { - compileSdkVersion 24 - buildToolsVersion "24.0.1" + compileSdkVersion 25 + buildToolsVersion "25" defaultConfig { applicationId "org.openlp.android2" minSdkVersion 16 - targetSdkVersion 24 + targetSdkVersion 25 versionCode 5 versionName "2.0" vectorDrawables.useSupportLibrary = true @@ -18,6 +18,9 @@ android { } } buildTypes { + debug { + debuggable true + } release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' @@ -29,9 +32,9 @@ android { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') - compile 'com.android.support:appcompat-v7:24.2.1' - compile 'com.android.support:support-v4:24.2.1' - compile 'com.android.support:design:24.2.1' + 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 { diff --git a/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java b/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java index 2f76220..2ec6b03 100644 --- a/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java +++ b/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java @@ -109,7 +109,7 @@ public class SearchSelectionDialog extends OpenLPDialog { public void createLive() { try { - String request = JsonHelpers.createRequestJSON("id", key); + 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, text)); diff --git a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java index 4d2e906..c044bf9 100644 --- a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java @@ -264,7 +264,7 @@ public class SearchFragment extends Fragment { String it = ""; try { Log.i(LOG_TAG, "list.setOnItemClickListener" + item); - it = (String) item.get(1); + it = (String) item.get(0); } catch (JSONException e) { e.printStackTrace(); } diff --git a/build.gradle b/build.gradle index 573f4fd..ef7ae5a 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' + 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 From 8439408875b1343d1259426a5e8b78d6f1680915 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 21 Oct 2016 20:24:55 +0100 Subject: [PATCH 12/18] fix layout --- app/app.iml | 17 ++++++++-------- .../dialogs/SearchSelectionDialog.java | 2 +- .../android2/fragments/LiveListFragment.java | 2 ++ .../android2/fragments/SearchFragment.java | 2 +- .../fragments/ServiceListFragment.java | 12 +++++++++-- .../res/layout/fragment_livelist_list.xml | 17 +++------------- .../main/res/layout/fragment_service_list.xml | 14 ++++++++++++- .../res/layout/fragment_servicelist_grid.xml | 20 ------------------- 8 files changed, 39 insertions(+), 47 deletions(-) delete mode 100644 app/src/main/res/layout/fragment_servicelist_grid.xml diff --git a/app/app.iml b/app/app.iml index fe31142..33a7364 100644 --- a/app/app.iml +++ b/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,8 +74,17 @@ + + + + + + + + + diff --git a/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java b/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java index 2ec6b03..76810bc 100644 --- a/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java +++ b/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java @@ -112,7 +112,7 @@ public class SearchSelectionDialog extends OpenLPDialog { 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, text)); + 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(); 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 ec89048..441f155 100644 --- a/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java @@ -128,6 +128,8 @@ public class LiveListFragment extends OpenLPFragment { text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); TextView text2 = (TextView) view.findViewById(R.id.liveListNormal); text2.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); + Log.i(LOG_TAG, "aaa " + selected +" "+ position); + if (selected == position) { text2.setTypeface(null, Typeface.BOLD_ITALIC); } else{ diff --git a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java index c044bf9..3485a9c 100644 --- a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java @@ -264,7 +264,7 @@ public class SearchFragment extends Fragment { String it = ""; try { Log.i(LOG_TAG, "list.setOnItemClickListener" + item); - it = (String) item.get(0); + it = item.get(0).toString(); } catch (JSONException e) { e.printStackTrace(); } 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 aecc7d3..42db064 100644 --- a/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java @@ -138,10 +138,10 @@ public class ServiceListFragment extends OpenLPFragment { } // Keys used in Hashmap - String[] from = {"icon", "title"}; + String[] from = {"line","icon", "title"}; // Ids of views in service_list_fragment - int[] to = {R.id.icon, R.id.serviceListText}; + int[] to = {R.id.servicelistLine, R.id.icon, R.id.serviceListText}; SharedPreferences prefs = context.getSharedPreferences( context.getString(R.string.key_shared_preferences), @@ -155,19 +155,27 @@ public class ServiceListFragment extends OpenLPFragment { // 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); + Log.i(LOG_TAG, "bbb " + selected +" "+ position); + if (selected == position) { text1.setTextColor(Color.parseColor("#000000")); text1.setTypeface(null, Typeface.BOLD_ITALIC); } else{ text1.setTypeface(null, Typeface.NORMAL); + line.setBackgroundColor(0xffffff); } return view; } }; + setListAdapter(adapter); SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); diff --git a/app/src/main/res/layout/fragment_livelist_list.xml b/app/src/main/res/layout/fragment_livelist_list.xml index 1cabec9..9f13d27 100644 --- a/app/src/main/res/layout/fragment_livelist_list.xml +++ b/app/src/main/res/layout/fragment_livelist_list.xml @@ -10,8 +10,8 @@ android:clickable="false" android:longClickable="false" android:background="@drawable/custom_border"> - - diff --git a/app/src/main/res/layout/fragment_service_list.xml b/app/src/main/res/layout/fragment_service_list.xml index 1262401..56d6025 100644 --- a/app/src/main/res/layout/fragment_service_list.xml +++ b/app/src/main/res/layout/fragment_service_list.xml @@ -10,10 +10,22 @@ android:clickable="false" android:longClickable="false" android:background="@drawable/custom_border"> + + + - - - - - - - From a905a94e49acd04c64199d1d1d07c30eedcbeef6 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 25 Oct 2016 20:38:52 +0100 Subject: [PATCH 13/18] Search finished --- .../main/java/org/openlp/android2/OpenLP.java | 2 +- .../openlp/android2/common/JsonHelpers.java | 3 ++ .../dialogs/SearchSelectionDialog.java | 4 +- .../android2/fragments/LiveListFragment.java | 3 +- .../fragments/ServiceListFragment.java | 3 +- app/src/main/res/layout/activity_main.xml | 2 +- .../main/res/layout/fragment_item_grid.xml | 12 ----- .../res/layout/fragment_livelist_grid.xml | 45 ------------------- app/src/main/res/values-large/refs.xml | 1 - app/src/main/res/values-sw600dp/refs.xml | 2 - 10 files changed, 10 insertions(+), 67 deletions(-) delete mode 100644 app/src/main/res/layout/fragment_item_grid.xml delete mode 100644 app/src/main/res/layout/fragment_livelist_grid.xml diff --git a/app/src/main/java/org/openlp/android2/OpenLP.java b/app/src/main/java/org/openlp/android2/OpenLP.java index 222d328..e09a0cb 100644 --- a/app/src/main/java/org/openlp/android2/OpenLP.java +++ b/app/src/main/java/org/openlp/android2/OpenLP.java @@ -144,7 +144,7 @@ public class OpenLP extends ActionBarActivity .replace(R.id.container_left, ServiceListFragment.newInstance(), "servicelist") .commit(); fragmentManager.beginTransaction() - .replace(R.id.container_right, LiveListFragment.newInstance()) + .replace(R.id.container_right, LiveListFragment.newInstance(), "livelist") .commit(); mTitle = getString(R.string.live_list); toggerContainer(R.id.next_button, View.VISIBLE); diff --git a/app/src/main/java/org/openlp/android2/common/JsonHelpers.java b/app/src/main/java/org/openlp/android2/common/JsonHelpers.java index d06ffc7..bcc6a2f 100644 --- a/app/src/main/java/org/openlp/android2/common/JsonHelpers.java +++ b/app/src/main/java/org/openlp/android2/common/JsonHelpers.java @@ -18,6 +18,8 @@ *******************************************************************************/ package org.openlp.android2.common; +import android.util.Log; + import org.json.JSONException; import org.json.JSONObject; import org.json.JSONStringer; @@ -37,6 +39,7 @@ public class JsonHelpers { 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); diff --git a/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java b/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java index 76810bc..35d71fe 100644 --- a/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java +++ b/app/src/main/java/org/openlp/android2/dialogs/SearchSelectionDialog.java @@ -56,6 +56,8 @@ public class SearchSelectionDialog extends OpenLPDialog { 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()); @@ -121,7 +123,7 @@ public class SearchSelectionDialog extends OpenLPDialog { public void createService() { try { - String request = JsonHelpers.createRequestJSON("id", key); + 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)); 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 441f155..61b3e93 100644 --- a/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java @@ -128,10 +128,9 @@ public class LiveListFragment extends OpenLPFragment { text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); TextView text2 = (TextView) view.findViewById(R.id.liveListNormal); text2.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); - Log.i(LOG_TAG, "aaa " + selected +" "+ position); - if (selected == position) { text2.setTypeface(null, Typeface.BOLD_ITALIC); + line.setBackgroundColor(0xffffff); } else{ text2.setTypeface(null, Typeface.NORMAL); line.setBackgroundColor(0xffffff); 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 42db064..1be47b0 100644 --- a/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/ServiceListFragment.java @@ -163,11 +163,10 @@ public class ServiceListFragment extends OpenLPFragment { TextView line = (TextView) view.findViewById(R.id.servicelistLine); TextView text1 = (TextView) view.findViewById(R.id.serviceListText); text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); - Log.i(LOG_TAG, "bbb " + selected +" "+ position); - 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); diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5bfe684..f0eff4c 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".OpenLP"> diff --git a/app/src/main/res/layout/fragment_item_grid.xml b/app/src/main/res/layout/fragment_item_grid.xml deleted file mode 100644 index 9452736..0000000 --- a/app/src/main/res/layout/fragment_item_grid.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/layout/fragment_livelist_grid.xml b/app/src/main/res/layout/fragment_livelist_grid.xml deleted file mode 100644 index 313ec0e..0000000 --- a/app/src/main/res/layout/fragment_livelist_grid.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/values-large/refs.xml b/app/src/main/res/values-large/refs.xml index d6935a5..04ab57e 100644 --- a/app/src/main/res/values-large/refs.xml +++ b/app/src/main/res/values-large/refs.xml @@ -7,6 +7,5 @@ For more on layout aliases, see: http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters --> - @layout/fragment_item_grid \ No newline at end of file diff --git a/app/src/main/res/values-sw600dp/refs.xml b/app/src/main/res/values-sw600dp/refs.xml index d6935a5..2ec568f 100644 --- a/app/src/main/res/values-sw600dp/refs.xml +++ b/app/src/main/res/values-sw600dp/refs.xml @@ -7,6 +7,4 @@ For more on layout aliases, see: http://developer.android.com/training/multiscreen/screensizes.html#TaskUseAliasFilters --> - @layout/fragment_item_grid - \ No newline at end of file From 81f03f0d7bcf7073ee8186dc816f8af6b9c9ddfd Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 1 Nov 2016 18:28:03 +0000 Subject: [PATCH 14/18] Translations --- app/app.iml | 16 +++--- .../android2/fragments/SearchFragment.java | 15 ++++- app/src/main/res/values-af/strings.xml | 33 ++++++++++- app/src/main/res/values-bg/strings.xml | 3 +- app/src/main/res/values-da/strings.xml | 4 ++ app/src/main/res/values-de/strings.xml | 10 ++-- app/src/main/res/values-es/strings.xml | 3 + app/src/main/res/values-et/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 34 +++++++++++- app/src/main/res/values-hu/strings.xml | 8 +-- app/src/main/res/values-id/strings.xml | 4 ++ app/src/main/res/values-it/strings.xml | 55 ++++++++++++++++++- app/src/main/res/values-ja/strings.xml | 18 +++++- app/src/main/res/values-ko/strings.xml | 5 ++ app/src/main/res/values-lv/strings.xml | 51 ++++++++++++++++- app/src/main/res/values-nl/strings.xml | 4 ++ app/src/main/res/values-nn/strings.xml | 2 + app/src/main/res/values-pap/strings.xml | 3 +- app/src/main/res/values-pl/strings.xml | 6 ++ app/src/main/res/values-pt-rBR/strings.xml | 9 ++- app/src/main/res/values-ru/strings.xml | 9 +-- app/src/main/res/values-uk/strings.xml | 6 ++ 22 files changed, 266 insertions(+), 33 deletions(-) diff --git a/app/app.iml b/app/app.iml index 33a7364..2d7a8c7 100644 --- a/app/app.iml +++ b/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + + diff --git a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java index 3485a9c..40e341a 100644 --- a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java @@ -101,7 +101,7 @@ public class SearchFragment extends Fragment { triggerTextRequest(Api.SEARCHABLE_PLUGINS); // Add search listener to text field - EditText editText = (EditText) view.findViewById(R.id.search_text); + 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) { @@ -120,6 +120,19 @@ public class SearchFragment extends Fragment { 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; } diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 17d83c8..6b4dfff 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -1,8 +1,12 @@ + 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 @@ -12,14 +16,41 @@ Soek OpenLP Kanselleer + Konfigureer Netwerk + Wagwoord + Bediener Inligting + Gebruik HTTPS + Spesifiseer of HTTPS eerder gebruik moet word Konneksie Tyd-uitloop Kies \'n waarde (millisekondes) - Kies die gevraagde blanko tipe + 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 index 8a4b415..b7eb7e6 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -13,11 +13,12 @@ Откажи Времето за изчакване на свързването Избери стойност (в милисекунди) - Избери изисквания тип на празнота Активирай клиентски срокове Начало + След. Нищо Порт + назад Промени размера на текста за Службата Настройки Hostname или IP diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index b6ba55a..c0b4beb 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -28,14 +28,18 @@ 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 diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 2f8f99f..f098eb9 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,8 +1,8 @@ - OpenLP ist eine freie Präsentationssoftware für Kirchen und Gemeinden. Erfahre mehr über OpenLP. + OpenLP ist eine freie Präsentationssoftware für Kirchen und Gemeinden. Weitere Informationen sind auf der OpenLP Webseite zu finden. - Copyright + 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. @@ -12,7 +12,7 @@ Hinweis Zurück Anzeige umschalten - Voreinstellungen + Einstellungen Aktualisieren Suche OpenLP @@ -25,15 +25,17 @@ Verbindungzeit überschritten Wähle einen Wert (in Millisekunden) Benutzername - Setze eigenes Zeitlimit + 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 diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index a60ee24..2157e99 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -28,15 +28,18 @@ 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 diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index c4a9db1..124c07b 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -36,6 +36,7 @@ Kodu Lubamatu ligipääs, palun sisesta õiged kasutajanimi ja parool. Ekraanil + Ekraan Ava navisahtel Sulge navisahtel Järgmine diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 91de48f..628aa8f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,25 +1,57 @@ + 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 + Utiliser HTTPS + Indiquez si HTTPS doit être utilisé Délai de connexion Sélectionnez une valeur (millisecondes) - Sélectionnez le type vide requis + 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 index 7ee1903..00a52ab 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -23,10 +23,10 @@ HTTPS alkalmazása HTTPS alkalmazásának meghatározása Kapcsolódási időtúllépés - Válassz egy értéket (milliszekundum) + Érték választása (milliszekundum) Felhasználói név Egyéni időtúllépés beállítása - Válaszd ki a kívánt megjelenést + 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 @@ -37,7 +37,7 @@ 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, adjon meg érvényes felhasználói nevet és jelszót + 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 @@ -53,5 +53,5 @@ 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 - ellenőrizzük a hálózati beállításokat + 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 index 0148473..ea63ae4 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -28,14 +28,18 @@ 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 diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7f809d7..d305d73 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,6 +1,57 @@ - Licensa - Allerta + 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 + Utilizza HTTPS + Specificare se è necessario utilizzare HTTPS + 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 index ecf5824..236bf9d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -1,8 +1,12 @@ + OpenLPは無償の教会プレゼンテーション用ソフトです。 + 詳しくはOpenLPウェブサイトをご覧ください。 著作権 追加の著作権 ライセンス + このプログラムはフリーソフトウェアです。あなたはこれを、フリーソフトウェア財団によって発行された GNU 一般公衆利用許諾契約書バージョン2の定める条件の下で再頒布または改変することができます。 + このプログラムは有用であることを願って頒布されますが、*全くの無保証* です。商業可能性の保証や特定の目的への適合性は、言外に示されたものも含め全く存在しません。 設定 情報 警告 @@ -12,13 +16,25 @@ 検索 OpenLP キャンセル + ネットワーク設定 + パスワード + サーバの詳細 + HTTPSを使用 + HTTPSを使用するかどうかを選択してください 接続タイムアウト 値を選択 (ミリ秒) - ブランクの種類を選択してください + ユーザ名 + 任意のタイムアウト時間を設定する 任意のタイムアウトを有効にする + 警告文を入力 ホーム + 認証が必要です。ユーザ名とパスワードを入力してください。 + ライブ一覧 + 無し ポート + + 文字の大きさを選択 礼拝テキストの大きさを変更します 設定 ホスト名またはIPアドレス diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 3098870..75b4d4f 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -2,9 +2,14 @@ 라이선스 설정 + 정보 알림 + 뒤로 + 새로 고침 검색 취소 + 처음 + 다음 포트 설정 diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index fbfb312..6bd4dab 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -1,8 +1,57 @@ + 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 - Savienojuma laika beigas + Atcelt + Tīkla konfigurācija + Parole + Servera iestatījumi + Lietot HTTPS + Izvēlieties, ja jālieto HTTPS protokols + 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-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 5150eb6..2ef3384 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -28,14 +28,18 @@ 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 diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index ea67036..cadb6f2 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -5,6 +5,8 @@ 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 index dc270ef..48880b4 100644 --- a/app/src/main/res/values-pap/strings.xml +++ b/app/src/main/res/values-pap/strings.xml @@ -8,10 +8,11 @@ Preferensia Buska OpenLP - Selekta e tipo blanko nesesario 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 index 3b54fc1..a5d0121 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -11,6 +11,7 @@ O programie Komunikat Wróć + Przełącz Ekran Preferencje Odśwież Szukaj @@ -27,15 +28,20 @@ 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 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index cb03168..dbb731e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -11,7 +11,7 @@ Sobre Alertar Voltar - Altenar Monitor + Alternar Monitor Preferências Atualizar Busca @@ -28,22 +28,27 @@ 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 Palvo + Visualização de Palco Selecionar tamanho do monitor de exibição Alterar o tamanho do texto de culto Configurações diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 60ed117..7791b20 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -25,20 +25,17 @@ Время ожидания соединения Выберите значение (в миллисекундах) Установить пользовательский тайм-аут - Выберите нужный тип блокировки - Показать рабочий стол - Сбросить дисплей - Очистить дисплей (черный) - Очистить контент дисплея Включить пользовательские тайм-ауты Введите текст оповещения Домой + Вид прямого эфира + Следующий Ничего Порт + Предыдущий Выполнение Список служения Вид сцены - Выберите размер текста Изменить размер текста Служения Параметры diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index ab8ea31..b291ae0 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -28,18 +28,24 @@ Втановити інший Час Очікування Виберіть потрібний дисплей Обрати фон для робочого столу дисплея + Дозволити вибраний елемент, щоб перейти до центру списку Показати основний дисплей + Налаштування Дисплею Тільки Чорний дисплей Тільки Тема дисплею Обрати інший Час Очікування Введіть Текст Сповіщення + Дозволити дисплей в центрі Дім Несанкціонований доступ будь ласка, введіть правильне ім\'я користувача та пароль Список Перегляду + Режим Живого Перегляду Відкрити вікно навігації Закрити вікно навігації + Наступний Ні Порт + Попередній Процес Список Служб Поставити Прегляд From c81af0e70e42fa5ce080339df6229941be68f300 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 1 Nov 2016 19:09:45 +0000 Subject: [PATCH 15/18] updates --- app/app.iml | 16 ++++++++-------- app/src/main/res/values-af/strings.xml | 2 -- app/src/main/res/values-cs/strings.xml | 2 -- app/src/main/res/values-da/strings.xml | 2 -- app/src/main/res/values-de/strings.xml | 2 -- app/src/main/res/values-en-rGB/strings.xml | 2 -- app/src/main/res/values-en-rZA/strings.xml | 2 -- app/src/main/res/values-es/strings.xml | 2 -- app/src/main/res/values-et/strings.xml | 2 -- app/src/main/res/values-fi/strings.xml | 2 -- app/src/main/res/values-fr/strings.xml | 2 -- app/src/main/res/values-hu/strings.xml | 2 -- app/src/main/res/values-id/strings.xml | 2 -- app/src/main/res/values-it/strings.xml | 2 -- app/src/main/res/values-ja/strings.xml | 2 -- app/src/main/res/values-lt/strings.xml | 2 -- app/src/main/res/values-lv/strings.xml | 2 -- app/src/main/res/values-nb/strings.xml | 2 -- app/src/main/res/values-nl/strings.xml | 2 -- app/src/main/res/values-pl/strings.xml | 2 -- app/src/main/res/values-pt-rBR/strings.xml | 2 -- app/src/main/res/values-ro/strings.xml | 2 -- app/src/main/res/values-ru/strings.xml | 2 -- app/src/main/res/values-sk/strings.xml | 2 -- app/src/main/res/values-sv/strings.xml | 2 -- app/src/main/res/values-uk/strings.xml | 2 -- app/src/main/res/values-zh-rTW/strings.xml | 2 -- 27 files changed, 8 insertions(+), 60 deletions(-) diff --git a/app/app.iml b/app/app.iml index 2d7a8c7..33a7364 100644 --- a/app/app.iml +++ b/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + + diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 6b4dfff..ee41299 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -19,8 +19,6 @@ Konfigureer Netwerk Wagwoord Bediener Inligting - Gebruik HTTPS - Spesifiseer of HTTPS eerder gebruik moet word Konneksie Tyd-uitloop Kies \'n waarde (millisekondes) Gebruikernaame diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index b1cc0be..5a23b84 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -20,8 +20,6 @@ Nastavení sítě Heslo Podrobnosti serveru - Použít HTTPS - Upřesnit jestli použít HTTPS Časový limit spojení Vybrat hodnotu (milisekundy) Uživatelské jméno diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index c0b4beb..ab1e067 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -20,8 +20,6 @@ Konfigurér netværk Adgangskode Serverdetaljer - Benyt HTTPS - Angiv om HTTPS skal benyttes Timeout for forbindelse Vælg en værdi (millisekunder) Brugernavn diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f098eb9..81177c1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -20,8 +20,6 @@ Netzwerk einrichten Passwort Server-Einstellungen - HTTPS benutzen - Festlegen, ob HTTPS verwendet werden soll Verbindungzeit überschritten Wähle einen Wert (in Millisekunden) Benutzername diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 8dfdec9..4781d34 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -20,8 +20,6 @@ Configure Network Password Server Details - Use HTTPS - Specify whether HTTPS should be used Connection Timeout Select a value (milliseconds) Username diff --git a/app/src/main/res/values-en-rZA/strings.xml b/app/src/main/res/values-en-rZA/strings.xml index 89e296f..aec71ad 100644 --- a/app/src/main/res/values-en-rZA/strings.xml +++ b/app/src/main/res/values-en-rZA/strings.xml @@ -20,8 +20,6 @@ Configure Network Password Server Details - Use HTTPS - Specify whether HTTPS should be used Connection Timeout Select a value (milliseconds) Username diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 2157e99..375bb89 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -20,8 +20,6 @@ Configurar Red Clave Detalles de Servidor - Usar HTTPS - Especificar si se debe usar HTTPS Tiempo de espera de conexión Seleccione un valor (en milisegundos) Usuario diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 124c07b..f884ac0 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -18,8 +18,6 @@ Seadista võrk Parool Serveri andmed - HTTPSi kasutamine - Määra, kas kasutada tuleks HTTPSi kaudu ühendust Ühenduse aegumine Vali kestus (millisekundid) Kasutajanimi diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index a81f5c3..8f049ce 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -20,8 +20,6 @@ Verkon asetukset Salasana Palvelimen asetukset - Käytä HTTPS - Määrittele tahdotaanko HTTPS ottaa käyttöön Yhteyden aikakatkaisu Valitse arvo (millisekuntia) Käyttäjätunnus diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 628aa8f..9fcc28b 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -20,8 +20,6 @@ Configuration du réseau Mot de passe Détails du serveur - Utiliser HTTPS - Indiquez si HTTPS doit être utilisé Délai de connexion Sélectionnez une valeur (millisecondes) Nom d\'utilisateur diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 00a52ab..eeeb58c 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -20,8 +20,6 @@ Hálózat beállítása Jelszó Szerver részletek - HTTPS alkalmazása - HTTPS alkalmazásának meghatározása Kapcsolódási időtúllépés Érték választása (milliszekundum) Felhasználói név diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index ea63ae4..bc17607 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -20,8 +20,6 @@ Mengkonfigurasi Jaringan Kata sandi Rincian Server - Gunakan HTTPS - Tentukan apakah HTTPS seharusnya digunakan Batas-Waktu Sambungan Pilih sebuah nilai (milidetik) Nama Pengguna diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d305d73..6322f06 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -20,8 +20,6 @@ Configura Rete Password Dettagli Server - Utilizza HTTPS - Specificare se è necessario utilizzare HTTPS Timeout Connessione Seleziona un valore (millisecondi) Nome Utente diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 236bf9d..0492d4e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -19,8 +19,6 @@ ネットワーク設定 パスワード サーバの詳細 - HTTPSを使用 - HTTPSを使用するかどうかを選択してください 接続タイムアウト 値を選択 (ミリ秒) ユーザ名 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 9280283..6ec47d6 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -20,8 +20,6 @@ Konfigūruoti Tinklą Slaptažodis Išsamiau apie Serverį - Naudoti HTTPS - Nurodykite ar turėtų būti naudojamas HTTPS Sujungimo Laiko Limitas Pasirinkite reikšmę (milisekundėmis) Vartotojo vardas diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 6bd4dab..5c2f28e 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -20,8 +20,6 @@ Tīkla konfigurācija Parole Servera iestatījumi - Lietot HTTPS - Izvēlieties, ja jālieto HTTPS protokols Savienojuma noildze Izvēlieties vērtību (milisekundes) Lietotājvārds diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 2bcadcd..bc8c43c 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -20,8 +20,6 @@ Konfigurer nettverk Passord Serverditaljer - Bruk HTTPS - Angi om HTTPS skal brukes Tidsavbrudd for tilkobling Velg en verdi (millisekund) Brukernavn diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 2ef3384..af5c18d 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -20,8 +20,6 @@ Netwerk instellen Wachtwoord Serverdetails - Gebruik HTTPS - Geef aan of HTTPS gebruikt moet worden Verbindingstimeout Selecteer een waarde (milliseconden) Gebruikersnaam diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a5d0121..c240f96 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -20,8 +20,6 @@ Konfiguruj sieć Hasło Szczegóły serwera - Używaj HTTPS - Sprecyzuj czy HTTPS powinno być używane Limit czasowy połączenia Wybierz wartość (milisekundy) Nazwa użytkownika diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index dbb731e..ce397dc 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -20,8 +20,6 @@ Configurar Rede Senha Detalhes do Servidor - Usar HTTPS - Especifique se o HTTPS deve ser usado Tempo limite de conexão Selecione um valor (em milissegundos) Usuário diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index e073cf8..fdb4389 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -20,8 +20,6 @@ Configurează Rețeaua Parola Detalii Server - Folosește HTTPS - Specificați dacă ar trebui folosit HTTPS Conexiunea a expirat Selectați o valoare (milisecunde) Nume utilizator diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7791b20..44c5123 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -20,8 +20,6 @@ Настроить сеть Пароль Параметры сервера - Использовать HTTPS - Укажите, следует ли использовать HTTPS Время ожидания соединения Выберите значение (в миллисекундах) Установить пользовательский тайм-аут diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 585dbb9..ebf8106 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -20,8 +20,6 @@ Nastavenie sieťe Heslo Podrobnosti servera - Použiť HTTPS - Upresniť či by malo byť použité HTTPS Časový limit spojenia Vybrať hodnotu (milisekundy) Používateľské meno diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index eff1afd..fb4afca 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -20,8 +20,6 @@ Konfigurera nätverk Lösenord Serverinställningar - Använd HTTPS - Ange om HTTPS ska användas Anslutningstimeout Välj ett värde (millisekunder) Användarnamn diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b291ae0..d67b03a 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -20,8 +20,6 @@ Налаштування Мережі Пароль Деталі Сервера - Використовувати HTTPS - Вкажіть, чи варто використовувати протокол HTTPS Час очікування з\'єднання Виберіть значення (в мілісекундах) Ім\'я користувача: diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index dd2e7ce..fe6df6a 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -20,8 +20,6 @@ 設定網路 密碼 聚會細節 - 使用 HTTPS - 指定是否應使用HTTPS 連接逾時 選擇數值(毫秒) 帳號 From b5751ae1a4c262ffdc8cc240e620e62f213c0a23 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 1 Nov 2016 19:24:16 +0000 Subject: [PATCH 16/18] Fix build number --- app/app.iml | 16 ++++++++-------- app/build.gradle | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/app.iml b/app/app.iml index 33a7364..2d7a8c7 100644 --- a/app/app.iml +++ b/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 9d02b43..9618dc9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ android { applicationId "org.openlp.android2" minSdkVersion 16 targetSdkVersion 25 - versionCode 5 + versionCode 6 versionName "2.0" vectorDrawables.useSupportLibrary = true } From c9f9c93979c2a8badf64d68971f992230e5a962a Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 7 Nov 2016 19:43:25 +0000 Subject: [PATCH 17/18] fix abends --- app/app.iml | 16 +++++++------- .../android2/fragments/LiveListFragment.java | 22 +++++++++++-------- .../android2/fragments/SearchFragment.java | 2 +- .../android2/fragments/WebFragment.java | 2 +- app/src/main/res/layout/search_result_row.xml | 2 +- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/app/app.iml b/app/app.iml index 2d7a8c7..33a7364 100644 --- a/app/app.iml +++ b/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + + 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 61b3e93..48403c8 100644 --- a/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/LiveListFragment.java @@ -123,17 +123,21 @@ public class LiveListFragment extends OpenLPFragment { 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 line = (TextView) view.findViewById(R.id.line); TextView text1 = (TextView) view.findViewById(R.id.tag); - text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); + if (text1 != null) { + text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); + } TextView text2 = (TextView) view.findViewById(R.id.liveListNormal); - text2.setTextSize(TypedValue.COMPLEX_UNIT_SP, size); - if (selected == position) { - text2.setTypeface(null, Typeface.BOLD_ITALIC); - line.setBackgroundColor(0xffffff); - } else{ - text2.setTypeface(null, Typeface.NORMAL); - line.setBackgroundColor(0xffffff); + 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; diff --git a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java index 40e341a..f652d57 100644 --- a/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/SearchFragment.java @@ -294,7 +294,7 @@ public class SearchFragment extends Fragment { Log.i(LOG_TAG, "populateListDisplay - exit"); } - private class StableArrayAdapter extends ArrayAdapter { + public class StableArrayAdapter extends ArrayAdapter { HashMap mIdMap = new HashMap(); diff --git a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java index 0c9d67e..20400d9 100644 --- a/app/src/main/java/org/openlp/android2/fragments/WebFragment.java +++ b/app/src/main/java/org/openlp/android2/fragments/WebFragment.java @@ -69,7 +69,7 @@ public class WebFragment extends Fragment { super.onDestroyView(); } - private class webClient extends WebViewClient { + public class webClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; diff --git a/app/src/main/res/layout/search_result_row.xml b/app/src/main/res/layout/search_result_row.xml index 105f166..e378e2a 100644 --- a/app/src/main/res/layout/search_result_row.xml +++ b/app/src/main/res/layout/search_result_row.xml @@ -8,7 +8,7 @@ android:layout_height="wrap_content" android:textStyle="bold" android:textColor="#000000" - android:textSize="40sp" + android:textSize="25sp" android:paddingTop="10dp" android:paddingRight="5dp" android:paddingLeft="5dp" From 6ac265fafa96271229fbf7ec2a0c807eaf482f50 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 10 Nov 2016 19:32:51 +0000 Subject: [PATCH 18/18] Change the scroll default --- app/app.iml | 16 ++++++++-------- app/src/main/res/xml/pref_general.xml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/app.iml b/app/app.iml index 33a7364..2d7a8c7 100644 --- a/app/app.iml +++ b/app/app.iml @@ -66,14 +66,6 @@ - - - - - - - - @@ -82,6 +74,14 @@ + + + + + + + + diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml index 5ffe891..5c84e5e 100644 --- a/app/src/main/res/xml/pref_general.xml +++ b/app/src/main/res/xml/pref_general.xml @@ -10,7 +10,7 @@