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 b5fa0a6c5e
commit cccf19150f
4 changed files with 25 additions and 17 deletions

View File

@@ -5000,6 +5000,10 @@
<!-- Allows input events to be monitored. Very dangerous! @hide -->
<permission android:name="android.permission.MONITOR_INPUT"
android:protectionLevel="signature" />
<!-- 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" />
<!-- Allows the caller to change the associations between input devices and displays.
Very dangerous! @hide -->
<permission android:name="android.permission.ASSOCIATE_INPUT_DEVICE_TO_DISPLAY_BY_PORT"

View File

@@ -113,6 +113,7 @@
<uses-permission android:name="android.permission.SET_ORIENTATION" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.MONITOR_INPUT" />
<uses-permission android:name="android.permission.ALLOW_SLIPPERY_TOUCHES" />
<!-- DreamManager -->
<uses-permission android:name="android.permission.READ_DREAM_STATE" />

View File

@@ -62,7 +62,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_NO_LIMITS;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
import static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY;
import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
import static android.view.WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
@@ -834,20 +833,6 @@ public class DisplayPolicy {
== 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
* to do things like ensure that windows of a specific type can't take
@@ -931,7 +916,6 @@ public class DisplayPolicy {
}
break;
}
attrs.flags = sanitizeFlagSlippery(attrs.flags, attrs.privateFlags, win.getName());
}
/**

View File

@@ -1566,6 +1566,7 @@ public class WindowManagerService extends IWindowManager.Stub
final DisplayPolicy displayPolicy = displayContent.getDisplayPolicy();
displayPolicy.adjustWindowParamsLw(win, win.mAttrs, callingPid, callingUid);
attrs.flags = sanitizeFlagSlippery(attrs.flags, win.getName(), callingUid, callingPid);
res = displayPolicy.validateAddingWindowLw(attrs, callingPid, callingUid);
if (res != WindowManagerGlobal.ADD_OKAY) {
@@ -2150,6 +2151,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (attrs != null) {
displayPolicy.adjustWindowParamsLw(win, attrs, pid, uid);
win.mToken.adjustWindowParams(win, attrs);
attrs.flags = sanitizeFlagSlippery(attrs.flags, win.getName(), uid, pid);
// if they don't have the permission, mask out the status bar bits
if (seq == win.mSeq) {
int systemUiVisibility = attrs.systemUiVisibility
@@ -8049,6 +8051,23 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
/**
* 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
* touch input according to it's on-screen geometry.
@@ -8087,7 +8106,7 @@ public class WindowManagerService extends IWindowManager.Stub
h.token = channelToken;
h.name = name;
flags = DisplayPolicy.sanitizeFlagSlippery(flags, privateFlags, name);
flags = sanitizeFlagSlippery(flags, name, callingUid, callingPid);
final int sanitizedFlags = flags & (LayoutParams.FLAG_NOT_TOUCHABLE | FLAG_SLIPPERY);
h.layoutParamsFlags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | sanitizedFlags;