Loading core/java/com/android/internal/policy/AttributeCache.java +36 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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<>(); Loading Loading @@ -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; } Loading core/java/com/android/internal/policy/TransitionAnimation.java +11 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +1 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -182,7 +181,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { /* broadcastPermission = */ null, mMainHandler); AttributeCache.init(mContext); TransitionAnimation.initAttributeCache(mContext, mMainHandler); } private void updateEnterpriseThumbnailDrawable() { Loading Loading
core/java/com/android/internal/policy/AttributeCache.java +36 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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<>(); Loading Loading @@ -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; } Loading
core/java/com/android/internal/policy/TransitionAnimation.java +11 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } }
libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +1 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -182,7 +181,7 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { /* broadcastPermission = */ null, mMainHandler); AttributeCache.init(mContext); TransitionAnimation.initAttributeCache(mContext, mMainHandler); } private void updateEnterpriseThumbnailDrawable() { Loading