← Back to team overview

openlp-android team mailing list archive

[Merge] lp:~johanmynhardt/openlp/android into lp:openlp/android

 

Johan Mynhardt has proposed merging lp:~johanmynhardt/openlp/android into lp:openlp/android.

Requested reviews:
  Johan Mynhardt (johanmynhardt)
  Tim Bentley (trb143)

For more details, see:
https://code.launchpad.net/~johanmynhardt/openlp/android/+merge/107510

Connection profile management - the ability to add and remove server configurations.
Improved workflow and value updates.

Known 'bugs': 
* stage view not working when using SSL.
* indication of current profile (other than the selected values being set in the preferences)
-- 
https://code.launchpad.net/~johanmynhardt/openlp/android/+merge/107510
Your team OpenLP Android Developers is subscribed to branch lp:openlp/android.
=== modified file 'AndroidManifest.xml'
--- AndroidManifest.xml	2012-05-12 19:40:12 +0000
+++ AndroidManifest.xml	2012-05-26 13:03:17 +0000
@@ -31,7 +31,8 @@
                     android:resource="@xml/searchable"/>
         </activity>
 
-		<activity android:name=".activity.Preferences" android:label="@string/preferences"/>
+		<activity android:name=".activity.preference.Preferences" android:label="@string/preferences"/>
+		<activity android:name=".activity.preference.ConnectionPreferenceActivity"/>
 		<activity android:name=".activity.PagerActivity"/>
 
         <service android:name=".service.PingIntent"/>

=== modified file 'OpenLP.apk'
Binary files OpenLP.apk	2012-05-18 17:55:42 +0000 and OpenLP.apk	2012-05-26 13:03:17 +0000 differ
=== added file 'res/menu/connections_menu.xml'
--- res/menu/connections_menu.xml	1970-01-01 00:00:00 +0000
+++ res/menu/connections_menu.xml	2012-05-26 13:03:17 +0000
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android";>
+	<item
+		android:id="@+id/menuAddHost"
+		android:enabled="true"
+		android:title="Add Host"
+		android:titleCondensed="Add"/>
+</menu>

=== modified file 'res/values/defaultValues.xml'
--- res/values/defaultValues.xml	2012-05-06 15:53:56 +0000
+++ res/values/defaultValues.xml	2012-05-26 13:03:17 +0000
@@ -2,11 +2,12 @@
     <!-- STRING -->
     <string name="hostDefaultValue">192.168.1.1</string>
     <string name="portDefaultValue">4316</string>
+	<string name="ssl.port.default">4317</string>
     <string name="displayTypeValue">@string/displayScreen</string>
 
     <!-- INTEGER -->
     <integer name="socketTimeoutDefaultValue">3000</integer>
     <integer name="connectionTimeoutDefaultValue">3000</integer>
     <string name="backgroundRefreshDefaultValue">5000</string>
-    <integer name="textSizeDefaultValue">14</integer>    
+    <integer name="textSizeDefaultValue">14</integer>
 </resources>

=== modified file 'res/values/keyStrings.xml'
--- res/values/keyStrings.xml	2012-05-05 17:29:57 +0000
+++ res/values/keyStrings.xml	2012-05-26 13:03:17 +0000
@@ -8,4 +8,5 @@
     <string name="keyHost">keyHost</string>
     <string name="keyPort">keyPort</string>
     <string name="keySharedPreferences">keySharedPreferences</string>
-</resources>
\ No newline at end of file
+	<string name="key.ssl.use">ssl.use</string>
+</resources>

=== modified file 'res/values/strings.xml'
--- res/values/strings.xml	2012-05-18 18:06:34 +0000
+++ res/values/strings.xml	2012-05-26 13:03:17 +0000
@@ -72,4 +72,19 @@
 	<string name="requestFailed">Request Failed</string>
 	<string name="couldNotHandleLiveItems">Could not handle live items</string>
 	<string name="couldNotHandleServiceItems">Could not handle service items</string>
+	<string name="connection.profiles">Connection Profiles</string>
+	<string name="connection.profiles.manage">Manage Profiles</string>
+	<string name="connection.profile.active">Active Profile</string>
+	<string name="connection.profile.summary.activate">Set this profile as the active profile</string>
+	<string name="connection.profile.activate">Activate</string>
+	<string name="connection.profile.server">Server</string>
+	<string name="connection.profile.remove">Remove</string>
+	<string name="connection.profile.remove.summary">Remove this configuration</string>
+    <string name="connection.profile.not.saved">Tap to edit properties</string>
+    <string name="connection.profile.new.server">New Server</string>
+	<string name="notSet">Not set</string>
+	<string name="title.ssl.use">Use SSL</string>
+	<string name="summary.ssl.use">Specify whether SSL should be used</string>
+	<string name="connection.available.configurations">List of available profiles</string>
+	<string name="connection.add.by.menu">Add a config via the menu</string>
 </resources>

