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:
@@ -184,8 +184,17 @@ public class KeyguardManager {
|
|||||||
})
|
})
|
||||||
@interface LockTypes {}
|
@interface LockTypes {}
|
||||||
|
|
||||||
// TODO(b/220379118): register only one binder listener and keep a map of listener to executor.
|
private final IKeyguardLockedStateListener mIKeyguardLockedStateListener =
|
||||||
private final ArrayMap<KeyguardLockedStateListener, IKeyguardLockedStateListener>
|
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<>();
|
mKeyguardLockedStateListeners = new ArrayMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1102,17 +1111,12 @@ public class KeyguardManager {
|
|||||||
public void addKeyguardLockedStateListener(@NonNull @CallbackExecutor Executor executor,
|
public void addKeyguardLockedStateListener(@NonNull @CallbackExecutor Executor executor,
|
||||||
@NonNull KeyguardLockedStateListener listener) {
|
@NonNull KeyguardLockedStateListener listener) {
|
||||||
synchronized (mKeyguardLockedStateListeners) {
|
synchronized (mKeyguardLockedStateListeners) {
|
||||||
|
mKeyguardLockedStateListeners.put(listener, executor);
|
||||||
|
if (mKeyguardLockedStateListeners.size() > 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
final IKeyguardLockedStateListener innerListener =
|
mWM.addKeyguardLockedStateListener(mIKeyguardLockedStateListener);
|
||||||
new IKeyguardLockedStateListener.Stub() {
|
|
||||||
@Override
|
|
||||||
public void onKeyguardLockedStateChanged(boolean isKeyguardLocked) {
|
|
||||||
executor.execute(
|
|
||||||
() -> listener.onKeyguardLockedStateChanged(isKeyguardLocked));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
mWM.addKeyguardLockedStateListener(innerListener);
|
|
||||||
mKeyguardLockedStateListeners.put(listener, innerListener);
|
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
throw e.rethrowFromSystemServer();
|
throw e.rethrowFromSystemServer();
|
||||||
}
|
}
|
||||||
@@ -1125,17 +1129,15 @@ public class KeyguardManager {
|
|||||||
@RequiresPermission(Manifest.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE)
|
@RequiresPermission(Manifest.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE)
|
||||||
public void removeKeyguardLockedStateListener(@NonNull KeyguardLockedStateListener listener) {
|
public void removeKeyguardLockedStateListener(@NonNull KeyguardLockedStateListener listener) {
|
||||||
synchronized (mKeyguardLockedStateListeners) {
|
synchronized (mKeyguardLockedStateListeners) {
|
||||||
IKeyguardLockedStateListener innerListener = mKeyguardLockedStateListeners.get(
|
mKeyguardLockedStateListeners.remove(listener);
|
||||||
listener);
|
if (!mKeyguardLockedStateListeners.isEmpty()) {
|
||||||
if (innerListener == null) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
mWM.removeKeyguardLockedStateListener(innerListener);
|
mWM.removeKeyguardLockedStateListener(mIKeyguardLockedStateListener);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
throw e.rethrowFromSystemServer();
|
throw e.rethrowFromSystemServer();
|
||||||
}
|
}
|
||||||
mKeyguardLockedStateListeners.remove(listener);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3035,7 +3035,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
@Override
|
@Override
|
||||||
public void onKeyguardShowingAndNotOccludedChanged() {
|
public void onKeyguardShowingAndNotOccludedChanged() {
|
||||||
mH.sendEmptyMessage(H.RECOMPUTE_FOCUS);
|
mH.sendEmptyMessage(H.RECOMPUTE_FOCUS);
|
||||||
dispatchKeyguardLockedStateState();
|
dispatchKeyguardLockedState();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -3249,7 +3249,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
|||||||
+ " permission required to read keyguard visibility");
|
+ " permission required to read keyguard visibility");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void dispatchKeyguardLockedStateState() {
|
private void dispatchKeyguardLockedState() {
|
||||||
mH.post(() -> {
|
mH.post(() -> {
|
||||||
final boolean isKeyguardLocked = mPolicy.isKeyguardShowing();
|
final boolean isKeyguardLocked = mPolicy.isKeyguardShowing();
|
||||||
if (mDispatchedKeyguardLockedState == isKeyguardLocked) {
|
if (mDispatchedKeyguardLockedState == isKeyguardLocked) {
|
||||||
|
|||||||
Reference in New Issue
Block a user