diff options
| author | 2025-03-03 15:22:35 -0800 | |
|---|---|---|
| committer | 2025-03-03 15:22:35 -0800 | |
| commit | cf264117de7776e1a5a6aafd6c8e531a6e81656f (patch) | |
| tree | 9e239c9e8ac09b971858c3838d1149f5985deaf7 | |
| parent | 6d5cc4fce182d133b24dd3151591a0cd0cf13ed9 (diff) | |
| parent | 63444192a19052997066b2071c340194b7ff32df (diff) | |
Merge "Move window-focus change subscription to WindowManagerInternal" into main
4 files changed, 68 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/wm/ViewServer.java b/services/core/java/com/android/server/wm/ViewServer.java index ecf5652a1e69..971e6f95d6bd 100644 --- a/services/core/java/com/android/server/wm/ViewServer.java +++ b/services/core/java/com/android/server/wm/ViewServer.java @@ -19,7 +19,10 @@ package com.android.server.wm; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; +import static com.android.server.wm.WindowManagerInternal.WindowFocusChangeListener; +import static com.android.server.wm.WindowManagerService.WindowChangeListener; +import android.os.IBinder; import android.util.Slog; import java.net.ServerSocket; @@ -206,7 +209,7 @@ class ViewServer implements Runnable { return result; } - class ViewServerWorker implements Runnable, WindowManagerService.WindowChangeListener { + class ViewServerWorker implements Runnable, WindowChangeListener, WindowFocusChangeListener { private Socket mClient; private boolean mNeedWindowListUpdate; private boolean mNeedFocusedWindowUpdate; @@ -284,7 +287,7 @@ class ViewServer implements Runnable { } } - public void focusChanged() { + public void focusChanged(IBinder focusedWindowToken) { synchronized(this) { mNeedFocusedWindowUpdate = true; notifyAll(); @@ -293,6 +296,7 @@ class ViewServer implements Runnable { private boolean windowManagerAutolistLoop() { mWindowManager.addWindowChangeListener(this); + mWindowManager.addWindowFocusChangeListener(this); BufferedWriter out = null; try { out = new BufferedWriter(new OutputStreamWriter(mClient.getOutputStream())); @@ -332,6 +336,7 @@ class ViewServer implements Runnable { } } mWindowManager.removeWindowChangeListener(this); + mWindowManager.removeWindowFocusChangeListener(this); } return true; } diff --git a/services/core/java/com/android/server/wm/WindowManagerInternal.java b/services/core/java/com/android/server/wm/WindowManagerInternal.java index 6e224f07fcdc..4b5a3a031931 100644 --- a/services/core/java/com/android/server/wm/WindowManagerInternal.java +++ b/services/core/java/com/android/server/wm/WindowManagerInternal.java @@ -152,6 +152,30 @@ public abstract class WindowManagerInternal { } } + /** Interface for clients to receive callbacks related to window change. */ + public interface WindowFocusChangeListener { + /** + * Notify on focus changed. + * + * @param focusedWindowToken the token of the newly focused window. + */ + void focusChanged(@NonNull IBinder focusedWindowToken); + } + + /** + * Registers a listener to be notified about window focus changes. + * + * @param listener the {@link WindowFocusChangeListener} to register. + */ + public abstract void registerWindowFocusChangeListener(WindowFocusChangeListener listener); + + /** + * Unregisters a listener that was registered via {@link #registerWindowFocusChangeListener}. + * + * @param listener the {@link WindowFocusChangeListener} to unregister. + */ + public abstract void unregisterWindowFocusChangeListener(WindowFocusChangeListener listener); + /** * Interface to receive a callback when the windows reported for * accessibility changed. diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 54f960973eff..9fc0339c52a2 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -145,6 +145,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_VERBOSE_TRANSA import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowManagerInternal.OnWindowRemovedListener; +import static com.android.server.wm.WindowManagerInternal.WindowFocusChangeListener; import static com.android.server.wm.WindowManagerServiceDumpProto.BACK_NAVIGATION; import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_APP; import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_DISPLAY_ID; @@ -1078,14 +1079,12 @@ public class WindowManagerService extends IWindowManager.Stub private ViewServer mViewServer; final ArrayList<WindowChangeListener> mWindowChangeListeners = new ArrayList<>(); + final ArrayList<WindowFocusChangeListener> mWindowFocusChangeListeners = new ArrayList<>(); boolean mWindowsChanged = false; - public interface WindowChangeListener { + interface WindowChangeListener { /** Notify on windows changed */ void windowsChanged(); - - /** Notify on focus changed */ - void focusChanged(); } final HighRefreshRateDenylist mHighRefreshRateDenylist; @@ -5306,18 +5305,30 @@ public class WindowManagerService extends IWindowManager.Stub return success; } - public void addWindowChangeListener(WindowChangeListener listener) { + void addWindowChangeListener(WindowChangeListener listener) { synchronized (mGlobalLock) { mWindowChangeListeners.add(listener); } } - public void removeWindowChangeListener(WindowChangeListener listener) { + void removeWindowChangeListener(WindowChangeListener listener) { synchronized (mGlobalLock) { mWindowChangeListeners.remove(listener); } } + void addWindowFocusChangeListener(WindowFocusChangeListener listener) { + synchronized (mGlobalLock) { + mWindowFocusChangeListeners.add(listener); + } + } + + void removeWindowFocusChangeListener(WindowFocusChangeListener listener) { + synchronized (mGlobalLock) { + mWindowFocusChangeListeners.remove(listener); + } + } + private void notifyWindowRemovedListeners(IBinder client) { OnWindowRemovedListener[] windowRemovedListeners; synchronized (mGlobalLock) { @@ -5350,18 +5361,19 @@ public class WindowManagerService extends IWindowManager.Stub } } - private void notifyFocusChanged() { - WindowChangeListener[] windowChangeListeners; + private void notifyFocusChanged(IBinder focusedWindowToken) { + WindowFocusChangeListener[] windowFocusChangeListeners; synchronized (mGlobalLock) { - if(mWindowChangeListeners.isEmpty()) { + if(mWindowFocusChangeListeners.isEmpty()) { return; } - windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()]; - windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners); + windowFocusChangeListeners = + new WindowFocusChangeListener[mWindowFocusChangeListeners.size()]; + mWindowFocusChangeListeners.toArray(windowFocusChangeListeners); } - int N = windowChangeListeners.length; + int N = windowFocusChangeListeners.length; for(int i = 0; i < N; i++) { - windowChangeListeners[i].focusChanged(); + windowFocusChangeListeners[i].focusChanged(focusedWindowToken); } } @@ -5636,7 +5648,7 @@ public class WindowManagerService extends IWindowManager.Stub if (newFocusedWindow != null && newFocusedWindow.mInputChannelToken == newToken) { mAnrController.onFocusChanged(newFocusedWindow); newFocusedWindow.reportFocusChangedSerialized(true); - notifyFocusChanged(); + notifyFocusChanged(newTarget.getWindowToken()); } WindowState lastFocusedWindow = lastTarget != null ? lastTarget.getWindowState() : null; @@ -8650,6 +8662,16 @@ public class WindowManagerService extends IWindowManager.Stub } @Override + public void registerWindowFocusChangeListener(WindowFocusChangeListener listener) { + WindowManagerService.this.addWindowFocusChangeListener(listener); + } + + @Override + public void unregisterWindowFocusChangeListener(WindowFocusChangeListener listener) { + WindowManagerService.this.removeWindowFocusChangeListener(listener); + } + + @Override public void registerOnWindowRemovedListener(OnWindowRemovedListener listener) { synchronized (mGlobalLock) { mOnWindowRemovedListeners.add(listener); diff --git a/services/proguard.flags b/services/proguard.flags index 8d8b418ced0b..dd3757c9e360 100644 --- a/services/proguard.flags +++ b/services/proguard.flags @@ -59,6 +59,7 @@ # Referenced in wear-service -keep public class com.android.server.wm.WindowManagerInternal { *; } +-keep public class com.android.server.wm.WindowManagerInternal$WindowFocusChangeListener { *; } # JNI keep rules # The global keep rule for native methods allows stripping of such methods if they're unreferenced |