=== added file 'res/xml/empty_preferences.xml'
--- res/xml/empty_preferences.xml	1970-01-01 00:00:00 +0000
+++ res/xml/empty_preferences.xml	2012-05-26 13:03:17 +0000
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen
+        xmlns:android="http://schemas.android.com/apk/res/android";>
+
+</PreferenceScreen>

=== modified file 'res/xml/preferences.xml'
--- res/xml/preferences.xml	2012-05-18 17:55:42 +0000
+++ res/xml/preferences.xml	2012-05-26 13:03:17 +0000
@@ -22,19 +22,28 @@
                 android:defaultValue="@string/displayTypeValue"/>  
     </PreferenceCategory>
     <PreferenceCategory
-            android:title="@string/preferenceCategoryTitleServer">
-        <EditTextPreference
+            android:title="@string/preferenceCategoryTitleServer"
+            android:key="category.server">
+        <Preference
                 android:title="@string/url"
                 android:key="@string/keyHost"
                 android:hint="@string/urlHint"
                 android:inputType="textUri"
+                android:editable="false"
+                android:selectable="false"
                 android:name="@string/url"/>
-        <EditTextPreference
+        <Preference
                 android:defaultValue="@string/portDefaultValue"
                 android:title="@string/port"
                 android:key="@string/keyPort"
                 android:name="@string/url"
+                android:editable="false"
+                android:selectable="false"
                 android:inputType="number"/>
+		<CheckBoxPreference
+			android:title="@string/title.ssl.use"
+			android:key="@string/key.ssl.use"
+			android:summary="@string/summary.ssl.use"/>
     </PreferenceCategory>
     <PreferenceCategory
             android:title="@string/backgroundService">

=== modified file 'src/org/openlp/android/OpenLP.java'
--- src/org/openlp/android/OpenLP.java	2012-05-05 17:29:57 +0000
+++ src/org/openlp/android/OpenLP.java	2012-05-26 13:03:17 +0000
@@ -27,7 +27,7 @@
 import android.view.View;
 import org.openlp.android.activity.DefaultActivity;
 import org.openlp.android.activity.PagerActivity;
-import org.openlp.android.activity.Preferences;
+import org.openlp.android.activity.preference.Preferences;
 import org.openlp.android.utility.OpenLPController;
 
 import static org.openlp.android.utility.OpenLPController.getPageForButton;

=== modified file 'src/org/openlp/android/activity/DefaultActivity.java'
--- src/org/openlp/android/activity/DefaultActivity.java	2012-05-05 17:34:31 +0000
+++ src/org/openlp/android/activity/DefaultActivity.java	2012-05-26 13:03:17 +0000
@@ -26,6 +26,7 @@
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import org.openlp.android.R;
+import org.openlp.android.activity.preference.Preferences;
 import org.openlp.android.api.Api;
 
 

