diff options
| author | Filip Gruszczynski <gruszczy@google.com> | 2015-03-12 15:12:43 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-03-12 15:12:45 +0000 |
| commit | c6ee744a90a4a84df93b6631ca7df8736ef320e1 (patch) | |
| tree | d0a3ddbfc27576225908af776a964af848ba8822 | |
| parent | 80c24d4a27573b90368e78a155abe90849db1b06 (diff) | |
| parent | 954289d9a9b1a26b1621037a427269bdbd67d5bc (diff) | |
| download | frameworks_base-c6ee744a90a4a84df93b6631ca7df8736ef320e1.zip frameworks_base-c6ee744a90a4a84df93b6631ca7df8736ef320e1.tar.gz frameworks_base-c6ee744a90a4a84df93b6631ca7df8736ef320e1.tar.bz2 | |
Merge "Allow polling for WindowInsets."
| -rw-r--r-- | api/current.txt | 1 | ||||
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 13 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 35 |
4 files changed, 44 insertions, 6 deletions
diff --git a/api/current.txt b/api/current.txt index 2cdae98..c075029 100644 --- a/api/current.txt +++ b/api/current.txt @@ -34162,6 +34162,7 @@ package android.view { method protected float getRightFadingEdgeStrength(); method protected int getRightPaddingOffset(); method public android.view.View getRootView(); + method public android.view.WindowInsets getRootWindowInsets(); method public float getRotation(); method public float getRotationX(); method public float getRotationY(); diff --git a/api/system-current.txt b/api/system-current.txt index 1b3f1e4..eb47c5e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -36330,6 +36330,7 @@ package android.view { method protected float getRightFadingEdgeStrength(); method protected int getRightPaddingOffset(); method public android.view.View getRootView(); + method public android.view.WindowInsets getRootWindowInsets(); method public float getRotation(); method public float getRotationX(); method public float getRotationY(); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 085a3f2..4f2d4a6 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -6564,6 +6564,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Provide original WindowInsets that are dispatched to the view hierarchy. The insets are + * only available if the view is attached. + * + * @return WindowInsets from the top of the view hierarchy or null if View is detached + */ + public WindowInsets getRootWindowInsets() { + if (mAttachInfo != null) { + return mAttachInfo.mViewRootImpl.getWindowInsets(false /* forceConstruct */); + } + return null; + } + + /** * @hide Compute the insets that should be consumed by this view and the ones * that should propagate to those under it. */ diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 7cd12d5..f970e88 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -265,6 +265,8 @@ public final class ViewRootImpl implements ViewParent, final Rect mDispatchContentInsets = new Rect(); final Rect mDispatchStableInsets = new Rect(); + private WindowInsets mLastWindowInsets; + final Configuration mLastConfiguration = new Configuration(); final Configuration mPendingConfiguration = new Configuration(); @@ -550,6 +552,11 @@ public final class ViewRootImpl implements ViewParent, mPendingContentInsets.set(mAttachInfo.mContentInsets); mPendingStableInsets.set(mAttachInfo.mStableInsets); mPendingVisibleInsets.set(0, 0, 0, 0); + try { + relayoutWindow(attrs, getHostVisibility(), false); + } catch (RemoteException e) { + if (DEBUG_LAYOUT) Log.e(TAG, "failed to relayoutWindow", e); + } if (DEBUG_LAYOUT) Log.v(TAG, "Added window " + mWindow); if (res < WindowManagerGlobal.ADD_OKAY) { mAttachInfo.mRootView = null; @@ -1227,13 +1234,29 @@ public final class ViewRootImpl implements ViewParent, m.postTranslate(-mAttachInfo.mWindowLeft, -mAttachInfo.mWindowTop); } + /* package */ WindowInsets getWindowInsets(boolean forceConstruct) { + if (mLastWindowInsets == null || forceConstruct) { + mDispatchContentInsets.set(mAttachInfo.mContentInsets); + mDispatchStableInsets.set(mAttachInfo.mStableInsets); + Rect contentInsets = mDispatchContentInsets; + Rect stableInsets = mDispatchStableInsets; + // For dispatch we preserve old logic, but for direct requests from Views we allow to + // immediately use pending insets. + if (!forceConstruct + && (!mPendingContentInsets.equals(contentInsets) || + !mPendingStableInsets.equals(stableInsets))) { + contentInsets = mPendingContentInsets; + stableInsets = mPendingStableInsets; + } + final boolean isRound = (mIsEmulator && mIsCircularEmulator) || mWindowIsRound; + mLastWindowInsets = new WindowInsets(contentInsets, + null /* windowDecorInsets */, stableInsets, isRound); + } + return mLastWindowInsets; + } + void dispatchApplyInsets(View host) { - mDispatchContentInsets.set(mAttachInfo.mContentInsets); - mDispatchStableInsets.set(mAttachInfo.mStableInsets); - final boolean isRound = (mIsEmulator && mIsCircularEmulator) || mWindowIsRound; - host.dispatchApplyWindowInsets(new WindowInsets( - mDispatchContentInsets, null /* windowDecorInsets */, - mDispatchStableInsets, isRound)); + host.dispatchApplyWindowInsets(getWindowInsets(true /* forceConstruct */)); } private void performTraversals() { |
