diff options
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/WindowContext.java | 1 | ||||
| -rw-r--r-- | core/java/android/view/IWindowManager.aidl | 7 | ||||
| -rw-r--r-- | core/java/android/view/InsetsState.java | 6 | ||||
| -rw-r--r-- | core/java/android/view/WindowManagerImpl.java | 44 |
4 files changed, 40 insertions, 18 deletions
diff --git a/core/java/android/app/WindowContext.java b/core/java/android/app/WindowContext.java index 568456270809..878993ebcd19 100644 --- a/core/java/android/app/WindowContext.java +++ b/core/java/android/app/WindowContext.java @@ -60,7 +60,6 @@ public class WindowContext extends ContextWrapper { mWms = WindowManagerGlobal.getWindowManagerService(); mToken = new WindowTokenClient(); - final ContextImpl contextImpl = createBaseWindowContext(base, mToken); attachBaseContext(contextImpl); contextImpl.setOuterContext(this); diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 73601d968040..84ac90bae258 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -724,11 +724,12 @@ interface IWindowManager /** * Called to get the expected window insets. - * TODO(window-context): Remove when new insets flag is available. + * + * @return {@code true} if system bars are always comsumed. */ - void getWindowInsets(in WindowManager.LayoutParams attrs, int displayId, + boolean getWindowInsets(in WindowManager.LayoutParams attrs, int displayId, out Rect outContentInsets, out Rect outStableInsets, - out DisplayCutout.ParcelableWrapper displayCutout); + out DisplayCutout.ParcelableWrapper outDisplayCutout, out InsetsState outInsetsState); /** * Called to show global actions. diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java index b740c58ec15f..d970e91d59fa 100644 --- a/core/java/android/view/InsetsState.java +++ b/core/java/android/view/InsetsState.java @@ -80,6 +80,12 @@ public class InsetsState implements Parcelable { }) public @interface InternalInsetsType {} + /** + * Special value to be used to by methods returning an {@link InternalInsetsType} to indicate + * that the objects/parameters aren't associated with an {@link InternalInsetsType} + */ + public static final int ITYPE_INVALID = -1; + static final int FIRST_TYPE = 0; public static final int ITYPE_STATUS_BAR = FIRST_TYPE; diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java index 6435b42efca0..4050da1b5cb1 100644 --- a/core/java/android/view/WindowManagerImpl.java +++ b/core/java/android/view/WindowManagerImpl.java @@ -18,8 +18,11 @@ package android.view; 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_VISIBLE; +import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; +import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; import android.annotation.NonNull; import android.app.ResourcesManager; @@ -215,9 +218,9 @@ public final class WindowManagerImpl implements WindowManager { @Override public WindowMetrics getCurrentWindowMetrics() { final Context context = mParentWindow != null ? mParentWindow.getContext() : mContext; - final Rect bound = getCurrentBounds(context); + final Rect bounds = getCurrentBounds(context); - return new WindowMetrics(toSize(bound), computeWindowInsets()); + return new WindowMetrics(toSize(bounds), computeWindowInsets(bounds)); } private static Rect getCurrentBounds(Context context) { @@ -228,7 +231,8 @@ public final class WindowManagerImpl implements WindowManager { @Override public WindowMetrics getMaximumWindowMetrics() { - return new WindowMetrics(toSize(getMaximumBounds()), computeWindowInsets()); + final Rect maxBounds = getMaximumBounds(); + return new WindowMetrics(toSize(maxBounds), computeWindowInsets(maxBounds)); } private Size toSize(Rect frame) { @@ -244,9 +248,8 @@ public final class WindowManagerImpl implements WindowManager { return new Rect(0, 0, displaySize.x, displaySize.y); } - private WindowInsets computeWindowInsets() { - // TODO(b/118118435): This can only be properly implemented - // once we flip the new insets mode flag. + // TODO(b/150095967): Set window type to LayoutParams + private WindowInsets computeWindowInsets(Rect bounds) { // Initialize params which used for obtaining all system insets. final WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.flags = FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR; @@ -257,21 +260,34 @@ public final class WindowManagerImpl implements WindowManager { params.setFitInsetsTypes(0); params.setFitInsetsSides(0); - return getWindowInsetsFromServer(params); + return getWindowInsetsFromServer(params, bounds); } - private WindowInsets getWindowInsetsFromServer(WindowManager.LayoutParams attrs) { + private WindowInsets getWindowInsetsFromServer(WindowManager.LayoutParams attrs, Rect bounds) { try { final Rect systemWindowInsets = new Rect(); final Rect stableInsets = new Rect(); final DisplayCutout.ParcelableWrapper displayCutout = new DisplayCutout.ParcelableWrapper(); - WindowManagerGlobal.getWindowManagerService().getWindowInsets(attrs, - mContext.getDisplayId(), systemWindowInsets, stableInsets, displayCutout); - return new WindowInsets.Builder() - .setSystemWindowInsets(Insets.of(systemWindowInsets)) - .setStableInsets(Insets.of(stableInsets)) - .setDisplayCutout(displayCutout.get()).build(); + final InsetsState insetsState = new InsetsState(); + final boolean alwaysConsumeSystemBars = WindowManagerGlobal.getWindowManagerService() + .getWindowInsets(attrs, mContext.getDisplayId(), systemWindowInsets, + stableInsets, displayCutout, insetsState); + final boolean isScreenRound = + mContext.getResources().getConfiguration().isScreenRound(); + if (ViewRootImpl.sNewInsetsMode == NEW_INSETS_MODE_FULL) { + return insetsState.calculateInsets(bounds, null /* ignoringVisibilityState*/, + isScreenRound, alwaysConsumeSystemBars, displayCutout.get(), + systemWindowInsets, stableInsets, SOFT_INPUT_ADJUST_NOTHING, + SYSTEM_UI_FLAG_VISIBLE, null /* typeSideMap */); + } else { + return new WindowInsets.Builder() + .setAlwaysConsumeSystemBars(alwaysConsumeSystemBars) + .setRound(isScreenRound) + .setSystemWindowInsets(Insets.of(systemWindowInsets)) + .setStableInsets(Insets.of(stableInsets)) + .setDisplayCutout(displayCutout.get()).build(); + } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } |
