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;      }      /** |