← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~trb143/openlp/android_04 into lp:openlp

 

Tim Bentley has proposed merging lp:~trb143/openlp/android_04 into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)

For more details, see:
https://code.launchpad.net/~trb143/openlp/android_04/+merge/99073

Updated Translations and test apk file
-- 
https://code.launchpad.net/~trb143/openlp/android_04/+merge/99073
Your team OpenLP Core is requested to review the proposed merge of lp:~trb143/openlp/android_04 into lp:openlp.
=== added file '.bzrignore'
--- .bzrignore	1970-01-01 00:00:00 +0000
+++ .bzrignore	2012-03-23 16:56:20 +0000
@@ -0,0 +1,13 @@
+bin/
+assets/
+gen/
+.idea
+out
+Openlp-android.iml
+Openlp-android-working.iml
+.classpath
+.settings
+Openlp-android-buildfilefix.iml
+build.xml
+local.properties
+build.properties

=== renamed file '.bzrignore' => '.bzrignore.moved'
=== added file '.classpath'
--- .classpath	1970-01-01 00:00:00 +0000
+++ .classpath	2012-03-23 16:56:20 +0000
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="gen"/>
+	<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
+	<classpathentry kind="output" path="bin/classes"/>
+</classpath>

=== added file '.project'
--- .project	1970-01-01 00:00:00 +0000
+++ .project	2012-03-23 16:56:20 +0000
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>OpenlpRemote</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>

=== added file 'AndroidManifest.xml'
--- AndroidManifest.xml	1970-01-01 00:00:00 +0000
+++ AndroidManifest.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest
+        xmlns:android="http://schemas.android.com/apk/res/android";
+		android:installLocation="auto"
+        package="org.openlp.android"
+        android:versionCode="3"
+        android:versionName="0.4"
+        >
+    <uses-sdk android:minSdkVersion="8"/>
+    <uses-permission android:name="android.permission.INTERNET"/>
+
+    <application
+            android:icon="@drawable/openlp_logo"
+            android:label="@string/app_name" android:theme="@style/OpenLPStyle">
+        <activity
+                android:name=".OpenLP"
+                android:label="@string/app_name">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+        <activity
+                android:name=".activity.SearchableActivity"
+                android:label="@string/searchResults">
+            <intent-filter>
+                <action android:name="android.intent.action.SEARCH"/>
+            </intent-filter>
+            <meta-data
+                    android:name="android.app.searchable"
+                    android:resource="@xml/searchable"/>
+        </activity>
+
+        <activity android:name=".activity.Misc"/>
+        <activity android:name=".activity.Preferences" android:label="@string/preferences"/>
+        <activity android:name=".activity.Slide"/>
+        <activity android:name=".activity.Service"/>
+        <activity android:name=".activity.Alert"/>
+        <activity android:name=".activity.StageView"/>                 
+        <meta-data
+                android:name="android.app.default_searchable"
+                android:value=".activity.SearchableActivity"/>
+    </application>
+</manifest>

=== added file 'LICENSE'
--- LICENSE	1970-01-01 00:00:00 +0000
+++ LICENSE	2012-03-23 16:56:20 +0000
@@ -0,0 +1,339 @@
+            GNU GENERAL PUBLIC LICENSE
+               Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+            GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+             END OF TERMS AND CONDITIONS
+
+        How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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; either version 2 of the License, or
+    (at your option) any later version.
+
+    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.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

=== renamed file 'LICENSE' => 'LICENSE.moved'
=== added file 'OpenLP.apk'
Binary files OpenLP.apk	1970-01-01 00:00:00 +0000 and OpenLP.apk	2012-03-23 16:56:20 +0000 differ
=== added directory 'assets'
=== added directory 'libs'
=== added file 'proguard.cfg'
--- proguard.cfg	1970-01-01 00:00:00 +0000
+++ proguard.cfg	2012-03-23 16:56:20 +0000
@@ -0,0 +1,36 @@
+-optimizationpasses 5
+-dontusemixedcaseclassnames
+-dontskipnonpubliclibraryclasses
+-dontpreverify
+-verbose
+-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
+
+-keep public class * extends android.app.Activity
+-keep public class * extends android.app.Application
+-keep public class * extends android.app.Service
+-keep public class * extends android.content.BroadcastReceiver
+-keep public class * extends android.content.ContentProvider
+-keep public class * extends android.app.backup.BackupAgentHelper
+-keep public class * extends android.preference.Preference
+-keep public class com.android.vending.licensing.ILicensingService
+
+-keepclasseswithmembernames class * {
+    native <methods>;
+}
+
+-keepclasseswithmembernames class * {
+    public <init>(android.content.Context, android.util.AttributeSet);
+}
+
+-keepclasseswithmembernames class * {
+    public <init>(android.content.Context, android.util.AttributeSet, int);
+}
+
+-keepclassmembers enum * {
+    public static **[] values();
+    public static ** valueOf(java.lang.String);
+}
+
+-keep class * implements android.os.Parcelable {
+  public static final android.os.Parcelable$Creator *;
+}

=== added file 'project.properties'
--- project.properties	1970-01-01 00:00:00 +0000
+++ project.properties	2012-03-23 16:56:20 +0000
@@ -0,0 +1,11 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system use,
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+
+# Project target.
+target=android-8

=== added directory 'res'
=== added directory 'res/drawable-hdpi'
=== added file 'res/drawable-hdpi/alert.png'
Binary files res/drawable-hdpi/alert.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/alert.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/blank.png'
Binary files res/drawable-hdpi/blank.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/blank.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/icon.png'
Binary files res/drawable-hdpi/icon.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/icon.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/live.png'
Binary files res/drawable-hdpi/live.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/live.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/next.png'
Binary files res/drawable-hdpi/next.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/next.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/openlp_logo.png'
Binary files res/drawable-hdpi/openlp_logo.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/openlp_logo.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/openlp_logo_android.png'
Binary files res/drawable-hdpi/openlp_logo_android.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/openlp_logo_android.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/openlp_splash_screen.png'
Binary files res/drawable-hdpi/openlp_splash_screen.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/openlp_splash_screen.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/preferences.png'
Binary files res/drawable-hdpi/preferences.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/preferences.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/previous.png'
Binary files res/drawable-hdpi/previous.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/previous.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/search.png'
Binary files res/drawable-hdpi/search.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/search.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/service.png'
Binary files res/drawable-hdpi/service.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/service.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-hdpi/stage.png'
Binary files res/drawable-hdpi/stage.png	1970-01-01 00:00:00 +0000 and res/drawable-hdpi/stage.png	2012-03-23 16:56:20 +0000 differ
=== added directory 'res/drawable-ldpi'
=== added file 'res/drawable-ldpi/alert.png'
Binary files res/drawable-ldpi/alert.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/alert.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-ldpi/blank.png'
Binary files res/drawable-ldpi/blank.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/blank.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-ldpi/icon.png'
Binary files res/drawable-ldpi/icon.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/icon.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-ldpi/live.png'
Binary files res/drawable-ldpi/live.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/live.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-ldpi/next.png'
Binary files res/drawable-ldpi/next.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/next.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-ldpi/openlp_logo.png'
Binary files res/drawable-ldpi/openlp_logo.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/openlp_logo.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-ldpi/preferences.png'
Binary files res/drawable-ldpi/preferences.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/preferences.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-ldpi/previous.png'
Binary files res/drawable-ldpi/previous.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/previous.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-ldpi/search.png'
Binary files res/drawable-ldpi/search.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/search.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-ldpi/service.png'
Binary files res/drawable-ldpi/service.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/service.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-ldpi/stage.png'
Binary files res/drawable-ldpi/stage.png	1970-01-01 00:00:00 +0000 and res/drawable-ldpi/stage.png	2012-03-23 16:56:20 +0000 differ
=== added directory 'res/drawable-mdpi'
=== added file 'res/drawable-mdpi/alert.png'
Binary files res/drawable-mdpi/alert.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/alert.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-mdpi/blank.png'
Binary files res/drawable-mdpi/blank.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/blank.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-mdpi/icon.png'
Binary files res/drawable-mdpi/icon.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/icon.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-mdpi/live.png'
Binary files res/drawable-mdpi/live.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/live.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-mdpi/next.png'
Binary files res/drawable-mdpi/next.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/next.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-mdpi/openlp_logo.png'
Binary files res/drawable-mdpi/openlp_logo.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/openlp_logo.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-mdpi/preferences.png'
Binary files res/drawable-mdpi/preferences.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/preferences.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-mdpi/previous.png'
Binary files res/drawable-mdpi/previous.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/previous.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-mdpi/search.png'
Binary files res/drawable-mdpi/search.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/search.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-mdpi/service.png'
Binary files res/drawable-mdpi/service.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/service.png	2012-03-23 16:56:20 +0000 differ
=== added file 'res/drawable-mdpi/stage.png'
Binary files res/drawable-mdpi/stage.png	1970-01-01 00:00:00 +0000 and res/drawable-mdpi/stage.png	2012-03-23 16:56:20 +0000 differ
=== added directory 'res/layout'
=== added file 'res/layout/alert.xml'
--- res/layout/alert.xml	1970-01-01 00:00:00 +0000
+++ res/layout/alert.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android";
+        android:orientation="vertical"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent">
+    <TextView
+            android:text="@string/alert"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textStyle="bold"
+            android:textSize="10pt"
+            />
+    <View style="@style/SlideServiceViewHorizontalRule"
+            />
+    <View style="@style/SlideServiceViewHorizontalRule"
+          android:background="@android:color/transparent"
+          android:layout_height="5dip"
+            />
+    <EditText
+            android:id="@+id/alert"
+            android:layout_height="wrap_content"
+            android:text=""
+            android:inputType="textShortMessage"
+            android:layout_width="fill_parent"
+            android:hint="@string/alertHint"/>
+    <Button
+            android:id="@+id/send"
+            android:text="@string/send"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"/>
+</LinearLayout>

=== added file 'res/layout/group_child.xml'
--- res/layout/group_child.xml	1970-01-01 00:00:00 +0000
+++ res/layout/group_child.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,14 @@
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android";
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+    <TextView
+            android:id="@+id/groupChildText"
+            android:layout_height="wrap_content"
+            android:layout_width="fill_parent"
+            android:paddingLeft="20dip"
+            android:gravity="center_vertical"
+            android:minLines="3"
+            />
+</LinearLayout>
\ No newline at end of file

=== added file 'res/layout/group_parent.xml'
--- res/layout/group_parent.xml	1970-01-01 00:00:00 +0000
+++ res/layout/group_parent.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+	android:layout_width="fill_parent" 
+	android:baselineAligned="false"
+	android:orientation="horizontal" 
+	android:layout_height="wrap_content">
+	<TextView android:id="@+id/groupParentText"
+		android:layout_height="wrap_content" 
+		android:paddingLeft="5dip"
+		android:minLines="3" 
+		android:focusable="false" 
+		android:gravity="center_vertical|right"
+		android:layout_width="fill_parent"
+		android:layout_weight="1" />
+	<TextView android:id="@+id/parentChildCount" 
+		android:width="40dip"
+		android:paddingRight="5dip" 
+		android:layout_width="fill_parent"
+		android:layout_weight="1" 
+		android:layout_height="wrap_content"
+		android:gravity="center_vertical|right" />
+</LinearLayout>
\ No newline at end of file

=== added file 'res/layout/main.xml'
--- res/layout/main.xml	1970-01-01 00:00:00 +0000
+++ res/layout/main.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TableLayout xmlns:android="http://schemas.android.com/apk/res/android";
+             android:layout_width="fill_parent"
+             android:layout_height="fill_parent"
+             android:gravity="fill"
+             android:orientation="horizontal"
+             android:layout_weight="0"
+        >
+    <TableRow
+            android:layout_weight="1"
+            android:layout_gravity="fill">
+        <ImageView
+                android:padding="20pt"
+                android:layout_span="2"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="fill"
+                android:layout_weight="1"
+                android:src="@drawable/openlp_splash_screen"
+                android:contentDescription="@string/contentDescription"
+                />
+
+    </TableRow>
+    <TableRow
+            android:layout_weight="0"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content">
+        <Button
+                android:id="@+id/buttonService"
+                android:text="@string/tabService"
+                style="@style/ButtonStyle"
+                android:drawableLeft="@drawable/service"
+                />
+        <Button
+                android:id="@+id/buttonLive"
+                android:text="@string/tabLive"
+                style="@style/ButtonStyle"
+                android:drawableLeft="@drawable/live"
+                />
+    </TableRow>
+    <TableRow
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content">
+        <Button
+                android:id="@+id/buttonDisplay"
+                android:text="@string/tabDisplay"
+                style="@style/ButtonStyle"
+                android:drawableLeft="@drawable/blank"
+                />
+        <Button
+                android:id="@+id/buttonStage"
+                android:text="@string/tabStage"
+                style="@style/ButtonStyle"
+                android:drawableLeft="@drawable/stage"
+                />
+    </TableRow>
+    <TableRow
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content">
+        <Button
+                android:id="@+id/buttonAlert"
+                android:text="@string/tabAlert"
+                style="@style/ButtonStyle"
+                android:drawableLeft="@drawable/alert"
+                />
+        <Button
+                android:id="@+id/buttonSearch"
+                android:text="@string/buttonSearchText"
+                style="@style/ButtonStyle"
+                android:drawableLeft="@drawable/search"
+                />
+    </TableRow>
+</TableLayout>

=== added file 'res/layout/misc.xml'
--- res/layout/misc.xml	1970-01-01 00:00:00 +0000
+++ res/layout/misc.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android";
+        android:orientation="vertical"
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent">
+    <TextView
+                android:text="@string/tabDisplay"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:textStyle="bold"
+                android:textSize="10pt"
+                />
+    <View style="@style/SlideServiceViewHorizontalRule"
+            />
+    <View style="@style/SlideServiceViewHorizontalRule"
+          android:background="@android:color/transparent"
+          android:layout_height="5dip"
+            />
+    <ToggleButton
+            android:id="@+id/toggleDisplayButton"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:textOn="@string/displayBlankOn"
+            android:textOff="@string/displayBlankOff"/>
+</LinearLayout>
+

=== added file 'res/layout/search.xml'
--- res/layout/search.xml	1970-01-01 00:00:00 +0000
+++ res/layout/search.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android";
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent"
+        android:orientation="vertical">-->
+    <TableLayout
+            xmlns:android="http://schemas.android.com/apk/res/android";
+            android:id="@+id/tableLayout1"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent">
+        <ExpandableListView
+                android:layout_weight="1"
+                android:layout_height="wrap_content"
+                android:id="@+id/list"
+                android:layout_width="wrap_content"
+                />
+    </TableLayout>
+<!--</LinearLayout>-->

=== added file 'res/layout/slide_list_item.xml'
--- res/layout/slide_list_item.xml	1970-01-01 00:00:00 +0000
+++ res/layout/slide_list_item.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android";
+        android:layout_width="fill_parent"
+        android:layout_height="fill_parent">
+    <TextView
+            android:id="@+id/rowItemMarker"
+            android:layout_width="wrap_content"
+            android:layout_height="fill_parent"
+            android:gravity="center"
+            android:textStyle="bold"
+            android:textColor="@color/white"
+            />
+    <TextView
+            android:id="@+id/rowItemText"
+            android:layout_width="wrap_content"
+            android:layout_height="fill_parent"
+            android:gravity="center_vertical"
+            android:minLines="2"
+            android:textSize="8pt"/>
+</LinearLayout>
\ No newline at end of file

=== added file 'res/layout/slide_service.xml'
--- res/layout/slide_service.xml	1970-01-01 00:00:00 +0000
+++ res/layout/slide_service.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TableLayout
+        xmlns:android="http://schemas.android.com/apk/res/android";
+        style="@style/SlideServiceTableLayout"
+        >
+    <TextView
+            android:id="@+id/slide_service_title"
+            style="@style/SlideServiceTextViewTitle"
+            />
+    <View
+            style="@style/SlideServiceViewHorizontalRule"
+            />
+    <ListView
+            android:id="@+id/list"
+            style="@style/SlideServiceListView"
+            />
+    <LinearLayout
+            style="@style/LinearLayoutBottomButtons"
+            >
+        <Button
+                android:id="@+id/prev"
+                android:text="@string/prev"
+                style="@style/ButtonStylePrevious"
+                />
+        <Button
+                android:id="@+id/next"
+                android:text="@string/next"
+                style="@style/ButtonStyleNext"
+                />
+    </LinearLayout>
+</TableLayout>

=== added file 'res/layout/stageview.xml'
--- res/layout/stageview.xml	1970-01-01 00:00:00 +0000
+++ res/layout/stageview.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android";
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:baselineAligned="false"
+    android:orientation="vertical" >
+    <WebView
+        android:id="@+id/stageview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</LinearLayout>
\ No newline at end of file

=== added directory 'res/menu'
=== added file 'res/menu/menu.xml'
--- res/menu/menu.xml	1970-01-01 00:00:00 +0000
+++ res/menu/menu.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android";>
+    <item android:enabled="true" android:titleCondensed="@string/settings" android:title="@string/settings"
+          android:id="@+id/preferences"/>
+	<item
+		android:id="@+id/menuSearch"
+		android:enabled="true"
+		android:title="Search"
+		android:titleCondensed="Search"/>
+</menu>

