From 0e7ae4efe8f424fa1ced8f7e5f3d8ae78066592b Mon Sep 17 00:00:00 2001 From: Adrian Roos Date: Wed, 1 Oct 2014 15:33:22 +0200 Subject: [PATCH] Fix colored status bar panning issues Bug: 17695293 Change-Id: I6a1267f8dff27e7b78ab312a71648ef16ab9483b --- core/java/android/view/ViewRootImpl.java | 6 ++++++ .../android/internal/view/RootViewSurfaceTaker.java | 16 ++++++++++++++++ .../android/internal/policy/impl/PhoneWindow.java | 20 ++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 81fc96619128..6496b42b85d7 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1646,6 +1646,9 @@ public final class ViewRootImpl implements ViewParent, mLastScrolledFocus.clear(); } mScrollY = mCurScrollY = 0; + if (mView instanceof RootViewSurfaceTaker) { + ((RootViewSurfaceTaker) mView).onRootViewScrollYChanged(mCurScrollY); + } if (mScroller != null) { mScroller.abortAnimation(); } @@ -2415,6 +2418,9 @@ public final class ViewRootImpl implements ViewParent, if (mCurScrollY != curScrollY) { mCurScrollY = curScrollY; fullRedrawNeeded = true; + if (mView instanceof RootViewSurfaceTaker) { + ((RootViewSurfaceTaker) mView).onRootViewScrollYChanged(mCurScrollY); + } } final float appScale = mAttachInfo.mApplicationScale; diff --git a/core/java/com/android/internal/view/RootViewSurfaceTaker.java b/core/java/com/android/internal/view/RootViewSurfaceTaker.java index 9c1b558c740b..433ec730749c 100644 --- a/core/java/com/android/internal/view/RootViewSurfaceTaker.java +++ b/core/java/com/android/internal/view/RootViewSurfaceTaker.java @@ -1,3 +1,18 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.android.internal.view; import android.view.InputQueue; @@ -10,4 +25,5 @@ public interface RootViewSurfaceTaker { void setSurfaceFormat(int format); void setSurfaceKeepScreenOn(boolean keepOn); InputQueue.Callback willYouTakeTheInputQueue(); + void onRootViewScrollYChanged(int scrollY); } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index 1ed61fd22e97..f1faade01854 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -2174,6 +2174,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { private int mLastBottomInset = 0; private int mLastRightInset = 0; + private int mRootScrollY = 0; public DecorView(Context context, int featureId) { super(context); @@ -2875,6 +2876,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { view.setId(id); addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, height, Gravity.START | verticalGravity)); + updateColorViewTranslations(); } } else { int vis = show ? VISIBLE : INVISIBLE; @@ -2891,6 +2893,18 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { return view; } + private void updateColorViewTranslations() { + // Put the color views back in place when they get moved off the screen + // due to the the ViewRootImpl panning. + int rootScrollY = mRootScrollY; + if (mStatusColorView != null) { + mStatusColorView.setTranslationY(rootScrollY > 0 ? rootScrollY : 0); + } + if (mNavigationColorView != null) { + mNavigationColorView.setTranslationY(rootScrollY < 0 ? rootScrollY : 0); + } + } + private WindowInsets updateStatusGuard(WindowInsets insets) { boolean showStatusGuard = false; // Show the status guard when the non-overlay contextual action bar is showing @@ -3149,6 +3163,12 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { else PhoneWindow.this.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } + @Override + public void onRootViewScrollYChanged(int rootScrollY) { + mRootScrollY = rootScrollY; + updateColorViewTranslations(); + } + /** * Clears out internal reference when the action mode is destroyed. */ -- 2.11.0