=== removed file 'src/org/openlp/android/activity/Preferences.java'
--- src/org/openlp/android/activity/Preferences.java	2012-05-18 17:55:42 +0000
+++ src/org/openlp/android/activity/Preferences.java	1970-01-01 00:00:00 +0000
@@ -1,126 +0,0 @@
-/******************************************************************************
- * OpenLP - Open Source Lyrics Projection                                      *
- * --------------------------------------------------------------------------- *
- * Copyright (c) 2011-2012 Raoul Snyman                                        *
- * Portions copyright (c) 2011-2012 Tim Bentley, Johan Mynhardt, Samuel        *
- * Sjöbergsson                                                                 *
- * --------------------------------------------------------------------------- *
- * 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.android.activity;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.net.Uri;
-import android.os.Bundle;
-import android.preference.*;
-import android.util.Log;
-import org.openlp.android.R;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-/**
- * Credits: http://www.kaloer.com/android-preferences
- * http://androidpartaker.wordpress.com/2010/07/11/android-preferences/
- */
-public class Preferences extends PreferenceActivity {
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        Log.d(LOG_TAG, "Launching preferences");
-        getPreferenceManager().setSharedPreferencesName(
-                getString(R.string.keySharedPreferences));
-        addPreferencesFromResource(R.xml.preferences);
-
-        PackageManager manager = this.getPackageManager();
-        String version = "";
-        try {
-            PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
-            version = info.versionName;
-        } catch (PackageManager.NameNotFoundException e) {
-            // Nop as version defined
-        }
-        Date date = new Date();
-        SimpleDateFormat simpleDateformat = new SimpleDateFormat("yyyy");
-
-        /* Preferences time! (we build the preferences) */
-        Preference about = getPreference(getResources().getString(R.string.about_text), version, null);
-        Preference openlpLink = getPreference(getResources().getString(R.string.about_display_3), getResources().getString(R.string.about_display_1), new Intent(Intent.ACTION_VIEW, Uri.parse("http://openlp.org/";)));
-
-        StringBuffer html = new StringBuffer();
-        html.append(getResources().getString(R.string.about_display_4));
-        html.append(" © 2004-");
-        html.append(simpleDateformat.format(date));
-        html.append(" Raoul Snyman\n");
-        html.append(getResources().getString(R.string.about_display_5));
-        html.append(" © 2004-");
-        html.append(simpleDateformat.format(date));
-        html.append("\nTim Bentley, Johan Mynhardt, Samuel Sjöbergsson");
-        Preference copyright = getPreference(getResources().getString(R.string.about_display_4), html.toString(), null);
-
-        DialogPreference license = new MyDialogPreference(this, getResources().getString(R.string.about_display_6), getResources().getString(R.string.about_display_7) + "\n" + getResources().getString(R.string.about_display_8));
-
-        PreferenceScreen preferenceScreen = getPreferenceScreen();
-        addPreferenceCategory(preferenceScreen, getResources().getString(R.string.about), about, openlpLink, copyright, license);
-        this.setPreferenceScreen(preferenceScreen);
-    }
-
-    private boolean addPreferenceCategory(PreferenceScreen preferenceScreen,
-                                          String titleCategory, Preference... preferences) {
-        boolean addPreference = false;
-        for (Preference preference : preferences) {
-            if (preference != null)
-                addPreference = true;
-        }
-        if (addPreference) {
-            PreferenceCategory preferenceCategory = new PreferenceCategory(this);
-            preferenceCategory.setTitle(titleCategory);
-            preferenceScreen.addPreference(preferenceCategory);
-            for (Preference preference : preferences) {
-                if (preference != null)
-                    preferenceCategory.addPreference(preference);
-            }
-            return true;
-        } else
-            return false;
-    }
-
-    private Preference getPreference(String title, String summary, Intent intent) {
-        Preference pref = new Preference(this);
-        pref.setTitle(title);
-        pref.setSummary(summary);
-        if (intent != null)
-            pref.setIntent(intent);
-        return pref;
-    }
-
-    public class MyDialogPreference extends DialogPreference {
-        public MyDialogPreference(Context context, String title, String text) {
-            super(context, null);
-            this.setTitle(title);
-            this.setDialogMessage(text);
-        }
-    }
-
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        Log.d(LOG_TAG, "Destroying preferences");
-    }
-
-    private final String LOG_TAG = Preferences.class.getName();
-}