=== added directory 'res/values'
=== added directory 'res/values-af'
=== added file 'res/values-af/strings.xml'
--- res/values-af/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-af/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Instellings</string>
+  <string name="preferences">Voorkeure</string>
+  <string name="prev">Vorige</string>
+  <string name="next">Volgende</string>
+  <string name="blank">Blanko</string>
+  <string name="unblank">Vertoon</string>
+  <string name="tabAlert">Waarskuwing</string>
+  <string name="alert">Attent:</string>
+  <string name="alertHint">Vul attent boodskap in</string>
+  <string name="alertTextNull">Vul asseblief \'n boodskap in om te stuur.</string>
+  <string name="send">Stuur</string>
+  <string name="tabLive">Regstreeks</string>
+  <string name="tabStage">Verhoog</string>
+  <string name="tabDisplay">Vertoon</string>
+  <string name="tabService">Diens</string>
+  <string name="preferenceCategoryTitleServer">Bediener</string>
+  <string name="url">Bediener</string>
+  <string name="urlHint">Gasheer naam of IP</string>
+  <string name="port">Poort</string>
+  <string name="enableCustomTimeouts">Bekragtig Aangepasde Tyd-uitlope</string>
+  <string name="textSizeType">Teks Grootte Tipe</string>
+  <string name="textSizeSummary">Verander die Diens teks grootte</string>
+  <string name="displayType">Vertoning Blanko Tipe</string>
+  <string name="displayBlankType">Vertoning Blanko Tipe</string>
+  <string name="displayBlankSummary">Kies die gevraagde blanko tipe</string>
+  <string name="displayScreen">Skerm</string>
+  <string name="displayTheme">Tema</string>
+  <string name="displayDesktop">Hoofblad</string>
+  <string name="displayBlankOn">Herstel vertoon vorm</string>
+  <string name="displayBlankOff">Blanko skerm na</string>
+  <string name="customTimeoutsSummary">Tik om tyd-uitloop instellings te verander</string>
+  <string name="customTimeout">Aangepasde Tyd-uitlope</string>
+  <string name="socketTimeout">Sok Tyd-uitloop</string>
+  <string name="socketTimeoutSummary">Kies \'n waarde (millisekondes)</string>
+  <string name="connectionTimeout">Konneksie Tyd-uitloop</string>
+  <string name="connectionTimedout">Kenneksie tyd het uitgeloop</string>
+  <string name="connectionTimeoutSummary">Kies \'n waarde (millisekondes)</string>
+  <string name="unable">Nie in staat om blad te laai nie -</string>
+  <string name="connectionFailed">Konneksie veld</string>
+  <string name="jsonfail">JSON het misluk</string>
+  <string name="loading">Konnekteer...</string>
+  <string name="searching">Soek...</string>
+  <string name="loadingFailed">Fout - Laai het gevaal</string>
+  <string name="loadingServiceItems">Laai Diens Items...</string>
+  <string name="loadingSlideItems">Laai Skyfie Items...</string>
+  <string name="loadingStatusInfo">Laai Status Inligting...</string>
+  <string name="searchHint">Soek OpenLP</string>
+  <string name="searchResults">Soek Resultate</string>
+  <string name="showingResults">Vertoon Resultate vir \'%s\'</string>
+  <string name="contentDescription">Spat Skerm</string>
+  <string name="buttonSearchText">Soek</string>
+</resources>

=== added directory 'res/values-cs'
=== added file 'res/values-cs/strings.xml'
--- res/values-cs/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-cs/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Nastavení</string>
+  <string name="preferences">Nastavení</string>
+  <string name="prev">Předchozí</string>
+  <string name="next">Další</string>
+  <string name="blank">Prázdný</string>
+  <string name="unblank">Neprázdný</string>
+  <string name="tabAlert">Upozornění</string>
+  <string name="alert">Upozornění:</string>
+  <string name="alertHint">Zadat zprávu upozornění</string>
+  <string name="alertTextNull">Zadejte prosím zprávu k odeslání.</string>
+  <string name="send">Odeslat</string>
+  <string name="tabLive">Naživo</string>
+  <string name="tabStage">Pódium</string>
+  <string name="tabDisplay">Zobrazení</string>
+  <string name="tabService">Služba</string>
+  <string name="preferenceCategoryTitleServer">Server</string>
+  <string name="url">Server</string>
+  <string name="urlHint">Jméno počítače nebo IP</string>
+  <string name="port">Port</string>
+  <string name="enableCustomTimeouts">Zapnout uživatelský časový limit</string>
+  <string name="textSizeType">Typ velikosti textu</string>
+  <string name="textSizeSummary">Změnit velikost textu služby</string>
+  <string name="displayType">Zobrazit prázdný typ</string>
+  <string name="displayBlankType">Zobrazit prázdný typ</string>
+  <string name="displayBlankSummary">Vybrat požadovaný prázdný typ</string>
+  <string name="displayScreen">Obrazovka</string>
+  <string name="displayTheme">Motiv</string>
+  <string name="displayDesktop">Pracovní plocha</string>
+  <string name="displayBlankOn">Obnovit zobrazení z</string>
+  <string name="displayBlankOff">Prázdné zobrazení na</string>
+  <string name="customTimeoutsSummary">Ověřit změny nastavení časového limitu</string>
+  <string name="customTimeout">Uživatelský časový limit</string>
+  <string name="socketTimeout">Časový limit socketu</string>
+  <string name="socketTimeoutSummary">Vybrat hodnotu (milisekundy)</string>
+  <string name="connectionTimeout">Časový limit spojení</string>
+  <string name="connectionTimedout">Spojení vypršelo</string>
+  <string name="connectionTimeoutSummary">Vybrat hodnotu (milisekundy)</string>
+  <string name="unable">Není možno načíst stránku -</string>
+  <string name="connectionFailed">Připojení selhalo</string>
+  <string name="jsonfail">JSON selhal</string>
+  <string name="loading">Připojuji se...</string>
+  <string name="searching">Hledám...</string>
+  <string name="loadingFailed">Chyba - Načtení selhalo</string>
+  <string name="loadingServiceItems">Načítám položky služby...</string>
+  <string name="loadingSlideItems">Načítám položky snímku...</string>
+  <string name="loadingStatusInfo">Načítám stavové info...</string>
+  <string name="searchHint">Hledat OpenLP</string>
+  <string name="searchResults">Výsledky hledání</string>
+  <string name="showingResults">Zobrazuji výsledky pro \'%s\'</string>
+  <string name="contentDescription">Úvodní obrazovka</string>
+  <string name="buttonSearchText">Hledat</string>
+</resources>

=== added directory 'res/values-de'
=== added file 'res/values-de/strings.xml'
--- res/values-de/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-de/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Einstellungen</string>
+  <string name="preferences">Voreinstellungen</string>
+  <string name="prev">Zurück</string>
+  <string name="next">Vorwärts</string>
+  <string name="blank">Abdunkeln</string>
+  <string name="unblank">Aufhellen</string>
+  <string name="tabAlert">Hinweis</string>
+  <string name="alert">Hinweis:</string>
+  <string name="alertHint">Alarm eingeben</string>
+  <string name="alertTextNull">Bitte geben Sie eine Nachricht ein, welche gesendet werden soll.</string>
+  <string name="send">Senden</string>
+  <string name="tabLive">Live</string>
+  <string name="tabStage">Bühnenmonitor</string>
+  <string name="tabDisplay">Anzeige</string>
+  <string name="tabService">Ablauf</string>
+  <string name="preferenceCategoryTitleServer">Server</string>
+  <string name="url">Server</string>
+  <string name="urlHint">Hostname oder IP</string>
+  <string name="port">Port</string>
+  <string name="enableCustomTimeouts">Aktiviere eigene Time-outs</string>
+  <string name="textSizeType">Text Größe</string>
+  <string name="textSizeSummary">Ablauf Text Größe</string>
+  <string name="displayType">Zeige Verdunklungstyp an</string>
+  <string name="displayBlankType">Zeige Verdunklungstyp an</string>
+  <string name="displayBlankSummary">Wähle den erforderlichen Verdunklungstyp</string>
+  <string name="displayScreen">Bildschirm</string>
+  <string name="displayTheme">Design</string>
+  <string name="displayDesktop">Arbeitsfläche</string>
+  <string name="displayBlankOn">Live Bild von </string>
+  <string name="displayBlankOff">Live Bild zu</string>
+  <string name="customTimeoutsSummary">Aktiviere Timeouts</string>
+  <string name="customTimeout">Eigene Timeouts</string>
+  <string name="socketTimeout">Socket Timeout</string>
+  <string name="socketTimeoutSummary">Wähle einen Wert (in Millisekunden)</string>
+  <string name="connectionTimeout">Verbindungzeit überschritten</string>
+  <string name="connectionTimedout">Verbindungszeit abgelaufen</string>
+  <string name="connectionTimeoutSummary">Wähle einen Wert (in Millisekunden)</string>
+  <string name="unable">Seite kann nicht geladen werden -</string>
+  <string name="connectionFailed">Verbindungsfehler</string>
+  <string name="jsonfail">JSON fehlgeschlagen</string>
+  <string name="loading">Verbinde...</string>
+  <string name="searching">Suche...</string>
+  <string name="loadingFailed">Fehler - Laden fehlgeschlagen</string>
+  <string name="loadingServiceItems">Lade Ablauf Elemente...</string>
+  <string name="loadingSlideItems">Lade Folien Elemente...</string>
+  <string name="loadingStatusInfo">Lade Status Info...</string>
+  <string name="searchHint">Suche OpenLP</string>
+  <string name="searchResults">Such Ergebnisse</string>
+  <string name="showingResults">Zeige Ergebnisse für \'%s\'</string>
+  <string name="contentDescription">Startbildschirm</string>
+  <string name="buttonSearchText">Suche</string>
+</resources>

=== added directory 'res/values-el'
=== added file 'res/values-el/strings.xml'
--- res/values-el/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-el/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Ρυθμίσεις</string>
+  <string name="preferences">Προτιμήσεις</string>
+  <string name="prev">Προηγούμενο</string>
+  <string name="next">Επόμενο</string>
+  <string name="blank">Κενό</string>
+  <string name="unblank">Μη Κενό</string>
+  <string name="tabAlert">Alert</string>
+  <string name="alert">Ειδοποίηση:</string>
+  <string name="alertHint">Εισαγωγή μηνύματος ειδοποίησης</string>
+  <string name="alertTextNull">Παρακαλούμε εισάγετε ένα μήνυμα προς αποστολή.</string>
+  <string name="send">Send</string>
+  <string name="tabLive">Live</string>
+  <string name="tabStage">Stage</string>
+  <string name="tabDisplay">Display</string>
+  <string name="tabService">Service</string>
+  <string name="preferenceCategoryTitleServer">Server</string>
+  <string name="url">Server</string>
+  <string name="urlHint">Hostname ή διεύθυνση IP</string>
+  <string name="port">Θύρα</string>
+  <string name="enableCustomTimeouts">Ενεργοποίηση </string>
+  <string name="textSizeType">Text Size Type</string>
+  <string name="textSizeSummary">Change the Service text size</string>
+  <string name="displayType">Εμφάνιση Τύπου Κενής Σελίδας</string>
+  <string name="displayBlankType">Εμφάνιση Τύπου Κενής Σελίδας</string>
+  <string name="displayBlankSummary">Επιλέξτε τον απαιτούμενο τύπο κενής σελίδας </string>
+  <string name="displayScreen">Οθόνη</string>
+  <string name="displayTheme">Θέμα</string>
+  <string name="displayDesktop">Επιφάνεια Εργασίας</string>
+  <string name="displayBlankOn">Επαναφορά εμφάνισης από</string>
+  <string name="displayBlankOff">Εμφάνιση Κενής Σελίδας στο</string>
+  <string name="customTimeoutsSummary">Επιλέξτε για τροποποίηση των ρυθμίσεων λήξης</string>
+  <string name="customTimeout">Τροποποιημένη Λήξη</string>
+  <string name="socketTimeout">Λήξη Socket</string>
+  <string name="socketTimeoutSummary">Επιλέξτε μια τιμή (milliseconds)</string>
+  <string name="connectionTimeout">Λήξη Σύνδεσης</string>
+  <string name="connectionTimedout">Η σύνδεση έληξε</string>
+  <string name="connectionTimeoutSummary">Επιλέξτε μια τιμή (milliseconds)</string>
+  <string name="unable">Μη δυνατή φόρτωση σελίδας -</string>
+  <string name="connectionFailed">Connection failed</string>
+  <string name="jsonfail">JSON απέτυχε</string>
+  <string name="loading">Σύνδεση...</string>
+  <string name="searching">Αναζήτηση...</string>
+  <string name="loadingFailed">Error - Load Failed</string>
+  <string name="loadingServiceItems">Φόρτωση Αντικειμένων Λειτουργίας...</string>
+  <string name="loadingSlideItems">Φόρτωση Αντικειμένων Διαφανειών...</string>
+  <string name="loadingStatusInfo">Φόρτωση Πληροφοριών Κατάστασης...</string>
+  <string name="searchHint">Αναζήτηση OpenLP</string>
+  <string name="searchResults">Αποτελέσματα Αναζήτησης</string>
+  <string name="showingResults">Εμφάνιση Αποτελεσμάτων για \'%s\'</string>
+  <string name="contentDescription">Splash Screen</string>
+  <string name="buttonSearchText">Search</string>
+</resources>

=== added directory 'res/values-en-rGB'
=== added file 'res/values-en-rGB/strings.xml'
--- res/values-en-rGB/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-en-rGB/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Settings</string>
+  <string name="preferences">Preferences</string>
+  <string name="prev">Previous</string>
+  <string name="next">Next</string>
+  <string name="blank">Blank</string>
+  <string name="unblank">Unblank</string>
+  <string name="tabAlert">Alert</string>
+  <string name="alert">Alert:</string>
+  <string name="alertHint">Enter alert message</string>
+  <string name="alertTextNull">Please enter a message to send.</string>
+  <string name="send">Send</string>
+  <string name="tabLive">Live</string>
+  <string name="tabStage">Stage</string>
+  <string name="tabDisplay">Display</string>
+  <string name="tabService">Service</string>
+  <string name="preferenceCategoryTitleServer">Server</string>
+  <string name="url">Server</string>
+  <string name="urlHint">Hostname or IP</string>
+  <string name="port">Port</string>
+  <string name="enableCustomTimeouts">Enable Custom Timeouts</string>
+  <string name="textSizeType">Text Size Type</string>
+  <string name="textSizeSummary">Change the Service text size</string>
+  <string name="displayType">Display Blank Type</string>
+  <string name="displayBlankType">Display Blank Type</string>
+  <string name="displayBlankSummary">Select the required blank type</string>
+  <string name="displayScreen">Screen</string>
+  <string name="displayTheme">Theme</string>
+  <string name="displayDesktop">Desktop</string>
+  <string name="displayBlankOn">Reset display from</string>
+  <string name="displayBlankOff">Blank display to</string>
+  <string name="customTimeoutsSummary">Check to modify timeout settings</string>
+  <string name="customTimeout">Custom Timeout</string>
+  <string name="socketTimeout">Socket Timeout</string>
+  <string name="socketTimeoutSummary">Select a value (milliseconds)</string>
+  <string name="connectionTimeout">Connection Timeout</string>
+  <string name="connectionTimedout">Connection timed out</string>
+  <string name="connectionTimeoutSummary">Select a value (milliseconds)</string>
+  <string name="unable">Unable to load page -</string>
+  <string name="connectionFailed">Connection failed</string>
+  <string name="jsonfail">JSON failed</string>
+  <string name="loading">Connecting...</string>
+  <string name="searching">Searching...</string>
+  <string name="loadingFailed">Error - Load Failed</string>
+  <string name="loadingServiceItems">Loading Service Items...</string>
+  <string name="loadingSlideItems">Loading Slide Items...</string>
+  <string name="loadingStatusInfo">Loading Status Info...</string>
+  <string name="searchHint">Search OpenLP</string>
+  <string name="searchResults">Search Results</string>
+  <string name="showingResults">Showing Results for \'%s\'</string>
+  <string name="contentDescription">Splash Screen</string>
+  <string name="buttonSearchText">Search</string>
+</resources>

