Merge "Register only one binder listener and keep a map of listener to executor." into tm-dev am: 6504cbee86

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16995285

Change-Id: I656e4619c5f5deb53f963b3f1d8af1d6e5ed22bb
This commit is contained in:
Xiaowen Lei
2022-03-01 17:33:20 +00:00
committed by Automerger Merge Worker
2 changed files with 21 additions and 19 deletions

View File

@@ -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);
}
}
}

View File

@@ -3035,7 +3035,7 @@ public class WindowManagerService extends IWindowManager.Stub
@Override
public void onKeyguardShowingAndNotOccludedChanged() {
mH.sendEmptyMessage(H.RECOMPUTE_FOCUS);
dispatchKeyguardLockedStateState();
dispatchKeyguardLockedState();
}
@Override
@@ -3249,7 +3249,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) {