Merge "Revert the revert of adding isRound to WindowInsets after early merge"
diff --git a/api/current.txt b/api/current.txt
index 9edc6d3..3029a2a 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -30959,6 +30959,7 @@
method public boolean hasInsets();
method public boolean hasSystemWindowInsets();
method public boolean hasWindowDecorInsets();
+ method public boolean isRound();
}
public abstract interface WindowManager implements android.view.ViewManager {
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index ef22def..eec4354 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1171,6 +1171,11 @@
m.preTranslate(-attachInfo.mWindowLeft, -attachInfo.mWindowTop);
}
+ void dispatchApplyInsets(View host) {
+ mFitSystemWindowsInsets.set(mAttachInfo.mContentInsets);
+ host.dispatchApplyWindowInsets(new WindowInsets(mFitSystemWindowsInsets));
+ }
+
private void performTraversals() {
// cache mView since it is used so much below...
final View host = mView;
@@ -1257,8 +1262,7 @@
}
host.dispatchAttachedToWindow(attachInfo, 0);
attachInfo.mTreeObserver.dispatchOnWindowAttachedChange(true);
- mFitSystemWindowsInsets.set(mAttachInfo.mContentInsets);
- host.fitSystemWindows(mFitSystemWindowsInsets);
+ dispatchApplyInsets(host);
//Log.i(TAG, "Screen on initialized: " + attachInfo.mKeepScreenOn);
} else {
@@ -1383,9 +1387,8 @@
if (mFitSystemWindowsRequested) {
mFitSystemWindowsRequested = false;
- mFitSystemWindowsInsets.set(mAttachInfo.mContentInsets);
mLastOverscanRequested = mAttachInfo.mOverscanRequested;
- host.fitSystemWindows(mFitSystemWindowsInsets);
+ dispatchApplyInsets(host);
if (mLayoutRequested) {
// Short-circuit catching a new layout request here, so
// we don't need to go through two layout passes when things
@@ -1559,8 +1562,7 @@
mLastSystemUiVisibility = mAttachInfo.mSystemUiVisibility;
mLastOverscanRequested = mAttachInfo.mOverscanRequested;
mFitSystemWindowsRequested = false;
- mFitSystemWindowsInsets.set(mAttachInfo.mContentInsets);
- host.fitSystemWindows(mFitSystemWindowsInsets);
+ dispatchApplyInsets(host);
}
if (visibleInsetsChanged) {
mAttachInfo.mVisibleInsets.set(mPendingVisibleInsets);
diff --git a/core/java/android/view/WindowInsets.java b/core/java/android/view/WindowInsets.java
index cdfcb43..f8cc793 100644
--- a/core/java/android/view/WindowInsets.java
+++ b/core/java/android/view/WindowInsets.java
@@ -33,6 +33,7 @@
private Rect mSystemWindowInsets;
private Rect mWindowDecorInsets;
private Rect mTempRect;
+ private boolean mIsRound;
private static final Rect EMPTY_RECT = new Rect(0, 0, 0, 0);
@@ -46,8 +47,14 @@
/** @hide */
public WindowInsets(Rect systemWindowInsets, Rect windowDecorInsets) {
+ this(systemWindowInsets, windowDecorInsets, false);
+ }
+
+ /** @hide */
+ public WindowInsets(Rect systemWindowInsets, Rect windowDecorInsets, boolean isRound) {
mSystemWindowInsets = systemWindowInsets;
mWindowDecorInsets = windowDecorInsets;
+ mIsRound = isRound;
}
/**
@@ -58,12 +65,12 @@
public WindowInsets(WindowInsets src) {
mSystemWindowInsets = src.mSystemWindowInsets;
mWindowDecorInsets = src.mWindowDecorInsets;
+ mIsRound = src.mIsRound;
}
/** @hide */
public WindowInsets(Rect systemWindowInsets) {
- mSystemWindowInsets = systemWindowInsets;
- mWindowDecorInsets = EMPTY_RECT;
+ this(systemWindowInsets, EMPTY_RECT);
}
/**
@@ -220,6 +227,20 @@
return hasSystemWindowInsets() || hasWindowDecorInsets();
}
+ /**
+ * Returns true if the associated window has a round shape.
+ *
+ * <p>A round window's left, top, right and bottom edges reach all the way to the
+ * associated edges of the window but the corners may not be visible. Views responding
+ * to round insets should take care to not lay out critical elements within the corners
+ * where they may not be accessible.</p>
+ *
+ * @return True if the window is round
+ */
+ public boolean isRound() {
+ return mIsRound;
+ }
+
public WindowInsets cloneWithSystemWindowInsetsConsumed() {
final WindowInsets result = new WindowInsets(this);
result.mSystemWindowInsets = new Rect(0, 0, 0, 0);
@@ -273,6 +294,6 @@
@Override
public String toString() {
return "WindowInsets{systemWindowInsets=" + mSystemWindowInsets + " windowDecorInsets=" +
- mWindowDecorInsets + "}";
+ mWindowDecorInsets + (isRound() ? "round}" : "}");
}
}