=== added directory 'res/values-en-rZA'
=== added file 'res/values-en-rZA/strings.xml'
--- res/values-en-rZA/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-en-rZA/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Settings</string>
+  <string name="preferences">Preferences</string>
+  <string name="prev">Previous</string>
+  <string name="next">Next</string>
+  <string name="blank">Blank</string>
+  <string name="unblank">Unblank</string>
+  <string name="tabAlert">Alert</string>
+  <string name="alert">Alert:</string>
+  <string name="alertHint">Enter alert message</string>
+  <string name="alertTextNull">Please enter a message to send.</string>
+  <string name="send">Send</string>
+  <string name="tabLive">Live</string>
+  <string name="tabStage">Stage</string>
+  <string name="tabDisplay">Display</string>
+  <string name="tabService">Service</string>
+  <string name="preferenceCategoryTitleServer">Server</string>
+  <string name="url">Server</string>
+  <string name="urlHint">Hostname or IP</string>
+  <string name="port">Port</string>
+  <string name="enableCustomTimeouts">Enable Custom Timeouts</string>
+  <string name="textSizeType">Text Size Type</string>
+  <string name="textSizeSummary">Change the Service text size</string>
+  <string name="displayType">Display Blank Type</string>
+  <string name="displayBlankType">Display Blank Type</string>
+  <string name="displayBlankSummary">Select the required blank type</string>
+  <string name="displayScreen">Screen</string>
+  <string name="displayTheme">Theme</string>
+  <string name="displayDesktop">Desktop</string>
+  <string name="displayBlankOn">Reset display from</string>
+  <string name="displayBlankOff">Blank display to</string>
+  <string name="customTimeoutsSummary">Check to modify timeout settings</string>
+  <string name="customTimeout">Custom Timeout</string>
+  <string name="socketTimeout">Socket Timeout</string>
+  <string name="socketTimeoutSummary">Select a value (milliseconds)</string>
+  <string name="connectionTimeout">Connection Timeout</string>
+  <string name="connectionTimedout">Connection timed out</string>
+  <string name="connectionTimeoutSummary">Select a value (milliseconds)</string>
+  <string name="unable">Unable to load page -</string>
+  <string name="connectionFailed">Connection failed</string>
+  <string name="jsonfail">JSON failed</string>
+  <string name="loading">Connecting...</string>
+  <string name="searching">Searching...</string>
+  <string name="loadingFailed">Error - Load Failed</string>
+  <string name="loadingServiceItems">Loading Service Items...</string>
+  <string name="loadingSlideItems">Loading Slide Items...</string>
+  <string name="loadingStatusInfo">Loading Status Info...</string>
+  <string name="searchHint">Search OpenLP</string>
+  <string name="searchResults">Search Results</string>
+  <string name="showingResults">Showing Results for \'%s\'</string>
+  <string name="contentDescription">Splash Screen</string>
+  <string name="buttonSearchText">Search</string>
+</resources>

=== added directory 'res/values-es'
=== added file 'res/values-es/strings.xml'
--- res/values-es/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-es/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Configuración</string>
+  <string name="preferences">Preferencias</string>
+  <string name="prev">Anterior</string>
+  <string name="next">Siguiente</string>
+  <string name="blank">En blanco</string>
+  <string name="unblank">Unblank</string>
+  <string name="tabAlert">Alerta</string>
+  <string name="alert">Alerta:</string>
+  <string name="alertHint">Escriba un mensaje de alerta</string>
+  <string name="alertTextNull">Por favor, introduzca un mensaje para enviar.</string>
+  <string name="send">Enviar</string>
+  <string name="tabLive">En vivo</string>
+  <string name="tabStage">Escenario</string>
+  <string name="tabDisplay">Pantalla</string>
+  <string name="tabService">Servicio</string>
+  <string name="preferenceCategoryTitleServer">Servidor</string>
+  <string name="url">Servidor</string>
+  <string name="urlHint">Nombre de host o IP</string>
+  <string name="port">Puerto</string>
+  <string name="enableCustomTimeouts">Permitir tiempos de espera personalizados</string>
+  <string name="textSizeType">Tamaño de Fuente</string>
+  <string name="textSizeSummary">Cambia el tamaño de texto del Servicio</string>
+  <string name="displayType">Tipo de pantalla en blanco</string>
+  <string name="displayBlankType">Tipo de pantalla en blanco</string>
+  <string name="displayBlankSummary">Seleccione el tipo de blanco que necesite</string>
+  <string name="displayScreen">Pantalla</string>
+  <string name="displayTheme">Tema</string>
+  <string name="displayDesktop">Escritorio</string>
+  <string name="displayBlankOn">Restablecer la pantalla desde</string>
+  <string name="displayBlankOff">Restablecer la pantalla hasta</string>
+  <string name="customTimeoutsSummary">Modificar la configuración de tiempo de espera</string>
+  <string name="customTimeout">Tiempo de espera personalizado</string>
+  <string name="socketTimeout">Tiempo de espera de Socket</string>
+  <string name="socketTimeoutSummary">Seleccione un valor (en milisegundos)</string>
+  <string name="connectionTimeout">Tiempo de espera de conexión</string>
+  <string name="connectionTimedout">Tiempo de la conexión agotado</string>
+  <string name="connectionTimeoutSummary">Seleccione un valor (en milisegundos)</string>
+  <string name="unable">No se puede cargar la página -</string>
+  <string name="connectionFailed">Conexión fallida</string>
+  <string name="jsonfail">Error en el formato</string>
+  <string name="loading">Conectando...</string>
+  <string name="searching">Buscando...</string>
+  <string name="loadingFailed">Error - Carga Fallida</string>
+  <string name="loadingServiceItems">Cargando elementos del Servicio...</string>
+  <string name="loadingSlideItems">Cargando elementos de Diapositiva...</string>
+  <string name="loadingStatusInfo">Cargando Información de Estado...</string>
+  <string name="searchHint">Buscar OpenLP</string>
+  <string name="searchResults">Resultados de búsqueda</string>
+  <string name="showingResults">Mostrando resultados para \'%s\'</string>
+  <string name="contentDescription">Pantalla de Bienvenida</string>
+  <string name="buttonSearchText">Buscar</string>
+</resources>

=== added directory 'res/values-et'
=== added file 'res/values-et/strings.xml'
--- res/values-et/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-et/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Sätted</string>
+  <string name="preferences">Eelistused</string>
+  <string name="prev">Eelmine</string>
+  <string name="next">Järgmine</string>
+  <string name="blank">Tühjenda</string>
+  <string name="unblank">Näita</string>
+  <string name="tabAlert">Teade</string>
+  <string name="alert">Teade:</string>
+  <string name="alertHint">Sisesta teade</string>
+  <string name="alertTextNull">Palun sisesta teade, mida saata.</string>
+  <string name="send">Saada</string>
+  <string name="tabLive">Ekraan</string>
+  <string name="tabStage">Lava</string>
+  <string name="tabDisplay">Kuva</string>
+  <string name="tabService">Teenistus</string>
+  <string name="preferenceCategoryTitleServer">Server</string>
+  <string name="url">Server</string>
+  <string name="urlHint">Hostinimi või IP</string>
+  <string name="port">Port</string>
+  <string name="enableCustomTimeouts">Kohandatud aegumisegade kasutamine</string>
+  <string name="textSizeType">Teksti suurus</string>
+  <string name="textSizeSummary">Vaikimisi teenistuse teksti suuruse muutmine</string>
+  <string name="displayType">Kuva tühjendamise liik</string>
+  <string name="displayBlankType">Kuva tühjendamise liik</string>
+  <string name="displayBlankSummary">Vali kuva tühjendamise liik</string>
+  <string name="displayScreen">Ekraan</string>
+  <string name="displayTheme">Kujundus</string>
+  <string name="displayDesktop">Töölaud</string>
+  <string name="displayBlankOn">Kuvavormi lähtestamine</string>
+  <string name="displayBlankOff">Kuva tühjendamisel kuvatakse</string>
+  <string name="customTimeoutsSummary">Märgi, et muuta aegumise sätteid</string>
+  <string name="customTimeout">Kohandatud aegumine</string>
+  <string name="socketTimeout">Pesa aegumine</string>
+  <string name="socketTimeoutSummary">Vali kestus (millisekundid)</string>
+  <string name="connectionTimeout">Ühenduse aegumine</string>
+  <string name="connectionTimedout">Ühendus aegus</string>
+  <string name="connectionTimeoutSummary">Vali kestus (millisekundid)</string>
+  <string name="unable">Lehe laadimine pole võimalik -</string>
+  <string name="connectionFailed">Ühendus nurjus</string>
+  <string name="jsonfail">JSON nurjus</string>
+  <string name="loading">Ühendumine...</string>
+  <string name="searching">Otsimine...</string>
+  <string name="loadingFailed">Viga - laadimine nurjus</string>
+  <string name="loadingServiceItems">Teenistuse elementide laadimine...</string>
+  <string name="loadingSlideItems">Slaidi elementide laadimine...</string>
+  <string name="loadingStatusInfo">Olekuinfo laadimine...</string>
+  <string name="searchHint">OpenLP otsing</string>
+  <string name="searchResults">Otsingu tulemused</string>
+  <string name="showingResults">Tulemused otsingule \'%s\' </string>
+  <string name="contentDescription">Käivitusekraan</string>
+  <string name="buttonSearchText">Otsi</string>
+</resources>

=== added directory 'res/values-fr'
=== added file 'res/values-fr/strings.xml'
--- res/values-fr/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-fr/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Paramètres</string>
+  <string name="preferences">Préférences</string>
+  <string name="prev">Précédent</string>
+  <string name="next">Suivant</string>
+  <string name="blank">Vide</string>
+  <string name="unblank">Restaure</string>
+  <string name="tabAlert">Alerte</string>
+  <string name="alert">Alerte :</string>
+  <string name="alertHint">Entrez le message d\'alerte</string>
+  <string name="alertTextNull">Veuillez entrer un message à envoyer.</string>
+  <string name="send">Send</string>
+  <string name="tabLive">Direct</string>
+  <string name="tabStage">Scène</string>
+  <string name="tabDisplay">Affichage</string>
+  <string name="tabService">Service</string>
+  <string name="preferenceCategoryTitleServer">Serveur</string>
+  <string name="url">Serveur</string>
+  <string name="urlHint">Nom d\'hôte ou IP</string>
+  <string name="port">Port</string>
+  <string name="enableCustomTimeouts">Activer le délai personnalisé</string>
+  <string name="textSizeType">Type de taille du texte</string>
+  <string name="textSizeSummary">Modifier la taille du texte du service</string>
+  <string name="displayType">Afficher un type vide</string>
+  <string name="displayBlankType">Afficher un type vide</string>
+  <string name="displayBlankSummary">Sélectionnez le type vide requis</string>
+  <string name="displayScreen">Écran</string>
+  <string name="displayTheme">Thème</string>
+  <string name="displayDesktop">Bureau</string>
+  <string name="displayBlankOn">Restaure l\'affichage à partir de</string>
+  <string name="displayBlankOff">Affichage vide vers</string>
+  <string name="customTimeoutsSummary">Vérifiez le paramétrage du délai</string>
+  <string name="customTimeout">Délai personnalisé</string>
+  <string name="socketTimeout">Délai de connexion réseau</string>
+  <string name="socketTimeoutSummary">Sélectionnez une valeur (millisecondes)</string>
+  <string name="connectionTimeout">Délai de connexion</string>
+  <string name="connectionTimedout">Connexion expirée</string>
+  <string name="connectionTimeoutSummary">Sélectionnez une valeur (millisecondes)</string>
+  <string name="unable">Impossible de charger la page -</string>
+  <string name="connectionFailed">Échec de connexion</string>
+  <string name="jsonfail">Erreur JSON</string>
+  <string name="loading">Connexion en cours...</string>
+  <string name="searching">Recherche en cours...</string>
+  <string name="loadingFailed">Erreur - Échec de chargement</string>
+  <string name="loadingServiceItems">Chargement des éléments du service...</string>
+  <string name="loadingSlideItems">Chargement des diapositives...</string>
+  <string name="loadingStatusInfo">Chargement des infos d\'état...</string>
+  <string name="searchHint">Recherche OpenLP</string>
+  <string name="searchResults">Résultats de recherche</string>
+  <string name="showingResults">Affichage des résultats de \'%s\'</string>
+  <string name="contentDescription">Splash Screen</string>
+  <string name="buttonSearchText">Search</string>
+</resources>

=== added directory 'res/values-hu'
=== added file 'res/values-hu/strings.xml'
--- res/values-hu/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-hu/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Beállítások</string>
+  <string name="preferences">Beállítások</string>
+  <string name="prev">Előző</string>
+  <string name="next">Következő</string>
+  <string name="blank">Elsötétítés</string>
+  <string name="unblank">Elsötétítés visszavonása</string>
+  <string name="tabAlert">Értesítés</string>
+  <string name="alert">Értesítés:</string>
+  <string name="alertHint">Értesítés megadása</string>
+  <string name="alertTextNull">Kérem, adj meg egy értesítő üzenetet.</string>
+  <string name="send">Küldés</string>
+  <string name="tabLive">Élő</string>
+  <string name="tabStage">Színpadi nézet</string>
+  <string name="tabDisplay">Megjelenítés</string>
+  <string name="tabService">Szolgálati sorrend</string>
+  <string name="preferenceCategoryTitleServer">Kiszolgáló</string>
+  <string name="url">Kiszolgáló</string>
+  <string name="urlHint">Gépnév vagy IP-cím</string>
+  <string name="port">Portszám</string>
+  <string name="enableCustomTimeouts">Egyéni időtúllépés engedélyezése</string>
+  <string name="textSizeType">Betűméret típusa</string>
+  <string name="textSizeSummary">Sorrend betűméretének módosítása</string>
+  <string name="displayType">Képernyő elsötétítési mód</string>
+  <string name="displayBlankType">Képernyő elsötétítési mód</string>
+  <string name="displayBlankSummary">Válaszd ki a kívánt elsötétítési módot</string>
+  <string name="displayScreen">Képernyő</string>
+  <string name="displayTheme">Téma</string>
+  <string name="displayDesktop">Asztalra</string>
+  <string name="displayBlankOn">Képernyő alaphelyzetbe állítása erről</string>
+  <string name="displayBlankOff">Képernyő elsötétítése erre</string>
+  <string name="customTimeoutsSummary">Jelöld be az időtúllépési beállítások módosításához</string>
+  <string name="customTimeout">Egyéni időtúllépés</string>
+  <string name="socketTimeout">Socket időtúllépés</string>
+  <string name="socketTimeoutSummary">Válassz egy értéket (milliszekundum)</string>
+  <string name="connectionTimeout">Kapcsolódási időtúllépés</string>
+  <string name="connectionTimedout">Időtúllépés miatt a kapcsolat megszakadt</string>
+  <string name="connectionTimeoutSummary">Válassz egy értéket (milliszekundum)</string>
+  <string name="unable">Az oldal nem tölthető be -</string>
+  <string name="connectionFailed">A kapcsolat megszakadt</string>
+  <string name="jsonfail">JSON feldolgozás sikertelen</string>
+  <string name="loading">Kapcsolódás…</string>
+  <string name="searching">Keresés…</string>
+  <string name="loadingFailed">Hiba - Betöltés sikertelen</string>
+  <string name="loadingServiceItems">Sorrend elemeinek betöltése…</string>
+  <string name="loadingSlideItems">Dia elemeinek betöltése…</string>
+  <string name="loadingStatusInfo">Állapotinformációk betöltése…</string>
+  <string name="searchHint">OpenLP keresés</string>
+  <string name="searchResults">Keresési eredmények</string>
+  <string name="showingResults">Keresési eredmények: %s </string>
+  <string name="contentDescription">Indítóképernyő</string>
+  <string name="buttonSearchText">Keresés</string>
+</resources>

=== added directory 'res/values-ja'
=== added file 'res/values-ja/strings.xml'
--- res/values-ja/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-ja/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">設定</string>
+  <string name="preferences">設定</string>
+  <string name="prev">前</string>
+  <string name="next">次</string>
+  <string name="blank">ブランク</string>
+  <string name="unblank">ブランクを戻す</string>
+  <string name="tabAlert">Alert</string>
+  <string name="alert">警告:</string>
+  <string name="alertHint">警告文を入力</string>
+  <string name="alertTextNull">警告するメッセージを入力してください。</string>
+  <string name="send">Send</string>
+  <string name="tabLive">Live</string>
+  <string name="tabStage">Stage</string>
+  <string name="tabDisplay">Display</string>
+  <string name="tabService">Service</string>
+  <string name="preferenceCategoryTitleServer">サーバ</string>
+  <string name="url">サーバ</string>
+  <string name="urlHint">ホスト名またはIPアドレス</string>
+  <string name="port">ポート</string>
+  <string name="enableCustomTimeouts">任意のタイムアウトを有効にする</string>
+  <string name="textSizeType">Text Size Type</string>
+  <string name="textSizeSummary">Change the Service text size</string>
+  <string name="displayType">ブランクの種類</string>
+  <string name="displayBlankType">ブランクの種類</string>
+  <string name="displayBlankSummary">ブランクの種類を選択してください</string>
+  <string name="displayScreen">スクリーン</string>
+  <string name="displayTheme">テーマ</string>
+  <string name="displayDesktop">デスクトップ</string>
+  <string name="displayBlankOn">Reset display from</string>
+  <string name="displayBlankOff">Blank display to</string>
+  <string name="customTimeoutsSummary">Check to modify timeout settings</string>
+  <string name="customTimeout">カスタムタイムアウト</string>
+  <string name="socketTimeout">ソケットタイムアウト</string>
+  <string name="socketTimeoutSummary">値を選択 (ミリ秒)</string>
+  <string name="connectionTimeout">接続タイムアウト</string>
+  <string name="connectionTimedout">接続がタイムアウトしました</string>
+  <string name="connectionTimeoutSummary">値を選択 (ミリ秒)</string>
+  <string name="unable">Unable to load page -</string>
+  <string name="connectionFailed">Connection failed</string>
+  <string name="jsonfail">JSONに失敗しました</string>
+  <string name="loading">接続中...</string>
+  <string name="searching">検索中...</string>
+  <string name="loadingFailed">Error - Load Failed</string>
+  <string name="loadingServiceItems">礼拝項目を読込中...</string>
+  <string name="loadingSlideItems">スライド項目を読込中...</string>
+  <string name="loadingStatusInfo">ステータス情報を読込中...</string>
+  <string name="searchHint">OpenLPを検索</string>
+  <string name="searchResults">検索結果</string>
+  <string name="showingResults">\'%s\'の結果を表示中</string>
+  <string name="contentDescription">Splash Screen</string>
+  <string name="buttonSearchText">Search</string>
+</resources>

