diff options
| -rw-r--r-- | core/java/android/app/KeyguardManager.java | 36 | ||||
| -rw-r--r-- | services/core/java/com/android/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 87ba197d8052..cedf483eb076 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<KeyguardLockedStateListener, IKeyguardLockedStateListener> + 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<KeyguardLockedStateListener, Executor> 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 6445d1e657da..7c59e4a50c24 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) { |