diff options
| author | 2022-05-30 08:40:03 +0000 | |
|---|---|---|
| committer | 2022-05-30 08:40:03 +0000 | |
| commit | 1fab45404b246d03ef9df3adaca1e9b5ef80883d (patch) | |
| tree | e26f55a8e1fadfd010bbc1071127d2de2d56a565 | |
| parent | edfc3fa2aee20d93d2bdbd1d50002395ddf03800 (diff) | |
| parent | 521ba43e12fe38f5178ceab6fc843cfa393f875f (diff) | |
Merge "Only update the compat system UI visibility if the source is valid" into tm-dev
| -rw-r--r-- | core/java/android/view/InsetsSourceConsumer.java | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java index d6b75b94b19a..b17e19998a9d 100644 --- a/core/java/android/view/InsetsSourceConsumer.java +++ b/core/java/android/view/InsetsSourceConsumer.java @@ -36,6 +36,7 @@ import android.annotation.IntDef; import android.annotation.Nullable; import android.graphics.Insets; import android.graphics.Rect; +import android.util.ArraySet; import android.util.Log; import android.util.proto.ProtoOutputStream; import android.view.InsetsState.InternalInsetsType; @@ -272,11 +273,7 @@ public class InsetsSourceConsumer { mController.getHost().getInputMethodManager(), null /* icProto */); } - // We still need to let the legacy app know the visibility change even if we don't have the - // control. If we don't have the source, we don't change the requested visibility for making - // the callback behavior compatible. - mController.updateCompatSysUiVisibility( - mType, (hasControl || source == null) ? mRequestedVisible : isVisible, hasControl); + updateCompatSysUiVisibility(hasControl, source, isVisible); // If we don't have control, we are not able to change the visibility. if (!hasControl) { @@ -294,6 +291,36 @@ public class InsetsSourceConsumer { return true; } + private void updateCompatSysUiVisibility(boolean hasControl, InsetsSource source, + boolean visible) { + final @InsetsType int publicType = InsetsState.toPublicType(mType); + if (publicType != WindowInsets.Type.statusBars() + && publicType != WindowInsets.Type.navigationBars()) { + // System UI visibility only controls status bars and navigation bars. + return; + } + final boolean compatVisible; + if (hasControl) { + compatVisible = mRequestedVisible; + } else if (source != null && !source.getFrame().isEmpty()) { + compatVisible = visible; + } else { + final ArraySet<Integer> types = InsetsState.toInternalType(publicType); + for (int i = types.size() - 1; i >= 0; i--) { + final InsetsSource s = mState.peekSource(types.valueAt(i)); + if (s != null && !s.getFrame().isEmpty()) { + // The compat system UI visibility would be updated by another consumer which + // handles the same public insets type. + return; + } + } + // No one provides the public type. Use the requested visibility for making the callback + // behavior compatible. + compatVisible = mRequestedVisible; + } + mController.updateCompatSysUiVisibility(mType, compatVisible, hasControl); + } + @VisibleForTesting public boolean isRequestedVisible() { return mRequestedVisible; |