=== added directory 'res/values-ko'
=== added directory 'res/values-nb'
=== added directory 'res/values-nl'
=== added file 'res/values-nl/strings.xml'
--- res/values-nl/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-nl/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Instellingen</string>
+  <string name="preferences">Voorkeuren</string>
+  <string name="prev">Vorige</string>
+  <string name="next">Volgende</string>
+  <string name="blank">Scherm-uit</string>
+  <string name="unblank">Scherm-uit Uit</string>
+  <string name="tabAlert">Waarschuwing</string>
+  <string name="alert">Waarschuwing:</string>
+  <string name="alertHint">Voer waarschuwingsbericht in</string>
+  <string name="alertTextNull">Voer een bericht in om te versturen.</string>
+  <string name="send">Verstuur</string>
+  <string name="tabLive">Live</string>
+  <string name="tabStage">Podium</string>
+  <string name="tabDisplay">Weergave</string>
+  <string name="tabService">Liturgie</string>
+  <string name="preferenceCategoryTitleServer">Server</string>
+  <string name="url">Server</string>
+  <string name="urlHint">Hostname of IP</string>
+  <string name="port">Poort</string>
+  <string name="enableCustomTimeouts"> Aangepaste timeouts toestaan</string>
+  <string name="textSizeType">Lettergrootte</string>
+  <string name="textSizeSummary">Verander Lettergrootte Liturgie</string>
+  <string name="displayType">Scherm-uit soort </string>
+  <string name="displayBlankType">Scherm-uit soort </string>
+  <string name="displayBlankSummary">Selecteer noodzakelijk Scherm-uit soort </string>
+  <string name="displayScreen">Scherm</string>
+  <string name="displayTheme">Thema</string>
+  <string name="displayDesktop">Desktop</string>
+  <string name="displayBlankOn">Weergave herstellen van</string>
+  <string name="displayBlankOff">Scherm-uit Weergave naar</string>
+  <string name="customTimeoutsSummary">Inschakelen om timeout instellingen aan te passen</string>
+  <string name="customTimeout">Aangepaste timeout</string>
+  <string name="socketTimeout">Socket Timeout</string>
+  <string name="socketTimeoutSummary">Selecteer een waarde (milliseconden)</string>
+  <string name="connectionTimeout">Verbinding Timeout</string>
+  <string name="connectionTimedout">Verbinding timed out</string>
+  <string name="connectionTimeoutSummary">Selecteer een waarde (milliseconden)</string>
+  <string name="unable">Kan de pagina niet laden -</string>
+  <string name="connectionFailed">Verbinding mislukt</string>
+  <string name="jsonfail">Bericht opmaakfout</string>
+  <string name="loading">Verbinden…</string>
+  <string name="searching">Zoeken…</string>
+  <string name="loadingFailed">Fout - laden mislukt</string>
+  <string name="loadingServiceItems">Liturgie items Laden…</string>
+  <string name="loadingSlideItems">Dia items Laden…</string>
+  <string name="loadingStatusInfo">Status info Laden…</string>
+  <string name="searchHint">Doorzoek OpenLP</string>
+  <string name="searchResults">Doorzoek resultaten</string>
+  <string name="showingResults">Resultaten voor  \'%s\'</string>
+  <string name="contentDescription">Opstartscherm</string>
+  <string name="buttonSearchText">Zoek</string>
+</resources>

=== added directory 'res/values-pt-rBR'
=== added file 'res/values-pt-rBR/strings.xml'
--- res/values-pt-rBR/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-pt-rBR/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Configurações</string>
+  <string name="preferences">Preferências</string>
+  <string name="prev">Anterior</string>
+  <string name="next">Próximo</string>
+  <string name="blank">Em Branco</string>
+  <string name="unblank">Vasio</string>
+  <string name="tabAlert">Alertar</string>
+  <string name="alert">Alerta:</string>
+  <string name="alertHint">Digite uma mensagem de alerta</string>
+  <string name="alertTextNull">Por favor digite uma mensagem para ser enviada.</string>
+  <string name="send">Enviar</string>
+  <string name="tabLive">Ao Vivo</string>
+  <string name="tabStage">Fase</string>
+  <string name="tabDisplay">Exibir</string>
+  <string name="tabService">Serviço</string>
+  <string name="preferenceCategoryTitleServer">Servidor</string>
+  <string name="url">Sservidor</string>
+  <string name="urlHint">Hostname ou IP</string>
+  <string name="port">Porta</string>
+  <string name="enableCustomTimeouts">Habilitar Timeouts personalizados</string>
+  <string name="textSizeType">Tipo do Tamanho de Texto</string>
+  <string name="textSizeSummary">Alterar o tamanho do texto de Serviço</string>
+  <string name="displayType">Mostar \'Tipo em Branco\'</string>
+  <string name="displayBlankType">Mostar \'Tipo em Branco\'</string>
+  <string name="displayBlankSummary">Selecione o \'Tipo em Branco\' requerido</string>
+  <string name="displayScreen">Tela</string>
+  <string name="displayTheme">Tema</string>
+  <string name="displayDesktop">Área de Trabalho</string>
+  <string name="displayBlankOn">Redefinir exibição de</string>
+  <string name="displayBlankOff">Tela em branco para</string>
+  <string name="customTimeoutsSummary">Verifique para modificar as configurações de tempo limite</string>
+  <string name="customTimeout">Timeout personalizado</string>
+  <string name="socketTimeout">Tempo limite do soquete</string>
+  <string name="socketTimeoutSummary">Selecione um valor (em milissegundos)</string>
+  <string name="connectionTimeout">Tempo limite de conexão</string>
+  <string name="connectionTimedout">Tempo esgotado para conexão</string>
+  <string name="connectionTimeoutSummary">Selecione um valor (em milissegundos)</string>
+  <string name="unable">Não foi possível carregar a página -</string>
+  <string name="connectionFailed">Falha na conexão</string>
+  <string name="jsonfail">Erro no formato da mensagem</string>
+  <string name="loading">Conectando...</string>
+  <string name="searching">Pesquisando ...</string>
+  <string name="loadingFailed">Erro - Falha ao Carregar</string>
+  <string name="loadingServiceItems">Carregar itens de serviço...</string>
+  <string name="loadingSlideItems">Carregar itens de slides...</string>
+  <string name="loadingStatusInfo">Carregando informação de estado...</string>
+  <string name="searchHint">Pesquisa OpenLP</string>
+  <string name="searchResults">Resultados da pesquisa</string>
+  <string name="showingResults">Mostrando Resultados para %s</string>
+  <string name="contentDescription">Tela de Abertura</string>
+  <string name="buttonSearchText">Busca</string>
+</resources>

=== added directory 'res/values-ru'
=== added directory 'res/values-sv'
=== added file 'res/values-sv/strings.xml'
--- res/values-sv/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values-sv/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+  <string name="app_name">OpenLP</string>
+  <string name="settings">Inställningar</string>
+  <string name="preferences">Alternativ</string>
+  <string name="prev">Föregående</string>
+  <string name="next">Nästa</string>
+  <string name="blank">Släck</string>
+  <string name="unblank">Tänd</string>
+  <string name="tabAlert">Meddelande</string>
+  <string name="alert">Meddelande:</string>
+  <string name="alertHint">Skriv ett meddelande</string>
+  <string name="alertTextNull">Skriv ett meddelande att skicka.</string>
+  <string name="send">Skicka</string>
+  <string name="tabLive">Live</string>
+  <string name="tabStage">Scen</string>
+  <string name="tabDisplay">Skärm</string>
+  <string name="tabService">Körschema</string>
+  <string name="preferenceCategoryTitleServer">Server</string>
+  <string name="url">Server</string>
+  <string name="urlHint">Värdnamn eller IP-adress</string>
+  <string name="port">Port</string>
+  <string name="enableCustomTimeouts">Aktivera anpassade timeouter</string>
+  <string name="textSizeType">Teckenstorlek</string>
+  <string name="textSizeSummary">Ändra körschemats teckenstorlek</string>
+  <string name="displayType">Skärmsläckningsmetod</string>
+  <string name="displayBlankType">Skärmsläckningsmetod</string>
+  <string name="displayBlankSummary">Välj metod för att släcka skärmen</string>
+  <string name="displayScreen">Svart</string>
+  <string name="displayTheme">Tema</string>
+  <string name="displayDesktop">Skrivbord</string>
+  <string name="displayBlankOn">Återställ skärmen från</string>
+  <string name="displayBlankOff">Släck skärmen till</string>
+  <string name="customTimeoutsSummary">Välj för att ändra timeoutinställningar</string>
+  <string name="customTimeout">Anpassad timeout</string>
+  <string name="socketTimeout">Socket-timeout</string>
+  <string name="socketTimeoutSummary">Välj ett värde (millisekunder)</string>
+  <string name="connectionTimeout">Anslutningstimeout</string>
+  <string name="connectionTimedout">Anslutningen tappades</string>
+  <string name="connectionTimeoutSummary">Välj ett värde (millisekunder)</string>
+  <string name="unable">Kan inte ladda sida -</string>
+  <string name="connectionFailed">Anslutning misslyckades</string>
+  <string name="jsonfail">Meddelandeformat-fel </string>
+  <string name="loading">Ansluter…</string>
+  <string name="searching">Söker…</string>
+  <string name="loadingFailed">Fel - Inläsning misslyckades</string>
+  <string name="loadingServiceItems">Läser in körschemaposter…</string>
+  <string name="loadingSlideItems">Läser in bildposter…</string>
+  <string name="loadingStatusInfo">Läser in statusinformation…</string>
+  <string name="searchHint">Sök i OpenLP</string>
+  <string name="searchResults">Sökresultat</string>
+  <string name="showingResults">Visar resultat för \'%s\'</string>
+  <string name="contentDescription">Uppstartsbild</string>
+  <string name="buttonSearchText">Sök</string>
+</resources>

=== added directory 'res/values-zh-rCN'
=== added file 'res/values/colors.xml'
--- res/values/colors.xml	1970-01-01 00:00:00 +0000
+++ res/values/colors.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,4 @@
+<resources>
+    <color name="lightGreen">#ff66ff33</color>
+    <color name="white">#ffffff00</color>
+</resources>
\ No newline at end of file

=== added file 'res/values/defaultValues.xml'
--- res/values/defaultValues.xml	1970-01-01 00:00:00 +0000
+++ res/values/defaultValues.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,11 @@
+<resources>
+    <!-- STRING -->
+    <string name="hostDefaultValue">192.168.1.1</string>
+    <string name="portDefaultValue">4316</string>
+    <string name="displayTypeValue">@string/displayScreen</string>
+
+    <!-- INTEGER -->
+    <integer name="socketTimeoutDefaultValue">3000</integer>
+    <integer name="connectionTimeoutDefaultValue">3000</integer>
+    <integer name="textSizeDefaultValue">14</integer>    
+</resources>
\ No newline at end of file

=== added file 'res/values/httpClientTimeoutValues.xml'
--- res/values/httpClientTimeoutValues.xml	1970-01-01 00:00:00 +0000
+++ res/values/httpClientTimeoutValues.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,16 @@
+<resources>
+    <string-array name="socketValueEntries">
+		<item>3000</item>
+		<item>4000</item>
+		<item>5000</item>
+		<item>8000</item>
+		<item>10000</item>
+	</string-array>
+	<string-array name="socketValues">
+		<item>3000</item>
+		<item>4000</item>
+		<item>5000</item>
+		<item>8000</item>
+		<item>10000</item>
+	</string-array>
+</resources>
\ No newline at end of file

=== added file 'res/values/keyStrings.xml'
--- res/values/keyStrings.xml	1970-01-01 00:00:00 +0000
+++ res/values/keyStrings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,10 @@
+<resources>
+    <string name="keyEnableCustomTimeout">enableCustomTimeout</string>
+    <string name="keyConnectionTimeout">connectionTimeout</string>
+    <string name="keyDisplayBlankType">blankType</string> 
+    <string name="keyTextSize">textSize</string> 
+    <string name="keySocketTimeout">socketTimeout</string>
+    <string name="keyHost">keyHost</string>
+    <string name="keyPort">keyPort</string>
+    <string name="keySharedPreferences">keySharedPreferences</string>
+</resources>
\ No newline at end of file

=== added file 'res/values/misc.xml'
--- res/values/misc.xml	1970-01-01 00:00:00 +0000
+++ res/values/misc.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,12 @@
+<resources>
+    <string-array name="displayTypeValueEntries">
+		<item>@string/displayScreen</item>
+		<item>@string/displayTheme</item>
+		<item>@string/displayDesktop</item>
+	</string-array>
+    <string-array name="displayTypeValues">
+		<item>@string/displayScreen</item>
+		<item>@string/displayTheme</item>
+		<item>@string/displayDesktop</item>
+	</string-array>	
+</resources>
\ No newline at end of file

=== added file 'res/values/strings.xml'
--- res/values/strings.xml	1970-01-01 00:00:00 +0000
+++ res/values/strings.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">OpenLP</string>
+    <string name="settings">Settings</string>
+	<string name="preferences">Preferences</string>
+    <string name="prev">Previous</string>
+    <string name="next">Next</string>
+    <string name="blank">Blank</string>
+    <string name="unblank">Unblank</string>
+    <string name="tabAlert">Alert</string>    
+    <string name="alert">Alert:</string>
+    <string name="alertHint">Enter alert message</string>
+    <string name="alertTextNull">Please enter a message to send.</string>
+    <string name="send">Send</string>
+    <string name="tabLive">Live</string>
+    <string name="tabStage">Stage</string> 
+    <string name="tabDisplay">Display</string>       
+    <string name="tabService">Service</string>
+    <string name="preferenceCategoryTitleServer">Server</string>
+    <string name="url">Server</string>
+    <string name="urlHint">Hostname or IP</string>
+    <string name="port">Port</string>
+    <string name="enableCustomTimeouts">Enable Custom Timeouts</string>
+    <string name="textSizeType">Text Size Type</string>  
+    <string name="textSizeSummary">Change the Service text size</string>
+    <string name="displayType">Display Blank Type</string>
+    <string name="displayBlankType">Display Blank Type</string>
+    <string name="displayBlankSummary">Select the required blank type</string>
+    <string name="displayScreen">Screen</string>
+    <string name="displayTheme">Theme</string>
+    <string name="displayDesktop">Desktop</string>
+    <string name="displayBlankOn">Reset display from</string>
+    <string name="displayBlankOff">Blank display to</string>
+    <string name="customTimeoutsSummary">Check to modify timeout settings</string>
+    <string name="customTimeout">Custom Timeout</string>
+    <string name="socketTimeout">Socket Timeout</string>
+    <string name="socketTimeoutSummary">Select a value (milliseconds)</string>
+    <string name="connectionTimeout">Connection Timeout</string>
+    <string name="connectionTimedout">Connection timed out</string>
+    <string name="connectionTimeoutSummary">Select a value (milliseconds)</string>
+    <string name="unable">Unable to load page -</string>
+    <string name="connectionFailed">Connection failed</string>
+    <string name="jsonfail">Message format error </string>
+    <string name="loading">Connecting…</string>
+    <string name="searching">Searching…</string>
+    <string name="loadingFailed">Error - Load Failed</string>    
+    <string name="loadingServiceItems">Loading Service Items…</string>
+    <string name="loadingSlideItems">Loading Slide Items…</string>
+    <string name="loadingStatusInfo">Loading Status Info…</string>
+	<string name="searchHint">Search OpenLP</string>
+    <string name="searchResults">Search Results</string>
+    <string name="showingResults">Showing Results for \'%s\'</string>
+    <string name="contentDescription">Splash Screen</string>
+    <string name="buttonSearchText">Search</string>
+</resources>

