Merge changes from topic "toast-security-fix-sc-dev" into sc-dev

* changes:
  Drop input for toast and child surfaces
  SurfaceControl: Add setDropInputMode api
This commit is contained in:
Vishnu Nair
2022-02-07 23:22:22 +00:00
committed by Android (Google) Code Review
5 changed files with 40 additions and 1 deletions

View File

@@ -113,6 +113,7 @@ filegroup {
":gatekeeper_aidl", ":gatekeeper_aidl",
":gsiservice_aidl", ":gsiservice_aidl",
":idmap2_aidl", ":idmap2_aidl",
":guiconstants_aidl",
":idmap2_core_aidl", ":idmap2_core_aidl",
":incidentcompanion_aidl", ":incidentcompanion_aidl",
":inputconstants_aidl", ":inputconstants_aidl",

View File

@@ -41,6 +41,7 @@ import android.graphics.PixelFormat;
import android.graphics.Point; import android.graphics.Point;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.Region; import android.graphics.Region;
import android.gui.DropInputMode;
import android.hardware.HardwareBuffer; import android.hardware.HardwareBuffer;
import android.hardware.display.DeviceProductInfo; import android.hardware.display.DeviceProductInfo;
import android.hardware.display.DisplayedContentSample; import android.hardware.display.DisplayedContentSample;
@@ -150,7 +151,8 @@ public final class SurfaceControl implements Parcelable {
float childRelativeTop, float childRelativeRight, float childRelativeBottom); float childRelativeTop, float childRelativeRight, float childRelativeBottom);
private static native void nativeSetTrustedOverlay(long transactionObj, long nativeObject, private static native void nativeSetTrustedOverlay(long transactionObj, long nativeObject,
boolean isTrustedOverlay); boolean isTrustedOverlay);
private static native void nativeSetDropInputMode(
long transactionObj, long nativeObject, int flags);
private static native boolean nativeClearContentFrameStats(long nativeObject); private static native boolean nativeClearContentFrameStats(long nativeObject);
private static native boolean nativeGetContentFrameStats(long nativeObject, WindowContentFrameStats outStats); private static native boolean nativeGetContentFrameStats(long nativeObject, WindowContentFrameStats outStats);
private static native boolean nativeClearAnimationFrameStats(); private static native boolean nativeClearAnimationFrameStats();
@@ -3426,6 +3428,17 @@ public final class SurfaceControl implements Parcelable {
return this; return this;
} }
/**
* Sets the input event drop mode on this SurfaceControl and its children. The caller must
* hold the ACCESS_SURFACE_FLINGER permission. See {@code InputEventDropMode}.
* @hide
*/
public Transaction setDropInputMode(SurfaceControl sc, @DropInputMode int mode) {
checkPreconditions(sc);
nativeSetDropInputMode(mNativeObject, sc.mNativeObject, mode);
return this;
}
/** /**
* Merge the other transaction into this transaction, clearing the * Merge the other transaction into this transaction, clearing the
* other transaction as if it had been applied. * other transaction as if it had been applied.

View File

@@ -868,6 +868,13 @@ static void nativeSetFixedTransformHint(JNIEnv* env, jclass clazz, jlong transac
transaction->setFixedTransformHint(ctrl, transformHint); transaction->setFixedTransformHint(ctrl, transformHint);
} }
static void nativeSetDropInputMode(JNIEnv* env, jclass clazz, jlong transactionObj,
jlong nativeObject, jint mode) {
auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
transaction->setDropInputMode(ctrl, static_cast<gui::DropInputMode>(mode));
}
static jlongArray nativeGetPhysicalDisplayIds(JNIEnv* env, jclass clazz) { static jlongArray nativeGetPhysicalDisplayIds(JNIEnv* env, jclass clazz) {
const auto displayIds = SurfaceComposerClient::getPhysicalDisplayIds(); const auto displayIds = SurfaceComposerClient::getPhysicalDisplayIds();
jlongArray array = env->NewLongArray(displayIds.size()); jlongArray array = env->NewLongArray(displayIds.size());
@@ -1994,6 +2001,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = {
(void*)nativeGetTransformHint }, (void*)nativeGetTransformHint },
{"nativeSetTrustedOverlay", "(JJZ)V", {"nativeSetTrustedOverlay", "(JJZ)V",
(void*)nativeSetTrustedOverlay }, (void*)nativeSetTrustedOverlay },
{"nativeSetDropInputMode", "(JJI)V",
(void*)nativeSetDropInputMode},
// clang-format on // clang-format on
}; };

View File

@@ -124,6 +124,7 @@ import android.graphics.Insets;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.Region; import android.graphics.Region;
import android.gui.DropInputMode;
import android.hardware.power.Boost; import android.hardware.power.Boost;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
@@ -927,6 +928,20 @@ public class DisplayPolicy {
} }
} }
/**
* Add additional policy if needed to ensure the window or its children should not receive any
* input.
*/
public void setDropInputModePolicy(WindowState win, LayoutParams attrs) {
if (attrs.type == TYPE_TOAST
&& (attrs.privateFlags & PRIVATE_FLAG_TRUSTED_OVERLAY) == 0) {
// Toasts should not receive input. These windows should not have any children, so
// force this hierarchy of windows to drop all input.
mService.mTransactionFactory.get()
.setDropInputMode(win.getSurfaceControl(), DropInputMode.ALL).apply();
}
}
/** /**
* Check if a window can be added to the system. * Check if a window can be added to the system.
* *

View File

@@ -1780,6 +1780,7 @@ public class WindowManagerService extends IWindowManager.Stub
win.mToken.addWindow(win); win.mToken.addWindow(win);
displayPolicy.addWindowLw(win, attrs); displayPolicy.addWindowLw(win, attrs);
displayPolicy.setDropInputModePolicy(win, win.mAttrs);
if (type == TYPE_INPUT_METHOD) { if (type == TYPE_INPUT_METHOD) {
displayContent.setInputMethodWindowLocked(win); displayContent.setInputMethodWindowLocked(win);
imMayMove = false; imMayMove = false;