=== added directory 'src/org/openlp/android/activity/preference'
=== added file 'src/org/openlp/android/activity/preference/ConnectionPreferenceActivity.java'
--- src/org/openlp/android/activity/preference/ConnectionPreferenceActivity.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/preference/ConnectionPreferenceActivity.java	2012-05-26 13:03:17 +0000
@@ -0,0 +1,330 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2012 Raoul Snyman                                        *
+ * Portions copyright (c) 2011-2012 Tim Bentley, Johan Mynhardt, Samuel        *
+ * Sjöbergsson                                                                 *
+ * --------------------------------------------------------------------------- *
+ * 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.android.activity.preference;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.EditTextPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceScreen;
+import android.text.InputType;
+import android.util.Log;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.widget.Toast;
+import org.openlp.android.R;
+
+public class ConnectionPreferenceActivity extends PreferenceActivity {
+	private final String KEY_PREFERENCE_DISPLAY = "preferenceDisplay";
+	private final String KEY_SERVER_ID = "keyServerId";
+	private final String PREFERENCE_DISPLAY_SERVER = "displayServer";
+	private final String LOG_TAG = ConnectionPreferenceActivity.class.getName();
+
+
+	private PreferenceScreen preferenceScreen = null;
+	private boolean resume = true;
+
+	@Override
+	protected void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		addPreferencesFromResource(R.xml.empty_preferences);
+		getPreferenceManager().setSharedPreferencesName(getString(R.string.keySharedPreferences));
+		preferenceScreen = getPreferenceScreen() == null
+				? getPreferenceManager().createPreferenceScreen(this)
+				: getPreferenceScreen();
+		preferenceScreen.removeAll();
+		String preferenceDisplay = getIntent().getStringExtra(KEY_PREFERENCE_DISPLAY);
+		if (preferenceDisplay != null && preferenceDisplay.equalsIgnoreCase(PREFERENCE_DISPLAY_SERVER)) {
+			constructServerView(getIntent().getIntExtra(KEY_SERVER_ID, 1));
+		} else {
+			resume = false;
+			constructOverviewScreen();
+		}
+	}
+
+	private void constructOverviewScreen() {
+		getPreferenceScreen().removeAll();
+		Log.i(LOG_TAG, "constructOverviewScreen");
+		Preference configPref = new Preference(this);
+		configPref.setTitle(getString(R.string.connection_available_configurations));
+		configPref.setSummary(getString(R.string.connection_add_by_menu));
+		configPref.setSelectable(false);
+		preferenceScreen.addPreference(configPref);
+		List<HostConfig> hostConfigs = getHostConfigs();
+		if (!hostConfigs.isEmpty()) {
+			for (final HostConfig config : getHostConfigs()) {
+				preferenceScreen.addPreference(simpleClickablePreferenceFromHostConfig(config));
+			}
+		}
+	}
+
+	private void constructServerView(int hostId) {
+		HostConfig hostConfig = hostConfigFromPreferencesForHostId(
+				hostId,
+				getHostConfigMap(
+						getPreferenceManager()
+								.getSharedPreferences()
+								.getAll()
+				)
+		);
+		addPreferenceCategory(preferenceScreen, hostConfig);
+	}
+
+	private Preference simpleClickablePreferenceFromHostConfig(final HostConfig config) {
+		final Preference serverConfig = new Preference(this);
+		serverConfig.setTitle(config.title);
+		serverConfig.setSummary(String.format("%s:%s", config.hostAddress.getText(), config.hostPort.getText()));
+		serverConfig.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
+			@Override
+			public boolean onPreferenceClick(Preference preference) {
+				Intent serverConfigIntent = new Intent(ConnectionPreferenceActivity.this, ConnectionPreferenceActivity.class);
+				serverConfigIntent.putExtra(KEY_PREFERENCE_DISPLAY, PREFERENCE_DISPLAY_SERVER);
+				serverConfigIntent.putExtra(KEY_SERVER_ID, config.id);
+				startActivity(serverConfigIntent);
+				return true;
+			}
+		});
+		return serverConfig;
+	}
+
+	private List<HostConfig> getHostConfigs() {
+		return hostConfigsFromPreferences(
+				getHostConfigMap(
+						getPreferenceManager()
+								.getSharedPreferences()
+								.getAll()
+				)
+		);
+	}
+
+	private Map<String, ?> getHostConfigMap(Map<String, ?> preferences) {
+		Map<String, Object> configMap = new TreeMap<String, Object>();
+
+		List<String> sortedKeys = new ArrayList<String>(preferences.keySet());
+		Collections.sort(sortedKeys);
+		for (String key : sortedKeys) {
+			if (key.startsWith(HostConfig.KEY_PREFIX)) {
+				configMap.put(key, preferences.get(key));
+			}
+		}
+		return configMap;
+	}
+
+	private List<HostConfig> hostConfigsFromPreferences(Map<String, ?> preferences) {
+		List<Integer> hostIds = getHostIds(preferences);
+		List<HostConfig> hostConfigs = new ArrayList<HostConfig>();
+		for (Integer id : hostIds) {
+			hostConfigs.add(hostConfigFromPreferencesForHostId(id, preferences));
+		}
+		return hostConfigs;
+	}
+
+	private HostConfig hostConfigFromPreferencesForHostId(int hostId, Map<String, ?> preferences) {
+		HostConfig hostConfig = new HostConfig(getString(R.string.connection_profile_server), hostId);
+		Object hostValueObject = preferences.get(hostConfig.hostAddress.getKey());
+		String hostValue = hostValueObject == null ? getString(R.string.hostDefaultValue) : hostValueObject.toString();
+		hostConfig.hostAddress.setText(hostValue);
+		hostConfig.hostAddress.setSummary(hostValue);
+		Object portValueObject = preferences.get(hostConfig.hostPort.getKey());
+		String portValue = portValueObject == null ? getString(R.string.portDefaultValue) : portValueObject.toString();
+		hostConfig.hostPort.setText(portValue);
+		hostConfig.hostPort.setSummary(portValue);
+		return hostConfig;
+	}
+
+	private int getNextPrefId(Map<String, ?> preferences) {
+		int max = 0;
+		for (String key : preferences.keySet()) {
+			int prefValue = Integer.valueOf(key.split("\\.")[2]);
+			max = prefValue > max ? prefValue : max;
+		}
+		return max + 1;
+	}
+
+	private List<Integer> getHostIds(Map<String, ?> preferences) {
+		Set<Integer> hashSet = new HashSet<Integer>();
+		for (String key : preferences.keySet()) {
+			hashSet.add(Integer.valueOf(key.split("\\.")[2]));
+		}
+		List<Integer> hostIds = new ArrayList<Integer>(hashSet);
+		Collections.sort(hostIds);
+		Log.i(LOG_TAG, "Got HostIds: " + hostIds);
+		return hostIds;
+	}
+
+	private boolean addPreferenceCategory(PreferenceScreen preferenceScreen, HostConfig hostConfig) {
+		PreferenceCategory preferenceCategory = new PreferenceCategory(this);
+		preferenceCategory.setTitle(hostConfig.title);
+		preferenceScreen.addPreference(preferenceCategory);
+		preferenceCategory.addPreference(hostConfig.hostAddress);
+		preferenceCategory.addPreference(hostConfig.hostPort);
+		preferenceCategory.addPreference(hostConfig.remove);
+		preferenceCategory.addPreference(hostConfig.activate);
+		return true;
+	}
+
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu) {
+		MenuInflater inflater = getMenuInflater();
+		inflater.inflate(R.menu.connections_menu, menu);
+		return true;
+	}
+
+	@Override
+	public boolean onOptionsItemSelected(MenuItem item) {
+		switch (item.getItemId()) {
+			case R.id.preferences:
+				startActivity(new Intent(this, Preferences.class));
+				return true;
+			case R.id.menuAddHost:
+				int nextId = getNextPrefId(
+						getHostConfigMap(
+								getPreferenceManager().getSharedPreferences().getAll()
+						)
+				);
+				Preference preference = simpleClickablePreferenceFromHostConfig(
+										new HostConfig(
+											getString(R.string.connection_profile_server),
+											nextId));
+				preference.setTitle(getString(R.string.connection_profile_new_server));
+				preference.setSummary(getString(R.string.connection_profile_not_saved));
+				preferenceScreen.addPreference(preference);
+				return true;
+			default:
+				return super.onOptionsItemSelected(item);
+		}
+	}
+
+	@Override
+	protected void onResume() {
+		super.onResume();
+		if (resume) {
+			Log.i(LOG_TAG, "Resuming...");
+		} else {
+			constructOverviewScreen();
+			Log.i(LOG_TAG, "Not resuming...");
+		}
+	}
+
+	private class HostConfig {
+		static final String KEY_PREFIX = "host.config.";
+		final int id;
+		final String title;
+		final EditTextPreference hostAddress;
+		final EditTextPreference hostPort;
+		final Preference remove;
+		final Preference activate;
+
+		HostConfig(String title, int id) {
+			this.title = title + " " + id;
+			this.id = id;
+			hostAddress = new EditTextPreference(ConnectionPreferenceActivity.this);
+			hostAddress.setTitle(getString(R.string.urlHint));
+			hostAddress.setKey(KEY_PREFIX + id + ".address");
+			hostAddress.setSummary(getString(R.string.urlHint));
+			hostAddress.setDialogTitle(getString(R.string.urlHint));
+			hostAddress.getEditText().setInputType(InputType.TYPE_TEXT_VARIATION_URI);
+			hostAddress.setOnPreferenceChangeListener(onPreferenceChangeListener);
+			hostPort = new EditTextPreference(ConnectionPreferenceActivity.this);
+			hostPort.setTitle(getString(R.string.port));
+			hostPort.setKey(KEY_PREFIX + id + ".port");
+			hostPort.setSummary(getString(R.string.port));
+			hostPort.setDialogTitle(getString(R.string.port));
+			hostPort.getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);
+			hostPort.setDefaultValue(getString(R.string.portDefaultValue));
+			hostPort.setOnPreferenceChangeListener(onPreferenceChangeListener);
+			remove = new Preference(ConnectionPreferenceActivity.this);
+			remove.setTitle(getString(R.string.connection_profile_remove));
+			remove.setSummary(getString(R.string.connection_profile_remove_summary));
+			remove.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
+				@Override
+				public boolean onPreferenceClick(Preference preference) {
+					SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
+					SharedPreferences.Editor editor = prefs.edit();
+					editor.remove(hostAddress.getKey());
+					editor.remove(hostPort.getKey());
+					editor.commit();
+					ConnectionPreferenceActivity.this.onBackPressed();
+					return false;
+				}
+			});
+
+			activate = new Preference(ConnectionPreferenceActivity.this);
+			activate.setTitle(getString(R.string.connection_profile_activate));
+			activate.setSummary(getString(R.string.connection_profile_summary_activate));
+			activate.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
+				@Override
+				public boolean onPreferenceClick(Preference preference) {
+					SharedPreferences preferences = getPreferenceManager().getSharedPreferences();
+					SharedPreferences.Editor editor = preferences.edit();
+					String host = preferences.getString(hostAddress.getKey(),
+							getString(R.string.hostDefaultValue));
+					editor.putString(getString(R.string.keyHost), host);
+					String port = preferences.getString(hostPort.getKey(),
+							getString(R.string.portDefaultValue));
+					editor.putString(getString(R.string.keyPort), port);
+					editor.commit();
+					Toast.makeText(ConnectionPreferenceActivity.this,
+							String.format(
+									"%s: %s [%s:%s]",
+									getString(R.string.connection_profile_active),
+									HostConfig.this.title,
+									host,
+									port
+							),
+							Toast.LENGTH_SHORT).show();
+					return false;
+				}
+			});
+		}
+
+		@Override
+		public String toString() {
+			return "HostConfig{" +
+					"id=" + id +
+					", title='" + title + '\'' +
+					", hostAddress=" + hostAddress.getKey() +
+					", hostPort=" + hostPort.getKey() +
+					'}';
+		}
+
+		Preference.OnPreferenceChangeListener onPreferenceChangeListener =
+				new Preference.OnPreferenceChangeListener() {
+					@Override
+					public boolean onPreferenceChange(Preference preference, Object o) {
+						preference.setSummary("" + o);
+						return true;
+					}
+				};
+	}
+}

