Loading services/core/java/com/android/server/wm/ViewServer.java +7 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -284,7 +287,7 @@ class ViewServer implements Runnable { } } public void focusChanged() { public void focusChanged(IBinder focusedWindowToken) { synchronized(this) { mNeedFocusedWindowUpdate = true; notifyAll(); Loading @@ -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())); Loading Loading @@ -332,6 +336,7 @@ class ViewServer implements Runnable { } } mWindowManager.removeWindowChangeListener(this); mWindowManager.removeWindowFocusChangeListener(this); } return true; } Loading services/core/java/com/android/server/wm/WindowManagerInternal.java +24 −0 Original line number Diff line number Diff line Loading @@ -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. Loading services/core/java/com/android/server/wm/WindowManagerService.java +36 −14 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); } } Loading Loading @@ -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; Loading Loading @@ -8649,6 +8661,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) { Loading services/proguard.flags +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading
services/core/java/com/android/server/wm/ViewServer.java +7 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -284,7 +287,7 @@ class ViewServer implements Runnable { } } public void focusChanged() { public void focusChanged(IBinder focusedWindowToken) { synchronized(this) { mNeedFocusedWindowUpdate = true; notifyAll(); Loading @@ -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())); Loading Loading @@ -332,6 +336,7 @@ class ViewServer implements Runnable { } } mWindowManager.removeWindowChangeListener(this); mWindowManager.removeWindowFocusChangeListener(this); } return true; } Loading
services/core/java/com/android/server/wm/WindowManagerInternal.java +24 −0 Original line number Diff line number Diff line Loading @@ -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. Loading
services/core/java/com/android/server/wm/WindowManagerService.java +36 −14 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); } } Loading Loading @@ -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; Loading Loading @@ -8649,6 +8661,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) { Loading
services/proguard.flags +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading