emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature/android 16617627845 1/2: Correctly display popup dialogs from Em


From: Po Lu
Subject: feature/android 16617627845 1/2: Correctly display popup dialogs from Emacsclient
Date: Thu, 8 Jun 2023 08:50:48 -0400 (EDT)

branch: feature/android
commit 1661762784520eb6834aa9831dcb646396efde73
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Correctly display popup dialogs from Emacsclient
    
    * java/org/gnu/emacs/EmacsContextMenu.java (EmacsContextMenu):
    Make subclasses final.
    * java/org/gnu/emacs/EmacsDialog.java (display1): Check if an
    instance of EmacsOpenActivity is open; if it is, try using it to
    display the pop up dialog.
    * java/org/gnu/emacs/EmacsDialogButtonLayout.java
    (EmacsDialogButtonLayout): Make final.
    * java/org/gnu/emacs/EmacsHolder.java (EmacsHolder<T>):
    Likewise.
    * java/org/gnu/emacs/EmacsOpenActivity.java (EmacsOpenActivity):
    New field `currentActivity'.
    (onCreate, onDestroy, onWindowFocusChanged, onPause): Set that
    field as appropriate.
---
 java/org/gnu/emacs/EmacsContextMenu.java        |  2 +-
 java/org/gnu/emacs/EmacsDialog.java             | 17 ++++--
 java/org/gnu/emacs/EmacsDialogButtonLayout.java |  2 +-
 java/org/gnu/emacs/EmacsHolder.java             |  2 +-
 java/org/gnu/emacs/EmacsOpenActivity.java       | 70 ++++++++++++++++++++++++-
 5 files changed, 85 insertions(+), 8 deletions(-)

diff --git a/java/org/gnu/emacs/EmacsContextMenu.java 
b/java/org/gnu/emacs/EmacsContextMenu.java
index 60f2db67fb0..d69d0263b93 100644
--- a/java/org/gnu/emacs/EmacsContextMenu.java
+++ b/java/org/gnu/emacs/EmacsContextMenu.java
@@ -58,7 +58,7 @@ public final class EmacsContextMenu
   /* The last group ID used for a menu item.  */
   public int lastGroupId;
 
-  private static class Item implements MenuItem.OnMenuItemClickListener
+  private static final class Item implements MenuItem.OnMenuItemClickListener
   {
     public int itemID;
     public String itemName, tooltip;
diff --git a/java/org/gnu/emacs/EmacsDialog.java 
b/java/org/gnu/emacs/EmacsDialog.java
index afdce3c50ec..3f8fe0109c0 100644
--- a/java/org/gnu/emacs/EmacsDialog.java
+++ b/java/org/gnu/emacs/EmacsDialog.java
@@ -68,8 +68,8 @@ public final class EmacsDialog implements 
DialogInterface.OnDismissListener
   /* The menu serial associated with this dialog box.  */
   private int menuEventSerial;
 
-  private class EmacsButton implements View.OnClickListener,
-                           DialogInterface.OnClickListener
+  private final class EmacsButton implements View.OnClickListener,
+                                 DialogInterface.OnClickListener
   {
     /* Name of this button.  */
     public String name;
@@ -244,13 +244,22 @@ public final class EmacsDialog implements 
DialogInterface.OnDismissListener
     if (EmacsActivity.focusedActivities.isEmpty ())
       {
        /* If focusedActivities is empty then this dialog may have
-          been displayed immediately after a popup dialog is
+          been displayed immediately after another popup dialog was
           dismissed.  Or Emacs might legitimately be in the
-          background.  Try the service context first if possible.  */
+          background, possibly displaying this popup in response to
+          an Emacsclient request.  Try the service context if it will
+          work, then any focused EmacsOpenActivity, and finally the
+          last EmacsActivity to be focused.  */
+
+       Log.d (TAG, "display1: no focused activities...");
+       Log.d (TAG, ("display1: EmacsOpenActivity.currentActivity: "
+                    + EmacsOpenActivity.currentActivity));
 
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M
            || Settings.canDrawOverlays (EmacsService.SERVICE))
          context = EmacsService.SERVICE;
+       else if (EmacsOpenActivity.currentActivity != null)
+         context = EmacsOpenActivity.currentActivity;
        else
          context = EmacsActivity.lastFocusedActivity;
 
diff --git a/java/org/gnu/emacs/EmacsDialogButtonLayout.java 
b/java/org/gnu/emacs/EmacsDialogButtonLayout.java
index 5d97eea32aa..fd8d63d81d3 100644
--- a/java/org/gnu/emacs/EmacsDialogButtonLayout.java
+++ b/java/org/gnu/emacs/EmacsDialogButtonLayout.java
@@ -37,7 +37,7 @@ import android.view.ViewGroup;
 
 
 
-public class EmacsDialogButtonLayout extends ViewGroup
+public final class EmacsDialogButtonLayout extends ViewGroup
 {
   public
   EmacsDialogButtonLayout (Context context)
diff --git a/java/org/gnu/emacs/EmacsHolder.java 
b/java/org/gnu/emacs/EmacsHolder.java
index 3ca803d1640..6cd48ba57ce 100644
--- a/java/org/gnu/emacs/EmacsHolder.java
+++ b/java/org/gnu/emacs/EmacsHolder.java
@@ -24,7 +24,7 @@ package org.gnu.emacs;
 /* This class serves as a simple reference to an object of type T.
    Nothing could be found inside the standard library.  */
 
-public class EmacsHolder<T>
+public final class EmacsHolder<T>
 {
   T thing;
 };
diff --git a/java/org/gnu/emacs/EmacsOpenActivity.java 
b/java/org/gnu/emacs/EmacsOpenActivity.java
index f402e25c7fb..6af2b2d2e94 100644
--- a/java/org/gnu/emacs/EmacsOpenActivity.java
+++ b/java/org/gnu/emacs/EmacsOpenActivity.java
@@ -72,8 +72,17 @@ public final class EmacsOpenActivity extends Activity
   DialogInterface.OnCancelListener
 {
   private static final String TAG = "EmacsOpenActivity";
+
+  /* The name of any file that should be opened as EmacsThread starts
+     Emacs.  This is never cleared, even if EmacsOpenActivity is
+     started a second time, as EmacsThread only starts once.  */
   public static String fileToOpen;
 
+  /* Any currently focused EmacsOpenActivity.  Used to show pop ups
+     while the activity is active and Emacs doesn't have permission to
+     display over other programs.  */
+  public static EmacsOpenActivity currentActivity;
+
   private class EmacsClientThread extends Thread
   {
     private ProcessBuilder builder;
@@ -362,6 +371,15 @@ public final class EmacsOpenActivity extends Activity
     thread.start ();
   }
 
+  /* Run emacsclient to open the file specified in the Intent that
+     caused this activity to start.
+
+     Determine the name of the file corresponding to the URI specified
+     in that intent; then, run emacsclient and wait for it to finish.
+
+     Finally, display any error message, transfer the focus to an
+     Emacs frame, and finish the activity.  */
+
   @Override
   public void
   onCreate (Bundle savedInstanceState)
@@ -463,10 +481,60 @@ public final class EmacsOpenActivity extends Activity
              }
          }
 
-       /* And start emacsclient.  */
+       /* And start emacsclient.  Set `currentActivity' to this now.
+          Presumably, it will shortly become capable of displaying
+          dialogs.  */
+       currentActivity = this;
        startEmacsClient (fileName);
       }
     else
       finish ();
   }
+
+
+
+  @Override
+  public void
+  onDestroy ()
+  {
+    Log.d (TAG, "onDestroy: " + this);
+
+    /* Clear `currentActivity' if it refers to the activity being
+       destroyed.  */
+
+    if (currentActivity == this)
+      this.currentActivity = null;
+
+    super.onDestroy ();
+  }
+
+  @Override
+  public void
+  onWindowFocusChanged (boolean isFocused)
+  {
+    Log.d (TAG, "onWindowFocusChanged: " + this + ", is now focused: "
+          + isFocused);
+
+    if (isFocused)
+      currentActivity = this;
+    else if (currentActivity == this)
+      currentActivity = null;
+
+    super.onWindowFocusChanged (isFocused);
+  }
+
+  @Override
+  public void
+  onPause ()
+  {
+    Log.d (TAG, "onPause: " + this);
+
+    /* XXX: clear currentActivity here as well; I don't know whether
+       or not onWindowFocusChanged is always called prior to this.  */
+
+    if (currentActivity == this)
+      currentActivity = null;
+
+    super.onPause ();
+  }
 }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]