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

Commit 85dc2fd8 authored by wilsonshih's avatar wilsonshih
Browse files

Monitor package change to update AttributeCache for non-system server.

So the corresponding resources can be load correctly after package
update.

Bug: 300655500
Bug: 299877330
Test: update app resources and re-install test app, verify there should
load latest resources.

Change-Id: I7753bfc58c9a30c9a21a76b175ae18742e6750d9
parent 77c5cd9a
Loading
Loading
Loading
Loading
+36 −0
Original line number Original line Diff line number Diff line
@@ -16,12 +16,18 @@


package com.android.internal.policy;
package com.android.internal.policy;


import android.annotation.RequiresPermission;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.TypedArray;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArrayMap;
import android.util.LruCache;
import android.util.LruCache;
@@ -46,6 +52,8 @@ public final class AttributeCache {
    @GuardedBy("this")
    @GuardedBy("this")
    private final Configuration mConfiguration = new Configuration();
    private final Configuration mConfiguration = new Configuration();


    private PackageMonitor mPackageMonitor;

    public final static class Package {
    public final static class Package {
        public final Context context;
        public final Context context;
        private final SparseArray<ArrayMap<int[], Entry>> mMap = new SparseArray<>();
        private final SparseArray<ArrayMap<int[], Entry>> mMap = new SparseArray<>();
@@ -77,6 +85,34 @@ public final class AttributeCache {
        }
        }
    }
    }


    /**
     * Start monitor package change, so the resources can be loaded correctly.
     */
    void monitorPackageRemove(Handler handler) {
        if (mPackageMonitor == null) {
            mPackageMonitor = new PackageMonitor(mContext, handler);
        }
    }

    static class PackageMonitor extends BroadcastReceiver {
        @RequiresPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
        PackageMonitor(Context context, Handler handler) {
            final IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
            filter.addDataScheme(IntentFilter.SCHEME_PACKAGE);
            context.registerReceiverAsUser(this, UserHandle.ALL, filter,
                    null /* broadcastPermission */, handler);
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            final Uri packageUri = intent.getData();
            if (packageUri != null) {
                final String packageName = packageUri.getEncodedSchemeSpecificPart();
                AttributeCache.instance().removePackage(packageName);
            }
        }
    }

    public static AttributeCache instance() {
    public static AttributeCache instance() {
        return sInstance;
        return sInstance;
    }
    }
+11 −0
Original line number Original line Diff line number Diff line
@@ -48,6 +48,7 @@ import android.graphics.drawable.Drawable;
import android.hardware.HardwareBuffer;
import android.hardware.HardwareBuffer;
import android.media.Image;
import android.media.Image;
import android.media.ImageReader;
import android.media.ImageReader;
import android.os.Handler;
import android.os.SystemProperties;
import android.os.SystemProperties;
import android.util.Slog;
import android.util.Slog;
import android.view.InflateException;
import android.view.InflateException;
@@ -1399,4 +1400,14 @@ public class TransitionAnimation {
        // Approximation of WCAG 2.0 relative luminance.
        // Approximation of WCAG 2.0 relative luminance.
        return ((r * 8) + (g * 22) + (b * 2)) >> 5;
        return ((r * 8) + (g * 22) + (b * 2)) >> 5;
    }
    }

    /**
     * For non-system server process, it must call this method to initialize the AttributeCache and
     * start monitor package change, so the resources can be loaded correctly.
     */
    public static void initAttributeCache(Context context, Handler handler) {
        AttributeCache.init(context);
        AttributeCache.instance().monitorPackageRemove(handler);
    }

}
}
+1 −2
Original line number Original line Diff line number Diff line
@@ -99,7 +99,6 @@ import android.window.WindowContainerTransaction;


import com.android.internal.R;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.policy.AttributeCache;
import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.internal.policy.TransitionAnimation;
import com.android.internal.policy.TransitionAnimation;
import com.android.internal.protolog.common.ProtoLog;
import com.android.internal.protolog.common.ProtoLog;
@@ -182,7 +181,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler {
                /* broadcastPermission = */ null,
                /* broadcastPermission = */ null,
                mMainHandler);
                mMainHandler);


        AttributeCache.init(mContext);
        TransitionAnimation.initAttributeCache(mContext, mMainHandler);
    }
    }


    private void updateEnterpriseThumbnailDrawable() {
    private void updateEnterpriseThumbnailDrawable() {