Clear low profile mode while forcing client to show system bars

Forcing client to show system bars would clear system UI flags at the
client side. SYSTEM_UI_FLAG_LOW_PROFILE would be cleared as well in
previous Android versions. This CL makes the behavior compatible.

Fix: 167892531
Test: Steps in the bug
Change-Id: I466a05120a08ac95b619eadd8291fc546d3bb450
This commit is contained in:
Tiger Huang
2020-09-24 17:35:48 +08:00
parent fd55a98702
commit 3b6bdffa44

View File

@@ -1981,11 +1981,7 @@ public final class ViewRootImpl implements ViewParent,
mCompatibleVisibilityInfo.globalVisibility =
(mCompatibleVisibilityInfo.globalVisibility & ~View.SYSTEM_UI_FLAG_LOW_PROFILE)
| (mAttachInfo.mSystemUiVisibility & View.SYSTEM_UI_FLAG_LOW_PROFILE);
if (mDispatchedSystemUiVisibility != mCompatibleVisibilityInfo.globalVisibility) {
mHandler.removeMessages(MSG_DISPATCH_SYSTEM_UI_VISIBILITY);
mHandler.sendMessage(mHandler.obtainMessage(
MSG_DISPATCH_SYSTEM_UI_VISIBILITY, mCompatibleVisibilityInfo));
}
dispatchDispatchSystemUiVisibilityChanged(mCompatibleVisibilityInfo);
if (mAttachInfo.mKeepScreenOn != oldScreenOn
|| mAttachInfo.mSystemUiVisibility != params.subtreeSystemUiVisibility
|| mAttachInfo.mHasSystemUiListeners != params.hasSystemUiListeners) {
@@ -2039,9 +2035,30 @@ public final class ViewRootImpl implements ViewParent,
info.globalVisibility |= systemUiFlag;
info.localChanges &= ~systemUiFlag;
}
if (mDispatchedSystemUiVisibility != info.globalVisibility) {
dispatchDispatchSystemUiVisibilityChanged(info);
}
/**
* If the system is forcing showing any system bar, the legacy low profile flag should be
* cleared for compatibility.
*
* @param showTypes {@link InsetsType types} shown by the system.
* @param fromIme {@code true} if the invocation is from IME.
*/
private void clearLowProfileModeIfNeeded(@InsetsType int showTypes, boolean fromIme) {
final SystemUiVisibilityInfo info = mCompatibleVisibilityInfo;
if ((showTypes & Type.systemBars()) != 0 && !fromIme
&& (info.globalVisibility & SYSTEM_UI_FLAG_LOW_PROFILE) != 0) {
info.globalVisibility &= ~SYSTEM_UI_FLAG_LOW_PROFILE;
info.localChanges |= SYSTEM_UI_FLAG_LOW_PROFILE;
dispatchDispatchSystemUiVisibilityChanged(info);
}
}
private void dispatchDispatchSystemUiVisibilityChanged(SystemUiVisibilityInfo args) {
if (mDispatchedSystemUiVisibility != args.globalVisibility) {
mHandler.removeMessages(MSG_DISPATCH_SYSTEM_UI_VISIBILITY);
mHandler.sendMessage(mHandler.obtainMessage(MSG_DISPATCH_SYSTEM_UI_VISIBILITY, info));
mHandler.sendMessage(mHandler.obtainMessage(MSG_DISPATCH_SYSTEM_UI_VISIBILITY, args));
}
}
@@ -5008,6 +5025,7 @@ public final class ViewRootImpl implements ViewParent,
String.format("Calling showInsets(%d,%b) on window that no longer"
+ " has views.", msg.arg1, msg.arg2 == 1));
}
clearLowProfileModeIfNeeded(msg.arg1, msg.arg2 == 1);
mInsetsController.show(msg.arg1, msg.arg2 == 1);
break;
}