Merge "Refine adjustLayoutParamsForCompatibility about fitting insets" into rvc-dev am: ec2c4dfffe
Change-Id: Ifaab70a488933b31fb8a8ae39d549d6664dfdb7a
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_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user