diff options
| -rw-r--r-- | core/java/android/hardware/input/IInputManager.aidl | 4 | ||||
| -rw-r--r-- | core/java/android/hardware/input/input_framework.aconfig | 11 | ||||
| -rw-r--r-- | core/res/Android.bp | 1 | ||||
| -rw-r--r-- | core/res/AndroidManifest.xml | 3 | ||||
| -rw-r--r-- | services/core/java/com/android/server/input/InputManagerService.java | 45 |
5 files changed, 52 insertions, 12 deletions
diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl index 83f268517dab..2d96bbaae901 100644 --- a/core/java/android/hardware/input/IInputManager.aidl +++ b/core/java/android/hardware/input/IInputManager.aidl @@ -241,12 +241,12 @@ interface IInputManager { KeyGlyphMap getKeyGlyphMap(int deviceId); - @EnforcePermission("MANAGE_KEY_GESTURES") + @PermissionManuallyEnforced @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + "android.Manifest.permission.MANAGE_KEY_GESTURES)") void registerKeyGestureEventListener(IKeyGestureEventListener listener); - @EnforcePermission("MANAGE_KEY_GESTURES") + @PermissionManuallyEnforced @JavaPassthrough(annotation="@android.annotation.RequiresPermission(value = " + "android.Manifest.permission.MANAGE_KEY_GESTURES)") void unregisterKeyGestureEventListener(IKeyGestureEventListener listener); diff --git a/core/java/android/hardware/input/input_framework.aconfig b/core/java/android/hardware/input/input_framework.aconfig index 077bd821db02..764941fc3dd0 100644 --- a/core/java/android/hardware/input/input_framework.aconfig +++ b/core/java/android/hardware/input/input_framework.aconfig @@ -101,6 +101,17 @@ flag { } flag { + namespace: "input_native" + name: "manage_key_gestures" + description: "Manage key gestures through Input APIs" + is_exported: true + bug: "358569822" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "keyboard_repeat_keys" namespace: "input" description: "Allow configurable timeout before key repeat and repeat delay rate for key repeats" diff --git a/core/res/Android.bp b/core/res/Android.bp index bcc0a975b913..17d7bfa40f90 100644 --- a/core/res/Android.bp +++ b/core/res/Android.bp @@ -167,6 +167,7 @@ android_app { "android.os.flags-aconfig", "android.os.vibrator.flags-aconfig", "android.media.tv.flags-aconfig", + "com.android.hardware.input.input-aconfig", ], } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 5decf7f7c2f7..a19b71c68deb 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -8171,7 +8171,8 @@ <p>Not for use by third-party applications. @hide --> <permission android:name="android.permission.MANAGE_KEY_GESTURES" - android:protectionLevel="signature" /> + android:protectionLevel="signature" + android:featureFlag="com.android.hardware.input.manage_key_gestures" /> <uses-permission android:name="android.permission.HANDLE_QUERY_PACKAGE_RESTART" /> diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 52bf5379d367..84cee7ecbd05 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -26,6 +26,8 @@ import android.Manifest; import android.annotation.EnforcePermission; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.PermissionManuallyEnforced; +import android.annotation.RequiresPermission; import android.annotation.UserIdInt; import android.app.ActivityManagerInternal; import android.bluetooth.BluetoothAdapter; @@ -35,6 +37,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.graphics.PixelFormat; import android.graphics.PointF; import android.hardware.SensorPrivacyManager; @@ -84,7 +87,6 @@ import android.os.VibrationEffect; import android.os.vibrator.StepSegment; import android.os.vibrator.VibrationEffectSegment; import android.provider.DeviceConfig; -import android.provider.Settings; import android.text.TextUtils; import android.util.ArrayMap; import android.util.IndentingPrintWriter; @@ -125,7 +127,6 @@ import com.android.server.Watchdog; import com.android.server.input.InputManagerInternal.LidSwitchCallback; import com.android.server.input.debug.FocusEventDebugView; import com.android.server.input.debug.TouchpadDebugViewController; -import com.android.server.inputmethod.InputMethodManagerInternal; import com.android.server.policy.WindowManagerPolicy; import libcore.io.IoUtils; @@ -175,7 +176,7 @@ public class InputManagerService extends IInputManager.Stub private final InputManagerHandler mHandler; private DisplayManagerInternal mDisplayManagerInternal; - private InputMethodManagerInternal mInputMethodManagerInternal; + private PackageManagerInternal mPackageManagerInternal; private final File mDoubleTouchGestureEnableFile; @@ -546,8 +547,7 @@ public class InputManagerService extends IInputManager.Stub } mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); - mInputMethodManagerInternal = - LocalServices.getService(InputMethodManagerInternal.class); + mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); mSettingsObserver.registerAndUpdate(); @@ -2740,21 +2740,48 @@ public class InputManagerService extends IInputManager.Stub lockedModifierState); } + /** + * Enforces the caller contains the necessary permission to manage key gestures. + */ + @RequiresPermission(Manifest.permission.MANAGE_KEY_GESTURES) + private void enforceManageKeyGesturePermission() { + // TODO(b/361567988): Use @EnforcePermission to enforce permission once flag guarding the + // permission is rolled out + String systemUIPackage = mContext.getString(R.string.config_systemUi); + int systemUIAppId = UserHandle.getAppId(mPackageManagerInternal + .getPackageUid(systemUIPackage, PackageManager.MATCH_SYSTEM_ONLY, + UserHandle.USER_SYSTEM)); + if (UserHandle.getCallingAppId() == systemUIAppId) { + return; + } + if (mContext.checkCallingOrSelfPermission( + Manifest.permission.MANAGE_KEY_GESTURES) == PackageManager.PERMISSION_GRANTED) { + return; + } + + String message = "Managing Key Gestures requires the following permission: " + + Manifest.permission.MANAGE_KEY_GESTURES; + throw new SecurityException(message); + } + + @Override - @EnforcePermission(Manifest.permission.MANAGE_KEY_GESTURES) + @PermissionManuallyEnforced public void registerKeyGestureEventListener( @NonNull IKeyGestureEventListener listener) { - super.registerKeyGestureEventListener_enforcePermission(); + enforceManageKeyGesturePermission(); + Objects.requireNonNull(listener); mKeyGestureController.registerKeyGestureEventListener(listener, Binder.getCallingPid()); } @Override - @EnforcePermission(Manifest.permission.MANAGE_KEY_GESTURES) + @PermissionManuallyEnforced public void unregisterKeyGestureEventListener( @NonNull IKeyGestureEventListener listener) { - super.unregisterKeyGestureEventListener_enforcePermission(); + enforceManageKeyGesturePermission(); + Objects.requireNonNull(listener); mKeyGestureController.unregisterKeyGestureEventListener(listener, Binder.getCallingPid()); |