]> git.eshelyaron.com Git - emacs.git/commitdiff
Prevent crashes and related issues if initial activity is destroyed on Android
authorPo Lu <luangruo@yahoo.com>
Thu, 27 Jun 2024 03:06:59 +0000 (11:06 +0800)
committerEshel Yaron <me@eshelyaron.com>
Fri, 28 Jun 2024 05:48:06 +0000 (07:48 +0200)
* java/org/gnu/emacs/EmacsWindow.java
(EmacsWindow) <initialWindowCreated>: New variable.
(EmacsWindow): If the initial frame has not yet been created,
set attachmentToken to -1.

* java/org/gnu/emacs/EmacsWindowManager.java (registerWindow):
When the window's attachment token is -1 (i.e., it is the
default window), start EmacsActivity rather than
EmacsMultitaskActivity.  Catch exceptions around startActivity.

(cherry picked from commit 860840621a1ebe2e4f17ba8ae78d441ea75650b2)

java/org/gnu/emacs/EmacsWindow.java
java/org/gnu/emacs/EmacsWindowManager.java

index 5ffe11281720a3be881ea4b8ede887b1aeffc3af..698df2bfd64696759932a44badad9298ddcdde40 100644 (file)
@@ -74,6 +74,9 @@ public final class EmacsWindow extends EmacsHandleObject
 {
   private static final String TAG = "EmacsWindow";
 
+  /* Whether any windows have yet been created in this session.  */
+  private static boolean initialWindowCreated;
+
   private static class Coordinate
   {
     /* Integral coordinate.  */
@@ -192,6 +195,14 @@ public final class EmacsWindow extends EmacsHandleObject
     this.parent = parent;
     this.overrideRedirect = overrideRedirect;
 
+    /* The initial frame should always be bound to the startup
+       activity.  */
+    if (!initialWindowCreated)
+      {
+       this.attachmentToken = -1;
+        initialWindowCreated = true;
+      }
+
     /* Create the list of children.  */
     children = new ArrayList<EmacsWindow> ();
 
index 03487e853fb9da38f19afde4ab501d2ebbc89d2f..e4bd995f15a8ad2b9b1b5e02df47f2437dfa9f49 100644 (file)
@@ -174,6 +174,27 @@ public final class EmacsWindowManager
          }
       }
 
+    /* Do not create a multitasking activity for the initial frame,
+       but arrange to start EmacsActivity.  */
+    if (window.attachmentToken == -1)
+      {
+       intent = new Intent (EmacsService.SERVICE,
+                            EmacsActivity.class);
+       intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
+
+       try
+         {
+           EmacsService.SERVICE.startActivity (intent);
+         }
+       catch (Exception e)
+         {
+           Log.w (TAG, "an activity could not be started on behalf"
+                  + " of the mapped default window " + window.handle);
+         }
+
+       return;
+      }
+
     intent = new Intent (EmacsService.SERVICE,
                         EmacsMultitaskActivity.class);
 
@@ -205,14 +226,22 @@ public final class EmacsWindowManager
     window.attachmentToken = token;
     intent.putExtra (ACTIVITY_TOKEN, token);
 
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
-      EmacsService.SERVICE.startActivity (intent);
-    else
+    try
+      {
+       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
+         EmacsService.SERVICE.startActivity (intent);
+       else
+         {
+           /* Specify the desired window size.  */
+           options = ActivityOptions.makeBasic ();
+           options.setLaunchBounds (window.getGeometry ());
+           EmacsService.SERVICE.startActivity (intent, options.toBundle ());
+         }
+      }
+    catch (Exception e)
       {
-       /* Specify the desired window size.  */
-       options = ActivityOptions.makeBasic ();
-       options.setLaunchBounds (window.getGeometry ());
-       EmacsService.SERVICE.startActivity (intent, options.toBundle ());
+       Log.w (TAG, "an activity could not be started on behalf"
+              + " of a mapped window, " + window.handle);
       }
 
     pruneWindows ();