From 5964051fcefc52e02c88a41b91797cc7a785d550 Mon Sep 17 00:00:00 2001 From: Po Lu Date: Tue, 14 Mar 2023 09:48:02 +0800 Subject: Update Android port * 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. --- java/org/gnu/emacs/EmacsDialog.java | 45 ++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 8 deletions(-) (limited to 'java') diff --git a/java/org/gnu/emacs/EmacsDialog.java b/java/org/gnu/emacs/EmacsDialog.java index aed84de29e5..de5a37bd5c5 100644 --- a/java/org/gnu/emacs/EmacsDialog.java +++ b/java/org/gnu/emacs/EmacsDialog.java @@ -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) -- cgit v1.2.1