diff options
| author | Jorim Jaggi <jjaggi@google.com> | 2020-01-10 17:17:42 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-01-10 17:17:42 +0000 |
| commit | fa833b69b4f0fe60ef0c5955acf1409bd816f603 (patch) | |
| tree | 9ec94a000d28f85673ebfc4c00d8564829f77b94 /core/java | |
| parent | bcc216f21251131e31edce8bbc3d1e01972e65f2 (diff) | |
| parent | 4e04eb24aeb921ab652367c5970a569fa8c498e1 (diff) | |
Merge "Move visible insets calculation to client"
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/view/InsetsController.java | 9 | ||||
| -rw-r--r-- | core/java/android/view/InsetsSource.java | 31 | ||||
| -rw-r--r-- | core/java/android/view/InsetsState.java | 29 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 11 | ||||
| -rw-r--r-- | core/java/android/view/WindowInsets.java | 14 |
5 files changed, 91 insertions, 3 deletions
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java index 0207abdda355..775490c757d4 100644 --- a/core/java/android/view/InsetsController.java +++ b/core/java/android/view/InsetsController.java @@ -42,6 +42,7 @@ import android.view.WindowInsets.Type; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowInsetsAnimationCallback.AnimationBounds; import android.view.WindowInsetsAnimationCallback.InsetsAnimation; +import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import android.view.animation.Interpolator; import android.view.animation.PathInterpolator; @@ -299,6 +300,14 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation } /** + * @see InsetsState#calculateVisibleInsets(Rect, Rect, int) + */ + public Rect calculateVisibleInsets(Rect legacyVisibleInsets, + @SoftInputModeFlags int softInputMode) { + return mState.calculateVisibleInsets(mFrame, legacyVisibleInsets, softInputMode); + } + + /** * Called when the server has dispatched us a new set of inset controls. */ public void onControlsChanged(InsetsSourceControl[] activeControls) { diff --git a/core/java/android/view/InsetsSource.java b/core/java/android/view/InsetsSource.java index 324d562bfcfb..67ccfd6707f4 100644 --- a/core/java/android/view/InsetsSource.java +++ b/core/java/android/view/InsetsSource.java @@ -16,6 +16,7 @@ package android.view; +import android.annotation.Nullable; import android.graphics.Insets; import android.graphics.Rect; import android.os.Parcel; @@ -23,6 +24,7 @@ import android.os.Parcelable; import android.view.InsetsState.InternalInsetsType; import java.io.PrintWriter; +import java.util.Objects; /** * Represents the state of a single window generating insets for clients. @@ -34,6 +36,7 @@ public class InsetsSource implements Parcelable { /** Frame of the source in screen coordinate space */ private final Rect mFrame; + private @Nullable Rect mVisibleFrame; private boolean mVisible; private final Rect mTmpFrame = new Rect(); @@ -54,6 +57,10 @@ public class InsetsSource implements Parcelable { mFrame.set(frame); } + public void setVisibleFrame(@Nullable Rect visibleFrame) { + mVisibleFrame = visibleFrame != null ? new Rect(visibleFrame) : visibleFrame; + } + public void setVisible(boolean visible) { mVisible = visible; } @@ -66,6 +73,10 @@ public class InsetsSource implements Parcelable { return mFrame; } + public @Nullable Rect getVisibleFrame() { + return mVisibleFrame; + } + public boolean isVisible() { return mVisible; } @@ -79,10 +90,22 @@ public class InsetsSource implements Parcelable { * source. */ public Insets calculateInsets(Rect relativeFrame, boolean ignoreVisibility) { + return calculateInsets(relativeFrame, mFrame, ignoreVisibility); + } + + /** + * Like {@link #calculateInsets(Rect, boolean)}, but will return visible insets. + */ + public Insets calculateVisibleInsets(Rect relativeFrame) { + return calculateInsets(relativeFrame, mVisibleFrame != null ? mVisibleFrame : mFrame, + false /* ignoreVisibility */); + } + + private Insets calculateInsets(Rect relativeFrame, Rect frame, boolean ignoreVisibility) { if (!ignoreVisibility && !mVisible) { return Insets.NONE; } - if (!mTmpFrame.setIntersect(mFrame, relativeFrame)) { + if (!mTmpFrame.setIntersect(frame, relativeFrame)) { return Insets.NONE; } @@ -110,6 +133,9 @@ public class InsetsSource implements Parcelable { pw.print(prefix); pw.print("InsetsSource type="); pw.print(InsetsState.typeToString(mType)); pw.print(" frame="); pw.print(mFrame.toShortString()); + if (mVisibleFrame != null) { + pw.print(" visibleFrmae="); pw.print(mVisibleFrame.toShortString()); + } pw.print(" visible="); pw.print(mVisible); pw.println(); } @@ -123,6 +149,7 @@ public class InsetsSource implements Parcelable { if (mType != that.mType) return false; if (mVisible != that.mVisible) return false; + if (!Objects.equals(mVisibleFrame, that.mVisibleFrame)) return false; return mFrame.equals(that.mFrame); } @@ -137,6 +164,7 @@ public class InsetsSource implements Parcelable { public InsetsSource(Parcel in) { mType = in.readInt(); mFrame = in.readParcelable(null /* loader */); + mVisibleFrame = in.readParcelable(null /* loader */); mVisible = in.readBoolean(); } @@ -149,6 +177,7 @@ public class InsetsSource implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeInt(mType); dest.writeParcelable(mFrame, 0 /* flags*/); + dest.writeParcelable(mVisibleFrame, 0 /* flags */); dest.writeBoolean(mVisible); } diff --git a/core/java/android/view/InsetsState.java b/core/java/android/view/InsetsState.java index ae1e579da8f6..e33ca70c222e 100644 --- a/core/java/android/view/InsetsState.java +++ b/core/java/android/view/InsetsState.java @@ -19,12 +19,14 @@ package android.view; import static android.view.ViewRootImpl.NEW_INSETS_MODE_FULL; import static android.view.ViewRootImpl.NEW_INSETS_MODE_IME; import static android.view.ViewRootImpl.NEW_INSETS_MODE_NONE; +import static android.view.ViewRootImpl.sNewInsetsMode; import static android.view.WindowInsets.Type.IME; import static android.view.WindowInsets.Type.MANDATORY_SYSTEM_GESTURES; import static android.view.WindowInsets.Type.SIZE; import static android.view.WindowInsets.Type.SYSTEM_GESTURES; import static android.view.WindowInsets.Type.ime; import static android.view.WindowInsets.Type.indexOf; +import static android.view.WindowInsets.Type.isVisibleInsetsType; import static android.view.WindowInsets.Type.systemBars; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; @@ -41,6 +43,7 @@ import android.util.SparseIntArray; import android.view.WindowInsets.Type; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowManager.LayoutParams; +import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import java.io.PrintWriter; import java.lang.annotation.Retention; @@ -186,6 +189,32 @@ public class InsetsState implements Parcelable { : systemBars()); } + public Rect calculateVisibleInsets(Rect frame, Rect legacyVisibleInsets, + @SoftInputModeFlags int softInputMode) { + if (sNewInsetsMode == NEW_INSETS_MODE_NONE) { + return legacyVisibleInsets; + } + + Insets insets = Insets.NONE; + for (int type = FIRST_TYPE; type <= LAST_TYPE; type++) { + InsetsSource source = mSources.get(type); + if (source == null) { + continue; + } + if (sNewInsetsMode != NEW_INSETS_MODE_FULL && type != ITYPE_IME) { + continue; + } + + // Ignore everything that's not a system bar or IME. + int publicType = InsetsState.toPublicType(type); + if (!isVisibleInsetsType(publicType, softInputMode)) { + continue; + } + insets = Insets.max(source.calculateVisibleInsets(frame), insets); + } + return insets.toRect(); + } + private void processSource(InsetsSource source, Rect relativeFrame, boolean ignoreVisibility, Insets[] typeInsetsMap, @Nullable @InternalInsetsSide SparseIntArray typeSideMap, @Nullable boolean[] typeVisibilityMap) { diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index ab89ef46e09e..ca8ba4ca1b8a 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -2103,6 +2103,12 @@ public final class ViewRootImpl implements ViewParent, Trace.traceEnd(Trace.TRACE_TAG_VIEW); } + private void updateVisibleInsets() { + Rect visibleInsets = mInsetsController.calculateVisibleInsets(mPendingVisibleInsets, + mWindowAttributes.softInputMode); + mAttachInfo.mVisibleInsets.set(visibleInsets); + } + InsetsController getInsetsController() { return mInsetsController; } @@ -2251,7 +2257,7 @@ public final class ViewRootImpl implements ViewParent, insetsChanged = true; } if (!mPendingVisibleInsets.equals(mAttachInfo.mVisibleInsets)) { - mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets); + updateVisibleInsets(); if (DEBUG_LAYOUT) Log.v(mTag, "Visible insets changing to: " + mAttachInfo.mVisibleInsets); } @@ -2317,6 +2323,7 @@ public final class ViewRootImpl implements ViewParent, if (mApplyInsetsRequested) { mApplyInsetsRequested = false; + updateVisibleInsets(); dispatchApplyInsets(host); if (mLayoutRequested) { // Short-circuit catching a new layout request here, so @@ -2501,7 +2508,7 @@ public final class ViewRootImpl implements ViewParent, contentInsetsChanged = true; } if (visibleInsetsChanged) { - mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets); + updateVisibleInsets(); if (DEBUG_LAYOUT) Log.v(mTag, "Visible insets changing to: " + mAttachInfo.mVisibleInsets); } diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java index 9df131de6754..9291b5652425 100644 --- a/core/java/android/view/WindowInsets.java +++ b/core/java/android/view/WindowInsets.java @@ -29,6 +29,8 @@ import static android.view.WindowInsets.Type.TAPPABLE_ELEMENT; import static android.view.WindowInsets.Type.all; import static android.view.WindowInsets.Type.indexOf; import static android.view.WindowInsets.Type.systemBars; +import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; +import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_ADJUST; import android.annotation.IntDef; import android.annotation.IntRange; @@ -40,6 +42,7 @@ import android.graphics.Insets; import android.graphics.Rect; import android.util.SparseArray; import android.view.WindowInsets.Type.InsetsType; +import android.view.WindowManager.LayoutParams.SoftInputModeFlags; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethod; @@ -1289,6 +1292,17 @@ public final class WindowInsets { public static @InsetsType int all() { return 0xFFFFFFFF; } + + /** + * Checks whether the specified type is considered to be part of visible insets. + * @hide + */ + public static boolean isVisibleInsetsType(int type, + @SoftInputModeFlags int softInputModeFlags) { + int softInputMode = softInputModeFlags & SOFT_INPUT_MASK_ADJUST; + return (type & Type.systemBars()) != 0 + || (softInputMode != SOFT_INPUT_ADJUST_NOTHING && (type & Type.ime()) != 0); + } } /** |
