Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a213d306 authored by chaviw's avatar chaviw
Browse files

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
parent a8c840c4
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -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;
    }

+7 −2
Original line number Diff line number Diff line
@@ -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;
@@ -1843,6 +1841,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);
+1 −1
Original line number Diff line number Diff line
@@ -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);
                }