Merge "Only update the compat system UI visibility if the source is valid" into tm-dev
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user