summaryrefslogtreecommitdiff
path: root/java
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2024-04-07 12:15:39 +0800
committerPo Lu <luangruo@yahoo.com>2024-04-07 12:15:39 +0800
commitae296d762bc7366879e74f9dca90bc7edd89e860 (patch)
tree396c469faabe8380f6a9feb11aabe6b55d253052 /java
parentec25f5ad3d4323b56f239a06186f965c8d4cb695 (diff)
downloademacs-ae296d762bc7366879e74f9dca90bc7edd89e860.tar.gz
Port new Android window management strategy to Android 5.0
* doc/emacs/android.texi (Android Windowing): Revise to match. * java/org/gnu/emacs/EmacsWindowManager.java (registerWindow) (removeWindowConsumer, pruneWindows): Decrease minimum API for monitoring of tasks to Android 5.0. (getTaskToken): Ignore misleading documentation and access baseIntent by way of RecentTaskInfo.
Diffstat (limited to 'java')
-rw-r--r--java/org/gnu/emacs/EmacsWindowManager.java50
1 files changed, 28 insertions, 22 deletions
diff --git a/java/org/gnu/emacs/EmacsWindowManager.java b/java/org/gnu/emacs/EmacsWindowManager.java
index 41ea3a15809..22629cad329 100644
--- a/java/org/gnu/emacs/EmacsWindowManager.java
+++ b/java/org/gnu/emacs/EmacsWindowManager.java
@@ -23,9 +23,9 @@ import java.util.ArrayList;
import java.util.List;
import android.app.ActivityManager.AppTask;
+import android.app.ActivityManager.RecentTaskInfo;
import android.app.ActivityManager;
import android.app.ActivityOptions;
-import android.app.TaskInfo;
import android.content.Context;
import android.content.Intent;
@@ -60,7 +60,7 @@ import android.util.Log;
getAttachmentToken ()
should return a token uniquely identifying a consumer, which, on API
- 29 and up, enables attributing the tasks of activities to the windows
+ 21 and up, enables attributing the tasks of activities to the windows
for which they were created, and with that, consistent interaction
between user-visible window state and their underlying frames. */
@@ -182,7 +182,21 @@ public final class EmacsWindowManager
/* Intent.FLAG_ACTIVITY_NEW_DOCUMENT is lamentably unavailable on
older systems than Lolipop. */
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
- intent.addFlags (Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
+ {
+ intent.addFlags (Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
+
+ /* Bind this window to the activity in advance, i.e., before its
+ creation, so that its ID will be recorded in the RecentTasks
+ list. */
+ token = ++nextActivityToken;
+ }
+ else
+ /* APIs required for linking activities to windows are not
+ available in earlier Android versions. */
+ token = -2;
+
+ window.attachmentToken = token;
+ intent.putExtra (ACTIVITY_TOKEN, token);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
EmacsService.SERVICE.startActivity (intent);
@@ -191,19 +205,6 @@ public final class EmacsWindowManager
/* Specify the desired window size. */
options = ActivityOptions.makeBasic ();
options.setLaunchBounds (window.getGeometry ());
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
- /* Bind this window to the activity in advance, i.e., before
- its creation, so that its ID will be recorded in the
- RecentTasks list. */
- token = ++nextActivityToken;
- else
- /* APIs required for linking activities to windows are not
- available in earlier Android versions. */
- token = -2;
-
- window.attachmentToken = token;
- intent.putExtra (ACTIVITY_TOKEN, token);
EmacsService.SERVICE.startActivity (intent, options.toBundle ());
}
@@ -228,7 +229,7 @@ public final class EmacsWindowManager
the system-started task. */
if (isFinishing
&& (!(consumer instanceof EmacsMultitaskActivity)
- || Build.VERSION.SDK_INT < Build.VERSION_CODES.Q))
+ || Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP))
window.onActivityDetached ();
}
@@ -297,12 +298,17 @@ public final class EmacsWindowManager
private static long
getTaskToken (AppTask task)
{
- TaskInfo info;
+ RecentTaskInfo info;
+
+ info = task.getTaskInfo ();
- info = (TaskInfo) task.getTaskInfo ();
+ /* baseIntent is a member of info's superclass, TaskInfo, on Android
+ 10 and later. Prior to this release, it had been a member of
+ RecentTaskInfo since SDK 1, and whatever the misleading
+ documentation might suggest, a reference to `baseIntent' through
+ TaskInfo is just as good a reference to RecentTaskInfo. */
return (info.baseIntent != null
- ? info.baseIntent.getLongExtra (ACTIVITY_TOKEN,
- -1l)
+ ? info.baseIntent.getLongExtra (ACTIVITY_TOKEN, -1l)
: 0);
}
@@ -319,7 +325,7 @@ public final class EmacsWindowManager
long taskToken;
boolean set;
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP
|| EmacsService.SERVICE == null)
return;