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:
@@ -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"
|
||||||
|
|||||||
@@ -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 -->
|
||||||
|
|||||||
@@ -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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user