=== added file 'src/org/openlp/android/activity/preference/Preferences.java'
--- src/org/openlp/android/activity/preference/Preferences.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/preference/Preferences.java	2012-05-26 13:03:17 +0000
@@ -0,0 +1,195 @@
+/******************************************************************************
+ * OpenLP - Open Source Lyrics Projection                                      *
+ * --------------------------------------------------------------------------- *
+ * Copyright (c) 2011-2012 Raoul Snyman                                        *
+ * Portions copyright (c) 2011-2012 Tim Bentley, Johan Mynhardt, Samuel        *
+ * Sjöbergsson                                                                 *
+ * --------------------------------------------------------------------------- *
+ * 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.android.activity.preference;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.preference.DialogPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceScreen;
+import android.util.Log;
+import org.openlp.android.R;
+
+/**
+ * Credits: http://www.kaloer.com/android-preferences
+ * http://androidpartaker.wordpress.com/2010/07/11/android-preferences/
+ */
+public class Preferences extends PreferenceActivity {
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        Log.d(LOG_TAG, "Launching preferences");
+        buildPreferences();
+    }
+
+	private void buildPreferences() {
+		if (getPreferenceScreen() != null) getPreferenceScreen().removeAll();
+
+		getPreferenceManager()
+			.setSharedPreferencesName(getString(R.string.keySharedPreferences));
+
+		addPreferencesFromResource(R.xml.preferences);
+		final SharedPreferences sharedPreferences = getPreferenceManager()
+			.getSharedPreferences();
+		final Preference hostPreference = findPreference(getString(R.string.keyHost));
+		hostPreference.setSummary(
+				sharedPreferences.getString(
+					getString(R.string.keyHost),
+					getString(R.string.notSet)));
+
+		Preference.OnPreferenceChangeListener onPreferenceChangeListener = new Preference.OnPreferenceChangeListener() {
+			@Override
+			public boolean onPreferenceChange(Preference preference, Object o) {
+				preference.setSummary("" + o);
+				return true;
+			}
+		};
+		hostPreference.setOnPreferenceChangeListener(onPreferenceChangeListener);
+
+		final Preference portPreference = findPreference(getString(R.string.keyPort));
+		portPreference.setSummary(
+				sharedPreferences.getString(
+					getString(R.string.keyPort),
+					getString(R.string.notSet)));
+
+		portPreference.setOnPreferenceChangeListener(onPreferenceChangeListener);
+
+		PackageManager manager = this.getPackageManager();
+		String version = "";
+		try {
+			PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
+			version = info.versionName;
+		} catch (PackageManager.NameNotFoundException ignored) {}
+
+		String date = new SimpleDateFormat("yyyy").format(new Date());
+
+		//Preferences time! (we build the preferences)
+		Preference about = getPreference(getString(R.string.about_text), version, null);
+		about.setSelectable(false);
+		Preference openlpLink = getPreference(
+			getString(R.string.about_display_3),
+			getString(R.string.about_display_1),
+			new Intent(Intent.ACTION_VIEW, Uri.parse("http://openlp.org/";)));
+
+		StringBuilder html = new StringBuilder();
+		html.append(getString(R.string.about_display_4));
+		html.append(" © 2004-").append(date).append(" Raoul Snyman\n");
+		html.append(getString(R.string.about_display_5));
+		html.append(" © 2004-").append(date);
+		html.append("\nTim Bentley, Johan Mynhardt, Samuel Sjöbergsson");
+
+		Preference copyright = getPreference(
+			getString(R.string.about_display_4),
+			html.toString(), null);
+		copyright.setSelectable(false);
+
+		DialogPreference license = new MyDialogPreference(
+			this,
+			getString(R.string.about_display_6),
+			String.format(
+				"%s\n%s",
+				getString(R.string.about_display_7),
+				getString(R.string.about_display_8)
+			)
+		);
+
+
+		PreferenceScreen preferenceScreen = getPreferenceScreen();
+		addPreferenceCategory(preferenceScreen,getString(R.string.about),
+			about, openlpLink, copyright, license);
+
+		Preference preference = new Preference(this);
+		preference.setTitle(getString(R.string.connection_profiles_manage));
+		preference.setIntent(new Intent(this, ConnectionPreferenceActivity.class));
+		preference.setKey("preference.manage.profiles");
+		PreferenceCategory preferenceCategory = (
+			(PreferenceCategory) findPreference("category.server")
+		);
+		if (findPreference("preference.manage.profiles") == null) {
+			preferenceCategory.addPreference(preference);
+		}
+	}
+
+    private boolean addPreferenceCategory(PreferenceScreen preferenceScreen,
+		String titleCategory, Preference... preferences) {
+
+		boolean addPreference = false;
+
+		for (Preference preference : preferences) {
+            if (preference != null)
+                addPreference = true;
+        }
+
+		if (addPreference) {
+            PreferenceCategory preferenceCategory = new PreferenceCategory(this);
+            preferenceCategory.setTitle(titleCategory);
+            preferenceScreen.addPreference(preferenceCategory);
+            for (Preference preference : preferences) {
+                if (preference != null)
+                    preferenceCategory.addPreference(preference);
+            }
+            return true;
+        } else
+            return false;
+    }
+
+    private Preference getPreference(String title, String summary, Intent intent) {
+        Preference pref = new Preference(this);
+        pref.setTitle(title);
+        pref.setSummary(summary);
+        if (intent != null)
+            pref.setIntent(intent);
+        return pref;
+    }
+
+    public class MyDialogPreference extends DialogPreference {
+        public MyDialogPreference(Context context, String title, String text) {
+            super(context, null);
+            this.setTitle(title);
+            this.setDialogMessage(text);
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        Log.d(LOG_TAG, "Destroying preferences");
+    }
+
+	@Override
+	protected void onResume() {
+		super.onResume();
+		Log.i(LOG_TAG, "Resuming Preferences...");
+		buildPreferences();
+	}
+
+	private final String LOG_TAG = Preferences.class.getName();
+}

