Merge "Refine adjustLayoutParamsForCompatibility about fitting insets" into rvc-dev

This commit is contained in:
Tiger Huang
2020-03-02 14:33:39 +00:00
committed by Android (Google) Code Review
2 changed files with 67 additions and 16 deletions

View File

@@ -52,8 +52,6 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_APPEARANCE_CO
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_BEHAVIOR_CONTROLLED; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_BEHAVIOR_CONTROLLED;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FIT_INSETS_CONTROLLED; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FIT_INSETS_CONTROLLED;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
@@ -2009,7 +2007,6 @@ public final class ViewRootImpl implements ViewParent,
final int sysUiVis = inOutParams.systemUiVisibility | inOutParams.subtreeSystemUiVisibility; final int sysUiVis = inOutParams.systemUiVisibility | inOutParams.subtreeSystemUiVisibility;
final int flags = inOutParams.flags; final int flags = inOutParams.flags;
final int type = inOutParams.type; final int type = inOutParams.type;
final int adjust = inOutParams.softInputMode & SOFT_INPUT_MASK_ADJUST;
if ((inOutParams.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) == 0) { if ((inOutParams.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) == 0) {
inOutParams.insetsFlags.appearance = 0; inOutParams.insetsFlags.appearance = 0;
@@ -2054,8 +2051,7 @@ public final class ViewRootImpl implements ViewParent,
} }
if (type == TYPE_TOAST || type == TYPE_SYSTEM_ALERT) { if (type == TYPE_TOAST || type == TYPE_SYSTEM_ALERT) {
ignoreVis = true; ignoreVis = true;
} else if ((types & Type.systemBars()) == Type.systemBars() } else if ((types & Type.systemBars()) == Type.systemBars()) {
&& adjust == SOFT_INPUT_ADJUST_RESIZE) {
types |= Type.ime(); types |= Type.ime();
} }
inOutParams.setFitInsetsTypes(types); inOutParams.setFitInsetsTypes(types);
@@ -2261,7 +2257,8 @@ public final class ViewRootImpl implements ViewParent,
mAttachInfo.mVisibleInsets.set(visibleInsets); mAttachInfo.mVisibleInsets.set(visibleInsets);
} }
InsetsController getInsetsController() { @VisibleForTesting
public InsetsController getInsetsController() {
return mInsetsController; return mInsetsController;
} }

View File