=== added file 'res/values/styles.xml'
--- res/values/styles.xml	1970-01-01 00:00:00 +0000
+++ res/values/styles.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,47 @@
+<resources>
+    <style name="OpenLPStyle" parent="android:Theme.Black.NoTitleBar.Fullscreen">
+        <item name="android:windowBackground">@drawable/openlp_logo_android</item>
+        <item name="android:backgroundDimEnabled">false</item>
+    </style>
+
+    <style name="ButtonStyle" parent="android:TextAppearance.Widget.Button">
+        <item name="android:layout_width">fill_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:gravity">center</item>
+        <item name="android:layout_weight">1</item>
+    </style>
+    <style name="ButtonStylePrevious" parent="ButtonStyle">
+        <item name="android:drawableLeft">@drawable/previous</item>
+    </style>
+    <style name="ButtonStyleNext" parent="ButtonStyle">
+        <item name="android:drawableRight">@drawable/next</item>
+    </style>
+    <style name="SlideServiceListView" parent="android:Widget.ListView">
+        <item name="android:layout_gravity">top</item>
+        <item name="android:layout_weight">1</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_width">fill_parent</item>
+    </style>
+    <style name="SlideServiceTableLayout">
+        <item name="android:layout_gravity">fill</item>
+        <item name="android:layout_width">fill_parent</item>
+        <item name="android:layout_height">fill_parent</item>
+    </style>
+    <style name="SlideServiceTextViewTitle">
+        <item name="android:textStyle">bold</item>
+        <item name="android:textSize">10pt</item>
+        <item name="android:paddingBottom">5dip</item>
+    </style>
+    <style name="LinearLayoutBottomButtons">
+        <item name="android:baselineAligned">false</item>
+        <item name="android:layout_gravity">fill</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_width">fill_parent</item>
+        <item name="android:layout_weight">0</item>
+    </style>
+    <style name="SlideServiceViewHorizontalRule" parent="android:TextAppearance.Widget.TextView">
+        <item name="android:background">@android:color/background_light</item>
+        <item name="android:layout_height">2dip</item>
+        <item name="android:layout_width">fill_parent</item>
+    </style>
+</resources>

=== added file 'res/values/textSize.xml'
--- res/values/textSize.xml	1970-01-01 00:00:00 +0000
+++ res/values/textSize.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,22 @@
+<resources>
+    <string-array name="textSizeValueEntries">
+		<item>6</item>
+		<item>8</item>
+		<item>10</item>
+		<item>12</item>
+		<item>14</item>
+		<item>16</item>
+		<item>18</item>
+		<item>20</item>		
+	</string-array>
+    <string-array name="textSizeValues">
+		<item>6</item>
+		<item>8</item>
+		<item>10</item>
+		<item>12</item>
+		<item>14</item>
+		<item>16</item>
+		<item>18</item>
+		<item>20</item>		
+	</string-array>	
+</resources>
\ No newline at end of file

=== added directory 'res/xml'
=== added file 'res/xml/preferences.xml'
--- res/xml/preferences.xml	1970-01-01 00:00:00 +0000
+++ res/xml/preferences.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<PreferenceScreen
+        xmlns:android="http://schemas.android.com/apk/res/android";>
+    <PreferenceCategory
+            android:title="@string/textSizeType">
+        <ListPreference
+                android:title="@string/textSizeType"
+                android:key="@string/keyTextSize"
+                android:summary="@string/textSizeSummary"
+                android:entries="@array/textSizeValueEntries"
+                android:entryValues="@array/textSizeValues"
+                android:defaultValue="@integer/textSizeDefaultValue"/>  
+    </PreferenceCategory>
+    <PreferenceCategory
+            android:title="@string/displayType">
+        <ListPreference
+                android:title="@string/displayBlankType"
+                android:key="@string/keyDisplayBlankType"
+                android:summary="@string/displayBlankSummary"
+                android:entries="@array/displayTypeValueEntries"
+                android:entryValues="@array/displayTypeValues"
+                android:defaultValue="@string/displayTypeValue"/>  
+    </PreferenceCategory>
+    <PreferenceCategory
+            android:title="@string/preferenceCategoryTitleServer">
+        <EditTextPreference
+                android:title="@string/url"
+                android:key="@string/keyHost"
+                android:hint="@string/urlHint"
+                android:inputType="textUri"
+                android:name="@string/url"/>
+        <EditTextPreference
+                android:defaultValue="@string/portDefaultValue"
+                android:title="@string/port"
+                android:key="@string/keyPort"
+                android:name="@string/url"
+                android:inputType="number"/>
+    </PreferenceCategory>
+    <PreferenceCategory
+            android:title="@string/customTimeout">
+        <CheckBoxPreference
+                android:title="@string/enableCustomTimeouts"
+                android:key="@string/keyEnableCustomTimeout"
+                android:summary="@string/customTimeoutsSummary"/>
+        <ListPreference
+                android:title="@string/connectionTimeout"
+                android:key="@string/keyConnectionTimeout"
+                android:summary="@string/connectionTimeoutSummary"
+                android:dependency="@string/keyEnableCustomTimeout"
+                android:entries="@array/socketValueEntries"
+                android:entryValues="@array/socketValues"
+                android:defaultValue="@integer/connectionTimeoutDefaultValue"/>
+        <ListPreference
+                android:title="@string/socketTimeout"
+                android:key="@string/keySocketTimeout"
+                android:summary="@string/socketTimeoutSummary"
+                android:dependency="@string/keyEnableCustomTimeout"
+                android:entries="@array/socketValueEntries"
+                android:entryValues="@array/socketValues"
+                android:defaultValue="@integer/socketTimeoutDefaultValue"/>
+    </PreferenceCategory>
+</PreferenceScreen>

=== added file 'res/xml/searchable.xml'
--- res/xml/searchable.xml	1970-01-01 00:00:00 +0000
+++ res/xml/searchable.xml	2012-03-23 16:56:20 +0000
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<searchable
+		xmlns:android="http://schemas.android.com/apk/res/android";
+		android:label="@string/app_name"
+		android:hint="@string/searchHint"
+		>
+	
+</searchable>
\ No newline at end of file

=== added directory 'src'
=== added directory 'src/org'
=== added directory 'src/org/openlp'
=== added directory 'src/org/openlp/android'
=== added file 'src/org/openlp/android/OpenLP.java'
--- src/org/openlp/android/OpenLP.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/OpenLP.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,122 @@
+/******************************************************************************
+ * 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;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import org.openlp.android.activity.Alert;
+import org.openlp.android.activity.DefaultActivity;
+import org.openlp.android.activity.Misc;
+import org.openlp.android.activity.Preferences;
+import org.openlp.android.activity.Service;
+import org.openlp.android.activity.Slide;
+import org.openlp.android.activity.StageView;
+
+/**
+ * OpenLP-Android initialisation point.
+ */
+public class OpenLP extends DefaultActivity {
+
+	/**
+	 * Called when the activity is first created.
+	 */
+	@Override
+	public void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.main);
+
+		if (getSharedPreferences(getString(R.string.keySharedPreferences),
+			Context.MODE_PRIVATE).getString(getString(R.string.keyHost),
+			"NONE").equals("NONE")
+			|| getSharedPreferences(
+			getString(R.string.keySharedPreferences),
+			Context.MODE_PRIVATE).getString(
+			getString(R.string.keyHost), null).equals(null)) {
+			Log.d(LOG_TAG,
+				"URL preference not set. Starting preference activity...");
+			Intent preferenceIntent = new Intent(this, Preferences.class);
+			startActivity(preferenceIntent);
+		}
+
+		findViewById(R.id.buttonService)
+			.setOnClickListener(onClickListenerService);
+		findViewById(R.id.buttonLive).setOnClickListener(onClickListenerLive);
+		findViewById(R.id.buttonDisplay)
+			.setOnClickListener(onClickListenerDisplay);
+		findViewById(R.id.buttonAlert).setOnClickListener(onClickListenerAlert);
+		findViewById(R.id.buttonStage).setOnClickListener(onClickListenerStage);
+		findViewById(R.id.buttonSearch)
+			.setOnClickListener(onClickListenerSearch);
+	}
+
+	private View.OnClickListener onClickListenerService =
+		new View.OnClickListener() {
+			@Override
+			public void onClick(View view) {
+				startActivity(new Intent(OpenLP.this, Service.class));
+			}
+		};
+
+	private View.OnClickListener onClickListenerLive =
+		new View.OnClickListener() {
+			@Override
+			public void onClick(View view) {
+				startActivity(new Intent(OpenLP.this, Slide.class));
+			}
+		};
+
+	private View.OnClickListener onClickListenerDisplay =
+		new View.OnClickListener() {
+			@Override
+			public void onClick(View view) {
+				startActivity(new Intent(OpenLP.this, Misc.class));
+			}
+		};
+
+	private View.OnClickListener onClickListenerAlert =
+		new View.OnClickListener() {
+			@Override
+			public void onClick(View view) {
+				startActivity(new Intent(OpenLP.this, Alert.class));
+			}
+		};
+
+	private View.OnClickListener onClickListenerStage =
+		new View.OnClickListener() {
+			@Override
+			public void onClick(View view) {
+				startActivity(new Intent(OpenLP.this, StageView.class));
+			}
+		};
+
+	private View.OnClickListener onClickListenerSearch =
+		new View.OnClickListener() {
+			@Override
+			public void onClick(View view) {
+				onSearchRequested();
+			}
+		};
+
+	private final String LOG_TAG = OpenLP.class.getName();
+}

=== added directory 'src/org/openlp/android/activity'
=== added file 'src/org/openlp/android/activity/Alert.java'
--- src/org/openlp/android/activity/Alert.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/Alert.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,90 @@
+/******************************************************************************
+ * 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 java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+import org.openlp.android.R;
+import org.openlp.android.utility.JSONHandler;
+import org.openlp.android.utility.WebCallAsyncTask;
+
+public class Alert extends DefaultActivity {
+	private final Context context = this;
+
+	@Override
+	public void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+
+		Log.i(LOG_TAG, "onCreate");
+		setContentView(R.layout.alert);
+
+		findViewById(R.id.send).setOnClickListener(mSend);
+	}
+
+	public Button.OnClickListener mSend = new Button.OnClickListener() {
+		@Override
+		public void onClick(View v) {
+			EditText edittext = (EditText) findViewById(R.id.alert);
+			String alert;
+			try {
+				if (edittext.getText().toString().trim().length() > 0) {
+					try {
+						alert = JSONHandler.createRequestJSON("text", 
+							URLEncoder.encode(edittext
+							.getText().toString(), "utf-8"));
+						new WebCallAsyncTask(context, ALERT).execute(alert);						
+					}
+					catch (UnsupportedEncodingException e) {
+						Toast.makeText(context, R.string.jsonfail,
+								Toast.LENGTH_LONG).show();
+						Log.e(LOG_TAG, e.toString());
+					}
+				}
+				else {
+					Toast.makeText(getBaseContext(),
+						getString(R.string.alertTextNull),
+						Toast.LENGTH_SHORT).show();
+				}
+			}
+			catch (JSONHandler.JSONHandlerException e) {
+				Toast.makeText(context, R.string.jsonfail,
+					Toast.LENGTH_LONG).show();
+				Log.e(LOG_TAG, e.toString());
+			}
+		}
+	};
+
+	@Override
+	protected void onResume() {
+		super.onResume();
+		Log.d(LOG_TAG, "Resume");
+	}
+
+	private final String LOG_TAG = Alert.class.getName();
+}

=== added file 'src/org/openlp/android/activity/DefaultActivity.java'
--- src/org/openlp/android/activity/DefaultActivity.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/DefaultActivity.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,54 @@
+/******************************************************************************
+ * 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.app.Activity;
+import android.content.Intent;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import org.openlp.android.R;
+import org.openlp.android.api.Api;
+
+
+public abstract class DefaultActivity extends Activity implements Api {
+	@Override
+	public boolean onCreateOptionsMenu(Menu menu) {
+		MenuInflater inflater = getMenuInflater();
+		inflater.inflate(R.menu.menu, menu);
+		return true;
+	}
+
+	@Override
+	public boolean onOptionsItemSelected(MenuItem item) {
+		// Handle item selection
+		switch (item.getItemId()) {
+			case R.id.preferences:
+				startActivity(new Intent(this, Preferences.class));
+				return true;
+			case R.id.menuSearch:
+				onSearchRequested();
+				return true;
+			default:
+				return super.onOptionsItemSelected(item);
+		}
+	}
+}

=== added file 'src/org/openlp/android/activity/Misc.java'
--- src/org/openlp/android/activity/Misc.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/Misc.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,259 @@
+/******************************************************************************
+ * 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.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Toast;
+import android.widget.ToggleButton;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.openlp.android.R;
+import org.openlp.android.data.Poll;
+import org.openlp.android.utility.JSONHandler;
+import org.openlp.android.utility.OpenLPHttpClient;
+import org.openlp.android.utility.WebCallAsyncTask;
+
+import java.util.Arrays;
+
+public class Misc extends DefaultActivity {
+	private final Context context = this;
+	Misc misc = this;
+	SharedPreferences prefs;
+	String displayType;
+
+	@Override
+	public void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+
+		Log.i(LOG_TAG, "onCreate");
+		setContentView(R.layout.misc);
+
+		prefs = getApplicationContext().getSharedPreferences(
+			getApplicationContext()
+				.getString(R.string.keySharedPreferences),
+			Context.MODE_PRIVATE);
+		Log.d(LOG_TAG, prefs.getAll().toString());
+		displayType = prefs
+			.getString(
+				getApplicationContext().getString(
+					R.string.keyDisplayBlankType),
+				getApplicationContext().getString(
+					R.string.displayTypeValue));
+		Log.d(LOG_TAG, "Pref Display Type = " + displayType);
+
+		final ToggleButton toggleButton =
+			(ToggleButton) findViewById(R.id.toggleDisplayButton);
+
+		toggleButton.setOnClickListener(new View.OnClickListener() {
+			@Override
+			public void onClick(View view) {
+				try {
+					if (!toggleButton.isChecked()) {
+						new WebCallAsyncTask(context).execute(DISPLAY_SHOW);
+					}
+					else {
+						Log.d(LOG_TAG, "onCLick Display Type = " + displayType);
+						if (displayType
+							.equals(getString(R.string.displayScreen))) {
+							Log.d(LOG_TAG, "Blank matched");
+							new WebCallAsyncTask(context)
+								.execute(DISPLAY_HIDE_SCREEN);
+						}
+						else if (displayType
+							.equals(getString(R.string.displayTheme))) {
+							Log.d(LOG_TAG, "Theme matched");
+							new WebCallAsyncTask(context)
+								.execute(DISPLAY_HIDE_THEME);
+						}
+						else {
+							Log.d(LOG_TAG, "Desktop matched");
+							new WebCallAsyncTask(context)
+								.execute(DISPLAY_HIDE_DESKTOP);
+						}
+					}
+				}
+				catch (Exception e) {
+					Toast.makeText(context, R.string.loadingFailed,
+						Toast.LENGTH_LONG).show();
+					Log.e(LOG_TAG, e.toString());
+				}
+				try {
+					Thread.sleep(500);
+				}
+				catch (InterruptedException e) {
+					e.printStackTrace();
+				}
+				PollStatusTask poll = new PollStatusTask(misc);
+				poll.execute(POLL_STATUS);
+			}
+		});
+	}
+
+	@Override
+	protected void onResume() {
+		super.onResume();
+		Log.d(LOG_TAG, "Resume");
+		new PollStatusTask(this).execute(POLL_STATUS);
+	}
+
+	/**
+	 * Asynchronous task to Poll the status data.
+	 */
+	class PollStatusTask extends AsyncTask<String, Void, Poll> {
+		Misc miscActivity;
+		ProgressDialog progressDialog;
+		String error;
+
+		PollStatusTask(Misc miscActivity) {
+			this.miscActivity = miscActivity;
+		}
+
+		@Override
+		protected void onPreExecute() {
+			super.onPreExecute();
+			progressDialog = ProgressDialog.show(Misc.this,
+				getString(R.string.loading),
+				getString(R.string.loadingStatusInfo));
+		}
+
+		@Override
+		protected Poll doInBackground(String... strings) {
+			OpenLPHttpClient httpClient = new OpenLPHttpClient(
+				getApplicationContext());
+			HttpResponse response = null;
+			error = "";
+
+			Log.d(LOG_TAG, "Processing:" + Arrays.asList(strings));
+			try {
+				httpClient.setUrl(strings[0]);
+				if (httpClient.getUrl().getHost().trim().length() <= 0) {
+					startActivity(new Intent(miscActivity, Preferences.class));
+				}
+				else {
+					response = httpClient.execute();
+				}
+
+				if (response != null
+					&& response.getStatusLine().getStatusCode() == 200) {
+					HttpEntity entity = response.getEntity();
+
+					if (entity != null) {
+						Poll poll = JSONHandler.parsePollResponseJSON(entity);
+						Log.i(LOG_TAG,
+							String.format("Service Items: %s", poll));
+						return poll;
+					}
+				}
+				else {
+					error = String.format("%s %s",
+						getString(R.string.unable), response);
+				}
+			}
+			catch (Exception e) {
+				error = String.format("%s: %s", e.getClass()
+					.getSimpleName(), e.getMessage());
+			}
+			return null;
+		}
+
+		@Override
+		protected void onPostExecute(Poll poll) {
+			super.onPostExecute(poll);
+			final ToggleButton toggleButton = (ToggleButton)
+				findViewById(R.id.toggleDisplayButton);
+			if (poll == null) {
+				toggleButton.setEnabled(false);
+			}
+			else {
+				String onText = "";
+				String offText = "";
+
+				displayType = prefs.getString(
+					getApplicationContext().getString(
+						R.string.keyDisplayBlankType),
+					getApplicationContext().getString(
+						R.string.displayTypeValue));
+				Log.d(LOG_TAG, "onPostExecute Display Type = " + displayType
+					+ " " + poll.isDisplayHidden());
+				/*
+				Set display blanking to the preferences value
+				*/
+				if (displayType.equals(getString(R.string.displayScreen))) {
+					Log.d(LOG_TAG, "Blank called");
+					onText = context.getString(R.string.displayScreen);
+					offText = context.getString(R.string.displayScreen);
+				}
+				else if (displayType.equals(getString(R.string.displayTheme))) {
+					Log.d(LOG_TAG, "Theme called");
+					onText = context.getString(R.string.displayTheme);
+					offText = context.getString(R.string.displayTheme);
+				}
+				else {
+					Log.d(LOG_TAG, "Desktop called");
+					onText = context.getString(R.string.displayDesktop);
+					offText = context.getString(R.string.displayDesktop);
+				}
+				/*
+				Set display blanked to the off value to that of the screen
+				*/
+				if (poll.isDisplayHidden()) {
+					if (poll.isBlankedDisplayed()) {
+						Log.d(LOG_TAG, "Hidden Blank called");
+						onText = context.getString(R.string.displayScreen);
+					}
+					else if (poll.isThemeDisplayed()) {
+						Log.d(LOG_TAG, "Hidden Theme called");
+						onText = context.getString(R.string.displayTheme);
+					}
+					else {
+						Log.d(LOG_TAG, "Hidden Desktop called");
+						onText = context.getString(R.string.displayDesktop);
+					}
+				}
+				toggleButton.setTextOn(context
+					.getString(R.string.displayBlankOn) + " " + onText);
+				toggleButton.setTextOff(context
+					.getString(R.string.displayBlankOff) + " " + offText);
+				toggleButton.setEnabled(true);
+				toggleButton.setChecked(false);
+				if (poll.isDisplayHidden()) {
+					toggleButton.setChecked(true);
+				}
+			}
+			progressDialog.dismiss();
+
+			if (error != null && error.trim().length() > 0) {
+				Toast.makeText(context, R.string.connectionFailed,
+					Toast.LENGTH_LONG).show();
+				Toast.makeText(context, error, Toast.LENGTH_LONG).show();
+			}
+		}
+	}
+
+	private final String LOG_TAG = Misc.class.getName();
+}

