Create new context with new resources

The old implementation of this function had the unintended side effect
of modifying the default configuration for the context which the caller
passed in. This CL avoids that by creating a new context with the new
configuration.

Test: atest SubscriptionControllerTest#testGetResourcesForSubId
Bug: 146481715
Change-Id: I6539817caa67e1100e50018fa0186993a1f56ccb
This commit is contained in:
Jordan Liu
2020-01-21 10:55:08 -08:00
parent d21c45fc95
commit 14747aa9fd

View File

@@ -58,7 +58,6 @@ import android.os.ServiceManager;
import android.provider.Telephony.SimInfo;
import android.telephony.euicc.EuiccManager;
import android.telephony.ims.ImsMmTelManager;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.Pair;
@@ -2513,23 +2512,24 @@ public class SubscriptionManager {
final SubscriptionInfo subInfo =
SubscriptionManager.from(context).getActiveSubscriptionInfo(subId);
Configuration config = context.getResources().getConfiguration();
Configuration newConfig = new Configuration();
newConfig.setTo(config);
Configuration overrideConfig = new Configuration();
if (subInfo != null) {
newConfig.mcc = subInfo.getMcc();
newConfig.mnc = subInfo.getMnc();
if (newConfig.mnc == 0) newConfig.mnc = Configuration.MNC_ZERO;
overrideConfig.mcc = subInfo.getMcc();
overrideConfig.mnc = subInfo.getMnc();
if (overrideConfig.mnc == 0) overrideConfig.mnc = Configuration.MNC_ZERO;
}
if (useRootLocale) {
newConfig.setLocale(Locale.ROOT);
overrideConfig.setLocale(Locale.ROOT);
}
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
DisplayMetrics newMetrics = new DisplayMetrics();
newMetrics.setTo(metrics);
Resources res = new Resources(context.getResources().getAssets(), newMetrics, newConfig);
// Create new context with new configuration so that we can avoid modifying the passed in
// context.
// Note that if the original context configuration changes, the resources here will also
// change for all values except those overridden by newConfig (e.g. if the device has an
// orientation change).
Context newContext = context.createConfigurationContext(overrideConfig);
Resources res = newContext.getResources();
if (cacheKey != null) {
// Save the newly created Resources in the resource cache.