diff --git a/java/org/gnu/emacs/EmacsService.java b/java/org/gnu/emacs/EmacsService.java index b8ff98e79a7..fd052653087 100644 --- a/java/org/gnu/emacs/EmacsService.java +++ b/java/org/gnu/emacs/EmacsService.java @@ -234,6 +234,8 @@ public final class EmacsService extends Service final double scaledDensity; double tempScaledDensity; + super.onCreate (); + SERVICE = this; handler = new Handler (Looper.getMainLooper ()); manager = getAssets (); @@ -247,9 +249,9 @@ public final class EmacsService extends Service resolver = getContentResolver (); mainThread = Thread.currentThread (); - /* If the density used to compute the text size is lesser than - 160, there's likely a bug with display density computation. - Reset it to 160 in that case. + /* If the density used to compute the text size is smaller than 160, + there's likely a bug with display density computation. Reset it + to 160 in that case. Note that Android uses 160 ``dpi'' as the density where 1 point corresponds to 1 pixel, not 72 or 96 as used elsewhere. This @@ -262,6 +264,10 @@ public final class EmacsService extends Service the nested function below. */ scaledDensity = tempScaledDensity; + /* Remove all tasks from previous Emacs sessions but the task + created by the system at startup. */ + EmacsWindowManager.MANAGER.removeOldTasks (this); + try { /* Configure Emacs with the asset manager and other necessary diff --git a/java/org/gnu/emacs/EmacsWindowManager.java b/java/org/gnu/emacs/EmacsWindowManager.java index a193d49d0ec..49f0ebd5841 100644 --- a/java/org/gnu/emacs/EmacsWindowManager.java +++ b/java/org/gnu/emacs/EmacsWindowManager.java @@ -27,6 +27,7 @@ import android.app.ActivityManager.RecentTaskInfo; import android.app.ActivityManager; import android.app.ActivityOptions; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -385,4 +386,44 @@ public final class EmacsWindowManager window.onActivityDetached (); } } + + /* Iterate over each of Emacs's tasks to delete such as belong to a + previous Emacs session, i.e., tasks created for a previous + session's non-initial frames. CONTEXT should be a context from + which to obtain a reference to the activity manager. */ + + public void + removeOldTasks (Context context) + { + List appTasks; + RecentTaskInfo info; + ComponentName name; + String target; + Object object; + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) + return; + + if (activityManager == null) + { + object = context.getSystemService (Context.ACTIVITY_SERVICE); + activityManager = (ActivityManager) object; + } + + appTasks = activityManager.getAppTasks (); + target = ".EmacsMultitaskActivity"; + + for (AppTask task : appTasks) + { + info = task.getTaskInfo (); + + /* Test whether info is a reference to + EmacsMultitaskActivity. */ + if (info.baseIntent != null + && (name = info.baseIntent.getComponent ()) != null + && name.getShortClassName ().equals (target)) + /* Delete the task. */ + task.finishAndRemoveTask (); + } + } }; diff --git a/java/proguard.conf b/java/proguard.conf index e6b08f76fe4..5da402946bb 100644 --- a/java/proguard.conf +++ b/java/proguard.conf @@ -20,22 +20,22 @@ # The effect of the following lines is to inhibit the removal of variable or # method symbol names from symbols referenced from C. --keep,allowoptimization class org.gnu.emacs.EmacsClipboard { ; } --keep,allowoptimization class org.gnu.emacs.EmacsContextMenu { ; } --keep,allowoptimization class org.gnu.emacs.EmacsCursor { ; } --keep,allowoptimization class org.gnu.emacs.EmacsDesktopNotification { ; } --keep,allowoptimization class org.gnu.emacs.EmacsDialog { ; } --keep,allowoptimization class org.gnu.emacs.EmacsDirectoryEntry { ; } --keep,allowoptimization class org.gnu.emacs.EmacsFontDriver { ; } --keep,allowoptimization class org.gnu.emacs.EmacsFontDriver$* { ; } --keep,allowoptimization class org.gnu.emacs.EmacsGC { ; ; } --keep,allowoptimization class org.gnu.emacs.EmacsHandleObject { ; } --keep,allowoptimization class org.gnu.emacs.EmacsPixmap { ; } --keep,allowoptimization class org.gnu.emacs.EmacsService { ; } --keep,allowoptimization class org.gnu.emacs.EmacsWindow { ; } --keep,allowoptimization class org.gnu.emacs.EmacsNative { ; } --keep,allowoptimization class org.gnu.emacs.EmacsNoninteractive { ; } --keep,allowoptimization interface org.gnu.emacs.EmacsDrawable { ; } +-keep,allowoptimization class org.gnu.emacs.EmacsClipboard { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsContextMenu { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsCursor { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsDesktopNotification { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsDialog { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsDirectoryEntry { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsFontDriver { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsFontDriver$* { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsGC { public ; public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsHandleObject { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsPixmap { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsService { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsWindow { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsNative { public ; } +-keep,allowoptimization class org.gnu.emacs.EmacsNoninteractive { public ; } +-keep,allowoptimization interface org.gnu.emacs.EmacsDrawable { public ; } # And these lines inhibit the deletion of symbols that are referenced by # the operating system while enabling the compiler to minify or delete