summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Antonio Kantek <kanant@google.com> 2024-12-17 20:24:58 +0000
committer Antonio Kantek <kanant@google.com> 2025-01-08 14:03:42 -0800
commitaf7d65b34748b7af5e621d6df9b9547e9a0c4ec8 (patch)
tree436165c3301375f3858b5994bd533e929ca3d543
parent6988e7a4a85b5e5ad8534849676afb43fd44ff83 (diff)
Block visible background user unallowed key event gestures
This is the second changelist to consolidate the logic of blocking unallowed key events for visible background user. Flag: EXEMPT refactor Bug: 372256138 Test: atest KeyGestureControllerTests Test: presubmit Change-Id: Ib32937c8f75dbbb934e7dd796fcc870acc7b6cd1
-rw-r--r--core/java/android/hardware/input/KeyGestureEvent.java20
-rw-r--r--services/core/java/com/android/server/input/KeyGestureController.java62
2 files changed, 77 insertions, 5 deletions
diff --git a/core/java/android/hardware/input/KeyGestureEvent.java b/core/java/android/hardware/input/KeyGestureEvent.java
index 66d073fa791e..9f5dabfda22c 100644
--- a/core/java/android/hardware/input/KeyGestureEvent.java
+++ b/core/java/android/hardware/input/KeyGestureEvent.java
@@ -230,6 +230,26 @@ public final class KeyGestureEvent {
public @interface KeyGestureType {
}
+ /**
+ * Returns whether the key gesture type passed as argument is allowed for visible background
+ * users.
+ *
+ * @hide
+ */
+ public static boolean isVisibleBackgrounduserAllowedGesture(int keyGestureType) {
+ switch (keyGestureType) {
+ case KEY_GESTURE_TYPE_SLEEP:
+ case KEY_GESTURE_TYPE_WAKEUP:
+ case KEY_GESTURE_TYPE_LAUNCH_ASSISTANT:
+ case KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT:
+ case KEY_GESTURE_TYPE_VOLUME_MUTE:
+ case KEY_GESTURE_TYPE_RECENT_APPS:
+ case KEY_GESTURE_TYPE_APP_SWITCH:
+ return false;
+ }
+ return true;
+ }
+
public KeyGestureEvent(@NonNull AidlKeyGestureEvent keyGestureEvent) {
this.mKeyGestureEvent = keyGestureEvent;
}
diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java
index 5f7ad2797368..db6d77238676 100644
--- a/services/core/java/com/android/server/input/KeyGestureController.java
+++ b/services/core/java/com/android/server/input/KeyGestureController.java
@@ -18,6 +18,8 @@ package com.android.server.input;
import static android.content.pm.PackageManager.FEATURE_LEANBACK;
import static android.content.pm.PackageManager.FEATURE_WATCH;
+import static android.os.UserManager.isVisibleBackgroundUsersEnabled;
+import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManagerPolicyConstants.FLAG_INTERACTIVE;
import static com.android.hardware.input.Flags.enableNew25q2Keycodes;
@@ -55,7 +57,6 @@ import android.util.IndentingPrintWriter;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
-import android.view.Display;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
@@ -64,6 +65,8 @@ import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.policy.IShortcutService;
+import com.android.server.LocalServices;
+import com.android.server.pm.UserManagerInternal;
import com.android.server.policy.KeyCombinationManager;
import java.util.ArrayDeque;
@@ -159,6 +162,10 @@ final class KeyGestureController {
/** Currently fully consumed key codes per device */
private final SparseArray<Set<Integer>> mConsumedKeysForDevice = new SparseArray<>();
+ private final UserManagerInternal mUserManagerInternal;
+
+ private final boolean mVisibleBackgroundUsersEnabled = isVisibleBackgroundUsersEnabled();
+
KeyGestureController(Context context, Looper looper, InputDataStore inputDataStore) {
mContext = context;
mHandler = new Handler(looper, this::handleMessage);
@@ -180,6 +187,7 @@ final class KeyGestureController {
mAppLaunchShortcutManager = new AppLaunchShortcutManager(mContext);
mInputGestureManager = new InputGestureManager(mContext);
mInputDataStore = inputDataStore;
+ mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
initBehaviors();
initKeyCombinationRules();
}
@@ -449,6 +457,9 @@ final class KeyGestureController {
}
public boolean interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
+ if (mVisibleBackgroundUsersEnabled && shouldIgnoreKeyEventForVisibleBackgroundUser(event)) {
+ return false;
+ }
final boolean interactive = (policyFlags & FLAG_INTERACTIVE) != 0;
if (InputSettings.doesKeyGestureEventHandlerSupportMultiKeyGestures()
&& (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
@@ -457,6 +468,24 @@ final class KeyGestureController {
return false;
}
+ private boolean shouldIgnoreKeyEventForVisibleBackgroundUser(KeyEvent event) {
+ final int displayAssignedUserId = mUserManagerInternal.getUserAssignedToDisplay(
+ event.getDisplayId());
+ final int currentUserId;
+ synchronized (mUserLock) {
+ currentUserId = mCurrentUserId;
+ }
+ if (currentUserId != displayAssignedUserId
+ && !KeyEvent.isVisibleBackgroundUserAllowedKey(event.getKeyCode())) {
+ if (DEBUG) {
+ Slog.w(TAG, "Ignored key event [" + event + "] for visible background user ["
+ + displayAssignedUserId + "]");
+ }
+ return true;
+ }
+ return false;
+ }
+
public long interceptKeyBeforeDispatching(IBinder focusedToken, KeyEvent event,
int policyFlags) {
// TODO(b/358569822): Handle shortcuts trigger logic here and pass it to appropriate
@@ -895,7 +924,7 @@ final class KeyGestureController {
private void handleMultiKeyGesture(int[] keycodes,
@KeyGestureEvent.KeyGestureType int gestureType, int action, int flags) {
handleKeyGesture(KeyCharacterMap.VIRTUAL_KEYBOARD, keycodes, /* modifierState= */0,
- gestureType, action, Display.DEFAULT_DISPLAY, /* focusedToken = */null, flags,
+ gestureType, action, DEFAULT_DISPLAY, /* focusedToken = */null, flags,
/* appLaunchData = */null);
}
@@ -903,7 +932,7 @@ final class KeyGestureController {
@Nullable AppLaunchData appLaunchData) {
handleKeyGesture(KeyCharacterMap.VIRTUAL_KEYBOARD, new int[0], /* modifierState= */0,
keyGestureType, KeyGestureEvent.ACTION_GESTURE_COMPLETE,
- Display.DEFAULT_DISPLAY, /* focusedToken = */null, /* flags = */0, appLaunchData);
+ DEFAULT_DISPLAY, /* focusedToken = */null, /* flags = */0, appLaunchData);
}
@VisibleForTesting
@@ -915,6 +944,11 @@ final class KeyGestureController {
}
private boolean handleKeyGesture(AidlKeyGestureEvent event, @Nullable IBinder focusedToken) {
+ if (mVisibleBackgroundUsersEnabled && event.displayId != DEFAULT_DISPLAY
+ && shouldIgnoreGestureEventForVisibleBackgroundUser(event.gestureType,
+ event.displayId)) {
+ return false;
+ }
synchronized (mKeyGestureHandlerRecords) {
for (KeyGestureHandlerRecord handler : mKeyGestureHandlerRecords.values()) {
if (handler.handleKeyGesture(event, focusedToken)) {
@@ -927,6 +961,24 @@ final class KeyGestureController {
return false;
}
+ private boolean shouldIgnoreGestureEventForVisibleBackgroundUser(
+ @KeyGestureEvent.KeyGestureType int gestureType, int displayId) {
+ final int displayAssignedUserId = mUserManagerInternal.getUserAssignedToDisplay(displayId);
+ final int currentUserId;
+ synchronized (mUserLock) {
+ currentUserId = mCurrentUserId;
+ }
+ if (currentUserId != displayAssignedUserId
+ && !KeyGestureEvent.isVisibleBackgrounduserAllowedGesture(gestureType)) {
+ if (DEBUG) {
+ Slog.w(TAG, "Ignored gesture event [" + gestureType
+ + "] for visible background user [" + displayAssignedUserId + "]");
+ }
+ return true;
+ }
+ return false;
+ }
+
private boolean isKeyGestureSupported(@KeyGestureEvent.KeyGestureType int gestureType) {
synchronized (mKeyGestureHandlerRecords) {
for (KeyGestureHandlerRecord handler : mKeyGestureHandlerRecords.values()) {
@@ -943,7 +995,7 @@ final class KeyGestureController {
// TODO(b/358569822): Once we move the gesture detection logic to IMS, we ideally
// should not rely on PWM to tell us about the gesture start and end.
AidlKeyGestureEvent event = createKeyGestureEvent(deviceId, keycodes, modifierState,
- gestureType, KeyGestureEvent.ACTION_GESTURE_COMPLETE, Display.DEFAULT_DISPLAY,
+ gestureType, KeyGestureEvent.ACTION_GESTURE_COMPLETE, DEFAULT_DISPLAY,
/* flags = */0, /* appLaunchData = */null);
mHandler.obtainMessage(MSG_NOTIFY_KEY_GESTURE_EVENT, event).sendToTarget();
}
@@ -951,7 +1003,7 @@ final class KeyGestureController {
public void handleKeyGesture(int deviceId, int[] keycodes, int modifierState,
@KeyGestureEvent.KeyGestureType int gestureType) {
AidlKeyGestureEvent event = createKeyGestureEvent(deviceId, keycodes, modifierState,
- gestureType, KeyGestureEvent.ACTION_GESTURE_COMPLETE, Display.DEFAULT_DISPLAY,
+ gestureType, KeyGestureEvent.ACTION_GESTURE_COMPLETE, DEFAULT_DISPLAY,
/* flags = */0, /* appLaunchData = */null);
handleKeyGesture(event, null /*focusedToken*/);
}