Add ALLOW_SLIPPERY_TOUCHES permission

This permission allows the app to use FLAG_SLIPPERY. This means, windows
of the app that has this permission can let touches slip out when the
finger moves out of the window bounds.

Bug: 157929241
Bug: 206188649
Test: atest FlagSlipperyTest
Change-Id: I9ccdfd298f32c36b9c4da68c2e9c355c97dc7593
Merged-In: I9ccdfd298f32c36b9c4da68c2e9c355c97dc7593
This commit is contained in:
Siarhei Vishniakou
2021-11-29 09:07:25 -08:00
parent 7814c61670
commit d732692ba7
4 changed files with 25 additions and 18 deletions

View File

@@ -5659,6 +5659,10 @@
<!-- Allows input events to be monitored. Very dangerous! @hide --> <!-- Allows input events to be monitored. Very dangerous! @hide -->
<permission android:name="android.permission.MONITOR_INPUT" <permission android:name="android.permission.MONITOR_INPUT"
android:protectionLevel="signature|recents" /> android:protectionLevel="signature|recents" />
<!-- Allows the use of FLAG_SLIPPERY, which permits touch events to slip from the current
window to the window where the touch currently is on top of. @hide -->
<permission android:name="android.permission.ALLOW_SLIPPERY_TOUCHES"
android:protectionLevel="signature|recents" />
<!-- Allows the caller to change the associations between input devices and displays. <!-- Allows the caller to change the associations between input devices and displays.
Very dangerous! @hide --> Very dangerous! @hide -->
<permission android:name="android.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY" <permission android:name="android.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY"

View File

@@ -121,6 +121,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.ALLOW_SLIPPERY_TOUCHES" />
<uses-permission android:name="android.permission.INPUT_CONSUMER" /> <uses-permission android:name="android.permission.INPUT_CONSUMER" />
<!-- DreamManager --> <!-- DreamManager -->

View File

@@ -56,7 +56,6 @@ import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
@@ -846,20 +845,6 @@ public class DisplayPolicy {
== PackageManager.PERMISSION_GRANTED; == PackageManager.PERMISSION_GRANTED;
} }
/**
* Only trusted overlays are allowed to use FLAG_SLIPPERY.
*/
static int sanitizeFlagSlippery(int flags, int privateFlags, String name) {
if ((flags & FLAG_SLIPPERY) == 0) {
return flags;
}
if ((privateFlags & PRIVATE_FLAG_TRUSTED_OVERLAY) != 0) {
return flags;
}
Slog.w(TAG, "Removing FLAG_SLIPPERY for non-trusted overlay " + name);
return flags & ~FLAG_SLIPPERY;
}
/** /**
* Sanitize the layout parameters coming from a client. Allows the policy * Sanitize the layout parameters coming from a client. Allows the policy
* to do things like ensure that windows of a specific type can't take * to do things like ensure that windows of a specific type can't take
@@ -940,8 +925,6 @@ public class DisplayPolicy {
if (mExtraNavBarAlt == win) { if (mExtraNavBarAlt == win) {
mExtraNavBarAltPosition = getAltBarPosition(attrs); mExtraNavBarAltPosition = getAltBarPosition(attrs);
} }
attrs.flags = sanitizeFlagSlippery(attrs.flags, attrs.privateFlags, win.getName());
} }
/** /**

View File

@@ -1678,6 +1678,7 @@ public class WindowManagerService extends IWindowManager.Stub
final DisplayPolicy displayPolicy = displayContent.getDisplayPolicy(); final DisplayPolicy displayPolicy = displayContent.getDisplayPolicy();
displayPolicy.adjustWindowParamsLw(win, win.mAttrs); displayPolicy.adjustWindowParamsLw(win, win.mAttrs);
attrs.flags = sanitizeFlagSlippery(attrs.flags, win.getName(), callingUid, callingPid);
win.updateRequestedVisibility(requestedVisibility); win.updateRequestedVisibility(requestedVisibility);
res = displayPolicy.validateAddingWindowLw(attrs, callingPid, callingUid); res = displayPolicy.validateAddingWindowLw(attrs, callingPid, callingUid);
@@ -2240,6 +2241,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (attrs != null) { if (attrs != null) {
displayPolicy.adjustWindowParamsLw(win, attrs); displayPolicy.adjustWindowParamsLw(win, attrs);
win.mToken.adjustWindowParams(win, attrs); win.mToken.adjustWindowParams(win, attrs);
attrs.flags = sanitizeFlagSlippery(attrs.flags, win.getName(), uid, pid);
int disableFlags = int disableFlags =
(attrs.systemUiVisibility | attrs.subtreeSystemUiVisibility) & DISABLE_MASK; (attrs.systemUiVisibility | attrs.subtreeSystemUiVisibility) & DISABLE_MASK;
if (disableFlags != 0 && !hasStatusBarPermission(pid, uid)) { if (disableFlags != 0 && !hasStatusBarPermission(pid, uid)) {
@@ -8178,6 +8180,23 @@ public class WindowManagerService extends IWindowManager.Stub
mAtmService.setFocusedTask(task.mTaskId); mAtmService.setFocusedTask(task.mTaskId);
} }
/**
* You need ALLOW_SLIPPERY_TOUCHES permission to be able to set FLAG_SLIPPERY.
*/
private int sanitizeFlagSlippery(int flags, String windowName, int callingUid, int callingPid) {
if ((flags & FLAG_SLIPPERY) == 0) {
return flags;
}
final int permissionResult = mContext.checkPermission(
android.Manifest.permission.ALLOW_SLIPPERY_TOUCHES, callingPid, callingUid);
if (permissionResult != PackageManager.PERMISSION_GRANTED) {
Slog.w(TAG, "Removing FLAG_SLIPPERY from '" + windowName
+ "' because it doesn't have ALLOW_SLIPPERY_TOUCHES permission");
return flags & ~FLAG_SLIPPERY;
}
return flags;
}
/** /**
* Assigns an InputChannel to a SurfaceControl and configures it to receive * Assigns an InputChannel to a SurfaceControl and configures it to receive
* touch input according to it's on-screen geometry. * touch input according to it's on-screen geometry.
@@ -8216,7 +8235,7 @@ public class WindowManagerService extends IWindowManager.Stub
h.token = channelToken; h.token = channelToken;
h.name = name; h.name = name;
flags = DisplayPolicy.sanitizeFlagSlippery(flags, privateFlags, name); flags = sanitizeFlagSlippery(flags, name, callingUid, callingPid);
final int sanitizedFlags = flags & (LayoutParams.FLAG_NOT_TOUCHABLE final int sanitizedFlags = flags & (LayoutParams.FLAG_NOT_TOUCHABLE
| FLAG_SLIPPERY | LayoutParams.FLAG_NOT_FOCUSABLE); | FLAG_SLIPPERY | LayoutParams.FLAG_NOT_FOCUSABLE);