Fix: Block opening any apps on keyguard without user auth
Test: atest KeyGestureEventTests
Bug: 378900798
Flag: EXEMPT bugfix
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d615298466085c4a88c6733804160e0c1ee7e31e)
Merged-In: I89d43872108710d20e0c4ef7e652d389896155d7
Change-Id: I89d43872108710d20e0c4ef7e652d389896155d7
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index f1a4811..8052754 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -3576,7 +3576,7 @@
}
break;
case KeyEvent.KEYCODE_I:
- if (firstDown && event.isMetaPressed()) {
+ if (firstDown && event.isMetaPressed() && isUserSetupComplete() && !keyguardOn) {
showSystemSettings();
notifyKeyGestureCompleted(event,
KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS);
@@ -4149,6 +4149,7 @@
int displayId = event.getDisplayId();
int modifierState = event.getModifierState();
boolean keyguardOn = keyguardOn();
+ boolean canLaunchApp = isUserSetupComplete() && !keyguardOn;
switch (gestureType) {
case KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS:
if (complete) {
@@ -4166,7 +4167,7 @@
return true;
case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT:
case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT:
- if (complete) {
+ if (complete && canLaunchApp) {
launchAssistAction(Intent.EXTRA_ASSIST_INPUT_HINT_KEYBOARD,
deviceId, SystemClock.uptimeMillis(),
AssistUtils.INVOCATION_TYPE_UNKNOWN);
@@ -4179,7 +4180,7 @@
}
return true;
case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS:
- if (complete) {
+ if (complete && canLaunchApp) {
showSystemSettings();
}
return true;
@@ -4282,7 +4283,7 @@
}
return true;
case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH:
- if (complete) {
+ if (complete && canLaunchApp) {
launchTargetSearchActivity();
}
return true;
@@ -4363,8 +4364,8 @@
break;
case KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_APPLICATION:
AppLaunchData data = event.getAppLaunchData();
- if (complete && isUserSetupComplete() && !keyguardOn
- && data != null && mModifierShortcutManager.launchApplication(data)) {
+ if (complete && canLaunchApp && data != null
+ && mModifierShortcutManager.launchApplication(data)) {
dismissKeyboardShortcutsMenu();
}
return true;
diff --git a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
index 41865b20..6c8c826 100644
--- a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
+++ b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java
@@ -808,4 +808,44 @@
sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_BOUNCE_KEYS));
Assert.assertFalse(InputSettings.isAccessibilityBounceKeysEnabled(mContext));
}
+
+ @Test
+ public void testLaunchSettingsAndSearchDoesntOpenAnything_withKeyguardOn() {
+ mPhoneWindowManager.overrideKeyguardOn(true);
+
+ sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS);
+ sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH);
+
+ mPhoneWindowManager.assertNoActivityLaunched();
+ }
+
+ @Test
+ public void testLaunchSettingsAndSearchDoesntOpenAnything_withUserSetupIncomplete() {
+ mPhoneWindowManager.overrideIsUserSetupComplete(false);
+
+ sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SYSTEM_SETTINGS);
+ sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_SEARCH);
+
+ mPhoneWindowManager.assertNoActivityLaunched();
+ }
+
+ @Test
+ public void testLaunchAssistantDoesntWork_withKeyguardOn() {
+ mPhoneWindowManager.overrideKeyguardOn(true);
+
+ sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT);
+ sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT);
+
+ mPhoneWindowManager.assertSearchManagerDoesntLaunchAssist();
+ }
+
+ @Test
+ public void testLaunchAssistantDoesntWork_withUserSetupIncomplete() {
+ mPhoneWindowManager.overrideIsUserSetupComplete(false);
+
+ sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT);
+ sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_VOICE_ASSISTANT);
+
+ mPhoneWindowManager.assertSearchManagerDoesntLaunchAssist();
+ }
}
diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
index 9db76d4..8ea3a34 100644
--- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
+++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java
@@ -563,6 +563,10 @@
doNothing().when(mPhoneWindowManager).launchHomeFromHotKey(anyInt());
}
+ void overrideKeyguardOn(boolean isKeyguardOn) {
+ doReturn(isKeyguardOn).when(mPhoneWindowManager).keyguardOn();
+ }
+
void overrideIsUserSetupComplete(boolean isCompleted) {
doReturn(isCompleted).when(mPhoneWindowManager).isUserSetupComplete();
}
@@ -725,6 +729,11 @@
verify(mSearchManager).launchAssist(any());
}
+ void assertSearchManagerDoesntLaunchAssist() {
+ mTestLooper.dispatchAll();
+ verify(mSearchManager, never()).launchAssist(any());
+ }
+
void assertLaunchSystemSettings() {
mTestLooper.dispatchAll();
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
@@ -929,4 +938,10 @@
verify(mInputManagerInternal)
.handleKeyGestureInKeyGestureController(anyInt(), any(), anyInt(), eq(gestureType));
}
+
+ void assertNoActivityLaunched() {
+ mTestLooper.dispatchAll();
+ verify(mContext, never()).startActivityAsUser(any(), any(), any());
+ verify(mContext, never()).startActivityAsUser(any(), any());
+ }
}