Merge "Carrier restriction enhancements for Android Q"
diff --git a/src/java/com/android/internal/telephony/CommandsInterface.java b/src/java/com/android/internal/telephony/CommandsInterface.java
index bcc8e1a..9a978ce 100644
--- a/src/java/com/android/internal/telephony/CommandsInterface.java
+++ b/src/java/com/android/internal/telephony/CommandsInterface.java
@@ -21,7 +21,7 @@
import android.os.Handler;
import android.os.Message;
import android.os.WorkSource;
-import android.service.carrier.CarrierIdentifier;
+import android.telephony.CarrierRestrictionRules;
import android.telephony.ClientRequestStats;
import android.telephony.ImsiEncryptionInfo;
import android.telephony.NetworkScanRequest;
@@ -2067,11 +2067,11 @@
* Set allowed carriers
*
* @param carriers Allowed carriers
- * @param result Callback message contains the number of carriers set successfully
+ * @param result Callback message contains the result of the operation
* @param workSource calling WorkSource
*/
- default void setAllowedCarriers(List<CarrierIdentifier> carriers, Message result,
- WorkSource workSource) {}
+ default void setAllowedCarriers(CarrierRestrictionRules carrierRestrictionRules,
+ Message result, WorkSource workSource) {}
/**
* Get allowed carriers
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index 9d084dd..8951cd7 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -39,10 +39,10 @@
import android.os.WorkSource;
import android.preference.PreferenceManager;
import android.provider.Settings;
-import android.service.carrier.CarrierIdentifier;
import android.telecom.VideoProfile;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.CarrierConfigManager;
+import android.telephony.CarrierRestrictionRules;
import android.telephony.CellInfo;
import android.telephony.CellLocation;
import android.telephony.ClientRequestStats;
@@ -3658,9 +3658,9 @@
/**
* Set allowed carriers
*/
- public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message response,
- WorkSource workSource) {
- mCi.setAllowedCarriers(carriers, response, workSource);
+ public void setAllowedCarriers(CarrierRestrictionRules carrierRestrictionRules,
+ Message response, WorkSource workSource) {
+ mCi.setAllowedCarriers(carrierRestrictionRules, response, workSource);
}
/** Sets the SignalStrength reporting criteria. */
diff --git a/src/java/com/android/internal/telephony/RIL.java b/src/java/com/android/internal/telephony/RIL.java
index 7df50ea..a3acaf9 100644
--- a/src/java/com/android/internal/telephony/RIL.java
+++ b/src/java/com/android/internal/telephony/RIL.java
@@ -48,6 +48,8 @@
import android.hardware.radio.V1_0.SmsWriteArgs;
import android.hardware.radio.V1_0.UusInfo;
import android.hardware.radio.V1_2.AccessNetwork;
+import android.hardware.radio.V1_4.CarrierRestrictionsWithPriority;
+import android.hardware.radio.V1_4.SimLockMultiSimPolicy;
import android.hardware.radio.deprecated.V1_0.IOemHook;
import android.net.ConnectivityManager;
import android.net.KeepalivePacketData;
@@ -65,6 +67,7 @@
import android.os.WorkSource;
import android.service.carrier.CarrierIdentifier;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
+import android.telephony.CarrierRestrictionRules;
import android.telephony.CellInfo;
import android.telephony.ClientRequestStats;
import android.telephony.ImsiEncryptionInfo;
@@ -612,7 +615,7 @@
resetProxyAndRequestList();
}
- private String convertNullToEmptyString(String string) {
+ private static String convertNullToEmptyString(String string) {
return string != null ? string : "";
}
@@ -3843,62 +3846,121 @@
}
+ /**
+ * Convert a list of CarrierIdentifier into a list of Carrier defined in 1.0/types.hal.
+ * @param carriers List of CarrierIdentifier
+ * @return List of converted objects
+ */
+ @VisibleForTesting
+ public static ArrayList<Carrier> createCarrierRestrictionList(
+ List<CarrierIdentifier> carriers) {
+ ArrayList<Carrier> result = new ArrayList<>();
+ for (CarrierIdentifier ci : carriers) {
+ Carrier c = new Carrier();
+ c.mcc = convertNullToEmptyString(ci.getMcc());
+ c.mnc = convertNullToEmptyString(ci.getMnc());
+ int matchType = CarrierIdentifier.MatchType.ALL;
+ String matchData = null;
+ if (!TextUtils.isEmpty(ci.getSpn())) {
+ matchType = CarrierIdentifier.MatchType.SPN;
+ matchData = ci.getSpn();
+ } else if (!TextUtils.isEmpty(ci.getImsi())) {
+ matchType = CarrierIdentifier.MatchType.IMSI_PREFIX;
+ matchData = ci.getImsi();
+ } else if (!TextUtils.isEmpty(ci.getGid1())) {
+ matchType = CarrierIdentifier.MatchType.GID1;
+ matchData = ci.getGid1();
+ } else if (!TextUtils.isEmpty(ci.getGid2())) {
+ matchType = CarrierIdentifier.MatchType.GID2;
+ matchData = ci.getGid2();
+ }
+ c.matchType = matchType;
+ c.matchData = convertNullToEmptyString(matchData);
+ result.add(c);
+ }
+ return result;
+ }
+
@Override
- public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message result,
- WorkSource workSource) {
- checkNotNull(carriers, "Allowed carriers list cannot be null.");
+ public void setAllowedCarriers(CarrierRestrictionRules carrierRestrictionRules,
+ Message result, WorkSource workSource) {
+ riljLog("RIL.java - setAllowedCarriers");
+
+ checkNotNull(carrierRestrictionRules, "Carrier restriction cannot be null.");
workSource = getDeafultWorkSourceIfInvalid(workSource);
IRadio radioProxy = getRadioProxy(result);
- if (radioProxy != null) {
- RILRequest rr = obtainRequest(RIL_REQUEST_SET_ALLOWED_CARRIERS, result,
- workSource);
+ if (radioProxy == null) {
+ return;
+ }
- if (RILJ_LOGD) {
- String logStr = "";
- for (int i = 0; i < carriers.size(); i++) {
- logStr = logStr + carriers.get(i) + " ";
- }
- riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " carriers = "
- + logStr);
- }
+ RILRequest rr = obtainRequest(RIL_REQUEST_SET_ALLOWED_CARRIERS, result, workSource);
- boolean allAllowed;
- if (carriers.size() == 0) {
- allAllowed = true;
- } else {
- allAllowed = false;
- }
- CarrierRestrictions carrierList = new CarrierRestrictions();
+ if (RILJ_LOGD) {
+ riljLog(rr.serialString() + "> " + requestToString(rr.mRequest) + " params: "
+ + carrierRestrictionRules);
+ }
- for (CarrierIdentifier ci : carriers) { /* allowed carriers */
- Carrier c = new Carrier();
- c.mcc = convertNullToEmptyString(ci.getMcc());
- c.mnc = convertNullToEmptyString(ci.getMnc());
- int matchType = CarrierIdentifier.MatchType.ALL;
- String matchData = null;
- if (!TextUtils.isEmpty(ci.getSpn())) {
- matchType = CarrierIdentifier.MatchType.SPN;
- matchData = ci.getSpn();
- } else if (!TextUtils.isEmpty(ci.getImsi())) {
- matchType = CarrierIdentifier.MatchType.IMSI_PREFIX;
- matchData = ci.getImsi();
- } else if (!TextUtils.isEmpty(ci.getGid1())) {
- matchType = CarrierIdentifier.MatchType.GID1;
- matchData = ci.getGid1();
- } else if (!TextUtils.isEmpty(ci.getGid2())) {
- matchType = CarrierIdentifier.MatchType.GID2;
- matchData = ci.getGid2();
- }
- c.matchType = matchType;
- c.matchData = convertNullToEmptyString(matchData);
- carrierList.allowedCarriers.add(c);
- }
+ // Extract multisim policy
+ int policy = SimLockMultiSimPolicy.NO_MULTISIM_POLICY;
+ switch (carrierRestrictionRules.getMultiSimPolicy()) {
+ case CarrierRestrictionRules.MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT:
+ policy = SimLockMultiSimPolicy.ONE_VALID_SIM_MUST_BE_PRESENT;
+ break;
+ }
- /* TODO: add excluded carriers */
+ if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_4)) {
+ riljLog("RIL.java - Using IRadio 1.4 or greater");
+
+ android.hardware.radio.V1_4.IRadio radioProxy14 =
+ (android.hardware.radio.V1_4.IRadio) radioProxy;
+
+ // Prepare structure with allowed list, excluded list and priority
+ CarrierRestrictionsWithPriority carrierRestrictions =
+ new CarrierRestrictionsWithPriority();
+ carrierRestrictions.allowedCarriers =
+ createCarrierRestrictionList(carrierRestrictionRules.getAllowedCarriers());
+ carrierRestrictions.excludedCarriers =
+ createCarrierRestrictionList(carrierRestrictionRules.getExcludedCarriers());
+ carrierRestrictions.allowedCarriersPrioritized =
+ (carrierRestrictionRules.getDefaultCarrierRestriction()
+ == CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED);
try {
- radioProxy.setAllowedCarriers(rr.mSerial, allAllowed, carrierList);
+ radioProxy14.setAllowedCarriers_1_4(rr.mSerial, carrierRestrictions, policy);
+ } catch (RemoteException | RuntimeException e) {
+ handleRadioProxyExceptionForRR(rr, "setAllowedCarriers_1_4", e);
+ }
+ } else {
+ boolean isAllCarriersAllowed = carrierRestrictionRules.isAllCarriersAllowed();
+
+ boolean supported = (isAllCarriersAllowed
+ || (carrierRestrictionRules.getExcludedCarriers().isEmpty()
+ && (carrierRestrictionRules.getDefaultCarrierRestriction()
+ == CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED)));
+ supported = supported && (policy == SimLockMultiSimPolicy.NO_MULTISIM_POLICY);
+
+ if (!supported) {
+ // Feature is not supported by IRadio interface
+ riljLoge("setAllowedCarriers does not support excluded list on IRadio version"
+ + " less than 1.4");
+ if (result != null) {
+ AsyncResult.forMessage(result, null,
+ CommandException.fromRilErrno(REQUEST_NOT_SUPPORTED));
+ result.sendToTarget();
+ }
+ return;
+ }
+ riljLog("RIL.java - Using IRadio 1.3 or lower");
+
+ // Prepare structure with allowed list
+ CarrierRestrictions carrierRestrictions = new CarrierRestrictions();
+ carrierRestrictions.allowedCarriers =
+ createCarrierRestrictionList(carrierRestrictionRules.getAllowedCarriers());
+
+ try {
+ radioProxy.setAllowedCarriers(rr.mSerial, isAllCarriersAllowed,
+ carrierRestrictions);
} catch (RemoteException | RuntimeException e) {
handleRadioProxyExceptionForRR(rr, "setAllowedCarriers", e);
}
@@ -3910,13 +3972,30 @@
workSource = getDeafultWorkSourceIfInvalid(workSource);
IRadio radioProxy = getRadioProxy(result);
- if (radioProxy != null) {
- RILRequest rr = obtainRequest(RIL_REQUEST_GET_ALLOWED_CARRIERS, result,
- workSource);
+ if (radioProxy == null) {
+ return;
+ }
- if (RILJ_LOGD) {
- riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+ RILRequest rr = obtainRequest(RIL_REQUEST_GET_ALLOWED_CARRIERS, result,
+ workSource);
+
+ if (RILJ_LOGD) {
+ riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
+ }
+
+ if (mRadioVersion.greaterOrEqual(RADIO_HAL_VERSION_1_4)) {
+ riljLog("RIL.java - Using IRadio 1.4 or greater");
+
+ android.hardware.radio.V1_4.IRadio radioProxy14 =
+ (android.hardware.radio.V1_4.IRadio) radioProxy;
+
+ try {
+ radioProxy14.getAllowedCarriers_1_4(rr.mSerial);
+ } catch (RemoteException | RuntimeException e) {
+ handleRadioProxyExceptionForRR(rr, "getAllowedCarriers_1_4", e);
}
+ } else {
+ riljLog("RIL.java - Using IRadio 1.3 or lower");
try {
radioProxy.getAllowedCarriers(rr.mSerial);
diff --git a/src/java/com/android/internal/telephony/RadioResponse.java b/src/java/com/android/internal/telephony/RadioResponse.java
index fedb45f..c6fada3 100644
--- a/src/java/com/android/internal/telephony/RadioResponse.java
+++ b/src/java/com/android/internal/telephony/RadioResponse.java
@@ -20,6 +20,7 @@
import android.hardware.radio.V1_0.ActivityStatsInfo;
import android.hardware.radio.V1_0.AppStatus;
import android.hardware.radio.V1_0.CardStatus;
+import android.hardware.radio.V1_0.Carrier;
import android.hardware.radio.V1_0.CarrierRestrictions;
import android.hardware.radio.V1_0.CdmaBroadcastSmsConfigInfo;
import android.hardware.radio.V1_0.DataRegStateResult;
@@ -34,10 +35,13 @@
import android.hardware.radio.V1_0.SetupDataCallResult;
import android.hardware.radio.V1_0.VoiceRegStateResult;
import android.hardware.radio.V1_2.IRadioResponse;
+import android.hardware.radio.V1_4.CarrierRestrictionsWithPriority;
+import android.hardware.radio.V1_4.SimLockMultiSimPolicy;
import android.os.AsyncResult;
import android.os.Message;
import android.os.SystemClock;
import android.service.carrier.CarrierIdentifier;
+import android.telephony.CarrierRestrictionRules;
import android.telephony.CellInfo;
import android.telephony.ModemActivityInfo;
import android.telephony.NeighboringCellInfo;
@@ -1299,19 +1303,74 @@
* if Length of allowed carriers list is 0, numAllowed = 0.
*/
public void setAllowedCarriersResponse(RadioResponseInfo responseInfo, int numAllowed) {
- responseInts(responseInfo, numAllowed);
+ // The number of allowed carriers set correctly is not really useful. Even if one is
+ // missing, the operation has failed, as the list should be treated as a single
+ // configuration item. So, ignoring the value of numAllowed and considering only the
+ // value of the responseInfo.error.
+ int ret = TelephonyManager.SET_CARRIER_RESTRICTION_ERROR;
+ RILRequest rr = mRil.processResponse(responseInfo);
+ if (rr != null) {
+ mRil.riljLog("setAllowedCarriersResponse - error = " + responseInfo.error);
+
+ if (responseInfo.error == RadioError.NONE) {
+ ret = TelephonyManager.SET_CARRIER_RESTRICTION_SUCCESS;
+ sendMessageResponse(rr.mResult, ret);
+ } else if (responseInfo.error == RadioError.REQUEST_NOT_SUPPORTED) {
+ // Handle the case REQUEST_NOT_SUPPORTED as a valid response
+ responseInfo.error = RadioError.NONE;
+ ret = TelephonyManager.SET_CARRIER_RESTRICTION_NOT_SUPPORTED;
+ sendMessageResponse(rr.mResult, ret);
+ }
+ mRil.processResponseDone(rr, responseInfo, ret);
+ }
}
/**
*
* @param responseInfo Response info struct containing response type, serial no. and error
+ */
+ public void setAllowedCarriersResponse_1_4(RadioResponseInfo responseInfo) {
+ int ret = TelephonyManager.SET_CARRIER_RESTRICTION_ERROR;
+ RILRequest rr = mRil.processResponse(responseInfo);
+ if (rr != null) {
+ mRil.riljLog("setAllowedCarriersResponse_1_4 - error = " + responseInfo.error);
+
+ if (responseInfo.error == RadioError.NONE) {
+ ret = TelephonyManager.SET_CARRIER_RESTRICTION_SUCCESS;
+ sendMessageResponse(rr.mResult, ret);
+ }
+ mRil.processResponseDone(rr, responseInfo, ret);
+ }
+ }
+
+ /**
+ * @param responseInfo Response info struct containing response type, serial no. and error
* @param allAllowed true only when all carriers are allowed. Ignore "carriers" struct.
* If false, consider "carriers" struct
* @param carriers Carrier restriction information.
*/
public void getAllowedCarriersResponse(RadioResponseInfo responseInfo, boolean allAllowed,
- CarrierRestrictions carriers) {
- responseCarrierIdentifiers(responseInfo, allAllowed, carriers);
+ CarrierRestrictions carriers) {
+ CarrierRestrictionsWithPriority carrierRestrictions = new CarrierRestrictionsWithPriority();
+ carrierRestrictions.allowedCarriers = carriers.allowedCarriers;
+ carrierRestrictions.excludedCarriers = carriers.excludedCarriers;
+ carrierRestrictions.allowedCarriersPrioritized = true;
+
+ responseCarrierRestrictions(responseInfo, allAllowed, carrierRestrictions,
+ SimLockMultiSimPolicy.NO_MULTISIM_POLICY);
+ }
+
+ /**
+ * @param responseInfo Response info struct containing response type, serial no. and error
+ * @param carrierRestrictions Carrier restriction information.
+ * @param multiSimPolicy Policy for multi-sim devices.
+ */
+ public void getAllowedCarriersResponse_1_4(RadioResponseInfo responseInfo,
+ CarrierRestrictionsWithPriority carrierRestrictions,
+ int multiSimPolicy) {
+ // The API in IRadio 1.4 does not support the flag allAllowed, so setting it to false, so
+ // that values in carrierRestrictions are used.
+ responseCarrierRestrictions(responseInfo, false, carrierRestrictions, multiSimPolicy);
}
/**
@@ -2151,34 +2210,63 @@
}
}
- private void responseCarrierIdentifiers(RadioResponseInfo responseInfo, boolean allAllowed,
- CarrierRestrictions carriers) {
- RILRequest rr = mRil.processResponse(responseInfo);
-
- if (rr != null) {
- List<CarrierIdentifier> ret = new ArrayList<CarrierIdentifier>();
- for (int i = 0; i < carriers.allowedCarriers.size(); i++) {
- String mcc = carriers.allowedCarriers.get(i).mcc;
- String mnc = carriers.allowedCarriers.get(i).mnc;
- String spn = null, imsi = null, gid1 = null, gid2 = null;
- int matchType = carriers.allowedCarriers.get(i).matchType;
- String matchData = carriers.allowedCarriers.get(i).matchData;
- if (matchType == CarrierIdentifier.MatchType.SPN) {
- spn = matchData;
- } else if (matchType == CarrierIdentifier.MatchType.IMSI_PREFIX) {
- imsi = matchData;
- } else if (matchType == CarrierIdentifier.MatchType.GID1) {
- gid1 = matchData;
- } else if (matchType == CarrierIdentifier.MatchType.GID2) {
- gid2 = matchData;
- }
- ret.add(new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2));
+ private static List<CarrierIdentifier> convertCarrierList(List<Carrier> carrierList) {
+ List<CarrierIdentifier> ret = new ArrayList<>();
+ for (int i = 0; i < carrierList.size(); i++) {
+ String mcc = carrierList.get(i).mcc;
+ String mnc = carrierList.get(i).mnc;
+ String spn = null, imsi = null, gid1 = null, gid2 = null;
+ int matchType = carrierList.get(i).matchType;
+ String matchData = carrierList.get(i).matchData;
+ if (matchType == CarrierIdentifier.MatchType.SPN) {
+ spn = matchData;
+ } else if (matchType == CarrierIdentifier.MatchType.IMSI_PREFIX) {
+ imsi = matchData;
+ } else if (matchType == CarrierIdentifier.MatchType.GID1) {
+ gid1 = matchData;
+ } else if (matchType == CarrierIdentifier.MatchType.GID2) {
+ gid2 = matchData;
}
- if (responseInfo.error == RadioError.NONE) {
- /* TODO: Handle excluded carriers */
- sendMessageResponse(rr.mResult, ret);
- }
- mRil.processResponseDone(rr, responseInfo, ret);
+ ret.add(new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2));
}
+ return ret;
+ }
+
+ private void responseCarrierRestrictions(RadioResponseInfo responseInfo, boolean allAllowed,
+ CarrierRestrictionsWithPriority carriers,
+ int multiSimPolicy) {
+ RILRequest rr = mRil.processResponse(responseInfo);
+ if (rr == null) {
+ return;
+ }
+ CarrierRestrictionRules ret;
+
+ if (allAllowed) {
+ ret = CarrierRestrictionRules.newBuilder().setAllCarriersAllowed().build();
+ } else {
+ int policy = CarrierRestrictionRules.MULTISIM_POLICY_NONE;
+ if (multiSimPolicy == SimLockMultiSimPolicy.ONE_VALID_SIM_MUST_BE_PRESENT) {
+ policy = CarrierRestrictionRules.MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT;
+ }
+
+ int carrierRestrictionDefault =
+ CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED;
+ if (!carriers.allowedCarriersPrioritized) {
+ carrierRestrictionDefault =
+ CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_ALLOWED;
+ }
+
+ ret = CarrierRestrictionRules.newBuilder()
+ .setAllowedCarriers(convertCarrierList(carriers.allowedCarriers))
+ .setExcludedCarriers(convertCarrierList(carriers.excludedCarriers))
+ .setDefaultCarrierRestriction(carrierRestrictionDefault)
+ .setMultiSimPolicy(policy)
+ .build();
+ }
+
+ if (responseInfo.error == RadioError.NONE) {
+ sendMessageResponse(rr.mResult, ret);
+ }
+ mRil.processResponseDone(rr, responseInfo, ret);
}
}
diff --git a/src/java/com/android/internal/telephony/test/SimulatedCommands.java b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
index c958aef..a207c6d 100644
--- a/src/java/com/android/internal/telephony/test/SimulatedCommands.java
+++ b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
@@ -29,7 +29,7 @@
import android.os.Parcel;
import android.os.SystemClock;
import android.os.WorkSource;
-import android.service.carrier.CarrierIdentifier;
+import android.telephony.CarrierRestrictionRules;
import android.telephony.CellInfo;
import android.telephony.CellInfoGsm;
import android.telephony.CellSignalStrengthCdma;
@@ -2063,8 +2063,8 @@
}
@Override
- public void setAllowedCarriers(List<CarrierIdentifier> carriers, Message result,
- WorkSource workSource) {
+ public void setAllowedCarriers(CarrierRestrictionRules carrierRestrictionRules,
+ Message result, WorkSource workSource) {
unimplemented(result);
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/CarrierRestrictionRulesTest.java b/tests/telephonytests/src/com/android/internal/telephony/CarrierRestrictionRulesTest.java
new file mode 100644
index 0000000..e493577
--- /dev/null
+++ b/tests/telephonytests/src/com/android/internal/telephony/CarrierRestrictionRulesTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.telephony;
+
+import android.os.Parcel;
+import android.service.carrier.CarrierIdentifier;
+import android.telephony.CarrierRestrictionRules;
+import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import java.util.ArrayList;
+
+/** Unit tests for {@link CarrierRestrictionRules}. */
+
+public class CarrierRestrictionRulesTest extends AndroidTestCase {
+
+ private static final String MCC1 = "110";
+ private static final String MNC1 = "210";
+ private static final String MCC2 = "120";
+ private static final String MNC2 = "220";
+ private static final String MCC1_WILDCHAR = "3??";
+ private static final String MNC1_WILDCHAR = "???";
+ private static final String MCC2_WILDCHAR = "31?";
+ private static final String MNC2_WILDCHAR = "?0";
+ private static final String GID1 = "80";
+
+ @SmallTest
+ public void testBuilderAllowedAndExcludedCarriers() {
+ ArrayList<CarrierIdentifier> allowedCarriers = new ArrayList<>();
+ allowedCarriers.add(new CarrierIdentifier(MCC1, MNC1, null, null, null, null));
+ allowedCarriers.add(new CarrierIdentifier(MCC2, MNC2, null, null, null, null));
+
+ ArrayList<CarrierIdentifier> excludedCarriers = new ArrayList<>();
+ excludedCarriers.add(new CarrierIdentifier(MCC2, MNC2, null, null, GID1, null));
+
+ CarrierRestrictionRules rules = CarrierRestrictionRules.newBuilder()
+ .setAllowedCarriers(allowedCarriers)
+ .setExcludedCarriers(excludedCarriers)
+ .build();
+
+ assertEquals(false, rules.isAllCarriersAllowed());
+ assertTrue(rules.getAllowedCarriers().equals(allowedCarriers));
+ assertTrue(rules.getExcludedCarriers().equals(excludedCarriers));
+ assertEquals(CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED,
+ rules.getDefaultCarrierRestriction());
+ }
+
+ @SmallTest
+ public void testBuilderEmptyLists() {
+ ArrayList<CarrierIdentifier> emptyCarriers = new ArrayList<>();
+
+ CarrierRestrictionRules rules = CarrierRestrictionRules.newBuilder().build();
+
+ assertEquals(false, rules.isAllCarriersAllowed());
+ assertTrue(rules.getAllowedCarriers().equals(emptyCarriers));
+ assertTrue(rules.getExcludedCarriers().equals(emptyCarriers));
+ assertEquals(CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED,
+ rules.getDefaultCarrierRestriction());
+ }
+
+ @SmallTest
+ public void testBuilderWildCharacter() {
+ ArrayList<CarrierIdentifier> allowedCarriers = new ArrayList<>();
+ allowedCarriers.add(new CarrierIdentifier(MCC1_WILDCHAR, MNC1_WILDCHAR, null, null,
+ null, null));
+
+ ArrayList<CarrierIdentifier> excludedCarriers = new ArrayList<>();
+ excludedCarriers.add(new CarrierIdentifier(MCC2_WILDCHAR, MNC2_WILDCHAR, null, null,
+ GID1, null));
+
+ CarrierRestrictionRules rules = CarrierRestrictionRules.newBuilder()
+ .setAllowedCarriers(allowedCarriers)
+ .setExcludedCarriers(excludedCarriers)
+ .build();
+
+ assertEquals(false, rules.isAllCarriersAllowed());
+ assertTrue(rules.getAllowedCarriers().equals(allowedCarriers));
+ assertTrue(rules.getExcludedCarriers().equals(excludedCarriers));
+ assertEquals(CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED,
+ rules.getDefaultCarrierRestriction());
+ }
+
+ @SmallTest
+ public void testBuilderDefaultAllowed() {
+ ArrayList<CarrierIdentifier> allowedCarriers = new ArrayList<>();
+ allowedCarriers.add(new CarrierIdentifier(MCC1, MNC1, null, null, null, null));
+ allowedCarriers.add(new CarrierIdentifier(MCC2, MNC2, null, null, null, null));
+
+ ArrayList<CarrierIdentifier> excludedCarriers = new ArrayList<>();
+ allowedCarriers.add(new CarrierIdentifier(MCC2, MNC2, null, null, GID1, null));
+
+ CarrierRestrictionRules rules = CarrierRestrictionRules.newBuilder()
+ .setAllowedCarriers(allowedCarriers)
+ .setExcludedCarriers(excludedCarriers)
+ .setDefaultCarrierRestriction(
+ CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_ALLOWED)
+ .build();
+
+ assertEquals(false, rules.isAllCarriersAllowed());
+ assertTrue(rules.getAllowedCarriers().equals(allowedCarriers));
+ assertTrue(rules.getExcludedCarriers().equals(excludedCarriers));
+ assertEquals(CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_ALLOWED,
+ rules.getDefaultCarrierRestriction());
+ }
+
+ @SmallTest
+ public void testBuilderAllCarriersAllowed() {
+ ArrayList<CarrierIdentifier> allowedCarriers = new ArrayList<>();
+ ArrayList<CarrierIdentifier> excludedCarriers = new ArrayList<>();
+
+ CarrierRestrictionRules rules = CarrierRestrictionRules.newBuilder()
+ .setAllCarriersAllowed()
+ .build();
+
+ assertEquals(true, rules.isAllCarriersAllowed());
+ assertTrue(rules.getAllowedCarriers().equals(allowedCarriers));
+ assertTrue(rules.getExcludedCarriers().equals(excludedCarriers));
+ assertEquals(CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_ALLOWED,
+ rules.getDefaultCarrierRestriction());
+ }
+
+ @SmallTest
+ public void testParcel() {
+ ArrayList<CarrierIdentifier> allowedCarriers = new ArrayList<>();
+ allowedCarriers.add(new CarrierIdentifier(MCC1, MNC1, null, null, null, null));
+ allowedCarriers.add(new CarrierIdentifier(MCC2, MNC2, null, null, null, null));
+
+ ArrayList<CarrierIdentifier> excludedCarriers = new ArrayList<>();
+ excludedCarriers.add(new CarrierIdentifier(MCC2, MNC2, null, null, GID1, null));
+
+ CarrierRestrictionRules rules = CarrierRestrictionRules.newBuilder()
+ .setAllowedCarriers(allowedCarriers)
+ .setExcludedCarriers(excludedCarriers)
+ .setDefaultCarrierRestriction(
+ CarrierRestrictionRules.CARRIER_RESTRICTION_DEFAULT_NOT_ALLOWED)
+ .setMultiSimPolicy(
+ CarrierRestrictionRules.MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT)
+ .build();
+
+ Parcel p = Parcel.obtain();
+ rules.writeToParcel(p, 0);
+ p.setDataPosition(0);
+
+ CarrierRestrictionRules newRules = CarrierRestrictionRules.CREATOR.createFromParcel(p);
+
+ assertEquals(false, rules.isAllCarriersAllowed());
+ assertTrue(allowedCarriers.equals(newRules.getAllowedCarriers()));
+ assertTrue(excludedCarriers.equals(newRules.getExcludedCarriers()));
+ assertEquals(rules.getDefaultCarrierRestriction(),
+ newRules.getDefaultCarrierRestriction());
+ assertEquals(rules.getMultiSimPolicy(),
+ CarrierRestrictionRules.MULTISIM_POLICY_ONE_VALID_SIM_MUST_BE_PRESENT);
+ }
+
+ @SmallTest
+ public void testDefaultMultiSimPolicy() {
+ CarrierRestrictionRules rules = CarrierRestrictionRules.newBuilder().build();
+
+ assertEquals(CarrierRestrictionRules.MULTISIM_POLICY_NONE, rules.getMultiSimPolicy());
+ }
+}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/RILTest.java b/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
index b87b416..22ddffb 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/RILTest.java
@@ -92,6 +92,7 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
+import android.hardware.radio.V1_0.Carrier;
import android.hardware.radio.V1_0.CdmaSmsMessage;
import android.hardware.radio.V1_0.DataProfileInfo;
import android.hardware.radio.V1_0.GsmSmsMessage;
@@ -110,6 +111,7 @@
import android.os.Message;
import android.os.PowerManager;
import android.os.WorkSource;
+import android.service.carrier.CarrierIdentifier;
import android.telephony.AccessNetworkConstants;
import android.telephony.CellIdentityCdma;
import android.telephony.CellIdentityGsm;
@@ -1700,4 +1702,50 @@
assertEquals(BEARER_BITMAP, dpi.bearerBitmap);
assertEquals(MTU, dpi.mtu);
}
+
+ @Test
+ public void testCreateCarrierRestrictionList() {
+ ArrayList<CarrierIdentifier> carriers = new ArrayList<>();
+ carriers.add(new CarrierIdentifier("110", "120", null, null, null, null));
+ carriers.add(new CarrierIdentifier("210", "220", "SPN", null, null, null));
+ carriers.add(new CarrierIdentifier("310", "320", null, "012345", null, null));
+ carriers.add(new CarrierIdentifier("410", "420", null, null, "GID1", null));
+ carriers.add(new CarrierIdentifier("510", "520", null, null, null, "GID2"));
+
+ Carrier c1 = new Carrier();
+ c1.mcc = "110";
+ c1.mnc = "120";
+ c1.matchType = CarrierIdentifier.MatchType.ALL;
+ Carrier c2 = new Carrier();
+ c2.mcc = "210";
+ c2.mnc = "220";
+ c2.matchType = CarrierIdentifier.MatchType.SPN;
+ c2.matchData = "SPN";
+ Carrier c3 = new Carrier();
+ c3.mcc = "310";
+ c3.mnc = "320";
+ c3.matchType = CarrierIdentifier.MatchType.IMSI_PREFIX;
+ c3.matchData = "012345";
+ Carrier c4 = new Carrier();
+ c4.mcc = "410";
+ c4.mnc = "420";
+ c4.matchType = CarrierIdentifier.MatchType.GID1;
+ c4.matchData = "GID1";
+ Carrier c5 = new Carrier();
+ c5.mcc = "510";
+ c5.mnc = "520";
+ c5.matchType = CarrierIdentifier.MatchType.GID2;
+ c5.matchData = "GID2";
+
+ ArrayList<Carrier> expected = new ArrayList<>();
+ expected.add(c1);
+ expected.add(c2);
+ expected.add(c3);
+ expected.add(c4);
+ expected.add(c5);
+
+ ArrayList<Carrier> result = RIL.createCarrierRestrictionList(carriers);
+
+ assertTrue(result.equals(expected));
+ }
}