diff options
| author | 2018-04-23 13:34:36 -0700 | |
|---|---|---|
| committer | 2018-04-27 18:04:00 -0700 | |
| commit | a213d306d556a140bafe8079b00b3654c62b534c (patch) | |
| tree | 4bc96477cca504eac6a248637e628db8a0131a8a | |
| parent | a8c840c46d63ee5d5c837de8b0b3b41e00f0ecb8 (diff) | |
Update DecorContext's Resource cache when calling getResources.
DecorContext is created with the resources from the activity. However,
the resources in DecorContext may not get updated properly
ResourcesManager if the original resource object it's pointing to isn't
updated by ResourcesManager. Because of this, resources for the
DecorView can be incorrect when the activity's resources are updated.
This change updates the DecorContext's resources with the activity's
resources when getResources is called to ensure they get properly
updated.
This fixes the issue where windowing mode was incorrect when determining
what the window elevation should be. It was incorrectly getting full
screen when it should have gotten pinned. This was preventing surface
insets from getting set on the WM side, so PIP windows didn't get
shadows.
Change-Id: I5af2364f81b167e3732811d7413554d035c4a021
Test: PIP has shadows
Fixes: 78214575
| -rw-r--r-- | core/java/com/android/internal/policy/DecorContext.java | 16 | ||||
| -rw-r--r-- | core/java/com/android/internal/policy/DecorView.java | 9 | ||||
| -rw-r--r-- | core/java/com/android/internal/policy/PhoneWindow.java | 2 |
3 files changed, 22 insertions, 5 deletions
diff --git a/core/java/com/android/internal/policy/DecorContext.java b/core/java/com/android/internal/policy/DecorContext.java index eac9f64f3fa0..cd80d53a7546 100644 --- a/core/java/com/android/internal/policy/DecorContext.java +++ b/core/java/com/android/internal/policy/DecorContext.java @@ -23,6 +23,8 @@ import android.view.ContextThemeWrapper; import android.view.WindowManager; import android.view.WindowManagerImpl; +import java.lang.ref.WeakReference; + /** * Context for decor views which can be seeded with pure application context and not depend on the * activity, but still provide some of the facilities that Activity has, @@ -35,9 +37,12 @@ class DecorContext extends ContextThemeWrapper { private WindowManager mWindowManager; private Resources mActivityResources; - public DecorContext(Context context, Resources activityResources) { + private WeakReference<Context> mActivityContext; + + public DecorContext(Context context, Context activityContext) { super(context, null); - mActivityResources = activityResources; + mActivityContext = new WeakReference<>(activityContext); + mActivityResources = activityContext.getResources(); } void setPhoneWindow(PhoneWindow phoneWindow) { @@ -60,6 +65,13 @@ class DecorContext extends ContextThemeWrapper { @Override public Resources getResources() { + Context activityContext = mActivityContext.get(); + // Attempt to update the local cached Resources from the activity context. If the activity + // is no longer around, return the old cached values. + if (activityContext != null) { + mActivityResources = activityContext.getResources(); + } + return mActivityResources; } diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index eadefc919934..cc95df7724ba 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -41,7 +41,6 @@ import java.util.List; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; -import android.app.ActivityManager; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -55,7 +54,6 @@ import android.graphics.Region; import android.graphics.Shader; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.os.RemoteException; import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; @@ -1844,6 +1842,13 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind } @Override + public Resources getResources() { + // Make sure the Resources object is propogated from the Context since it can be updated in + // the Context object. + return getContext().getResources(); + } + + @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 528888fbaab6..7ea023eb50b2 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -2299,7 +2299,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (applicationContext == null) { context = getContext(); } else { - context = new DecorContext(applicationContext, getContext().getResources()); + context = new DecorContext(applicationContext, getContext()); if (mTheme != -1) { context.setTheme(mTheme); } |