summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLucas Lin <lucaslin@google.com>2020-04-16 02:17:00 +0000
committerLucas Lin <lucaslin@google.com>2020-04-16 03:02:34 +0000
commit044be5f2b2c3c4d19f8d3f453a164be4c0d46455 (patch)
tree52965bfdb9c48c0dde5bbf0bba6ca1a3be7865f4 /src
parent13975b7e9aeb39ba049648ef8c37011339f3b1ed (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-xsrc/com/android/server/connectivity/NetworkMonitor.java63
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) {