=== added file 'src/org/openlp/android/activity/OpenLPNavigate.java'
--- src/org/openlp/android/activity/OpenLPNavigate.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/OpenLPNavigate.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,45 @@
+/******************************************************************************
+ * 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;
+
+/**
+ * Interface shared by {@link Service} and {@link Slide} to navigate and set data.
+ */
+public interface OpenLPNavigate {
+	/**
+	 * Call to the service changing service/slides.
+	 *
+	 * @param direction A direction constant from {@link org.openlp.android.api.Api}.
+	 *                  Eg.: {@link org.openlp.android.api.Api#LIVE_NEXT}
+	 *                  or {@link org.openlp.android.api.Api#SERVICE_NEXT}.
+	 */
+	void navigate(String direction);
+
+	/**
+	 * Call to the service changing data for Service or Live
+	 *
+	 * @param apiPart An {@link org.openlp.android.api.Api} part for which to set data.
+	 *                Eg.: {@link org.openlp.android.api.Api#LIVE_SET}
+	 *                or {@link org.openlp.android.api.Api#SERVICE_SET}
+	 * @param id      Id of the item selected.
+	 */
+	void setData(String apiPart, int id);
+}

=== added file 'src/org/openlp/android/activity/Preferences.java'
--- src/org/openlp/android/activity/Preferences.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/Preferences.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,43 @@
+/******************************************************************************
+ * 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.os.Bundle;
+import android.preference.PreferenceActivity;
+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");
+		getPreferenceManager().setSharedPreferencesName(
+			getString(R.string.keySharedPreferences));
+		addPreferencesFromResource(R.xml.preferences);
+	}
+
+	private final String LOG_TAG = Preferences.class.getName();
+}

=== added file 'src/org/openlp/android/activity/SearchableActivity.java'
--- src/org/openlp/android/activity/SearchableActivity.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/SearchableActivity.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,277 @@
+/******************************************************************************
+ * 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.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.ProgressDialog;
+import android.app.SearchManager;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.ExpandableListView;
+import android.widget.Toast;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.openlp.android.R;
+import org.openlp.android.api.Api;
+import org.openlp.android.utility.GroupExpandableListAdapter;
+import org.openlp.android.utility.JSONHandler;
+import org.openlp.android.utility.WebCallAsyncTask;
+import org.openlp.android.utility.WebCallReturningAsyncTask;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SearchableActivity extends Activity implements Api {
+	private Activity context;
+	private ExpandableListView listView;
+	private final int DIALOG_ITEM_OPTIONS = 0;
+	private Object dialogKey;
+	private JSONArray dialogValue;
+
+	@Override
+	protected void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		setContentView(R.layout.search);
+		context = this;
+		listView = (ExpandableListView) findViewById(R.id.list);
+
+		listView.setOnChildClickListener(
+			new ExpandableListView.OnChildClickListener() {
+				@SuppressWarnings({"unchecked"})
+				@Override
+				public boolean onChildClick(
+					ExpandableListView expandableListView,
+					View view, int parent, int childPosition, long l) {
+					Map<String, JSONArray> child =
+						(Map<String, JSONArray>) listView
+							.getExpandableListAdapter()
+							.getChild(parent,
+								childPosition);
+					dialogKey = null;
+					dialogValue = null;
+					dialogKey = listView.getExpandableListAdapter()
+						.getGroup(parent);
+					dialogValue = child.get(dialogKey.toString());
+					showDialog(DIALOG_ITEM_OPTIONS);
+					return false;
+				}
+			});
+
+		Intent intent = getIntent();
+		if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
+			String query = ""; 
+			try {
+				query = URLEncoder.encode(intent.getStringExtra(SearchManager.QUERY), "utf-8");
+			}
+			catch (UnsupportedEncodingException e) {
+				Toast.makeText(context, R.string.jsonfail,
+						Toast.LENGTH_LONG).show();
+				Log.e(LOG_TAG, e.toString());
+			}
+			doSearch(query);
+		}
+	}
+
+	@Override
+	protected Dialog onCreateDialog(int id) {
+		switch (id) {
+			case DIALOG_ITEM_OPTIONS:
+				AlertDialog.Builder dialogBuilder =
+					new AlertDialog.Builder(context);
+				dialogBuilder.setTitle("Item Options:");
+				dialogBuilder.setNegativeButton("Send Live",
+					new DialogInterface.OnClickListener() {
+						@Override
+						public void onClick(DialogInterface dialogInterface,
+							int i) {
+							try {
+								new WebCallAsyncTask(context, String.format(
+									SEARCH_PLUGIN_LIVE, dialogKey))
+									.execute(JSONHandler
+										.createRequestJSON(
+											"id",
+											dialogValue.get(0)
+												.toString()));
+							}
+							catch (Exception e) {
+								Toast.makeText(context, e.getMessage(),
+									Toast.LENGTH_LONG).show();
+							}
+						}
+					});
+				dialogBuilder.setPositiveButton("Add to Service",
+					new DialogInterface.OnClickListener() {
+						@Override
+						public void onClick(DialogInterface dialogInterface,
+							int i) {
+							try {
+								new WebCallAsyncTask(context, String.format(
+									SEARCH_PLUGIN_ADD, dialogKey))
+									.execute(JSONHandler
+										.createRequestJSON(
+											"id",
+											dialogValue.get(0)
+												.toString()));
+							}
+							catch (Exception e) {
+								Toast.makeText(context, e.getMessage(),
+									Toast.LENGTH_LONG).show();
+							}
+							dialogInterface.cancel();
+						}
+					});
+				return dialogBuilder.create();
+			default:
+				return null;
+		}
+	}
+
+	@Override
+	protected void onPrepareDialog(int id, Dialog dialog) {
+		try {
+			dialog.setTitle(dialogValue.get(1).toString());
+		}
+		catch (JSONException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void doSearch(String search) {
+		new SearchAsync().execute(search);
+	}
+
+	class SearchAsync extends AsyncTask<String, Void, SearchResults> {
+		ProgressDialog progressDialog;
+		String query;
+
+		@Override
+		protected SearchResults doInBackground(String... strings) {
+			query = strings[0];
+			List<String> groups = new ArrayList<String>();
+			List<List<Map<String, JSONArray>>> children =
+				new ArrayList<List<Map<String, JSONArray>>>();
+
+			AsyncTask<String, Void, String> call =
+				new WebCallReturningAsyncTask(
+					context).execute(SEARCHABLE_PLUGINS);
+
+			try {
+				JSONArray array = new JSONObject(call.get().toString())
+					.getJSONObject("results").getJSONArray("items");
+
+				for (int i = 0; i < array.length(); i++) {
+					String pluginString = ((JSONArray) array.get(i)).get(0)
+						.toString();
+					groups.add(pluginString);
+
+					JSONArray resultArray = null;
+
+					AsyncTask<String, Void, String> pluginResults =
+						new WebCallReturningAsyncTask(
+							context,
+							String.format(SEARCH_PLUGIN_FORMATTED,
+								pluginString)).execute(JSONHandler
+							.createRequestJSON("text", query));
+
+					List<Map<String, JSONArray>> list =
+						new ArrayList<Map<String, JSONArray>>();
+					if (pluginResults.get() != null
+						&& pluginResults.get().toString().trim().length() >
+						0) {
+						resultArray = new JSONObject(pluginResults.get()
+							.toString()).getJSONObject("results")
+							.getJSONArray("items");
+						for (int j = 0; j < resultArray.length(); j++) {
+							Map<String, JSONArray> item =
+								new HashMap<String, JSONArray>();
+							item.put(pluginString,
+								(JSONArray) resultArray.get(j));
+							list.add(item);
+						}
+					}
+					children.add(list);
+				}
+			}
+			catch (Exception e) {
+				Log.e(LOG_TAG, e.toString());
+				Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG)
+					.show();
+			}
+
+			SearchResults results = new SearchResults();
+			results.setGroups(groups);
+			results.setChildren(children);
+			return results;
+		}
+
+		@Override
+		protected void onPreExecute() {
+			super.onPreExecute();
+			progressDialog = ProgressDialog.show(context, null,
+				getString(R.string.searching));
+		}
+
+		@Override
+		protected void onPostExecute(SearchResults results) {
+			super.onPostExecute(results);
+			listView.setAdapter(new GroupExpandableListAdapter(context, results
+				.getGroups(), results.getChildren()));
+			progressDialog.dismiss();
+			Toast.makeText(context,
+				String.format(getString(R.string.showingResults), query),
+				Toast.LENGTH_SHORT).show();
+		}
+	}
+
+	class SearchResults {
+		List<String> groups;
+		List<List<Map<String, JSONArray>>> children;
+
+		public List<String> getGroups() {
+			return groups;
+		}
+
+		public void setGroups(List<String> groups) {
+			this.groups = groups;
+		}
+
+		public List<List<Map<String, JSONArray>>> getChildren() {
+			return children;
+		}
+
+		public void setChildren(List<List<Map<String, JSONArray>>> children) {
+			this.children = children;
+		}
+	}
+
+	private final String LOG_TAG = this.getClass().getSimpleName();
+}

=== added file 'src/org/openlp/android/activity/Service.java'
--- src/org/openlp/android/activity/Service.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/Service.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,219 @@
+/******************************************************************************
+ * 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.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.openlp.android.R;
+import org.openlp.android.data.SlideItem;
+import org.openlp.android.utility.JSONHandler;
+import org.openlp.android.utility.OpenLPHttpClient;
+import org.openlp.android.utility.SlideAdapter;
+import org.openlp.android.utility.WebCallAsyncTask;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Activity for managing service objects.
+ */
+public class Service extends DefaultActivity implements OpenLPNavigate {
+	private final Activity context = this;
+	private ListView listView;
+
+	@Override
+	public void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		Log.i(LOG_TAG, "onCreate");
+
+		setContentView(R.layout.slide_service);
+		listView = (ListView) findViewById(R.id.list);
+		findViewById(R.id.prev).setOnClickListener(onClickListenerNavigate);
+		findViewById(R.id.next).setOnClickListener(onClickListenerNavigate);
+		listView.setOnItemClickListener(onItemClickListenerService);
+		listView.setOnItemLongClickListener(adapterViewOnItemLongClickListener);
+		((TextView) findViewById(R.id.slide_service_title)).setText(
+			R.string.tabService);
+	}
+
+	private Button.OnClickListener onClickListenerNavigate =
+		new Button.OnClickListener() {
+			@Override
+			public void onClick(View v) {
+				if (v.getId() == R.id.prev) {
+					navigate(SERVICE_PREVIOUS);
+				}
+				else if (v.getId() == R.id.next) {
+					navigate(SERVICE_NEXT);
+				}
+			}
+		};
+
+	private ListView.OnItemClickListener onItemClickListenerService =
+		new AdapterView.OnItemClickListener() {
+			@Override
+			public void onItemClick(AdapterView<?> adapterView, View view,
+				int i,
+				long l) {
+				setData(SERVICE_SET, i);
+			}
+		};
+
+	private AdapterView.OnItemLongClickListener
+		adapterViewOnItemLongClickListener =
+		new AdapterView.OnItemLongClickListener() {
+			@Override
+			public boolean onItemLongClick(AdapterView<?> adapterView,
+				View view,
+				int i, long l) {
+				setData(SERVICE_SET, i);
+				startActivity(new Intent(context, Slide.class));
+				return true;
+			}
+		};
+
+	public void navigate(String direction) {
+		try {
+			new WebCallAsyncTask(context).execute(direction);
+		}
+		catch (Exception e) {
+			Toast.makeText(getApplicationContext(),
+				String.format("%s: %s", e.getClass().getSimpleName(),
+					e.getMessage()), Toast.LENGTH_SHORT).show();
+		}
+	}
+
+	public void setData(String apiPart, int id) {
+		try {
+			String response = JSONHandler.createRequestJSON("id",
+				Integer.toString(id));
+			new WebCallAsyncTask(context, apiPart).execute(response);
+		}
+		catch (JSONHandler.JSONHandlerException e) {
+			Toast.makeText(getApplicationContext(),
+				String.format("%s: %s", e.getClass().getSimpleName(),
+					e.getMessage()), Toast.LENGTH_LONG).show();
+		}
+	}
+
+
+	@Override
+	protected void onResume() {
+		super.onResume();
+		Log.d(LOG_TAG, "Resume");
+		new FetchServiceItemsTask(this).execute(SERVICE_LIST);
+	}
+
+	/**
+	 * Asynchronous task to fetch the service items.
+	 */
+	class FetchServiceItemsTask extends AsyncTask<String, Void, SlideItem[]> {
+		Service serviceActivity;
+		ProgressDialog progressDialog;
+		String error;
+
+		FetchServiceItemsTask(Service serviceActivity) {
+			this.serviceActivity = serviceActivity;
+		}
+
+		@Override
+		protected void onPreExecute() {
+			super.onPreExecute();
+			progressDialog = ProgressDialog.show(Service.this,
+				getString(R.string.loading),
+				getString(R.string.loadingServiceItems));
+		}
+
+		@Override
+		protected SlideItem[] doInBackground(String... strings) {
+			OpenLPHttpClient httpClient = new OpenLPHttpClient(
+				getApplicationContext());
+			HttpResponse response = null;
+			error = "";
+
+			Log.d(LOG_TAG, "Processing:" + Arrays.asList(strings));
+			try {
+				httpClient.setUrl(strings[0]);
+				if (httpClient.getUrl().getHost().trim().length() <= 0) {
+					startActivity(
+						new Intent(serviceActivity, Preferences.class));
+				}
+				else {
+					response = httpClient.execute();
+				}
+
+				if (response != null && response.getStatusLine()
+					.getStatusCode() == 200) {
+					HttpEntity entity = response.getEntity();
+
+					if (entity != null) {
+						List<SlideItem> serviceItemList = JSONHandler
+							.parseServiceItemResponseJSON(
+								entity);
+						Log.i(LOG_TAG, String.format("Service Items: %s",
+							serviceItemList));
+						return serviceItemList.toArray(new SlideItem[]{});
+					}
+				}
+				else {
+					error = String.format("%s %s", getString(R.string.unable),
+						response);
+				}
+			}
+			catch (Exception e) {
+				error = String.format("%s: %s", e.getClass().getSimpleName(),
+					e.getMessage());
+			}
+			return null;
+		}
+
+		@Override
+		protected void onPostExecute(SlideItem[] slides) {
+			super.onPostExecute(slides);
+			if (slides == null) {
+				slides = new SlideItem[]{};
+			}
+			listView.setAdapter(
+				new SlideAdapter(context, Arrays.asList(slides), false));
+			progressDialog.dismiss();
+
+			if (error != null && error.trim().length() > 0) {
+				Toast.makeText(context, R.string.loadingFailed,
+					Toast.LENGTH_LONG).show();
+				Log.e(LOG_TAG, error);
+			}
+		}
+	}
+
+	private final String LOG_TAG = Service.class.getName();
+}

