diff options
3 files changed, 65 insertions, 24 deletions
diff --git a/core/java/android/window/TransitionInfo.java b/core/java/android/window/TransitionInfo.java index 1bc8e6d7ef65..8815ab35b671 100644 --- a/core/java/android/window/TransitionInfo.java +++ b/core/java/android/window/TransitionInfo.java @@ -135,8 +135,11 @@ public final class TransitionInfo implements Parcelable { /** This change happened underneath something else. */ public static final int FLAG_IS_OCCLUDED = 1 << 15; + /** The container is a system window, excluding wallpaper and input-method. */ + public static final int FLAG_IS_SYSTEM_WINDOW = 1 << 16; + /** The first unused bit. This can be used by remotes to attach custom flags to this change. */ - public static final int FLAG_FIRST_CUSTOM = 1 << 16; + public static final int FLAG_FIRST_CUSTOM = 1 << 17; /** @hide */ @IntDef(prefix = { "FLAG_" }, value = { @@ -157,6 +160,7 @@ public final class TransitionInfo implements Parcelable { FLAG_CROSS_PROFILE_WORK_THUMBNAIL, FLAG_IS_BEHIND_STARTING_WINDOW, FLAG_IS_OCCLUDED, + FLAG_IS_SYSTEM_WINDOW, FLAG_FIRST_CUSTOM }) public @interface ChangeFlags {} @@ -369,6 +373,9 @@ public final class TransitionInfo implements Parcelable { if ((flags & FLAG_IS_OCCLUDED) != 0) { sb.append(sb.length() == 0 ? "" : "|").append("IS_OCCLUDED"); } + if ((flags & FLAG_IS_SYSTEM_WINDOW) != 0) { + sb.append(sb.length() == 0 ? "" : "|").append("FLAG_IS_SYSTEM_WINDOW"); + } if ((flags & FLAG_FIRST_CUSTOM) != 0) { sb.append(sb.length() == 0 ? "" : "|").append("FIRST_CUSTOM"); } @@ -701,14 +708,37 @@ public final class TransitionInfo implements Parcelable { @Override public String toString() { - String out = "{" + mContainer + "(" + mParent + ") leash=" + mLeash - + " m=" + modeToString(mMode) + " f=" + flagsToString(mFlags) + " sb=" - + mStartAbsBounds + " eb=" + mEndAbsBounds + " eo=" + mEndRelOffset + " r=" - + mStartRotation + "->" + mEndRotation + ":" + mRotationAnimation - + " endFixedRotation=" + mEndFixedRotation; - if (mSnapshot != null) out += " snapshot=" + mSnapshot; - if (mLastParent != null) out += " lastParent=" + mLastParent; - return out + "}"; + final StringBuilder sb = new StringBuilder(); + sb.append('{'); sb.append(mContainer); + sb.append(" m="); sb.append(modeToString(mMode)); + sb.append(" f="); sb.append(flagsToString(mFlags)); + if (mParent != null) { + sb.append(" p="); sb.append(mParent); + } + if (mLeash != null) { + sb.append(" leash="); sb.append(mLeash); + } + sb.append(" sb="); sb.append(mStartAbsBounds); + sb.append(" eb="); sb.append(mEndAbsBounds); + if (mEndRelOffset.x != 0 || mEndRelOffset.y != 0) { + sb.append(" eo="); sb.append(mEndRelOffset); + } + if (mStartRotation != mEndRotation) { + sb.append(" r="); sb.append(mStartRotation); + sb.append("->"); sb.append(mEndRotation); + sb.append(':'); sb.append(mRotationAnimation); + } + if (mEndFixedRotation != ROTATION_UNDEFINED) { + sb.append(" endFixedRotation="); sb.append(mEndFixedRotation); + } + if (mSnapshot != null) { + sb.append(" snapshot="); sb.append(mSnapshot); + } + if (mLastParent != null) { + sb.append(" lastParent="); sb.append(mLastParent); + } + sb.append('}'); + return sb.toString(); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index d1bc7384d78c..db1f19aa87b6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -322,6 +322,11 @@ public class Transitions implements RemoteCallable<Transitions> { boolean isOpening = isOpeningType(info.getType()); for (int i = info.getChanges().size() - 1; i >= 0; --i) { final TransitionInfo.Change change = info.getChanges().get(i); + if ((change.getFlags() & TransitionInfo.FLAG_IS_SYSTEM_WINDOW) != 0) { + // Currently system windows are controlled by WindowState, so don't change their + // surfaces. Otherwise their window tokens could be hidden unexpectedly. + continue; + } final SurfaceControl leash = change.getLeash(); final int mode = info.getChanges().get(i).getMode(); diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index b1862b6f274f..46253c1933b6 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -1878,15 +1878,15 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe flags |= FLAG_TRANSLUCENT; } final Task task = wc.asTask(); - if (task != null && task.voiceSession != null) { - flags |= FLAG_IS_VOICE_INTERACTION; - } if (task != null) { final ActivityRecord topActivity = task.getTopNonFinishingActivity(); if (topActivity != null && topActivity.mStartingData != null && topActivity.mStartingData.hasImeSurface()) { flags |= FLAG_WILL_IME_SHOWN; } + if (task.voiceSession != null) { + flags |= FLAG_IS_VOICE_INTERACTION; + } } Task parentTask = null; final ActivityRecord record = wc.asActivityRecord(); @@ -1914,20 +1914,26 @@ class Transition extends Binder implements BLASTSyncEngine.TransactionReadyListe // Whether the container fills its parent Task bounds. flags |= FLAG_FILLS_TASK; } - } - final DisplayContent dc = wc.asDisplayContent(); - if (dc != null) { - flags |= FLAG_IS_DISPLAY; - if (dc.hasAlertWindowSurfaces()) { - flags |= FLAG_DISPLAY_HAS_ALERT_WINDOWS; + } else { + final DisplayContent dc = wc.asDisplayContent(); + if (dc != null) { + flags |= FLAG_IS_DISPLAY; + if (dc.hasAlertWindowSurfaces()) { + flags |= FLAG_DISPLAY_HAS_ALERT_WINDOWS; + } + } else if (isWallpaper(wc)) { + flags |= FLAG_IS_WALLPAPER; + } else if (isInputMethod(wc)) { + flags |= FLAG_IS_INPUT_METHOD; + } else { + // In this condition, the wc can only be WindowToken or DisplayArea. + final int type = wc.getWindowType(); + if (type >= WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW + && type <= WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) { + flags |= TransitionInfo.FLAG_IS_SYSTEM_WINDOW; + } } } - if (isWallpaper(wc)) { - flags |= FLAG_IS_WALLPAPER; - } - if (isInputMethod(wc)) { - flags |= FLAG_IS_INPUT_METHOD; - } if (occludesKeyguard(wc)) { flags |= FLAG_OCCLUDES_KEYGUARD; } |