]> git.eshelyaron.com Git - emacs.git/commitdiff
Update Android port
authorPo Lu <luangruo@yahoo.com>
Tue, 14 Mar 2023 01:48:02 +0000 (09:48 +0800)
committerPo Lu <luangruo@yahoo.com>
Tue, 14 Mar 2023 01:48:02 +0000 (09:48 +0800)
* doc/emacs/android.texi (Android Windowing): Document how to
display dialogs when Emacs is in the background.
* java/org/gnu/emacs/EmacsDialog.java (display1): Use system
dialogs if possible.

doc/emacs/android.texi
java/org/gnu/emacs/EmacsDialog.java

index 15415f125702d9f788147d90602cb7aa2ca3d1a6..c92700980defb2f9a0dddc935465e36ca4e992d3 100644 (file)
@@ -507,12 +507,25 @@ application via cut-and-paste.
 @cindex volume/multimedia buttons, Android
   The volume keys are normally reserved by Emacs and used to provide
 the ability to quit Emacs without a physical keyboard
-(@pxref{On-Screen-Keyboards}.)  However, if you want them to adjust
+(@pxref{On-Screen Keyboards}.)  However, if you want them to adjust
 the volume instead, you can set the variable
 @code{android-pass-multimedia-buttons-to-system} to a non-@code{nil}
 value; note that you will no longer be able to quit Emacs using the
 volume buttons in that case.
 
+@cindex dialog boxes, android
+  Emacs is unable to display dialog boxes (@pxref{Dialog Boxes}) while
+it does not have the input focus on Android 6.0 or later.  If this is
+important to you, this ability can be restored by granting Emacs
+permission to display over other programs.  Normally, this can be done
+from the:
+
+@indentedblock
+System -> Apps -> Emacs -> More -> Display over other apps
+@end indentedblock
+
+menu in the system settings, but this procedure may vary by device.
+
 @node Android Fonts
 @section Font backends and selection under Android
 @cindex fonts, android
index aed84de29e52584537890aa480fe17275d586a18..de5a37bd5c5accd20f5c107a326be361b59be216 100644 (file)
@@ -23,8 +23,14 @@ import java.util.List;
 import java.util.ArrayList;
 
 import android.app.AlertDialog;
-import android.content.DialogInterface;
+
 import android.content.Context;
+import android.content.DialogInterface;
+
+import android.os.Build;
+
+import android.provider.Settings;
+
 import android.util.Log;
 
 import android.widget.Button;
@@ -33,6 +39,8 @@ import android.widget.FrameLayout;
 
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.Window;
+import android.view.WindowManager;
 
 /* Toolkit dialog implementation.  This object is built from JNI and
    describes a single alert dialog.  Then, `inflate' turns it into
@@ -225,33 +233,54 @@ public final class EmacsDialog implements DialogInterface.OnDismissListener
 
   /* Internal helper for display run on the main thread.  */
 
+  @SuppressWarnings("deprecation")
   private boolean
   display1 ()
   {
-    EmacsActivity activity;
-    int size;
+    Context context;
+    int size, type;
     Button buttonView;
     EmacsButton button;
     AlertDialog dialog;
+    Window window;
+
+    /* First, try to display a dialog using the service context.  */
 
-    if (EmacsActivity.focusedActivities.isEmpty ())
+    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M
+       || Settings.canDrawOverlays (EmacsService.SERVICE))
+      context = EmacsService.SERVICE;
+    else if (EmacsActivity.focusedActivities.isEmpty ())
       {
        /* If focusedActivities is empty then this dialog may have
           been displayed immediately after a popup dialog is
           dismissed.  */
 
-       activity = EmacsActivity.lastFocusedActivity;
+       context = EmacsActivity.lastFocusedActivity;
 
-       if (activity == null)
+       if (context == null)
          return false;
       }
     else
-      activity = EmacsActivity.focusedActivities.get (0);
+      context = EmacsActivity.focusedActivities.get (0);
+
+    Log.d (TAG, "display1: using context " + context);
 
-    dialog = dismissDialog = toAlertDialog (activity);
+    dialog = dismissDialog = toAlertDialog (context);
 
     try
       {
+       if (context == EmacsService.SERVICE)
+         {
+           /* Apply the system alert window type to make sure this
+              dialog can be displayed.  */
+
+           window = dialog.getWindow ();
+           type = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
+                   ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
+                   : WindowManager.LayoutParams.TYPE_PHONE);
+           window.setType (type);
+         }
+
        dismissDialog.show ();
       }
     catch (Exception exception)