=== added file 'src/org/openlp/android/activity/Slide.java'
--- src/org/openlp/android/activity/Slide.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/Slide.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,210 @@
+/******************************************************************************
+ * 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.app.Activity;
+import android.app.ProgressDialog;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.Button;
+import android.widget.ListView;
+import android.widget.TextView;
+import android.widget.Toast;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.openlp.android.R;
+import org.openlp.android.utility.JSONHandler;
+import org.openlp.android.utility.OpenLPHttpClient;
+import org.openlp.android.utility.SlideAdapter;
+import org.openlp.android.utility.WebCallAsyncTask;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Slide extends DefaultActivity implements OpenLPNavigate {
+	private final Activity context = this;
+	private ListView slideList;
+
+	public void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		Log.d(LOG_TAG, "onCreate");
+		setContentView(R.layout.slide_service);
+
+		slideList = (ListView) findViewById(R.id.list);
+		findViewById(R.id.prev).setOnClickListener(onClickListenerNavigate);
+		findViewById(R.id.next).setOnClickListener(onClickListenerNavigate);
+		slideList.setOnItemClickListener(onItemClickListenerSetLive);
+		((TextView) findViewById(R.id.slide_service_title))
+			.setText(R.string.tabLive);
+	}
+
+	private AdapterView.OnItemClickListener onItemClickListenerSetLive =
+		new AdapterView.OnItemClickListener() {
+			@Override
+			public void onItemClick(AdapterView<?> adapterView, View view,
+				int i, long l) {
+				setData(LIVE_SET, i);
+			}
+		};
+
+	private Button.OnClickListener onClickListenerNavigate =
+		new Button.OnClickListener() {
+			public void onClick(View v) {
+				if (v.getId() == R.id.next) {
+					navigate(LIVE_NEXT);
+				}
+				else if (v.getId() == R.id.prev) {
+					navigate(LIVE_PREVIOUS);
+				}
+			}
+		};
+
+	@Override
+	public void navigate(String direction) {
+		try {
+			new WebCallAsyncTask(context).execute(direction);
+		}
+		catch (Exception e) {
+			Toast.makeText(context, R.string.loadingFailed,
+				Toast.LENGTH_LONG).show();
+			Log.e(LOG_TAG, String.format("%s: %s", e.getClass()
+				.getSimpleName(), e.getMessage()), e);
+		}
+	}
+
+	@Override
+	public void setData(String apiPart, int id) {
+		try {
+			String response = JSONHandler.createRequestJSON("id",
+				Integer.toString(id));
+			new WebCallAsyncTask(context, apiPart).execute(response);
+		}
+		catch (Exception e) {
+			try {
+				throw new JSONHandler.JSONHandlerException(e);
+			}
+			catch (JSONHandler.JSONHandlerException e1) {
+				Toast.makeText(getApplicationContext(),
+					String.format("%s: %s", e1.getClass()
+						.getSimpleName(), e1.getMessage()),
+					Toast.LENGTH_LONG).show();
+			}
+		}
+	}
+
+	@Override
+	protected void onResume() {
+		super.onResume();
+		Log.d(LOG_TAG, "Resume");
+
+		new FetchSlideItemsTask(this).execute(LIVE_TEXT);
+	}
+
+	class FetchSlideItemsTask extends
+		AsyncTask<String, Void, org.openlp.android.data.SlideItem[]> {
+		Slide slideActivity;
+		ProgressDialog progressDialog;
+		String error;
+
+		FetchSlideItemsTask(Slide slideActivity) {
+			this.slideActivity = slideActivity;
+		}
+
+		@Override
+		protected void onPreExecute() {
+			super.onPreExecute();
+			progressDialog = ProgressDialog.show(Slide.this,
+				getString(R.string.loading),
+				getString(R.string.loadingSlideItems));
+		}
+
+		@Override
+		protected org.openlp.android.data.SlideItem[] doInBackground(
+			String... strings) {
+			OpenLPHttpClient httpClient = new OpenLPHttpClient(
+				getApplicationContext());
+			HttpResponse response = null;
+			error = "";
+
+			Log.d(LOG_TAG, "Processing:" + Arrays.asList(strings));
+			try {
+				httpClient.setUrl(strings[0]);
+				if (httpClient.getUrl().getHost().trim().length() <= 0) {
+					startActivity(new Intent(slideActivity, Preferences.class));
+				}
+				else {
+					response = httpClient.execute();
+				}
+
+				if (response != null
+					&& response.getStatusLine().getStatusCode() == 200) {
+					HttpEntity entity = response.getEntity();
+
+					if (entity != null) {
+						List<org.openlp.android.data.SlideItem> slideItemList =
+							JSONHandler
+								.parseSlideItemResponseJSON(entity);
+						Log.d(LOG_TAG,
+							String.format("slides: %s", slideItemList));
+						return slideItemList
+							.toArray(
+								new org.openlp.android.data.SlideItem[]{});
+					}
+				}
+				else {
+					error = String.format("%s %s",
+						getString(R.string.unable), response);
+				}
+			}
+			catch (Exception ex) {
+				Log.d(LOG_TAG, String.format("%s: %s", ex.getClass()
+					.getSimpleName(), ex.getMessage()));
+				error = String.format("%s",
+					getString(R.string.connectionTimedout));
+			}
+			return null;
+		}
+
+		@Override
+		protected void onPostExecute(
+			org.openlp.android.data.SlideItem[] slides) {
+			super.onPostExecute(slides);
+			if (slides == null) {
+				slides = new org.openlp.android.data.SlideItem[]{};
+			}
+			slideList.setAdapter(new SlideAdapter(context, Arrays
+				.asList(slides)));
+			progressDialog.dismiss();
+
+			if (error != null && error.trim().length() > 0) {
+				Toast.makeText(context, R.string.loadingFailed,
+					Toast.LENGTH_LONG).show();
+				Log.e(LOG_TAG, error);
+			}
+		}
+	}
+
+	private final String LOG_TAG = Slide.class.getName();
+}

=== added file 'src/org/openlp/android/activity/StageView.java'
--- src/org/openlp/android/activity/StageView.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/activity/StageView.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,70 @@
+/******************************************************************************
+ * 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.SharedPreferences;
+import android.os.Bundle;
+import android.util.Log;
+import android.webkit.WebSettings;
+import android.webkit.WebView;
+import org.openlp.android.R;
+
+public class StageView extends DefaultActivity {
+	private final Context context = this;
+	private SharedPreferences preferences;
+
+	public void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+		Log.d(LOG_TAG, "onCreate");
+		setContentView(R.layout.stageview);
+		preferences = getApplicationContext().getSharedPreferences(
+			getApplicationContext()
+				.getString(R.string.keySharedPreferences),
+			Context.MODE_PRIVATE);
+	}
+
+	@Override
+	protected void onResume() {
+		super.onResume();
+		Log.d(LOG_TAG, "Resume");
+		WebView myWebView = (WebView) findViewById(R.id.stageview);
+		WebSettings webSettings = myWebView.getSettings();
+		webSettings.setJavaScriptEnabled(true);
+		webSettings.setBuiltInZoomControls(true);
+		webSettings.setLoadWithOverviewMode(true);
+		webSettings.setUseWideViewPort(true);
+		myWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
+		myWebView.setScrollbarFadingEnabled(true);
+		String urlBase =
+			String.format("http://%s:%s/stage";, preferences.getString(
+				context.getString(R.string.keyHost),
+				context.getString(R.string.hostDefaultValue)),
+				preferences
+					.getString(context.getString(R.string.keyPort),
+						context.getString(
+							R.string.portDefaultValue)));
+		Log.d(LOG_TAG, urlBase);
+		myWebView.loadUrl(urlBase);
+	}
+
+	private final String LOG_TAG = StageView.class.getName();
+}

=== added directory 'src/org/openlp/android/api'
=== added file 'src/org/openlp/android/api/Api.java'
--- src/org/openlp/android/api/Api.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/api/Api.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,120 @@
+/******************************************************************************
+ * 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.api;
+
+/**
+ * <h1>Routes:</h1>
+ * <p/>
+ * <p/>
+ * <pre>
+ * ``/``
+ * Go to the web interface.
+ *
+ * ``/files/{filename}``
+ *
+ * ``/api/poll``
+ * {"results": {"type": "controller"}}
+ * Or, if there were no results, False::
+ * {"results": False}
+ *
+ * ``/api/display/{hide|show}``
+ * Blank or unblank the screen.
+ *
+ * ``/api/alert``
+ * {"request": {"text": "<your alert text>"}}
+ * ``/api/controller/{live|preview}/{action}``
+ * ``next``
+ * Load the next slide.
+ *
+ * ``previous``
+ * Load the previous slide.
+ *
+ * ``set``
+ * Set a specific slide. Requires an id return in a JSON-encoded dict like
+ * this::
+ *
+ * {"request": {"id": 1}}
+ *
+ * ``first``
+ * Load the first slide.
+ *
+ * ``last``
+ * Load the last slide.
+ *
+ * ``text``
+ * Fetches the text of the current song. The output is a JSON-encoded
+ * dict which looks like this::
+ *
+ * {"result": {"slides": ["...", "..."]}}
+ *
+ * ``/api/service/{action}``
+ * Perform ``{action}`` on the service manager (e.g. go live). Data is
+ * passed as a json-encoded ``data`` parameter. Valid actions are:
+ *
+ * ``next``
+ * Load the next item in the service.
+ *
+ * ``previous``
+ *
+ * ``set``
+ * Set a specific item in the service. Requires an id returned in a
+ * JSON-encoded dict like this::
+ *
+ * {"request": {"id": 1}}
+ *
+ * ``list``
+ * Request a list of items in the service. Returns a list of items in the
+ * current service in a JSON-encoded dict like this::
+ *
+ * {"results": {"items": [{...}, {...}]}}
+ * """
+ * </pre>
+ */
+
+public interface Api {
+
+	public final String LIVE_NEXT = "/api/controller/live/next";
+	public final String LIVE_PREVIOUS = "/api/controller/live/previous";
+	public final String LIVE_TEXT = "/api/controller/live/text";
+	public final String LIVE_SET = "/api/controller/live/set?data=";
+
+	public final String SERVICE_NEXT = "/api/service/next";
+	public final String SERVICE_PREVIOUS = "/api/service/previous";
+	public final String SERVICE_LIST = "/api/service/list";
+	public final String SERVICE_SET = "/api/service/set?data=";
+
+	public final String DISPLAY_HIDE_SCREEN = "/api/display/blank";
+	public final String DISPLAY_HIDE_THEME = "/api/display/theme";
+	public final String DISPLAY_HIDE_DESKTOP = "/api/display/desktop";
+	public final String DISPLAY_SHOW = "/api/display/show";
+	public final String POLL_STATUS = "/api/poll";
+
+	public final String ALERT = "/api/alert?data=";
+
+	public final String SEARCHABLE_PLUGINS = "/api/plugin/search";
+	/**
+	 * This is a special string that uses the String.format() method. See
+	 * {@link String#format(String, Object...)}
+	 */
+	public final String SEARCH_PLUGIN_FORMATTED = "/api/%s/search?data=";
+	public final String SEARCH_PLUGIN_LIVE = "/api/%s/live?data=";
+	public final String SEARCH_PLUGIN_ADD = "/api/%s/add?data=";
+}

=== added directory 'src/org/openlp/android/data'
=== added file 'src/org/openlp/android/data/Poll.java'
--- src/org/openlp/android/data/Poll.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/data/Poll.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,98 @@
+/******************************************************************************
+ * 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.data;
+
+public class Poll {
+
+	private int slide;
+	private String item;
+	private boolean twelveHourDisplay = false;
+	private boolean blankedDisplayed = false;
+	private boolean themeDisplayed = false;
+	private boolean desktopDisplayed = false;
+	private boolean displayHidden = false;
+
+	public int getSlide() {
+		return slide;
+	}
+
+	public void setSlide(int slide) {
+		this.slide = slide;
+	}
+
+	public String getItem() {
+		return item;
+	}
+
+	public void setItem(String item) {
+		this.item = item;
+	}
+
+	public boolean isTwelveHourDisplay() {
+		return twelveHourDisplay;
+	}
+
+	public void setTwelveHourDisplay(boolean twelveHourDisplay) {
+		this.twelveHourDisplay = twelveHourDisplay;
+	}
+
+	public boolean isBlankedDisplayed() {
+		return blankedDisplayed;
+	}
+
+	public void setBlankedDisplayed(boolean blankedDisplayed) {
+		this.blankedDisplayed = blankedDisplayed;
+		if (blankedDisplayed) {
+			this.displayHidden = true;
+		}
+	}
+
+	public boolean isThemeDisplayed() {
+		return themeDisplayed;
+	}
+
+	public void setThemeDisplayed(boolean themeDisplayed) {
+		this.themeDisplayed = themeDisplayed;
+		if (themeDisplayed) {
+			this.displayHidden = true;
+		}
+	}
+
+	public boolean isDesktopDisplayed() {
+		return desktopDisplayed;
+	}
+
+	public void setDesktopDisplayed(boolean desktopDisplayed) {
+		this.desktopDisplayed = desktopDisplayed;
+		if (desktopDisplayed) {
+			this.displayHidden = true;
+		}
+	}
+
+	public boolean isDisplayHidden() {
+		return displayHidden;
+	}
+
+	public void setDisplayHidden(boolean displayHidden) {
+		this.displayHidden = displayHidden;
+	}
+}

=== added file 'src/org/openlp/android/data/SlideItem.java'
--- src/org/openlp/android/data/SlideItem.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/data/SlideItem.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,66 @@
+/******************************************************************************
+ * 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.data;
+
+public class SlideItem {
+	private String text;
+	private boolean selected;
+	private String tag;
+	private String html;
+
+	public String getText() {
+		return text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	public boolean isSelected() {
+		return selected;
+	}
+
+	public void setSelected(boolean selected) {
+		this.selected = selected;
+	}
+
+	public String getTag() {
+		return tag;
+	}
+
+	public void setTag(String tag) {
+		this.tag = tag;
+	}
+
+	public String getHtml() {
+		return html;
+	}
+
+	public void setHtml(String html) {
+		this.html = html;
+	}
+
+	@Override
+	public String toString() {
+		return "SlidePOJO{" + "text='" + text + '\'' + ", selected=" + selected
+			+ ", tag='" + tag + '\'' + ", html='" + html + '\'' + '}';
+	}
+}

=== added directory 'src/org/openlp/android/service'
=== added file 'src/org/openlp/android/service/PingService.java'
--- src/org/openlp/android/service/PingService.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/service/PingService.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,40 @@
+/******************************************************************************
+ * 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.service;
+
+import android.os.Bundle;
+import org.openlp.android.activity.Service;
+
+/**
+ * TODO: The target is to have a ping service to know when something on the server changed,
+ * TODO: and update accordingly
+ */
+public class PingService extends Service {
+	@Override
+	public void onCreate(Bundle savedInstanceState) {
+		super.onCreate(savedInstanceState);
+	}
+
+	@Override
+	protected void onResume() {
+		super.onResume();
+	}
+}

