From 954ce27d13b651e916689ff996700a8987540064 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Thu, 15 Jul 2021 10:35:46 -0700 Subject: [PATCH] Add mechanism for a task's windows to be trusted overlays - Exposes a method to set that a certain part of the SF hierarchy is trusted, and sets this state for tasks in PIP. Bug: 191529039 Test: Manual, try using permission dialog while PIP is active Change-Id: I170cb5a7d22ef569eb36de21cc0bcbef60dd385e --- core/java/android/view/SurfaceControl.java | 13 +++++++++++++ core/jni/android_view_SurfaceControl.cpp | 10 ++++++++++ .../com/android/server/wm/RootWindowContainer.java | 8 ++++++-- services/core/java/com/android/server/wm/Task.java | 4 ++-- .../src/com/android/server/wm/StubTransaction.java | 6 ++++++ 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 4e2f37fde1f79..8143cf953f19b 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -148,6 +148,8 @@ public final class SurfaceControl implements Parcelable { float width, float height, float vecX, float vecY, float maxStretchAmountX, float maxStretchAmountY, float childRelativeLeft, float childRelativeTop, float childRelativeRight, float childRelativeBottom); + private static native void nativeSetTrustedOverlay(long transactionObj, long nativeObject, + boolean isTrustedOverlay); private static native boolean nativeClearContentFrameStats(long nativeObject); private static native boolean nativeGetContentFrameStats(long nativeObject, WindowContentFrameStats outStats); @@ -3413,6 +3415,17 @@ public final class SurfaceControl implements Parcelable { return this; } + /** + * Sets the trusted overlay state on this SurfaceControl and it is inherited to all the + * children. The caller must hold the ACCESS_SURFACE_FLINGER permission. + * @hide + */ + public Transaction setTrustedOverlay(SurfaceControl sc, boolean isTrustedOverlay) { + checkPreconditions(sc); + nativeSetTrustedOverlay(mNativeObject, sc.mNativeObject, isTrustedOverlay); + return this; + } + /** * Merge the other transaction into this transaction, clearing the * other transaction as if it had been applied. diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 1695e1af9270d..8d12df226ffe3 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -823,6 +823,14 @@ static void nativeSetShadowRadius(JNIEnv* env, jclass clazz, jlong transactionOb transaction->setShadowRadius(ctrl, shadowRadius); } +static void nativeSetTrustedOverlay(JNIEnv* env, jclass clazz, jlong transactionObj, + jlong nativeObject, jboolean isTrustedOverlay) { + auto transaction = reinterpret_cast(transactionObj); + + SurfaceControl* const ctrl = reinterpret_cast(nativeObject); + transaction->setTrustedOverlay(ctrl, isTrustedOverlay); +} + static void nativeSetFrameRate(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, jfloat frameRate, jint compatibility, jint changeFrameRateStrategy) { auto transaction = reinterpret_cast(transactionObj); @@ -1984,6 +1992,8 @@ static const JNINativeMethod sSurfaceControlMethods[] = { (void*)nativeSetTransformHint }, {"nativeGetTransformHint", "(J)I", (void*)nativeGetTransformHint }, + {"nativeSetTrustedOverlay", "(JJZ)V", + (void*)nativeSetTrustedOverlay }, // clang-format on }; diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index b6e0d8de31f47..a843c806f0104 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -2206,16 +2206,17 @@ class RootWindowContainer extends WindowContainer ensureActivitiesVisible(null, 0, false /* preserveWindows */); resumeFocusedTasksTopActivities(); - notifyActivityPipModeChanged(r); + notifyActivityPipModeChanged(r.getTask(), r); } /** * Notifies when an activity enters or leaves PIP mode. * + * @param task the task of {@param r} * @param r indicates the activity currently in PIP, can be null to indicate no activity is * currently in PIP mode. */ - void notifyActivityPipModeChanged(@Nullable ActivityRecord r) { + void notifyActivityPipModeChanged(@NonNull Task task, @Nullable ActivityRecord r) { final boolean inPip = r != null; if (inPip) { mService.getTaskChangeNotificationController().notifyActivityPinned(r); @@ -2223,6 +2224,9 @@ class RootWindowContainer extends WindowContainer mService.getTaskChangeNotificationController().notifyActivityUnpinned(); } mWindowManager.mPolicy.setPipVisibilityLw(inPip); + mWmService.mTransactionFactory.get() + .setTrustedOverlay(task.getSurfaceControl(), inPip) + .apply(); } void executeAppTransitionForAllDisplay() { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 382a2b1b5062f..fa8b6a15671c5 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1437,7 +1437,7 @@ class Task extends WindowContainer { && (newParent == null || !newParent.inPinnedWindowingMode())) { // Notify if a task from the root pinned task is being removed // (or moved depending on the mode). - mRootWindowContainer.notifyActivityPipModeChanged(null); + mRootWindowContainer.notifyActivityPipModeChanged(this, null); } } @@ -5394,7 +5394,7 @@ class Task extends WindowContainer { : WINDOWING_MODE_FULLSCREEN; } if (currentMode == WINDOWING_MODE_PINNED) { - mRootWindowContainer.notifyActivityPipModeChanged(null); + mRootWindowContainer.notifyActivityPipModeChanged(this, null); } if (likelyResolvedMode == WINDOWING_MODE_PINNED) { // In the case that we've disabled affecting the SysUI flags as a part of seamlessly diff --git a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java index b89539cabbfe8..3a2190d133549 100644 --- a/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java +++ b/services/tests/wmtests/src/com/android/server/wm/StubTransaction.java @@ -265,4 +265,10 @@ public class StubTransaction extends SurfaceControl.Transaction { public SurfaceControl.Transaction setColorSpace(SurfaceControl sc, ColorSpace colorSpace) { return this; } + + @Override + public SurfaceControl.Transaction setTrustedOverlay(SurfaceControl sc, + boolean isTrustedOverlay) { + return this; + } }