=== modified file 'src/org/openlp/android/utility/OpenLPController.java'
--- src/org/openlp/android/utility/OpenLPController.java	2012-05-05 14:12:12 +0000
+++ src/org/openlp/android/utility/OpenLPController.java	2012-05-26 13:03:17 +0000
@@ -604,7 +604,10 @@
 	}
 
 	private String getUrlBase() {
-		return String.format("http://%s:%s/stage";,
+		Boolean useSsl = preferences.getBoolean(context.getString(R.string.key_ssl_use), false);
+
+		return String.format("%s://%s:%s/stage",
+				useSsl ? "https" : "http",
 			preferences.getString(context.getString(R.string.keyHost),
 				context.getString(R.string.hostDefaultValue)),
 			preferences.getString(context.getString(R.string.keyPort),

=== modified file 'src/org/openlp/android/utility/OpenLPHttpClient.java'
--- src/org/openlp/android/utility/OpenLPHttpClient.java	2012-05-05 14:12:12 +0000
+++ src/org/openlp/android/utility/OpenLPHttpClient.java	2012-05-26 13:03:17 +0000
@@ -25,11 +25,22 @@
 import java.io.InputStreamReader;
 import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
+import java.net.Socket;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLDecoder;
+import java.net.UnknownHostException;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
 
-import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
 
 import android.content.Context;
 import android.content.SharedPreferences;
@@ -37,6 +48,10 @@
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.methods.HttpGet;
+import org.apache.http.conn.scheme.PlainSocketFactory;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.params.BasicHttpParams;
 import org.apache.http.params.HttpConnectionParams;
@@ -53,20 +68,50 @@
 	private HttpGet httpGet;
 	private URL url;
 	private final String urlBase;
+	private SSLSocketFactory sslSocketFactory;
 
 	public OpenLPHttpClient(Context context) {
 		SharedPreferences preferences = context.getSharedPreferences(
 				context.getString(R.string.keySharedPreferences),
 				Context.MODE_PRIVATE);
-
-		Log.v(LOG_TAG, String.format("Preferences: %s", preferences.getAll().toString()));
 		HttpParams httpParams = new BasicHttpParams();
 
-		urlBase = String.format("http://%s:%s";, preferences.getString(
+		Boolean useSsl = preferences.getBoolean(context.getString(R.string.key_ssl_use), false);
+
+		String port = preferences.getString(
+				context.getString(R.string.keyPort),
+				context.getString(R.string.portDefaultValue)
+		);
+
+
+		SchemeRegistry schemeRegistry = getConnectionManager().getSchemeRegistry();
+		if (!useSsl) {
+			schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), Integer.valueOf(port)));
+		} else {
+			try {
+				initSsl();
+				schemeRegistry.register(new Scheme("https", sslSocketFactory, Integer.valueOf(port)));
+			} catch (NoSuchAlgorithmException e) {
+				Log.e(LOG_TAG, e.toString());
+			} catch (KeyManagementException e) {
+				Log.e(LOG_TAG, e.toString());
+			} catch (KeyStoreException e) {
+				Log.e(LOG_TAG, e.toString());
+			} catch (UnrecoverableKeyException e) {
+				Log.e(LOG_TAG, e.toString());
+			} catch (CertificateException e) {
+				e.printStackTrace();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+
+		}
+
+		urlBase = String.format("http%s://%s:%s",
+				useSsl ? "s" : "",
+				preferences.getString(
 				context.getString(R.string.keyHost),
-				context.getString(R.string.hostDefaultValue)), preferences
-				.getString(context.getString(R.string.keyPort),
-						context.getString(R.string.portDefaultValue)));
+				context.getString(R.string.hostDefaultValue)), port);
 
 		int connectionTimeout = context.getResources().getInteger(
 				R.integer.connectionTimeoutDefaultValue);
@@ -129,8 +174,6 @@
 					stringBuilder.append(line);
 					line = bufferedReader.readLine();
 				}
-
-				Log.v(LOG_TAG, String.format("entity: %s",stringBuilder.toString()));
 				bufferedReader.close();
 				return stringBuilder.toString();
 			}
@@ -147,5 +190,39 @@
 		return null;
 	}
 