=== added directory 'src/org/openlp/android/utility'
=== added file 'src/org/openlp/android/utility/GroupExpandableListAdapter.java'
--- src/org/openlp/android/utility/GroupExpandableListAdapter.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/utility/GroupExpandableListAdapter.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,125 @@
+/******************************************************************************
+ * 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.utility;
+
+import android.app.Activity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseExpandableListAdapter;
+import android.widget.TextView;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.openlp.android.R;
+
+import java.util.List;
+import java.util.Map;
+
+public class GroupExpandableListAdapter extends BaseExpandableListAdapter {
+	List<String> groups;
+	List<List<Map<String, JSONArray>>> children;
+	LayoutInflater inflater;
+	Activity context;
+
+	public GroupExpandableListAdapter(Activity context, List<String> groups,
+		List<List<Map<String, JSONArray>>> children) {
+		this.context = context;
+		this.groups = groups;
+		this.children = children;
+		inflater = context.getLayoutInflater();
+	}
+
+	@Override
+	public int getGroupCount() {
+		return groups.size();
+	}
+
+	@Override
+	public int getChildrenCount(int position) {
+		return children.get(position).size();
+	}
+
+	@Override
+	public Object getGroup(int position) {
+		return groups.get(position);
+	}
+
+	@Override
+	public Object getChild(int rootPosition, int childPosition) {
+		return children.get(rootPosition).get(childPosition);
+	}
+
+	@Override
+	public long getGroupId(int position) {
+		return groups.indexOf(groups.get(position));
+	}
+
+	@Override
+	public long getChildId(int i, int i1) {
+		List<Map<String, JSONArray>> child = children.get(i);
+		return child.indexOf(child.get(i1));
+	}
+
+	@Override
+	public boolean hasStableIds() {
+		return false;
+	}
+
+	@Override
+	public View getGroupView(int position, boolean b, View view,
+		ViewGroup viewGroup) {
+		if (view == null) {
+			view = inflater.inflate(R.layout.group_parent, null);
+			view.setClickable(false);
+		}
+		TextView textView = (TextView) view.findViewById(R.id.groupParentText);
+		TextView numberView = (TextView) view
+			.findViewById(R.id.parentChildCount);
+		numberView.setText(String.format("%s", children.get(position).size()));
+		textView.setText(groups.get(position));
+		return view;
+	}
+
+	@Override
+	public View getChildView(int groupPosition, int childPosition, boolean b,
+		View view, ViewGroup viewGroup) {
+		if (view == null) {
+			view = inflater.inflate(R.layout.group_child, null);
+			view.setClickable(false);
+		}
+		TextView childView = (TextView) view.findViewById(R.id.groupChildText);
+		List<Map<String, JSONArray>> childItem = children.get(groupPosition);
+		Map<String, JSONArray> mapItem = childItem.get(childPosition);
+		JSONArray jsonItem = mapItem.get(groups.get(groupPosition));
+		try {
+			childView.setText(String.format("%s", jsonItem.get(1)));
+		}
+		catch (JSONException e) {
+			e.printStackTrace();
+		}
+		return view;
+	}
+
+	@Override
+	public boolean isChildSelectable(int i, int i1) {
+		return true;
+	}
+}

=== added file 'src/org/openlp/android/utility/JSONHandler.java'
--- src/org/openlp/android/utility/JSONHandler.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/utility/JSONHandler.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,169 @@
+/******************************************************************************
+ * 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.utility;
+
+import android.util.Log;
+import org.apache.http.HttpEntity;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.json.JSONStringer;
+import org.openlp.android.data.Poll;
+import org.openlp.android.data.SlideItem;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+
+public class JSONHandler {
+
+	public static String createRequestJSON(String key, String value)
+		throws JSONHandlerException {
+		try {
+			String responseJSON;
+			JSONObject jo = new JSONObject();
+			jo.put(key, value);
+			responseJSON = new JSONStringer().object().key("request").value(jo)
+				.endObject().toString();
+			responseJSON = URLEncoder.encode(responseJSON, "UTF-8");
+			return responseJSON;
+		}
+		catch (JSONException e) {
+			throw new JSONHandlerException(e);
+		}
+		catch (UnsupportedEncodingException e) {
+			throw new JSONHandlerException(e);
+		}
+	}
+
+	public static List<SlideItem> parseServiceItemResponseJSON(
+		HttpEntity entity)
+		throws JSONHandlerException {
+		try {
+			List<SlideItem> serviceItemList = new ArrayList<SlideItem>();
+			InputStream inputStream = entity.getContent();
+			String result = StringHelper.convertStreamToString(inputStream);
+			Log.i(LOG_TAG, result);
+
+			JSONObject jObject = new JSONObject(result);
+			JSONObject results = jObject.getJSONObject("results");
+			JSONArray items = results.getJSONArray("items");
+
+			for (int i = 0; i < items.length(); i++) {
+				JSONObject item = items.getJSONObject(i);
+				SlideItem slide = new SlideItem();
+				slide.setTag("");
+				slide.setText(item.getString("title"));
+				slide.setSelected(item.getBoolean("selected"));
+				slide.setHtml("");
+				serviceItemList.add(slide);
+			}
+
+			inputStream.close();
+			return serviceItemList;
+		}
+		catch (IOException e) {
+			throw new JSONHandlerException(e);
+		}
+		catch (JSONException e) {
+			throw new JSONHandlerException(e);
+		}
+
+	}
+
+	public static List<SlideItem> parseSlideItemResponseJSON(HttpEntity entity)
+		throws JSONHandlerException {
+		try {
+			List<SlideItem> serviceItemList = new ArrayList<SlideItem>();
+			InputStream inputStream = entity.getContent();
+			String result = StringHelper.convertStreamToString(inputStream);
+			Log.i(LOG_TAG, result);
+
+			JSONObject jObject = new JSONObject(result);
+			JSONObject results = jObject.getJSONObject("results");
+			JSONArray items = results.getJSONArray("slides");
+
+			for (int i = 0; i < items.length(); i++) {
+				JSONObject item = items.getJSONObject(i);
+				SlideItem slide = new SlideItem();
+				slide.setText(item.getString("text"));
+				slide.setTag(item.getString("tag"));
+				slide.setSelected(item.getBoolean("selected"));
+				slide.setHtml(item.getString("html"));
+				serviceItemList.add(slide);
+			}
+
+			inputStream.close();
+			return serviceItemList;
+		}
+		catch (IOException e) {
+			throw new JSONHandlerException(e);
+		}
+		catch (JSONException e) {
+			throw new JSONHandlerException(e);
+		}
+	}
+
+	public static Poll parsePollResponseJSON(HttpEntity entity)
+		throws JSONHandlerException {
+		try {
+			InputStream inputStream = entity.getContent();
+			String result = StringHelper.convertStreamToString(inputStream);
+			Log.i(LOG_TAG, result);
+
+			JSONObject jObject = new JSONObject(result);
+			JSONObject results = jObject.getJSONObject("results");
+			// JSONArray items = results.getJSONArray("slides");
+			Poll poll = new Poll();
+			poll.setSlide(results.getInt("slide"));
+			poll.setItem(results.getString("item"));
+			poll.setTwelveHourDisplay(results.getBoolean("twelve"));
+			poll.setBlankedDisplayed(results.getBoolean("blank"));
+			poll.setThemeDisplayed(results.getBoolean("theme"));
+			poll.setDesktopDisplayed(results.getBoolean("display"));
+			Log.d(LOG_TAG, poll.toString());
+			inputStream.close();
+			return poll;
+		}
+		catch (IOException e) {
+			throw new JSONHandlerException(e);
+		}
+		catch (JSONException e) {
+			throw new JSONHandlerException(e);
+		}
+	}
+
+	public static class JSONHandlerException extends Exception {
+		/**
+		 *
+		 */
+		private static final long serialVersionUID = -6772307308404816615L;
+
+		public JSONHandlerException(Throwable throwable) {
+			super(throwable);
+		}
+	}
+
+	private static String LOG_TAG = JSONHandler.class.getName();
+}

=== added file 'src/org/openlp/android/utility/OpenLPHttpClient.java'
--- src/org/openlp/android/utility/OpenLPHttpClient.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/utility/OpenLPHttpClient.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,105 @@
+/******************************************************************************
+ * 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.utility;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.util.Log;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
+import org.openlp.android.R;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+/**
+ * Personalised HttpClient to be used throughout OpenLP with customisable
+ * parameters.
+ */
+public class OpenLPHttpClient extends DefaultHttpClient {
+
+	private HttpGet httpGet;
+	private URL url;
+	private final String urlBase;
+
+	public OpenLPHttpClient(Context context) {
+		SharedPreferences preferences = context.getSharedPreferences(
+			context.getString(R.string.keySharedPreferences),
+			Context.MODE_PRIVATE);
+
+		Log.d(LOG_TAG, preferences.getAll().toString());
+		HttpParams httpParams = new BasicHttpParams();
+
+		urlBase = String.format("http://%s:%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)));
+
+		int connectionTimeout = context.getResources().getInteger(
+			R.integer.connectionTimeoutDefaultValue);
+		int socketTimeout = context.getResources().getInteger(
+			R.integer.socketTimeoutDefaultValue);
+
+		if (preferences.getBoolean(
+			context.getString(R.string.keyEnableCustomTimeout), false)) {
+			Log.d(LOG_TAG, String.format("Retrieving values for %s and %s",
+				context.getString(R.string.keyConnectionTimeout),
+				context.getString(R.string.keySocketTimeout)));
+			connectionTimeout = Integer.parseInt(preferences.getString(
+				context.getString(R.string.keyConnectionTimeout),
+				String.valueOf(context.getResources().getInteger(
+					R.integer.connectionTimeoutDefaultValue))));
+			socketTimeout = Integer.parseInt(preferences.getString(
+				context.getString(R.string.keySocketTimeout),
+				String.valueOf(context.getResources().getInteger(
+					R.integer.socketTimeoutDefaultValue))));
+		}
+		HttpConnectionParams
+			.setConnectionTimeout(httpParams, connectionTimeout);
+		HttpConnectionParams.setSoTimeout(httpParams, socketTimeout);
+		setParams(httpParams);
+		httpGet = new HttpGet();
+	}
+
+	public URL getUrl() {
+		return url;
+	}
+
+	public void setUrl(String apiPart) throws URISyntaxException,
+		MalformedURLException {
+		url = new URL(urlBase.concat(apiPart));
+		Log.d(LOG_TAG, "URL set to: " + url);
+		httpGet.setURI(getUrl().toURI());
+	}
+
+	public HttpResponse execute() throws IOException {
+		return super.execute(httpGet);
+	}
+
+	private final String LOG_TAG = OpenLPHttpClient.class.getName();
+}

=== added file 'src/org/openlp/android/utility/SlideAdapter.java'
--- src/org/openlp/android/utility/SlideAdapter.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/utility/SlideAdapter.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,130 @@
+/******************************************************************************
+ * 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.utility;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+import org.openlp.android.R;
+import org.openlp.android.data.SlideItem;
+
+import java.util.List;
+
+public class SlideAdapter extends BaseAdapter {
+	List<SlideItem> items;
+	Activity context;
+	LayoutInflater inflater;
+	boolean useTagDisplay = true;
+	private int[] colors = new int[]{0x74717000, 0x00000000};
+	SharedPreferences prefs;
+
+	public SlideAdapter(Activity context, List<SlideItem> items) {
+		this.context = context;
+		this.items = items;
+		inflater = context.getLayoutInflater();
+
+		prefs = context.getSharedPreferences(
+			context.getString(R.string.keySharedPreferences),
+			Context.MODE_PRIVATE);
+
+	}
+
+	public SlideAdapter(Activity context, List<SlideItem> items,
+		boolean useTagDisplay) {
+		this.context = context;
+		this.items = items;
+		this.useTagDisplay = useTagDisplay;
+		inflater = context.getLayoutInflater();
+
+		prefs = context.getSharedPreferences(
+			context.getString(R.string.keySharedPreferences),
+			Context.MODE_PRIVATE);
+	}
+
+	@Override
+	public int getCount() {
+		return items.size();
+	}
+
+	@Override
+	public Object getItem(int i) {
+		return items.get(i);
+	}
+
+	@Override
+	public long getItemId(int i) {
+		return items.indexOf(items.get(i));
+	}
+
+	@Override
+	public View getView(int position, View convertView, ViewGroup parent) {
+		ViewHolder holder;
+		View view = convertView;
+
+		SlideItem item = items.get(position);
+
+		if (view == null) {
+			view = inflater.inflate(R.layout.slide_list_item, null);
+			holder = new ViewHolder();
+
+			holder.rowMarker = (TextView) view.findViewById(R.id.rowItemMarker);
+			holder.rowItem = (TextView) view.findViewById(R.id.rowItemText);
+
+			view.setTag(holder);
+		}
+		else {
+			holder = (ViewHolder) view.getTag();
+		}
+
+		Log.d(LOG_TAG, " " + context.getString(R.string.keyTextSize));
+
+		int size = Integer.parseInt(prefs.getString(
+			context.getString(R.string.keyTextSize),
+			String.valueOf(context.getResources().getInteger(
+				R.integer.textSizeDefaultValue))));
+
+		holder.rowMarker.setText(item.getTag());
+		holder.rowItem.setText(item.getText());
+		holder.rowItem.setTextSize(size);
+
+		if (useTagDisplay) {
+			holder.rowMarker.setMinWidth(40);
+		}
+
+		int colorPos = position % colors.length;
+		view.setBackgroundColor(colors[colorPos]);
+
+		return view;
+	}
+
+	static class ViewHolder {
+		TextView rowMarker;
+		TextView rowItem;
+	}
+
+	private final String LOG_TAG = SlideAdapter.class.getName();
+}

=== added file 'src/org/openlp/android/utility/StringHelper.java'
--- src/org/openlp/android/utility/StringHelper.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/utility/StringHelper.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,63 @@
+/******************************************************************************
+ * 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.utility;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * String helper utility to do common string processing.
+ */
+public class StringHelper {
+	public synchronized static String convertStreamToString(InputStream is) {
+		/*
+				   * To convert the InputStream to String we use the
+				   * BufferedReader.readLine() method. We iterate until the BufferedReader
+				   * return null which means there's no more data to read. Each line will
+				   * appended to a StringBuilder and returned as String.
+				   */
+
+		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+		StringBuilder sb = new StringBuilder();
+
+		String line = null;
+		try {
+			while ((line = reader.readLine()) != null) {
+				sb.append(line + "\n");
+			}
+		}
+		catch (IOException e) {
+			e.printStackTrace();
+		}
+		finally {
+			try {
+				is.close();
+			}
+			catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+		return sb.toString();
+	}
+
+}

=== added file 'src/org/openlp/android/utility/WebCallAsyncTask.java'
--- src/org/openlp/android/utility/WebCallAsyncTask.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/utility/WebCallAsyncTask.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,90 @@
+/******************************************************************************
+ * 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.utility;
+
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.os.AsyncTask;
+import android.util.Log;
+import android.widget.Toast;
+import org.openlp.android.R;
+
+/**
+ * Call URL's using this task, which provides visual feedback.
+ */
+public class WebCallAsyncTask extends AsyncTask<String, Void, Void> {
+	private Context context;
+	private ProgressDialog progressDialog;
+	private String error;
+	private String apiPart;
+
+	public WebCallAsyncTask(Context context) {
+		this.context = context;
+	}
+
+	public WebCallAsyncTask(Context context, String apiPart) {
+		this.context = context;
+		this.apiPart = apiPart;
+	}
+
+	@Override
+	protected void onPreExecute() {
+		super.onPreExecute();
+		progressDialog = ProgressDialog.show(context, "",
+			context.getString(R.string.loading));
+	}
+
+	@Override
+	protected Void doInBackground(String... apiCall) {
+		OpenLPHttpClient httpClient = new OpenLPHttpClient(context);
+		try {
+			if (apiPart == null) {
+				httpClient.setUrl(apiCall[0]);
+			}
+			else {
+				httpClient.setUrl(String.format("%s%s", apiPart, apiCall[0]));
+			}
+
+			Log.d(LOG_TAG, "Executing request: "
+				+ httpClient.getUrl().toString());
+			if (httpClient.getUrl().getHost() != null) {
+				httpClient.execute();
+			}
+		}
+		catch (Exception e) {
+			Log.e(LOG_TAG, e.toString());
+			error = String.format("%s: %s", e.getClass().getSimpleName(),
+				e.getMessage());
+		}
+		return null;
+	}
+
+	@Override
+	protected void onPostExecute(Void aVoid) {
+		super.onPostExecute(aVoid);
+		progressDialog.dismiss();
+		if (error != null && error.trim().length() > 0) {
+			Toast.makeText(context, error, Toast.LENGTH_LONG).show();
+		}
+	}
+
+	private final String LOG_TAG = WebCallAsyncTask.class.getName();
+}

=== added file 'src/org/openlp/android/utility/WebCallReturningAsyncTask.java'
--- src/org/openlp/android/utility/WebCallReturningAsyncTask.java	1970-01-01 00:00:00 +0000
+++ src/org/openlp/android/utility/WebCallReturningAsyncTask.java	2012-03-23 16:56:20 +0000
@@ -0,0 +1,118 @@
+/******************************************************************************
+ * 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.utility;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.util.Log;
+import android.widget.Toast;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.openlp.android.activity.Preferences;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class WebCallReturningAsyncTask extends AsyncTask<String, Void, String> {
+	private Activity context;
+	private String apiPart;
+
+	public WebCallReturningAsyncTask(Activity context) {
+		this.context = context;
+	}
+
+	public WebCallReturningAsyncTask(Activity context, String apiPart) {
+		this.context = context;
+		this.apiPart = apiPart;
+	}
+
+	@Override
+	protected String doInBackground(String... apiCall) {
+		OpenLPHttpClient httpClient = new OpenLPHttpClient(context);
+		HttpResponse response = null;
+		BufferedReader bufferedReader = null;
+
+		try {
+			if (apiPart == null) {
+				httpClient.setUrl(apiCall[0]);
+			}
+			else {
+				httpClient.setUrl(String.format("%s%s", apiPart, apiCall[0]));
+			}
+
+			if (httpClient.getUrl().getHost().trim().length() <= 0) {
+				context.startActivity(new Intent(context, Preferences.class));
+			}
+			else {
+				response = httpClient.execute();
+			}
+
+			if (response != null
+				&& response.getStatusLine().getStatusCode() == 200) {
+				HttpEntity entity = response.getEntity();
+
+				if (entity != null) {
+					bufferedReader = new BufferedReader(
+						new InputStreamReader(entity.getContent()));
+					StringBuilder stringBuilder = new StringBuilder();
+
+					String line = bufferedReader.readLine();
+					while (line != null) {
+						stringBuilder.append(line);
+						line = bufferedReader.readLine();
+					}
+
+					Log.i(LOG_TAG, String.format("entity: %s",
+						stringBuilder.toString()));
+					bufferedReader.close();
+					return stringBuilder.toString();
+				}
+			}
+		}
+		catch (Exception e) {
+			Log.e(LOG_TAG, e.toString());
+			Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
+			if (bufferedReader != null) {
+				try {
+					bufferedReader.close();
+				}
+				catch (IOException e1) {
+					// do nothing as we are in an error state anyway
+				}
+			}
+		}
+		return null;
+	}
+
+	@Override
+	protected void onPreExecute() {
+		super.onPreExecute();
+	}
+
+	@Override
+	protected void onPostExecute(String s) {
+		super.onPostExecute(s);
+	}
+
+	private final String LOG_TAG = this.getClass().getName();
+}


Follow ups