diff options
3 files changed, 48 insertions, 2 deletions
diff --git a/core/java/com/android/internal/policy/AttributeCache.java b/core/java/com/android/internal/policy/AttributeCache.java index 1bdad25d25bb..970f5111c2ea 100644 --- a/core/java/com/android/internal/policy/AttributeCache.java +++ b/core/java/com/android/internal/policy/AttributeCache.java @@ -16,12 +16,18 @@ package com.android.internal.policy; +import android.annotation.RequiresPermission; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.TypedArray; +import android.net.Uri; +import android.os.Handler; import android.os.UserHandle; import android.util.ArrayMap; import android.util.LruCache; @@ -46,6 +52,8 @@ public final class AttributeCache { @GuardedBy("this") private final Configuration mConfiguration = new Configuration(); + private PackageMonitor mPackageMonitor; + public final static class Package { public final Context context; 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() { return sInstance; } diff --git a/core/java/com/android/internal/policy/TransitionAnimation.java b/core/java/com/android/internal/policy/TransitionAnimation.java index aa2318d219f8..04f2ea3679f5 100644 --- a/core/java/com/android/internal/policy/TransitionAnimation.java +++ b/core/java/com/android/internal/policy/TransitionAnimation.java @@ -48,6 +48,7 @@ import android.graphics.drawable.Drawable; import android.hardware.HardwareBuffer; import android.media.Image; import android.media.ImageReader; +import android.os.Handler; import android.os.SystemProperties; import android.util.Slog; import android.view.InflateException; @@ -1399,4 +1400,14 @@ public class TransitionAnimation { // Approximation of WCAG 2.0 relative luminance. 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); + } + } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java index 7df658e6c9db..de03f5826925 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java @@ -99,7 +99,6 @@ import android.window.WindowContainerTransaction; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.policy.AttributeCache; import com.android.internal.policy.ScreenDecorationsUtils; import com.android.internal.policy.TransitionAnimation; import com.android.internal.protolog.common.ProtoLog; @@ -182,7 +181,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { /* broadcastPermission = */ null, mMainHandler); - AttributeCache.init(mContext); + TransitionAnimation.initAttributeCache(mContext, mMainHandler); } private void updateEnterpriseThumbnailDrawable() { |