diff options
author | Lucas Lin <lucaslin@google.com> | 2020-04-16 02:17:00 +0000 |
---|---|---|
committer | Lucas Lin <lucaslin@google.com> | 2020-04-16 03:02:34 +0000 |
commit | 044be5f2b2c3c4d19f8d3f453a164be4c0d46455 (patch) | |
tree | 52965bfdb9c48c0dde5bbf0bba6ca1a3be7865f4 /src | |
parent | 13975b7e9aeb39ba049648ef8c37011339f3b1ed (diff) |
Make a customized context when matching a record in MccMncOverrideInfo
MccMncOverrideInfo records the customized carrier id, visited
mccmnc, home mccmnc. Once the carrier id and sim's mccmnc are
matching a record in MccMncOverrideInfo, make a customized
context by changing the mcc/mnc of configuration.
Bug: 147075795
Test: atest NetworkStackTests:NetworkMonitorTest
Change-Id: I75924f60c637eb93ac99b14b333608b6faeaa24a
Merged-In: I20f3c291015a0a79d88e923438d39ff90e1f0752
(cherry picked from commit 6d0b27f8cb8f96eb427609eb03ff6e1a1d490771)
Diffstat (limited to 'src')
-rwxr-xr-x | src/com/android/server/connectivity/NetworkMonitor.java | 63 |
1 files changed, 55 insertions, 8 deletions
diff --git a/src/com/android/server/connectivity/NetworkMonitor.java b/src/com/android/server/connectivity/NetworkMonitor.java index 40ad87d..701ffa4 100755 --- a/src/com/android/server/connectivity/NetworkMonitor.java +++ b/src/com/android/server/connectivity/NetworkMonitor.java @@ -141,6 +141,7 @@ import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import android.util.Pair; +import android.util.SparseArray; import androidx.annotation.ArrayRes; import androidx.annotation.BoolRes; @@ -218,6 +219,8 @@ public class NetworkMonitor extends StateMachine { private static final int SOCKET_TIMEOUT_MS = 10000; private static final int PROBE_TIMEOUT_MS = 3000; + private static final int UNSET_MCC_OR_MNC = -1; + private static final int CAPPORT_API_MAX_JSON_LENGTH = 4096; private static final String ACCEPT_HEADER = "Accept"; private static final String CONTENT_TYPE_HEADER = "Content-Type"; @@ -241,6 +244,24 @@ public class NetworkMonitor extends StateMachine { } } + @VisibleForTesting + protected static final class MccMncOverrideInfo { + public final int mcc; + public final int mnc; + MccMncOverrideInfo(int mcc, int mnc) { + this.mcc = mcc; + this.mnc = mnc; + } + } + + @VisibleForTesting + protected static final SparseArray<MccMncOverrideInfo> sCarrierIdToMccMnc = new SparseArray<>(); + + static { + // CTC + sCarrierIdToMccMnc.put(1854, new MccMncOverrideInfo(460, 03)); + } + /** * ConnectivityService has sent a notification to indicate that network has connected. * Initiates Network Validation. @@ -1507,25 +1528,51 @@ public class NetworkMonitor extends StateMachine { } } + /** + * Return a matched MccMncOverrideInfo if carrier id and sim mccmnc are matching a record in + * sCarrierIdToMccMnc. + */ @VisibleForTesting - protected Context getContextByMccIfNoSimCardOrDefault() { + @Nullable + MccMncOverrideInfo getMccMncOverrideInfo() { + final int carrierId = mTelephonyManager.getSimCarrierId(); + return sCarrierIdToMccMnc.get(carrierId); + } + + private Context getContextByMccMnc(final int mcc, final int mnc) { + final Configuration config = mContext.getResources().getConfiguration(); + if (mcc != UNSET_MCC_OR_MNC) config.mcc = mcc; + if (mnc != UNSET_MCC_OR_MNC) config.mnc = mnc; + return mContext.createConfigurationContext(config); + } + + @VisibleForTesting + protected Context getCustomizedContextOrDefault() { + // Return customized context if carrier id can match a record in sCarrierIdToMccMnc. + final MccMncOverrideInfo overrideInfo = getMccMncOverrideInfo(); + if (overrideInfo != null) { + return getContextByMccMnc(overrideInfo.mcc, overrideInfo.mnc); + } + + // Use neighbor mcc feature only works when the config_no_sim_card_uses_neighbor_mcc is + // true and there is no sim card inserted. final boolean useNeighborResource = getResBooleanConfig(mContext, R.bool.config_no_sim_card_uses_neighbor_mcc, false); if (!useNeighborResource || TelephonyManager.SIM_STATE_READY == mTelephonyManager.getSimState()) { return mContext; } + final String mcc = getLocationMcc(); if (TextUtils.isEmpty(mcc)) { return mContext; } - final Configuration config = mContext.getResources().getConfiguration(); - config.mcc = Integer.parseInt(mcc); - return mContext.createConfigurationContext(config); + + return getContextByMccMnc(Integer.parseInt(mcc), UNSET_MCC_OR_MNC); } private String getCaptivePortalServerHttpsUrl() { - final Context targetContext = getContextByMccIfNoSimCardOrDefault(); + final Context targetContext = getCustomizedContextOrDefault(); return getSettingFromResource(targetContext, R.string.config_captive_portal_https_url, R.string.default_captive_portal_https_url, CAPTIVE_PORTAL_HTTPS_URL); } @@ -1604,7 +1651,7 @@ public class NetworkMonitor extends StateMachine { * on one URL that can be used, while NetworkMonitor may implement more complex logic. */ public String getCaptivePortalServerHttpUrl() { - final Context targetContext = getContextByMccIfNoSimCardOrDefault(); + final Context targetContext = getCustomizedContextOrDefault(); return getSettingFromResource(targetContext, R.string.config_captive_portal_http_url, R.string.default_captive_portal_http_url, CAPTIVE_PORTAL_HTTP_URL); } @@ -1759,7 +1806,7 @@ public class NetworkMonitor extends StateMachine { */ private <T> T[] getProbeUrlArrayConfig(@NonNull T[] providerValue, @ArrayRes int configResId, @ArrayRes int defaultResId, @NonNull Function<String, T> resourceConverter) { - final Resources res = getContextByMccIfNoSimCardOrDefault().getResources(); + final Resources res = getCustomizedContextOrDefault().getResources(); return getProbeUrlArrayConfig(providerValue, configResId, res.getStringArray(defaultResId), resourceConverter); } @@ -1777,7 +1824,7 @@ public class NetworkMonitor extends StateMachine { */ private <T> T[] getProbeUrlArrayConfig(@NonNull T[] providerValue, @ArrayRes int configResId, String[] defaultConfig, @NonNull Function<String, T> resourceConverter) { - final Resources res = getContextByMccIfNoSimCardOrDefault().getResources(); + final Resources res = getCustomizedContextOrDefault().getResources(); String[] configValue = res.getStringArray(configResId); if (configValue.length == 0) { |