From b4eac9b5d69da171468288b8779d8577f0452afe Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Thu, 8 Jul 2021 17:32:28 +0800 Subject: [PATCH] Use the real behavior to decide the animation If the appearance or the behavior are not controlled by APIs, InsetsController will still return the default values, but the internal logic will access the real value. Fix: 192635471 Test: Open an app which hides system bars with SYSTEM_UI_FLAG_IMMERSIVE_STICKY, but not BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE. Change-Id: I1c2f947e3707fcb4c151c1ad19c9cd16527e11d9 --- core/java/android/view/InsetsController.java | 16 ++++++++++++++++ .../view/ViewRootInsetsControllerHost.java | 18 ++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index 145607ada4f4a..6f915c9182d23 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -128,6 +128,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation */ @Appearance int getSystemBarsAppearance(); + default boolean isSystemBarsAppearanceControlled() { + return false; + } + /** * @see WindowInsetsController#setSystemBarsBehavior */ @@ -138,6 +142,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation */ @Behavior int getSystemBarsBehavior(); + default boolean isSystemBarsBehaviorControlled() { + return false; + } + /** * Releases a surface and ensure that this is done after {@link #applySurfaceParams} has * finished applying params. @@ -1520,6 +1528,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @Override public @Appearance int getSystemBarsAppearance() { + if (!mHost.isSystemBarsAppearanceControlled()) { + // We only return the requested appearance, not the implied one. + return 0; + } return mHost.getSystemBarsAppearance(); } @@ -1544,6 +1556,10 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation @Override public @Behavior int getSystemBarsBehavior() { + if (!mHost.isSystemBarsBehaviorControlled()) { + // We only return the requested behavior, not the implied one. + return 0; + } return mHost.getSystemBarsBehavior(); } diff --git a/core/java/android/view/ViewRootInsetsControllerHost.java b/core/java/android/view/ViewRootInsetsControllerHost.java index 27821fd6608dc..ce882da1a6da3 100644 --- a/core/java/android/view/ViewRootInsetsControllerHost.java +++ b/core/java/android/view/ViewRootInsetsControllerHost.java @@ -180,13 +180,14 @@ public class ViewRootInsetsControllerHost implements InsetsController.Host { @Override public int getSystemBarsAppearance() { - if ((mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) == 0) { - // We only return the requested appearance, not the implied one. - return 0; - } return mViewRoot.mWindowAttributes.insetsFlags.appearance; } + @Override + public boolean isSystemBarsAppearanceControlled() { + return (mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) != 0; + } + @Override public void setSystemBarsBehavior(int behavior) { mViewRoot.mWindowAttributes.privateFlags |= PRIVATE_FLAG_BEHAVIOR_CONTROLLED; @@ -199,13 +200,14 @@ public class ViewRootInsetsControllerHost implements InsetsController.Host { @Override public int getSystemBarsBehavior() { - if ((mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_BEHAVIOR_CONTROLLED) == 0) { - // We only return the requested behavior, not the implied one. - return 0; - } return mViewRoot.mWindowAttributes.insetsFlags.behavior; } + @Override + public boolean isSystemBarsBehaviorControlled() { + return (mViewRoot.mWindowAttributes.privateFlags & PRIVATE_FLAG_BEHAVIOR_CONTROLLED) != 0; + } + @Override public void releaseSurfaceControlFromRt(SurfaceControl surfaceControl) {