summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author chaviw <chaviw@google.com> 2018-04-23 13:34:36 -0700
committer chaviw <chaviw@google.com> 2018-04-27 18:04:00 -0700
commita213d306d556a140bafe8079b00b3654c62b534c (patch)
tree4bc96477cca504eac6a248637e628db8a0131a8a
parenta8c840c46d63ee5d5c837de8b0b3b41e00f0ecb8 (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.java16
-rw-r--r--core/java/com/android/internal/policy/DecorView.java9
-rw-r--r--core/java/com/android/internal/policy/PhoneWindow.java2
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);
}