+	private void initSsl() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException, IOException, CertificateException {
+		final SSLContext sslContext = SSLContext.getInstance("TLS");
+		X509TrustManager trustManager = new X509TrustManager() {
+			@Override
+			public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+			}
+
+			@Override
+			public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+			}
+
+			@Override
+			public X509Certificate[] getAcceptedIssuers() {
+				return null;
+			}
+		};
+		sslContext.init(null, new TrustManager[]{trustManager}, null);
+
+		KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+		keyStore.load(null, null);
+		sslSocketFactory = new SSLSocketFactory(keyStore) {
+			@Override
+			public Socket createSocket() throws IOException {
+				return sslContext.getSocketFactory().createSocket();
+			}
+
+			@Override
+			public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
+				return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
+			}
+		};
+		sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+	}
+
 	private final String LOG_TAG = OpenLPHttpClient.class.getName();
 }

=== modified file 'src/org/openlp/android/utility/WebCallReturningAsyncTask.java'
--- src/org/openlp/android/utility/WebCallReturningAsyncTask.java	2012-05-05 17:51:24 +0000
+++ src/org/openlp/android/utility/WebCallReturningAsyncTask.java	2012-05-26 13:03:17 +0000
@@ -27,8 +27,7 @@
 import android.widget.Toast;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpResponse;
-import org.openlp.android.activity.Preferences;
-import org.openlp.android.utility.OpenLPHttpClient;
+import org.openlp.android.activity.preference.Preferences;
 
 import java.io.BufferedReader;
 import java.io.IOException;


Follow ups