Merge "Refine adjustLayoutParamsForCompatibility about fitting insets" into rvc-dev am: ec2c4dfffe am: bbcdc027be am: 3af9ee714c
Change-Id: I592fced5487e9f1d2d73802cfe6d4d3ef428e3e1
This commit is contained in:
@@ -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_FIT_INSETS_CONTROLLED;
|
||||
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_STATUS_BAR_PANEL;
|
||||
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 flags = inOutParams.flags;
|
||||
final int type = inOutParams.type;
|
||||
final int adjust = inOutParams.softInputMode & SOFT_INPUT_MASK_ADJUST;
|
||||
|
||||
if ((inOutParams.privateFlags & PRIVATE_FLAG_APPEARANCE_CONTROLLED) == 0) {
|
||||
inOutParams.insetsFlags.appearance = 0;
|
||||
@@ -2054,8 +2051,7 @@ public final class ViewRootImpl implements ViewParent,
|
||||
}
|
||||
if (type == TYPE_TOAST || type == TYPE_SYSTEM_ALERT) {
|
||||
ignoreVis = true;
|
||||
} else if ((types & Type.systemBars()) == Type.systemBars()
|
||||
&& adjust == SOFT_INPUT_ADJUST_RESIZE) {
|
||||
} else if ((types & Type.systemBars()) == Type.systemBars()) {
|
||||
types |= Type.ime();
|
||||
}
|
||||
inOutParams.setFitInsetsTypes(types);
|
||||
@@ -2261,7 +2257,8 @@ public final class ViewRootImpl implements ViewParent,
|
||||
mAttachInfo.mVisibleInsets.set(visibleInsets);
|
||||
}
|
||||
|
||||
InsetsController getInsetsController() {
|
||||
@VisibleForTesting
|
||||
public InsetsController getInsetsController() {
|
||||
return mInsetsController;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,9 +16,13 @@
|
||||
|
||||
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_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.TYPE_APPLICATION;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
|
||||
@@ -102,79 +106,129 @@ public class ViewRootImplTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void adjustLayoutParamsForInsets_layoutFullscreen() {
|
||||
public void adjustLayoutParamsForCompatibility_layoutFullscreen() {
|
||||
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
|
||||
|
||||
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
|
||||
attrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
|
||||
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
|
||||
|
||||
// Type.statusBars() must be removed.
|
||||
assertEquals(0, attrs.getFitInsetsTypes() & Type.statusBars());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void adjustLayoutParamsForInsets_layoutInScreen() {
|
||||
public void adjustLayoutParamsForCompatibility_layoutInScreen() {
|
||||
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
|
||||
|
||||
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
|
||||
attrs.flags = FLAG_LAYOUT_IN_SCREEN;
|
||||
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
|
||||
|
||||
// Type.statusBars() must be removed.
|
||||
assertEquals(0, attrs.getFitInsetsTypes() & Type.statusBars());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void adjustLayoutParamsForInsets_layoutHideNavigation() {
|
||||
public void adjustLayoutParamsForCompatibility_layoutHideNavigation() {
|
||||
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
|
||||
|
||||
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
|
||||
attrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
|
||||
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
|
||||
|
||||
// Type.systemBars() must be removed.
|
||||
assertEquals(0, attrs.getFitInsetsTypes() & Type.systemBars());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void adjustLayoutParamsForInsets_toast() {
|
||||
public void adjustLayoutParamsForCompatibility_toast() {
|
||||
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
|
||||
|
||||
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_TOAST);
|
||||
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
|
||||
|
||||
assertEquals(Type.systemBars(), attrs.getFitInsetsTypes() & Type.systemBars());
|
||||
assertEquals(true, attrs.isFitInsetsIgnoringVisibility());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void adjustLayoutParamsForInsets_systemAlert() {
|
||||
public void adjustLayoutParamsForCompatibility_systemAlert() {
|
||||
assumeTrue(ViewRootImpl.sNewInsetsMode == ViewRootImpl.NEW_INSETS_MODE_FULL);
|
||||
|
||||
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_SYSTEM_ALERT);
|
||||
ViewRootImpl.adjustLayoutParamsForCompatibility(attrs);
|
||||
|
||||
assertEquals(Type.systemBars(), attrs.getFitInsetsTypes() & Type.systemBars());
|
||||
assertEquals(true, attrs.isFitInsetsIgnoringVisibility());
|
||||
}
|
||||
|
||||
@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);
|
||||
|
||||
final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(TYPE_APPLICATION);
|
||||
final int types = Type.all();
|
||||
final int sides = Side.TOP | Side.LEFT;
|
||||
final boolean fitMaxInsets = true;
|
||||
attrs.flags = FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
|
||||
attrs.systemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
|
||||
attrs.setFitInsetsTypes(types);
|
||||
attrs.setFitInsetsSides(sides);
|
||||
attrs.setFitInsetsIgnoringVisibility(fitMaxInsets);
|
||||
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(sides, attrs.getFitInsetsSides());
|
||||
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 final ViewRootImpl mViewRootImpl;
|
||||
|
||||
Reference in New Issue
Block a user