@@ -16,9 +16,13 @@
package android.view; package android.view;
import static android.view.View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; import static android.view.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
import static android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
import static android.view.View.SYSTEM_UI_FLAG_LOW_PROFILE;
import static android.view.WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_TOUCH;
import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
@@ -102,79 +106,129 @@ public class ViewRootImplTest {
} }
@Test @Test
public void adjustLayoutParamsForInsets_layoutFullscreen() { public void adjustLayoutParamsForCompatibility_layoutFullscreen() {
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL); assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION); final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
attrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; attrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs); ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
// Type.statusBars() must be removed.
assertEquals(0, attrs.getFitInsetsTypes() & Type.statusBars()); assertEquals(0, attrs.getFitInsetsTypes() & Type.statusBars());
} }
@Test @Test
public void adjustLayoutParamsForInsets_layoutInScreen() { public void adjustLayoutParamsForCompatibility_layoutInScreen() {
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL); assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION); final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
attrs.flags = FLAG_LAYOUT_IN_SCREEN; attrs.flags = FLAG_LAYOUT_IN_SCREEN;
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs); ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
// Type.statusBars() must be removed.
assertEquals(0, attrs.getFitInsetsTypes() & Type.statusBars()); assertEquals(0, attrs.getFitInsetsTypes() & Type.statusBars());
} }
@Test @Test
public void adjustLayoutParamsForInsets_layoutHideNavigation() { public void adjustLayoutParamsForCompatibility_layoutHideNavigation() {
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL); assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION); final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
attrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION; attrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs); ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
// Type.systemBars() must be removed.
assertEquals(0, attrs.getFitInsetsTypes() & Type.systemBars()); assertEquals(0, attrs.getFitInsetsTypes() & Type.systemBars());
} }
@Test @Test
public void adjustLayoutParamsForInsets_toast() { public void adjustLayoutParamsForCompatibility_toast() {
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL); assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_TOAST); final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_TOAST);
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs); ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
assertEquals(Type.systemBars(), attrs.getFitInsetsTypes() & Type.systemBars());
assertEquals(true, attrs.isFitInsetsIgnoringVisibility()); assertEquals(true, attrs.isFitInsetsIgnoringVisibility());
} }
@Test @Test
public void adjustLayoutParamsForInsets_systemAlert() { public void adjustLayoutParamsForCompatibility_systemAlert() {
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL); assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_SYSTEM_ALERT); final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_SYSTEM_ALERT);
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs); ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
assertEquals(Type.systemBars(), attrs.getFitInsetsTypes() & Type.systemBars());
assertEquals(true, attrs.isFitInsetsIgnoringVisibility()); assertEquals(true, attrs.isFitInsetsIgnoringVisibility());
} }
@Test @Test
public void adjustLayoutParamsForInsets_noAdjust() { public void adjustLayoutParamsForCompatibility_fitSystemBars() {
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
// A window which fits system bars must fit IME, unless its type is toast or system alert.
assertEquals(Type.systemBars() | Type.ime(), attrs.getFitInsetsTypes());
}
@Test
public void adjustLayoutParamsForCompatibility_noAdjustLayout() {
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL); assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION); final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
final int types = Type.all(); final int types = Type.all();
final int sides = Side.TOP | Side.LEFT; final int sides = Side.TOP | Side.LEFT;
final boolean fitMaxInsets = true; final boolean fitMaxInsets = true;
attrs.flags = FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; attrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
attrs.setFitInsetsTypes(types); attrs.setFitInsetsTypes(types);
attrs.setFitInsetsSides(sides); attrs.setFitInsetsSides(sides);
attrs.setFitInsetsIgnoringVisibility(fitMaxInsets); attrs.setFitInsetsIgnoringVisibility(fitMaxInsets);
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs); ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
// Fit-insets related fields must not be adjusted due to legacy system UI visibility
// after calling fit-insets related methods.
assertEquals(types, attrs.getFitInsetsTypes()); assertEquals(types, attrs.getFitInsetsTypes());
assertEquals(sides, attrs.getFitInsetsSides()); assertEquals(sides, attrs.getFitInsetsSides());
assertEquals(fitMaxInsets, attrs.isFitInsetsIgnoringVisibility()); assertEquals(fitMaxInsets, attrs.isFitInsetsIgnoringVisibility());
} }
@Test
public void adjustLayoutParamsForCompatibility_noAdjustAppearance() {
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
final ViewRootImpl viewRoot = mViewRootImpl.get();
final WindowInsetsController controller = viewRoot.getInsetsController();
final WindowManager.LayoutParams attrs = viewRoot.mWindowAttributes;
final int appearance = 0;
controller.setSystemBarsAppearance(appearance, 0xffffffff);
attrs.systemUiVisibility = SYSTEM_UI_FLAG_LOW_PROFILE
| SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
| SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
// Appearance must not be adjusted due to legacy system UI visibility after calling
// setSystemBarsAppearance.
assertEquals(appearance, controller.getSystemBarsAppearance());
}
@Test
public void adjustLayoutParamsForCompatibility_noAdjustBehavior() {
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
final ViewRootImpl viewRoot = mViewRootImpl.get();
final WindowInsetsController controller = viewRoot.getInsetsController();
final WindowManager.LayoutParams attrs = viewRoot.mWindowAttributes;
final int behavior = BEHAVIOR_SHOW_BARS_BY_TOUCH;
controller.setSystemBarsBehavior(behavior);
attrs.systemUiVisibility = SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
// Behavior must not be adjusted due to legacy system UI visibility after calling
// setSystemBarsBehavior.
assertEquals(behavior, controller.getSystemBarsBehavior());
}
private static class ViewRootImplAccessor { private static class ViewRootImplAccessor {
private final ViewRootImpl mViewRootImpl; private final ViewRootImpl mViewRootImpl;