Merge "Introduce INPUT_CONSUMER permission for InputConsumer" into rvc-d1-dev

This commit is contained in:
TreeHugger Robot
2020-11-04 05:21:36 +00:00
committed by Android (Google) Code Review
4 changed files with 26 additions and 3 deletions

View File

@@ -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. -->

View File

@@ -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" />

View File

@@ -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);
@@ -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);
} }
@@ -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();

View File

@@ -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;
@@ -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) {
@@ -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) {