summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/app/KeyguardManager.java36
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java4
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) {