summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
authorAdam Powell <adamp@google.com>2014-04-15 17:38:54 -0700
committerAdam Powell <adamp@google.com>2014-04-16 13:59:00 -0700
commite5244b5638535964103ca1dfc867442a64243db1 (patch)
treef0a0bbd06a906ece96daaab5a3010267aeeb61a8 /core/java/android
parent2adb422928d35b34cfd8c52170e0df7ffc681816 (diff)
downloadframeworks_base-e5244b5638535964103ca1dfc867442a64243db1.zip
frameworks_base-e5244b5638535964103ca1dfc867442a64243db1.tar.gz
frameworks_base-e5244b5638535964103ca1dfc867442a64243db1.tar.bz2
Add isRound to WindowInsets
isRound allows a view to determine whether the window it is contained within obscures the corners of the window content. This allows views aware of this property to adapt their layout accordingly. Switch ViewRootImpl to use dispatchApplyInsets instead of fitSystemWindows. Change-Id: Ic3e3936b73815b2593cb9720af1a309fbd18406e
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/view/ViewRootImpl.java14
-rw-r--r--core/java/android/view/WindowInsets.java27
2 files changed, 32 insertions, 9 deletions
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 @@ public final class ViewRootImpl implements ViewParent,
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 @@ public final class ViewRootImpl implements ViewParent,
}
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 @@ public final class ViewRootImpl implements ViewParent,
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 @@ public final class ViewRootImpl implements ViewParent,
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 @@ public class WindowInsets {
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 @@ public class WindowInsets {
/** @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 class WindowInsets {
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 @@ public class WindowInsets {
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 @@ public class WindowInsets {
@Override
public String toString() {
return "WindowInsets{systemWindowInsets=" + mSystemWindowInsets + " windowDecorInsets=" +
- mWindowDecorInsets + "}";
+ mWindowDecorInsets + (isRound() ? "round}" : "}");
}
}