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
This commit is contained in:
Xiaowen Lei
2022-02-24 00:57:40 +00:00
parent c45a731f0f
commit 87598eb118
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

@@ -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) {