Loading core/res/AndroidManifest.xml +4 −0 Original line number Original line Diff line number Diff line Loading @@ -5036,6 +5036,10 @@ <permission android:name="android.permission.ACCESS_LOCUS_ID_USAGE_STATS" <permission android:name="android.permission.ACCESS_LOCUS_ID_USAGE_STATS" android:protectionLevel="signature|appPredictor" /> android:protectionLevel="signature|appPredictor" /> <!-- @hide Allows an application to create/destroy input consumer. --> <permission android:name="android.permission.INPUT_CONSUMER" android:protectionLevel="signature" /> <!-- Attribution for Country Detector. --> <!-- Attribution for Country Detector. --> <attribution android:tag="CountryDetector" android:label="@string/country_detector"/> <attribution android:tag="CountryDetector" android:label="@string/country_detector"/> <!-- Attribution for Location service. --> <!-- Attribution for Location service. --> Loading packages/SystemUI/AndroidManifest.xml +1 −0 Original line number Original line Diff line number Diff line Loading @@ -113,6 +113,7 @@ <uses-permission android:name="android.permission.SET_ORIENTATION" /> <uses-permission android:name="android.permission.SET_ORIENTATION" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.MONITOR_INPUT" /> <uses-permission android:name="android.permission.MONITOR_INPUT" /> <uses-permission android:name="android.permission.INPUT_CONSUMER" /> <!-- DreamManager --> <!-- DreamManager --> <uses-permission android:name="android.permission.READ_DREAM_STATE" /> <uses-permission android:name="android.permission.READ_DREAM_STATE" /> Loading services/core/java/com/android/server/wm/InputMonitor.java +10 −3 Original line number Original line Diff line number Diff line Loading @@ -219,6 +219,11 @@ final class InputMonitor { WindowManagerPolicy.InputConsumer createInputConsumer(Looper looper, String name, WindowManagerPolicy.InputConsumer createInputConsumer(Looper looper, String name, InputEventReceiver.Factory inputEventReceiverFactory) { InputEventReceiver.Factory inputEventReceiverFactory) { if (!name.contentEquals(INPUT_CONSUMER_NAVIGATION)) { throw new IllegalArgumentException("Illegal input consumer : " + name + ", display: " + mDisplayId); } if (mInputConsumers.containsKey(name)) { if (mInputConsumers.containsKey(name)) { throw new IllegalStateException("Existing input consumer found with name: " + name throw new IllegalStateException("Existing input consumer found with name: " + name + ", display: " + mDisplayId); + ", display: " + mDisplayId); Loading Loading @@ -248,6 +253,11 @@ final class InputMonitor { // stack, and we need FLAG_NOT_TOUCH_MODAL to ensure other events fall through // stack, and we need FLAG_NOT_TOUCH_MODAL to ensure other events fall through consumer.mWindowHandle.layoutParamsFlags |= FLAG_NOT_TOUCH_MODAL; consumer.mWindowHandle.layoutParamsFlags |= FLAG_NOT_TOUCH_MODAL; break; break; case INPUT_CONSUMER_RECENTS_ANIMATION: break; default: throw new IllegalArgumentException("Illegal input consumer : " + name + ", display: " + mDisplayId); } } addInputConsumer(name, consumer); addInputConsumer(name, consumer); } } Loading Loading @@ -459,9 +469,6 @@ final class InputMonitor { mDisplayContent.forAllWindows(this, mDisplayContent.forAllWindows(this, true /* traverseTopToBottom */); true /* traverseTopToBottom */); if (mAddWallpaperInputConsumerHandle) { mWallpaperInputConsumer.show(mInputTransaction, 0); } if (!mUpdateInputWindowsImmediately) { if (!mUpdateInputWindowsImmediately) { mDisplayContent.getPendingTransaction().merge(mInputTransaction); mDisplayContent.getPendingTransaction().merge(mInputTransaction); mDisplayContent.scheduleAnimation(); mDisplayContent.scheduleAnimation(); Loading services/core/java/com/android/server/wm/WindowManagerService.java +11 −0 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.wm; package com.android.server.wm; import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS; import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS; import static android.Manifest.permission.INPUT_CONSUMER; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS; import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS; import static android.Manifest.permission.MANAGE_APP_TOKENS; import static android.Manifest.permission.MANAGE_APP_TOKENS; Loading Loading @@ -5886,6 +5887,11 @@ public class WindowManagerService extends IWindowManager.Stub @Override @Override public void createInputConsumer(IBinder token, String name, int displayId, public void createInputConsumer(IBinder token, String name, int displayId, InputChannel inputChannel) { InputChannel inputChannel) { if (!mAtmInternal.isCallerRecents(Binder.getCallingUid()) && mContext.checkCallingOrSelfPermission(INPUT_CONSUMER) != PERMISSION_GRANTED) { throw new SecurityException("createInputConsumer requires INPUT_CONSUMER permission"); } synchronized (mGlobalLock) { synchronized (mGlobalLock) { DisplayContent display = mRoot.getDisplayContent(displayId); DisplayContent display = mRoot.getDisplayContent(displayId); if (display != null) { if (display != null) { Loading @@ -5897,6 +5903,11 @@ public class WindowManagerService extends IWindowManager.Stub @Override @Override public boolean destroyInputConsumer(String name, int displayId) { public boolean destroyInputConsumer(String name, int displayId) { if (!mAtmInternal.isCallerRecents(Binder.getCallingUid()) && mContext.checkCallingOrSelfPermission(INPUT_CONSUMER) != PERMISSION_GRANTED) { throw new SecurityException("destroyInputConsumer requires INPUT_CONSUMER permission"); } synchronized (mGlobalLock) { synchronized (mGlobalLock) { DisplayContent display = mRoot.getDisplayContent(displayId); DisplayContent display = mRoot.getDisplayContent(displayId); if (display != null) { if (display != null) { Loading Loading
core/res/AndroidManifest.xml +4 −0 Original line number Original line Diff line number Diff line Loading @@ -5036,6 +5036,10 @@ <permission android:name="android.permission.ACCESS_LOCUS_ID_USAGE_STATS" <permission android:name="android.permission.ACCESS_LOCUS_ID_USAGE_STATS" android:protectionLevel="signature|appPredictor" /> android:protectionLevel="signature|appPredictor" /> <!-- @hide Allows an application to create/destroy input consumer. --> <permission android:name="android.permission.INPUT_CONSUMER" android:protectionLevel="signature" /> <!-- Attribution for Country Detector. --> <!-- Attribution for Country Detector. --> <attribution android:tag="CountryDetector" android:label="@string/country_detector"/> <attribution android:tag="CountryDetector" android:label="@string/country_detector"/> <!-- Attribution for Location service. --> <!-- Attribution for Location service. --> Loading
packages/SystemUI/AndroidManifest.xml +1 −0 Original line number Original line Diff line number Diff line Loading @@ -113,6 +113,7 @@ <uses-permission android:name="android.permission.SET_ORIENTATION" /> <uses-permission android:name="android.permission.SET_ORIENTATION" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.MONITOR_INPUT" /> <uses-permission android:name="android.permission.MONITOR_INPUT" /> <uses-permission android:name="android.permission.INPUT_CONSUMER" /> <!-- DreamManager --> <!-- DreamManager --> <uses-permission android:name="android.permission.READ_DREAM_STATE" /> <uses-permission android:name="android.permission.READ_DREAM_STATE" /> Loading
services/core/java/com/android/server/wm/InputMonitor.java +10 −3 Original line number Original line Diff line number Diff line Loading @@ -219,6 +219,11 @@ final class InputMonitor { WindowManagerPolicy.InputConsumer createInputConsumer(Looper looper, String name, WindowManagerPolicy.InputConsumer createInputConsumer(Looper looper, String name, InputEventReceiver.Factory inputEventReceiverFactory) { InputEventReceiver.Factory inputEventReceiverFactory) { if (!name.contentEquals(INPUT_CONSUMER_NAVIGATION)) { throw new IllegalArgumentException("Illegal input consumer : " + name + ", display: " + mDisplayId); } if (mInputConsumers.containsKey(name)) { if (mInputConsumers.containsKey(name)) { throw new IllegalStateException("Existing input consumer found with name: " + name throw new IllegalStateException("Existing input consumer found with name: " + name + ", display: " + mDisplayId); + ", display: " + mDisplayId); Loading Loading @@ -248,6 +253,11 @@ final class InputMonitor { // stack, and we need FLAG_NOT_TOUCH_MODAL to ensure other events fall through // stack, and we need FLAG_NOT_TOUCH_MODAL to ensure other events fall through consumer.mWindowHandle.layoutParamsFlags |= FLAG_NOT_TOUCH_MODAL; consumer.mWindowHandle.layoutParamsFlags |= FLAG_NOT_TOUCH_MODAL; break; break; case INPUT_CONSUMER_RECENTS_ANIMATION: break; default: throw new IllegalArgumentException("Illegal input consumer : " + name + ", display: " + mDisplayId); } } addInputConsumer(name, consumer); addInputConsumer(name, consumer); } } Loading Loading @@ -459,9 +469,6 @@ final class InputMonitor { mDisplayContent.forAllWindows(this, mDisplayContent.forAllWindows(this, true /* traverseTopToBottom */); true /* traverseTopToBottom */); if (mAddWallpaperInputConsumerHandle) { mWallpaperInputConsumer.show(mInputTransaction, 0); } if (!mUpdateInputWindowsImmediately) { if (!mUpdateInputWindowsImmediately) { mDisplayContent.getPendingTransaction().merge(mInputTransaction); mDisplayContent.getPendingTransaction().merge(mInputTransaction); mDisplayContent.scheduleAnimation(); mDisplayContent.scheduleAnimation(); Loading
services/core/java/com/android/server/wm/WindowManagerService.java +11 −0 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.server.wm; package com.android.server.wm; import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS; import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS; import static android.Manifest.permission.INPUT_CONSUMER; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS; import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS; import static android.Manifest.permission.MANAGE_APP_TOKENS; import static android.Manifest.permission.MANAGE_APP_TOKENS; Loading Loading @@ -5886,6 +5887,11 @@ public class WindowManagerService extends IWindowManager.Stub @Override @Override public void createInputConsumer(IBinder token, String name, int displayId, public void createInputConsumer(IBinder token, String name, int displayId, InputChannel inputChannel) { InputChannel inputChannel) { if (!mAtmInternal.isCallerRecents(Binder.getCallingUid()) && mContext.checkCallingOrSelfPermission(INPUT_CONSUMER) != PERMISSION_GRANTED) { throw new SecurityException("createInputConsumer requires INPUT_CONSUMER permission"); } synchronized (mGlobalLock) { synchronized (mGlobalLock) { DisplayContent display = mRoot.getDisplayContent(displayId); DisplayContent display = mRoot.getDisplayContent(displayId); if (display != null) { if (display != null) { Loading @@ -5897,6 +5903,11 @@ public class WindowManagerService extends IWindowManager.Stub @Override @Override public boolean destroyInputConsumer(String name, int displayId) { public boolean destroyInputConsumer(String name, int displayId) { if (!mAtmInternal.isCallerRecents(Binder.getCallingUid()) && mContext.checkCallingOrSelfPermission(INPUT_CONSUMER) != PERMISSION_GRANTED) { throw new SecurityException("destroyInputConsumer requires INPUT_CONSUMER permission"); } synchronized (mGlobalLock) { synchronized (mGlobalLock) { DisplayContent display = mRoot.getDisplayContent(displayId); DisplayContent display = mRoot.getDisplayContent(displayId); if (display != null) { if (display != null) { Loading