diff options
| author | Po Lu <luangruo@yahoo.com> | 2024-04-03 20:29:10 +0800 |
|---|---|---|
| committer | Po Lu <luangruo@yahoo.com> | 2024-04-03 20:31:22 +0800 |
| commit | 7df66b4762ff51e394b8db03dfffe888bdba0a67 (patch) | |
| tree | c576b857afa236b95964cb28988b4aa2c3cabcc6 /java/org/gnu/emacs/EmacsWindowAttachmentManager.java | |
| parent | fa9791fe6af2bbedf1f5bb3e7dd8879a0191ebf1 (diff) | |
Better align Emacs window management with Android task lifecycles
* java/org/gnu/emacs/EmacsActivity.java (onCreate): Permit
overriding by child classes.
(onDestroy): Minor stylistic adjustments.
(getAttachmentToken): New function.
* java/org/gnu/emacs/EmacsMultitaskActivity.java (onCreate)
(getAttachmentToken): New functions.
* java/org/gnu/emacs/EmacsWindow.java (EmacsWindow):
<attachmentToken, preserve, previouslyAttached>: New variables.
(onActivityDetached): Remove redundant isFinishing argument.
(reparentTo): Reset the foregoing fields before registering with
the window manager.
* java/org/gnu/emacs/EmacsWindowManager.java
(EmacsWindowManager): Rename from EmacsWindowAttachmentManager.
(WindowConsumer): New function getAttachmentToken.
(isWindowEligible): New function.
(registerWindowConsumer, registerWindow, removeWindowConsumer)
(detachWindow): Implement a new window management strategy on
API 29 and subsequent releases where both varieties of toplevel
window are permanently, except when reparented, bound to the
activities to which they attach, and Emacs establishes at
strategic junctures whether those activities remain present.
(getTaskToken, pruneWindows): New functions.
Diffstat (limited to 'java/org/gnu/emacs/EmacsWindowAttachmentManager.java')
| -rw-r--r-- | java/org/gnu/emacs/EmacsWindowAttachmentManager.java | 211 |
1 files changed, 0 insertions, 211 deletions
diff --git a/java/org/gnu/emacs/EmacsWindowAttachmentManager.java b/java/org/gnu/emacs/EmacsWindowAttachmentManager.java deleted file mode 100644 index aae4e2ee49b..00000000000 --- a/java/org/gnu/emacs/EmacsWindowAttachmentManager.java +++ /dev/null @@ -1,211 +0,0 @@ -/* Communication module for Android terminals. -*- c-file-style: "GNU" -*- - -Copyright (C) 2023-2024 Free Software Foundation, Inc. - -This file is part of GNU Emacs. - -GNU Emacs is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or (at -your option) any later version. - -GNU Emacs is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ - -package org.gnu.emacs; - -import java.util.ArrayList; -import java.util.List; - -import android.app.ActivityOptions; -import android.content.Intent; -import android.os.Build; -import android.util.Log; - -/* Code to paper over the differences in lifecycles between - "activities" and windows. There are four interfaces to an instance - of this class: - - registerWindowConsumer (WindowConsumer) - registerWindow (EmacsWindow) - removeWindowConsumer (WindowConsumer) - removeWindow (EmacsWindow) - - A WindowConsumer is expected to allow an EmacsWindow to be attached - to it, and be created or destroyed. - - Every time a window is created, registerWindow checks the list of - window consumers. If a consumer exists and does not currently have - a window of its own attached, it gets the new window. Otherwise, - the window attachment manager starts a new consumer. - - Every time a consumer is registered, registerWindowConsumer checks - the list of available windows. If a window exists and is not - currently attached to a consumer, then the consumer gets it. - - Finally, every time a window is removed, the consumer is - destroyed. */ - -public final class EmacsWindowAttachmentManager -{ - private final static String TAG = "EmacsWindowAttachmentManager"; - - /* The single window attachment manager ``object''. */ - public static final EmacsWindowAttachmentManager MANAGER; - - static - { - MANAGER = new EmacsWindowAttachmentManager (); - }; - - public interface WindowConsumer - { - public void attachWindow (EmacsWindow window); - public EmacsWindow getAttachedWindow (); - public void detachWindow (); - public void destroy (); - }; - - /* List of currently attached window consumers. */ - public List<WindowConsumer> consumers; - - /* List of currently attached windows. */ - public List<EmacsWindow> windows; - - public - EmacsWindowAttachmentManager () - { - consumers = new ArrayList<WindowConsumer> (); - windows = new ArrayList<EmacsWindow> (); - } - - public void - registerWindowConsumer (WindowConsumer consumer) - { - consumers.add (consumer); - - for (EmacsWindow window : windows) - { - if (window.getAttachedConsumer () == null) - { - consumer.attachWindow (window); - return; - } - } - - EmacsNative.sendWindowAction ((short) 0, 0); - } - - public synchronized void - registerWindow (EmacsWindow window) - { - Intent intent; - ActivityOptions options; - - if (windows.contains (window)) - /* The window is already registered. */ - return; - - windows.add (window); - - for (WindowConsumer consumer : consumers) - { - if (consumer.getAttachedWindow () == null) - { - consumer.attachWindow (window); - return; - } - } - - intent = new Intent (EmacsService.SERVICE, - EmacsMultitaskActivity.class); - - intent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); - - /* 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); - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) - EmacsService.SERVICE.startActivity (intent); - else - { - /* Specify the desired window size. */ - options = ActivityOptions.makeBasic (); - options.setLaunchBounds (window.getGeometry ()); - EmacsService.SERVICE.startActivity (intent, - options.toBundle ()); - } - } - - public void - removeWindowConsumer (WindowConsumer consumer, boolean isFinishing) - { - EmacsWindow window; - - window = consumer.getAttachedWindow (); - - if (window != null) - { - consumer.detachWindow (); - window.onActivityDetached (isFinishing); - } - - consumers.remove (consumer); - } - - public synchronized void - detachWindow (EmacsWindow window) - { - WindowConsumer consumer; - - if (window.getAttachedConsumer () != null) - { - consumer = window.getAttachedConsumer (); - - consumers.remove (consumer); - consumer.destroy (); - } - - windows.remove (window); - } - - public void - noticeIconified (WindowConsumer consumer) - { - EmacsWindow window; - - /* If a window is attached, send the appropriate iconification - events. */ - window = consumer.getAttachedWindow (); - - if (window != null) - window.noticeIconified (); - } - - public void - noticeDeiconified (WindowConsumer consumer) - { - EmacsWindow window; - - /* If a window is attached, send the appropriate iconification - events. */ - window = consumer.getAttachedWindow (); - - if (window != null) - window.noticeDeiconified (); - } - - public synchronized List<EmacsWindow> - copyWindows () - { - return new ArrayList<EmacsWindow> (windows); - } -}; |
