summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java12
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowSurfaceController.java5
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java14
4 files changed, 31 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 0893207a1cbe..466075702409 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -4048,12 +4048,20 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
@VisibleForTesting
void setImeInputTarget(InputTarget target) {
mImeInputTarget = target;
- boolean canScreenshot = mImeInputTarget == null || mImeInputTarget.canScreenshotIme();
- if (mImeWindowsContainer.setCanScreenshot(canScreenshot)) {
+ if (refreshImeSecureFlag(getPendingTransaction())) {
mWmService.requestTraversal();
}
}
+ /**
+ * Re-check the IME target's SECURE flag since it's possible to have changed after the target
+ * was set.
+ */
+ boolean refreshImeSecureFlag(Transaction t) {
+ boolean canScreenshot = mImeInputTarget == null || mImeInputTarget.canScreenshotIme();
+ return mImeWindowsContainer.setCanScreenshot(t, canScreenshot);
+ }
+
@VisibleForTesting
void setImeControlTarget(InsetsControlTarget target) {
mImeControlTarget = target;
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 214524c2f42c..2900a5df6198 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -3782,11 +3782,11 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
return INVALID_WINDOW_TYPE;
}
- boolean setCanScreenshot(boolean canScreenshot) {
+ boolean setCanScreenshot(Transaction t, boolean canScreenshot) {
if (mSurfaceControl == null) {
return false;
}
- getPendingTransaction().setSecure(mSurfaceControl, !canScreenshot);
+ t.setSecure(mSurfaceControl, !canScreenshot);
return true;
}
diff --git a/services/core/java/com/android/server/wm/WindowSurfaceController.java b/services/core/java/com/android/server/wm/WindowSurfaceController.java
index c2414e72abbd..5f43800bd9d5 100644
--- a/services/core/java/com/android/server/wm/WindowSurfaceController.java
+++ b/services/core/java/com/android/server/wm/WindowSurfaceController.java
@@ -217,6 +217,11 @@ class WindowSurfaceController {
mService.openSurfaceTransaction();
try {
getGlobalTransaction().setSecure(mSurfaceControl, isSecure);
+
+ final DisplayContent dc = mAnimator.mWin.mDisplayContent;
+ if (dc != null) {
+ dc.refreshImeSecureFlag(getGlobalTransaction());
+ }
} finally {
mService.closeSurfaceTransaction("setSecure");
if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, "<<< CLOSE TRANSACTION setSecureLocked");
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 605726c0e804..118f159bee7b 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -1201,6 +1201,20 @@ public class DisplayContentTests extends WindowTestsBase {
dc.computeImeControlTarget());
}
+ @UseTestDisplay(addWindows = W_INPUT_METHOD)
+ @Test
+ public void testImeSecureFlagGetUpdatedAfterImeInputTarget() {
+ // Verify IME window can get up-to-date secure flag update when the IME input target
+ // set before setCanScreenshot called.
+ final WindowState app = createWindow(null, TYPE_APPLICATION, "app");
+ SurfaceControl.Transaction t = mDisplayContent.mInputMethodWindow.getPendingTransaction();
+ spyOn(t);
+ mDisplayContent.setImeInputTarget(app);
+ mDisplayContent.mInputMethodWindow.setCanScreenshot(t, false /* canScreenshot */);
+
+ verify(t).setSecure(eq(mDisplayContent.mInputMethodWindow.mSurfaceControl), eq(true));
+ }
+
@UseTestDisplay(addWindows = W_ACTIVITY)
@Test
public void testComputeImeControlTarget_notMatchParentBounds() throws Exception {