diff --git a/changeAppSettings.sh b/changeAppSettings.sh
index 392455b11..be6dd2032 100755
--- a/changeAppSettings.sh
+++ b/changeAppSettings.sh
@@ -6,13 +6,16 @@ JAVA_SRC_PATH=project/java
if [ "X$1" = "X-a" ]; then
AUTO=a
+ shift
fi
if [ "X$1" = "X-v" ]; then
AUTO=v
+ shift
fi
if [ "X$1" = "X-u" ]; then
CHANGED=1
AUTO=a
+ shift
fi
if [ "X$1" = "X-h" ]; then
echo "Usage: $0 [-a] [-v] [-u]"
@@ -22,6 +25,25 @@ if [ "X$1" = "X-h" ]; then
exit
fi
+if [ "$#" -gt 0 ]; then
+ echo "Switching build target to $1"
+ if [ -e project/jni/application/$1 ]; then
+ rm -f project/jni/application/src
+ ln -s "$1" project/jni/application/src
+ else
+ echo "Error: no app $1 under project/jni/application"
+ echo "Available applications:"
+ cd project/jni/application
+ for f in *; do
+ if [ -e "$f/AndroidAppSettings.cfg" ]; then
+ echo "$f"
+ fi
+ done
+ exit 1
+ fi
+ shift
+fi
+
. ./AndroidAppSettings.cfg
var=""
diff --git a/project/AndroidManifestTemplate.xml b/project/AndroidManifestTemplate.xml
index 3f5601df0..124b769c0 100644
--- a/project/AndroidManifestTemplate.xml
+++ b/project/AndroidManifestTemplate.xml
@@ -38,6 +38,10 @@
android:windowSoftInputMode="stateUnspecified"
android:process=":RestartMainActivity"
/>
+
diff --git a/project/java/DummyService.java b/project/java/DummyService.java
new file mode 100644
index 000000000..179c339b7
--- /dev/null
+++ b/project/java/DummyService.java
@@ -0,0 +1,137 @@
+/*
+Simple DirectMedia Layer
+Java source code (C) 2009-2014 Sergii Pylypenko
+
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+3. This notice may not be removed or altered from any source distribution.
+*/
+
+package net.sourceforge.clonekeenplus;
+
+import android.app.Activity;
+import android.app.Service;
+import android.content.Context;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.view.MotionEvent;
+import android.view.KeyEvent;
+import android.view.Window;
+import android.view.WindowManager;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import android.widget.EditText;
+import android.text.Editable;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.FrameLayout;
+import android.graphics.drawable.Drawable;
+import android.graphics.Color;
+import android.content.res.Configuration;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Intent;
+import android.view.View.OnKeyListener;
+import android.view.MenuItem;
+import android.view.Menu;
+import android.view.Gravity;
+import android.text.method.TextKeyListener;
+import java.util.LinkedList;
+import java.io.SequenceInputStream;
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.FileOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+import java.util.zip.CheckedInputStream;
+import java.util.zip.CRC32;
+import java.util.Set;
+import android.text.SpannedString;
+import java.io.BufferedReader;
+import java.io.BufferedInputStream;
+import java.io.InputStreamReader;
+import android.view.inputmethod.InputMethodManager;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.Handler;
+import android.os.Message;
+import android.os.SystemClock;
+import java.util.concurrent.Semaphore;
+import android.content.pm.ActivityInfo;
+import android.view.Display;
+import android.util.DisplayMetrics;
+import android.text.InputType;
+import android.util.Log;
+import android.view.Surface;
+import android.app.ProgressDialog;
+import android.app.KeyguardManager;
+import android.view.ViewTreeObserver;
+import android.graphics.Rect;
+import android.view.InputDevice;
+import android.inputmethodservice.KeyboardView;
+import android.inputmethodservice.Keyboard;
+import android.app.Notification;
+import android.app.PendingIntent;
+import android.widget.RemoteViews;
+
+public class DummyService extends Service
+{
+ public DummyService()
+ {
+ super();
+ }
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId)
+ {
+ if (intent != null && Intent.ACTION_DELETE.equals(intent.getAction()))
+ {
+ Log.v("SDL", "User dismissed notification, killing myself");
+ System.exit(0);
+ }
+ Log.v("SDL", "Starting dummy service - displaying notification");
+ Notification ntf = new Notification();
+ ntf.icon = R.drawable.icon;
+ ntf.flags |= Notification.FLAG_NO_CLEAR;
+ PendingIntent killIntent = PendingIntent.getService(this, 5, new Intent(Intent.ACTION_DELETE, null, this, DummyService.class), PendingIntent.FLAG_CANCEL_CURRENT);
+ PendingIntent showIntent = PendingIntent.getActivity(this, 0, new Intent("", null, this, MainActivity.class), PendingIntent.FLAG_CANCEL_CURRENT);
+ ntf.deleteIntent = killIntent;
+ ntf.tickerText = getString(getApplicationInfo().labelRes);
+ RemoteViews view = new RemoteViews(getPackageName(), R.layout.notification);
+ view.setCharSequence(R.id.notificationText, "setText", getString(R.string.notification_app_is_running, getString(getApplicationInfo().labelRes)));
+ view.setOnClickPendingIntent(R.id.notificationText, showIntent);
+ view.setOnClickPendingIntent(R.id.notificationIcon, showIntent);
+ view.setOnClickPendingIntent(R.id.notificationView, showIntent);
+ view.setOnClickPendingIntent(R.id.notificationStop, killIntent);
+ ntf.contentView = view;
+ startForeground(1, ntf);
+ return Service.START_STICKY;
+ }
+ @Override
+ public void onDestroy()
+ {
+ }
+ @Override
+ public IBinder onBind(Intent intent)
+ {
+ return null;
+ }
+}
diff --git a/project/java/MainActivity.java b/project/java/MainActivity.java
index ddde7b8d0..fd5daf4ac 100644
--- a/project/java/MainActivity.java
+++ b/project/java/MainActivity.java
@@ -89,6 +89,8 @@ import android.graphics.Rect;
import android.view.InputDevice;
import android.inputmethodservice.KeyboardView;
import android.inputmethodservice.Keyboard;
+import android.app.Notification;
+import android.app.PendingIntent;
public class MainActivity extends Activity
{
@@ -226,6 +228,7 @@ public class MainActivity extends Activity
(new Thread(new Callback(this))).start();
if( Globals.CreateService )
{
+ Log.v("SDL", "Starting dummy service - displaying notification");
Intent intent = new Intent(this, DummyService.class);
startService(intent);
}
@@ -1485,25 +1488,3 @@ abstract class SetLayerType
}
}
}
-
-class DummyService extends Service
-{
- public DummyService()
- {
- super();
- }
- @Override
- public int onStartCommand(Intent intent, int flags, int startId)
- {
- return Service.START_STICKY;
- }
- @Override
- public void onDestroy()
- {
- }
- @Override
- public IBinder onBind(Intent intent)
- {
- return null;
- }
-}
diff --git a/project/java/translations/values/strings.xml b/project/java/translations/values/strings.xml
index 6a36e9aec..fe178a1a6 100644
--- a/project/java/translations/values/strings.xml
+++ b/project/java/translations/values/strings.xml
@@ -199,4 +199,7 @@
Restarting, please wait.
+ %s is running
+ Stop
+
diff --git a/project/jni/application/commandergenius/commandergenius b/project/jni/application/commandergenius/commandergenius
index 29d9fe23e..32b2e006f 160000
--- a/project/jni/application/commandergenius/commandergenius
+++ b/project/jni/application/commandergenius/commandergenius
@@ -1 +1 @@
-Subproject commit 29d9fe23e29a021d8e659dfb176cf2b6104e9bb4
+Subproject commit 32b2e006f9facb81db41125ddf2e9365e6b5075b
diff --git a/project/jni/application/hid-pc-keyboard/src b/project/jni/application/hid-pc-keyboard/src
index 5d839bd53..470f8b02c 160000
--- a/project/jni/application/hid-pc-keyboard/src
+++ b/project/jni/application/hid-pc-keyboard/src
@@ -1 +1 @@
-Subproject commit 5d839bd53d61c59ea75be8ab1792787757421b78
+Subproject commit 470f8b02ca0bd8f4f0cc24fbdf40651326fa7667
diff --git a/project/jni/boost/src b/project/jni/boost/src
index 5824acb45..bc9ea9d30 160000
--- a/project/jni/boost/src
+++ b/project/jni/boost/src
@@ -1 +1 @@
-Subproject commit 5824acb451e671205afeb188576be1dd9a2674bd
+Subproject commit bc9ea9d3032eb1e2b095484e2052aa2bc2e91767
diff --git a/project/jni/icuuc/src b/project/jni/icuuc/src
index a63fa87d2..a6a653107 160000
--- a/project/jni/icuuc/src
+++ b/project/jni/icuuc/src
@@ -1 +1 @@
-Subproject commit a63fa87d2e1658428d3eace6432e9d6a206ea393
+Subproject commit a6a6531070409723b8b04ce4741a4f97e718dce8
diff --git a/project/jni/shmem b/project/jni/shmem
index c2a28f528..f6b49516c 160000
--- a/project/jni/shmem
+++ b/project/jni/shmem
@@ -1 +1 @@
-Subproject commit c2a28f528d0b1b2528dda125e8fe8018609e7e9a
+Subproject commit f6b49516cf4b13f455a19ec989626be5472830c5
diff --git a/project/res/layout/notification.xml b/project/res/layout/notification.xml
new file mode 100644
index 000000000..76a3b8114
--- /dev/null
+++ b/project/res/layout/notification.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+