]> git.eshelyaron.com Git - emacs.git/commitdiff
Remove leftover tasks from previous Emacs sessions on startup
authorPo Lu <luangruo@yahoo.com>
Sun, 14 Apr 2024 02:36:50 +0000 (10:36 +0800)
committerEshel Yaron <me@eshelyaron.com>
Sun, 14 Apr 2024 17:11:34 +0000 (19:11 +0200)
* java/org/gnu/emacs/EmacsService.java (onCreate): Call
removeOldTasks.

* java/org/gnu/emacs/EmacsWindowManager.java (removeOldTasks):
New function.

* java/proguard.conf: Optimize optimizer configuration.

(cherry picked from commit 2823eae0b7cb3bd3f2472fde9e13016a8d406a9a)

java/org/gnu/emacs/EmacsService.java
java/org/gnu/emacs/EmacsWindowManager.java
java/proguard.conf

index b8ff98e79a70c962e18976255b15467b3874bcd7..fd0526530874e0a5f5dff188dc9a57f33947da87 100644 (file)
@@ -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
index a193d49d0ecec55b875c275f0fa1deb88b39e273..49f0ebd5841f0656353ffb2122aa8317d2a80840 100644 (file)
@@ -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<AppTask> 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 ();
+      }
+  }
 };
index e6b08f76fe487938fd4681ef9764d700ad69a6b2..5da402946bb83b3c00786e5014a1be3bacfc582e 100644 (file)
 # 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           { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsContextMenu         { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsCursor              { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsDesktopNotification { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsDialog              { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsDirectoryEntry      { <fields>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsFontDriver          { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsFontDriver$*        { <fields>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsGC                  { <methods>; <fields>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsHandleObject        { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsPixmap              { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsService             { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsWindow              { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsNative              { <methods>; }
--keep,allowoptimization class           org.gnu.emacs.EmacsNoninteractive      { <methods>; }
--keep,allowoptimization interface       org.gnu.emacs.EmacsDrawable            { <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsClipboard           { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsContextMenu         { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsCursor              { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsDesktopNotification { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsDialog              { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsDirectoryEntry      { public <fields>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsFontDriver          { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsFontDriver$*        { public <fields>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsGC                  { public <methods>; public <fields>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsHandleObject        { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsPixmap              { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsService             { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsWindow              { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsNative              { public <methods>; }
+-keep,allowoptimization class           org.gnu.emacs.EmacsNoninteractive      { public <methods>; }
+-keep,allowoptimization interface       org.gnu.emacs.EmacsDrawable            { public <methods>; }
 
 # And these lines inhibit the deletion of symbols that are referenced by
 # the operating system while enabling the compiler to minify or delete