Merge "Do not dispatch system UI visibility during traversal" into rvc-dev am: 8fd8a538b8

Change-Id: Ief24436d5c61577546d2b99341945d4bdd39ceb9
This commit is contained in:
Tiger Huang
2020-05-14 17:27:13 +00:00
committed by Automerger Merge Worker
6 changed files with 26 additions and 37 deletions

View File

@@ -567,11 +567,15 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
private void updateState(InsetsState newState) {
mState.setDisplayFrame(newState.getDisplayFrame());
for (int i = newState.getSourcesCount() - 1; i >= 0; i--) {
InsetsSource source = newState.sourceAt(i);
getSourceConsumer(source.getType()).updateSource(source);
final InsetsSource source = newState.sourceAt(i);
final int type = source.getType();
final InsetsSourceConsumer consumer = getSourceConsumer(type);
consumer.updateSource(source);
mHost.updateCompatSysUiVisibility(type, source.isVisible(),
consumer.getControl() != null);
}
for (int i = mState.getSourcesCount() - 1; i >= 0; i--) {
InsetsSource source = mState.sourceAt(i);
final InsetsSource source = mState.sourceAt(i);
if (newState.peekSource(source.getType()) == null) {
mState.removeSource(source.getType());
}
@@ -1005,14 +1009,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
updateRequestedState();
}
/**
* @see ViewRootImpl#updateCompatSysUiVisibility(int, boolean, boolean)
*/
public void updateCompatSysUiVisibility(@InternalInsetsType int type, boolean visible,
boolean hasControl) {
mHost.updateCompatSysUiVisibility(type, visible, hasControl);
}
/**
* Called when current window gains focus.
*/

View File

@@ -200,20 +200,12 @@ public class InsetsSourceConsumer {
}
boolean applyLocalVisibilityOverride() {
InsetsSource source = mState.peekSource(mType);
final boolean isVisible = source != null && source.isVisible();
final boolean hasControl = mSourceControl != null;
// We still need to let the legacy app know the visibility change even if we don't have the
// control.
mController.updateCompatSysUiVisibility(
mType, hasControl ? mRequestedVisible : isVisible, hasControl);
// If we don't have control, we are not able to change the visibility.
if (!hasControl) {
if (mSourceControl == null) {
return false;
}
if (isVisible == mRequestedVisible) {
if (mState.getSource(mType).isVisible() == mRequestedVisible) {
return false;
}
mState.getSource(mType).setVisible(mRequestedVisible);

View File

@@ -1976,6 +1976,10 @@ 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.sendMessage(mHandler.obtainMessage(
MSG_DISPATCH_SYSTEM_UI_VISIBILITY, mCompatibleVisibilityInfo));
}
if (mAttachInfo.mKeepScreenOn != oldScreenOn
|| mAttachInfo.mSystemUiVisibility != params.subtreeSystemUiVisibility
|| mAttachInfo.mHasSystemUiListeners != params.hasSystemUiListeners) {
@@ -2029,7 +2033,7 @@ public final class ViewRootImpl implements ViewParent,
info.globalVisibility |= systemUiFlag;
}
if (mDispatchedSystemUiVisibility != info.globalVisibility) {
scheduleTraversals();
mHandler.sendMessage(mHandler.obtainMessage(MSG_DISPATCH_SYSTEM_UI_VISIBILITY, info));
}
}
@@ -2477,9 +2481,6 @@ public final class ViewRootImpl implements ViewParent,
mAttachInfo.mForceReportNewAttributes = false;
params = lp;
}
if (sNewInsetsMode == NEW_INSETS_MODE_FULL) {
handleDispatchSystemUiVisibilityChanged(mCompatibleVisibilityInfo);
}
if (mFirst || mAttachInfo.mViewVisibilityChanged) {
mAttachInfo.mViewVisibilityChanged = false;

View File

@@ -26,11 +26,8 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -98,8 +95,6 @@ public class InsetsAnimationControlImplTest {
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
doNothing().when(mMockController).updateCompatSysUiVisibility(
anyInt(), anyBoolean(), anyBoolean());
mTopLeash = new SurfaceControl.Builder(mSession)
.setName("testSurface")
.build();

View File

@@ -50,7 +50,7 @@ import android.util.Slog;
import android.util.SparseArray;
import android.util.TypedValue;
import android.view.Display;
import android.view.InsetsState;
import android.view.InsetsSource;
import android.view.MagnificationSpec;
import android.view.Surface;
import android.view.Surface.OutOfResourcesException;
@@ -80,6 +80,7 @@ final class AccessibilityController {
private final WindowManagerService mService;
private static final Rect EMPTY_RECT = new Rect();
private static final float[] sTempFloats = new float[9];
public AccessibilityController(WindowManagerService service) {
@@ -1166,9 +1167,9 @@ final class AccessibilityController {
}
static Rect getNavBarInsets(DisplayContent displayContent) {
final InsetsState insetsState =
displayContent.getInsetsStateController().getRawInsetsState();
return insetsState.getSource(ITYPE_NAVIGATION_BAR).getFrame();
final InsetsSource source = displayContent.getInsetsStateController().getRawInsetsState()
.peekSource(ITYPE_NAVIGATION_BAR);
return source != null ? source.getFrame() : EMPTY_RECT;
}
/**

View File

@@ -2032,9 +2032,13 @@ public class DisplayPolicy {
final Rect dfu = displayFrames.mUnrestricted;
Insets insets = Insets.of(0, 0, 0, 0);
for (int i = types.size() - 1; i >= 0; i--) {
insets = Insets.max(insets, mDisplayContent.getInsetsPolicy()
.getInsetsForDispatch(win).getSource(types.valueAt(i))
.calculateInsets(dfu, attrs.isFitInsetsIgnoringVisibility()));
final InsetsSource source = mDisplayContent.getInsetsPolicy()
.getInsetsForDispatch(win).peekSource(types.valueAt(i));
if (source == null) {
continue;
}
insets = Insets.max(insets, source.calculateInsets(
dfu, attrs.isFitInsetsIgnoringVisibility()));
}
final int left = (sidesToFit & Side.LEFT) != 0 ? insets.left : 0;
final int top = (sidesToFit & Side.TOP) != 0 ? insets.top : 0;