diff options
| -rw-r--r-- | telephony/java/android/telephony/SubscriptionManager.java | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 9d1b7a918327..3c890a18e344 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -61,6 +61,7 @@ import android.telephony.euicc.EuiccManager; import android.telephony.ims.ImsMmTelManager; import android.util.DisplayMetrics; import android.util.Log; +import android.util.Pair; import com.android.internal.telephony.ISetOpportunisticDataCallback; import com.android.internal.telephony.ISub; @@ -76,6 +77,7 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -910,6 +912,11 @@ public class SubscriptionManager { private final Context mContext; private volatile INetworkPolicyManager mNetworkPolicy; + // Cache of Resource that has been created in getResourcesForSubId. Key is a Pair containing + // the Context and subId. + private static final Map<Pair<Context, Integer>, Resources> sResourcesCache = + new ConcurrentHashMap<>(); + /** * A listener class for monitoring changes to {@link SubscriptionInfo} records. * <p> @@ -2304,8 +2311,20 @@ public class SubscriptionManager { * @return Resources associated with Subscription. * @hide */ + @NonNull public static Resources getResourcesForSubId(Context context, int subId, boolean useRootLocale) { + // Check if resources for this context and subId already exist in the resource cache. + // Resources that use the root locale are not cached. + Pair<Context, Integer> cacheKey = null; + if (isValidSubscriptionId(subId) && !useRootLocale) { + cacheKey = Pair.create(context, subId); + if (sResourcesCache.containsKey(cacheKey)) { + // Cache hit. Use cached Resources. + return sResourcesCache.get(cacheKey); + } + } + final SubscriptionInfo subInfo = SubscriptionManager.from(context).getActiveSubscriptionInfo(subId); @@ -2325,7 +2344,13 @@ public class SubscriptionManager { DisplayMetrics metrics = context.getResources().getDisplayMetrics(); DisplayMetrics newMetrics = new DisplayMetrics(); newMetrics.setTo(metrics); - return new Resources(context.getResources().getAssets(), newMetrics, newConfig); + Resources res = new Resources(context.getResources().getAssets(), newMetrics, newConfig); + + if (cacheKey != null) { + // Save the newly created Resources in the resource cache. + sResourcesCache.put(cacheKey, res); + } + return res; } /** |