From 87598eb11862db8a8e58f4dc308e2e7015a2433c Mon Sep 17 00:00:00 2001 From: Xiaowen Lei Date: Thu, 24 Feb 2022 00:57:40 +0000 Subject: [PATCH] Register only one binder listener and keep a map of listener to executor. This optimizes the code by keeping only one remote connection. Also fixed a typo in WindowManagerService: "StateState" -> "State". Bug: 216630470 Bug: 220379118 Test: atest CtsWindowManagerDeviceTestCases:KeyguardTests Change-Id: I8abb64f750e91db7048279f5217b63d35959c3b6 --- core/java/android/app/KeyguardManager.java | 36 ++++++++++--------- .../server/wm/WindowManagerService.java | 4 +-- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java index 87ba197d8052e..cedf483eb0767 100644 --- a/core/java/android/app/KeyguardManager.java +++ b/core/java/android/app/KeyguardManager.java @@ -184,8 +184,17 @@ public class KeyguardManager { }) @interface LockTypes {} - // TODO(b/220379118): register only one binder listener and keep a map of listener to executor. - private final ArrayMap + private final IKeyguardLockedStateListener mIKeyguardLockedStateListener = + new IKeyguardLockedStateListener.Stub() { + @Override + public void onKeyguardLockedStateChanged(boolean isKeyguardLocked) { + mKeyguardLockedStateListeners.forEach((listener, executor) -> { + executor.execute( + () -> listener.onKeyguardLockedStateChanged(isKeyguardLocked)); + }); + } + }; + private final ArrayMap mKeyguardLockedStateListeners = new ArrayMap<>(); /** @@ -1102,17 +1111,12 @@ public class KeyguardManager { public void addKeyguardLockedStateListener(@NonNull @CallbackExecutor Executor executor, @NonNull KeyguardLockedStateListener listener) { synchronized (mKeyguardLockedStateListeners) { + mKeyguardLockedStateListeners.put(listener, executor); + if (mKeyguardLockedStateListeners.size() > 1) { + return; + } try { - final IKeyguardLockedStateListener innerListener = - new IKeyguardLockedStateListener.Stub() { - @Override - public void onKeyguardLockedStateChanged(boolean isKeyguardLocked) { - executor.execute( - () -> listener.onKeyguardLockedStateChanged(isKeyguardLocked)); - } - }; - mWM.addKeyguardLockedStateListener(innerListener); - mKeyguardLockedStateListeners.put(listener, innerListener); + mWM.addKeyguardLockedStateListener(mIKeyguardLockedStateListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -1125,17 +1129,15 @@ public class KeyguardManager { @RequiresPermission(Manifest.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE) public void removeKeyguardLockedStateListener(@NonNull KeyguardLockedStateListener listener) { synchronized (mKeyguardLockedStateListeners) { - IKeyguardLockedStateListener innerListener = mKeyguardLockedStateListeners.get( - listener); - if (innerListener == null) { + mKeyguardLockedStateListeners.remove(listener); + if (!mKeyguardLockedStateListeners.isEmpty()) { return; } try { - mWM.removeKeyguardLockedStateListener(innerListener); + mWM.removeKeyguardLockedStateListener(mIKeyguardLockedStateListener); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - mKeyguardLockedStateListeners.remove(listener); } } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 6445d1e657dae..7c59e4a50c249 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3034,7 +3034,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void onKeyguardShowingAndNotOccludedChanged() { mH.sendEmptyMessage(H.RECOMPUTE_FOCUS); - dispatchKeyguardLockedStateState(); + dispatchKeyguardLockedState(); } @Override @@ -3248,7 +3248,7 @@ public class WindowManagerService extends IWindowManager.Stub + " permission required to read keyguard visibility"); } - private void dispatchKeyguardLockedStateState() { + private void dispatchKeyguardLockedState() { mH.post(() -> { final boolean isKeyguardLocked = mPolicy.isKeyguardShowing(); if (mDispatchedKeyguardLockedState == isKeyguardLocked) {