1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-21 06:55:39 +00:00

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.
This commit is contained in:
Po Lu 2024-04-07 12:15:39 +08:00
parent ec25f5ad3d
commit ae296d762b
2 changed files with 29 additions and 23 deletions

View File

@ -876,7 +876,7 @@ distributors.
@item
When the user or the system closes any window created by Emacs on behalf
of a specific frame, Emacs deletes the frame displayed within that
window, unless the system is Android 10.0 or later, where such windows
window, unless the system is Android 5.0 or later, where such windows
are treated identically to the window created at startup, albeit with no
proviso regarding window inactivity.
@end itemize

View File

@ -23,9 +23,9 @@
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 @@ class are relevant on all versions of Android:
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 @@ && isWindowEligible (consumer, window))
/* 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 @@ && isWindowEligible (consumer, window))
/* 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 @@ && isWindowEligible (consumer, window))
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 @@ && isWindowEligible (consumer, window))
private static long
getTaskToken (AppTask task)
{
TaskInfo info;
RecentTaskInfo info;
info = (TaskInfo) task.getTaskInfo ();
info = 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 @@ && isWindowEligible (consumer, window))
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;