Merge "Cap alpha to max if SAW + FLAG_NOT_TOUCHABLE" into sc-v2-dev

This commit is contained in:
Bernardo Rufino
2022-03-25 13:55:52 +00:00
committed by Android (Google) Code Review
2 changed files with 40 additions and 0 deletions

View File

@@ -967,6 +967,26 @@ public class DisplayPolicy {
break;
}
if (LayoutParams.isSystemAlertWindowType(attrs.type)) {
float maxOpacity = mService.mMaximumObscuringOpacityForTouch;
if (attrs.alpha > maxOpacity
&& (attrs.flags & FLAG_NOT_TOUCHABLE) != 0
&& (attrs.privateFlags & PRIVATE_FLAG_TRUSTED_OVERLAY) == 0) {
// The app is posting a SAW with the intent of letting touches pass through, but
// they are going to be deemed untrusted and will be blocked. Try to honor the
// intent of letting touches pass through at the cost of 0.2 opacity for app
// compatibility reasons. More details on b/218777508.
Slog.w(TAG, String.format(
"App %s has a system alert window (type = %d) with FLAG_NOT_TOUCHABLE and "
+ "LayoutParams.alpha = %.2f > %.2f, setting alpha to %.2f to "
+ "let touches pass through (if this is isn't desirable, remove "
+ "flag FLAG_NOT_TOUCHABLE).",
attrs.packageName, attrs.type, attrs.alpha, maxOpacity, maxOpacity));
attrs.alpha = maxOpacity;
win.mWinAnimator.mAlpha = maxOpacity;
}
}
// Check if alternate bars positions were updated.
if (mStatusBarAlt == win) {
mStatusBarAltPosition = getAltBarPosition(attrs);

View File

@@ -769,6 +769,9 @@ public class WindowManagerService extends IWindowManager.Stub
private final DisplayHashController mDisplayHashController;
volatile float mMaximumObscuringOpacityForTouch =
InputManager.DEFAULT_MAXIMUM_OBSCURING_OPACITY_FOR_TOUCH;
@VisibleForTesting
final WindowContextListenerController mWindowContextListenerController =
new WindowContextListenerController();
@@ -801,6 +804,8 @@ public class WindowManagerService extends IWindowManager.Stub
DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR);
private final Uri mDisplaySettingsPathUri = Settings.Global.getUriFor(
DEVELOPMENT_WM_DISPLAY_SETTINGS_PATH);
private final Uri mMaximumObscuringOpacityForTouchUri = Settings.Global.getUriFor(
Settings.Global.MAXIMUM_OBSCURING_OPACITY_FOR_TOUCH);
public SettingsObserver() {
super(new Handler());
@@ -827,6 +832,8 @@ public class WindowManagerService extends IWindowManager.Stub
UserHandle.USER_ALL);
resolver.registerContentObserver(mDisplaySettingsPathUri, false, this,
UserHandle.USER_ALL);
resolver.registerContentObserver(mMaximumObscuringOpacityForTouchUri, false, this,
UserHandle.USER_ALL);
}
@Override
@@ -875,6 +882,11 @@ public class WindowManagerService extends IWindowManager.Stub
return;
}
if (mMaximumObscuringOpacityForTouchUri.equals(uri)) {
updateMaximumObscuringOpacityForTouch();
return;
}
@UpdateAnimationScaleMode
final int mode;
if (mWindowAnimationScaleUri.equals(uri)) {
@@ -894,6 +906,14 @@ public class WindowManagerService extends IWindowManager.Stub
void loadSettings() {
updateSystemUiSettings(false /* handleChange */);
updatePointerLocation();
updateMaximumObscuringOpacityForTouch();
}
void updateMaximumObscuringOpacityForTouch() {
ContentResolver resolver = mContext.getContentResolver();
mMaximumObscuringOpacityForTouch = Settings.Global.getFloat(resolver,
Settings.Global.MAXIMUM_OBSCURING_OPACITY_FOR_TOUCH,
InputManager.DEFAULT_MAXIMUM_OBSCURING_OPACITY_FOR_TOUCH);
}
void updateSystemUiSettings(boolean handleChange) {