Loading src/java/com/android/internal/telephony/SubscriptionController.java +87 −94 Original line number Diff line number Diff line Loading @@ -525,33 +525,34 @@ public class SubscriptionController extends ISub.Stub { /** * New SubInfoRecord instance and fill in detail info * @param cursor * @param cursor The database cursor * @return the query result of desired SubInfoRecord */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private SubscriptionInfo getSubInfoRecord(Cursor cursor) { SubscriptionInfo.Builder builder = new SubscriptionInfo.Builder(); int id = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID)); String iccId = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.ICC_ID)); int simSlotIndex = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.SIM_SLOT_INDEX)); String displayName = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.DISPLAY_NAME)); String carrierName = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.CARRIER_NAME)); int nameSource = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.NAME_SOURCE)); int iconTint = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.HUE)); String number = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.NUMBER)); int dataRoaming = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.DATA_ROAMING)); String mcc = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.MCC_STRING)); String mnc = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.MNC_STRING)); builder.setId(id) .setIccId(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.ICC_ID))) .setSimSlotIndex(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.SIM_SLOT_INDEX))) .setDisplayName(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.DISPLAY_NAME))) .setCarrierName(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.CARRIER_NAME))) .setNameSource(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.NAME_SOURCE))) .setIconTint(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.HUE))) .setDataRoaming(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.DATA_ROAMING))) .setMcc(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.MCC_STRING))) .setMnc(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.MNC_STRING))); String ehplmnsRaw = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.EHPLMNS)); String hplmnsRaw = cursor.getString(cursor.getColumnIndexOrThrow( Loading @@ -559,77 +560,63 @@ public class SubscriptionController extends ISub.Stub { String[] ehplmns = ehplmnsRaw == null ? null : ehplmnsRaw.split(","); String[] hplmns = hplmnsRaw == null ? null : hplmnsRaw.split(","); // cardId is the private ICCID/EID string, also known as the card string String cardId = cursor.getString(cursor.getColumnIndexOrThrow( builder.setEhplmns(ehplmns).setHplmns(hplmns); // CARD_ID is the private ICCID/EID string, also known as the card string String cardString = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.CARD_ID)); String countryIso = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.ISO_COUNTRY_CODE)); builder.setCardString(cardString); // publicCardId is the publicly exposed int card ID int publicCardId = mUiccController.convertToPublicCardId(cardId); int publicCardId = mUiccController.convertToPublicCardId(cardString); builder.setCardId(publicCardId); builder.setCountryIso(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.ISO_COUNTRY_CODE))) .setCarrierId(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.CARRIER_ID))); boolean isEmbedded = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.IS_EMBEDDED)) == 1; int carrierId = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.CARRIER_ID)); UiccAccessRule[] accessRules; builder.setEmbedded(isEmbedded); if (isEmbedded) { accessRules = UiccAccessRule.decodeRules(cursor.getBlob( cursor.getColumnIndexOrThrow(SubscriptionManager.ACCESS_RULES))); } else { accessRules = null; } UiccAccessRule[] carrierConfigAccessRules = UiccAccessRule.decodeRules(cursor.getBlob( cursor.getColumnIndexOrThrow(SubscriptionManager.ACCESS_RULES_FROM_CARRIER_CONFIGS))); boolean isOpportunistic = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.IS_OPPORTUNISTIC)) == 1; String groupUUID = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.GROUP_UUID)); int profileClass = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.PROFILE_CLASS)); int portIndex = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.PORT_INDEX)); int subType = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.SUBSCRIPTION_TYPE)); String groupOwner = getOptionalStringFromCursor(cursor, SubscriptionManager.GROUP_OWNER, /*defaultVal*/ null); boolean areUiccApplicationsEnabled = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.UICC_APPLICATIONS_ENABLED)) == 1; int usageSetting = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.USAGE_SETTING)); if (VDBG) { String iccIdToPrint = SubscriptionInfo.givePrintableIccid(iccId); String cardIdToPrint = SubscriptionInfo.givePrintableIccid(cardId); logd("[getSubInfoRecord] id:" + id + " iccid:" + iccIdToPrint + " simSlotIndex:" + simSlotIndex + " carrierid:" + carrierId + " displayName:" + displayName + " nameSource:" + nameSource + " iconTint:" + iconTint + " dataRoaming:" + dataRoaming + " mcc:" + mcc + " mnc:" + mnc + " countIso:" + countryIso + " isEmbedded:" + isEmbedded + " accessRules:" + Arrays.toString(accessRules) + " carrierConfigAccessRules: " + Arrays.toString(carrierConfigAccessRules) + " cardId:" + cardIdToPrint + " portIndex:" + portIndex + " publicCardId:" + publicCardId + " isOpportunistic:" + isOpportunistic + " groupUUID:" + groupUUID + " profileClass:" + profileClass + " subscriptionType: " + subType + " areUiccApplicationsEnabled: " + areUiccApplicationsEnabled + " usageSetting: " + usageSetting); } builder.setNativeAccessRules(UiccAccessRule.decodeRules(cursor.getBlob( cursor.getColumnIndexOrThrow(SubscriptionManager.ACCESS_RULES)))); } builder.setCarrierConfigAccessRules(UiccAccessRule.decodeRules(cursor.getBlob( cursor.getColumnIndexOrThrow( SubscriptionManager.ACCESS_RULES_FROM_CARRIER_CONFIGS)))) .setOpportunistic(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.IS_OPPORTUNISTIC)) == 1) .setGroupUuid(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.GROUP_UUID))) .setProfileClass(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.PROFILE_CLASS))) .setPortIndex(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.PORT_INDEX))) .setType(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.SUBSCRIPTION_TYPE))) .setGroupOwner(getOptionalStringFromCursor(cursor, SubscriptionManager.GROUP_OWNER, /*defaultVal*/ null)) .setUiccApplicationsEnabled(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.UICC_APPLICATIONS_ENABLED)) == 1) .setUsageSetting(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.USAGE_SETTING))); // If line1number has been set to a different number, use it instead. String number = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.NUMBER)); String line1Number = mTelephonyManager.getLine1Number(id); if (!TextUtils.isEmpty(line1Number) && !line1Number.equals(number)) { number = line1Number; } builder.setNumber(number); // FIXME(b/210771052): constructing a complete SubscriptionInfo requires a port index, // but the port index isn't available here. Should it actually be part of SubscriptionInfo? SubscriptionInfo info = new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, dataRoaming, /* icon= */ null, mcc, mnc, countryIso, isEmbedded, accessRules, cardId, publicCardId, isOpportunistic, groupUUID, /* isGroupDisabled= */ false , carrierId, profileClass, subType, groupOwner, carrierConfigAccessRules, areUiccApplicationsEnabled, portIndex, usageSetting); info.setAssociatedPlmns(ehplmns, hplmns); return info; return builder.build(); } private String getOptionalStringFromCursor(Cursor cursor, String column, String defaultVal) { Loading Loading @@ -3161,8 +3148,8 @@ public class SubscriptionController extends ISub.Stub { /** * Get the SIM state for the slot index. * For Remote-SIMs, this method returns {@link #IccCardConstants.State.UNKNOWN} * @return SIM state as the ordinal of {@See IccCardConstants.State} * For Remote-SIMs, this method returns {@link IccCardConstants.State#UNKNOWN} * @return SIM state as the ordinal of {@link IccCardConstants.State} */ @Override public int getSimStateForSlotIndex(int slotIndex) { Loading Loading @@ -4158,7 +4145,10 @@ public class SubscriptionController extends ISub.Stub { } // Can't find the existing SIM. if (slotInfo == null) return false; if (slotInfo == null) { loge("Can't find the existing SIM."); return false; } // this for physical slot which has only one port if (enable && !slotInfo.getPorts().stream().findFirst().get().isActive()) { Loading Loading @@ -4408,16 +4398,16 @@ public class SubscriptionController extends ISub.Stub { if (hasIdentifierAccess && hasPhoneNumberAccess) { return subInfo; } SubscriptionInfo result = new SubscriptionInfo(subInfo); SubscriptionInfo.Builder result = new SubscriptionInfo.Builder(subInfo); if (!hasIdentifierAccess) { result.clearIccId(); result.clearCardString(); result.clearGroupUuid(); result.setIccId(null); result.setCardString(null); result.setGroupUuid(null); } if (!hasPhoneNumberAccess) { result.clearNumber(); result.setNumber(null); } return result; return result.build(); } private synchronized boolean addToSubIdList(int slotIndex, int subId, int subscriptionType) { Loading Loading @@ -4492,20 +4482,23 @@ public class SubscriptionController extends ISub.Stub { mCacheOpportunisticSubInfoList = subList; for (SubscriptionInfo info : mCacheOpportunisticSubInfoList) { for (int i = 0; i < mCacheOpportunisticSubInfoList.size(); i++) { SubscriptionInfo info = mCacheOpportunisticSubInfoList.get(i); if (shouldDisableSubGroup(info.getGroupUuid())) { info.setGroupDisabled(true); SubscriptionInfo.Builder builder = new SubscriptionInfo.Builder(info); builder.setGroupDisabled(true); mCacheOpportunisticSubInfoList.set(i, builder.build()); } } if (DBG_CACHE) { if (!mCacheOpportunisticSubInfoList.isEmpty()) { for (SubscriptionInfo si : mCacheOpportunisticSubInfoList) { logd("[refreshCachedOpptSubscriptionInfoList] Setting Cached info=" + si); logd("[refreshCachedOpportunisticSubscriptionInfoList] Setting Cached " + "info=" + si); } } else { logdl("[refreshCachedOpptSubscriptionInfoList]- no info return"); logdl("[refreshCachedOpportunisticSubscriptionInfoList]- no info return"); } } Loading Loading @@ -4686,7 +4679,7 @@ public class SubscriptionController extends ISub.Stub { * Sets the phone number for the given {@code subId}. * * <p>The only accepted {@code source} is {@link * SubscriptionManager.PHONE_NUMBER_SOURCE_CARRIER}. * SubscriptionManager#PHONE_NUMBER_SOURCE_CARRIER}. */ @Override public void setPhoneNumber(int subId, int source, String number, Loading tests/telephonytests/src/com/android/internal/telephony/FakeTelephonyProvider.java +1 −0 Original line number Diff line number Diff line Loading @@ -145,6 +145,7 @@ public class FakeTelephonyProvider extends MockContentProvider { @Override public Uri insert(Uri uri, ContentValues values) { Log.d(TAG, "insert. values=" + values); SQLiteDatabase db = mDbHelper.getWritableDatabase(); long id = db.insert("siminfo", null, values); return ContentUris.withAppendedId(Telephony.SimInfo.CONTENT_URI, id); Loading tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java +17 −4 Original line number Diff line number Diff line Loading @@ -1658,10 +1658,23 @@ public class GsmCdmaPhoneTest extends TelephonyTest { private SubscriptionInfo makeSubscriptionInfo(boolean isOpportunistic, int usageSetting) { return new SubscriptionInfo( 1, "xxxxxxxxx", 1, "Android Test", "Android Test", 0, 0, "8675309", 0, null, "001", "01", "us", true, null, null, 0, isOpportunistic, null, false, 1, 1, 0, null, null, true, 0, usageSetting); return new SubscriptionInfo.Builder() .setId(1) .setIccId("xxxxxxxxx") .setSimSlotIndex(1) .setDisplayName("Android Test") .setDisplayName("Android Test") .setNameSource(SubscriptionManager.NAME_SOURCE_CARRIER) .setNumber("8675309") .setMcc("001") .setMnc("01") .setCountryIso("us") .setEmbedded(true) .setOpportunistic(isOpportunistic) .setCarrierId(1) .setProfileClass(SubscriptionManager.PROFILE_CLASS_PROVISIONING) .setUsageSetting(usageSetting) .build(); } @Test Loading tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java +35 −25 Original line number Diff line number Diff line Loading @@ -89,28 +89,38 @@ public class MultiSimSettingControllerTest extends TelephonyTest { private DataSettingsManager mDataSettingsManagerMock2; private CommandsInterface mMockCi; private final SubscriptionInfo mSubInfo1 = new SubscriptionInfo.Builder() .setId(1) .setIccId("subInfo1 IccId") .setSimSlotIndex(0) .setDisplayName("T-mobile") .setCarrierName("T-mobile") .setNameSource(SubscriptionManager.NAME_SOURCE_CARRIER) .setIconTint(255) .setNumber("12345") .setMcc("310") .setMnc("260") .setCountryIso("us") .build(); private final SubscriptionInfo mSubInfo2 = new SubscriptionInfo.Builder(mSubInfo1) .setId(2) .setIccId("subInfo2 IccId") .setGroupUuid(mGroupUuid1.toString()) .build(); private final SubscriptionInfo mSubInfo3 = new SubscriptionInfo.Builder(mSubInfo1) .setId(3) .setIccId("subInfo3 IccId") .setGroupUuid(mGroupUuid1.toString()) .build(); private final SubscriptionInfo mSubInfo4 = new SubscriptionInfo.Builder(mSubInfo1) .setId(4) .setIccId("subInfo4 IccId") .setGroupUuid(mGroupUuid1.toString()) .build(); private final SubscriptionInfo mSubInfo1 = new SubscriptionInfo(1, "subInfo1 IccId", 0, "T-mobile", "T-mobile", 0, 255, "12345", 0, null, "310", "260", "156", false, null, null); private final SubscriptionInfo mSubInfo2 = new SubscriptionInfo(2, "subInfo2 IccId", 1, "T-mobile", "T-mobile", 0, 255, "12345", 0, null, "310", "260", "156", false, null, null, -1, false, mGroupUuid1.toString(), false, TelephonyManager.UNKNOWN_CARRIER_ID, SubscriptionManager.PROFILE_CLASS_DEFAULT, SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null, null, true, -1); private final SubscriptionInfo mSubInfo3 = new SubscriptionInfo(3, "subInfo3 IccId", -1, "T-mobile", "T-mobile", 0, 255, "12345", 0, null, "310", "260", "156", false, null, null, -1, false, mGroupUuid1.toString(), false, TelephonyManager.UNKNOWN_CARRIER_ID, SubscriptionManager.PROFILE_CLASS_DEFAULT, SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null, null, true, -1); private final SubscriptionInfo mSubInfo4 = new SubscriptionInfo(4, "subInfo4 IccId", -1, "T-mobile", "T-mobile", 0, 255, "12345", 0, null, "310", "260", "156", false, null, null, -1, false, mGroupUuid1.toString(), false, TelephonyManager.UNKNOWN_CARRIER_ID, SubscriptionManager.PROFILE_CLASS_DEFAULT, SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null, null, true, -1); @Before public void setUp() throws Exception { Loading Loading @@ -615,7 +625,7 @@ public class MultiSimSettingControllerTest extends TelephonyTest { public void testGroupedCbrs() throws Exception { // Mark sub 1 as opportunistic. replaceInstance(SubscriptionInfo.class, "mIsOpportunistic", mSubInfo1, true); replaceInstance(SubscriptionInfo.class, "mGroupUUID", mSubInfo1, mGroupUuid1); replaceInstance(SubscriptionInfo.class, "mGroupUuid", mSubInfo1, mGroupUuid1); doReturn(true).when(mSubControllerMock).isOpportunistic(1); // Make opportunistic sub 1 and sub 2 data enabled. doReturn(true).when(mPhoneMock1).isUserDataEnabled(); Loading Loading @@ -657,7 +667,7 @@ public class MultiSimSettingControllerTest extends TelephonyTest { @SmallTest public void testGroupedPrimaryRemoved() throws Exception { // Create subscription grouping of subs 1 and 2. replaceInstance(SubscriptionInfo.class, "mGroupUUID", mSubInfo1, mGroupUuid1); replaceInstance(SubscriptionInfo.class, "mGroupUuid", mSubInfo1, mGroupUuid1); doReturn(mGroupUuid1).when(mSubControllerMock).getGroupUuid(1); doReturn(mGroupUuid1).when(mSubControllerMock).getGroupUuid(2); doReturn(Arrays.asList(mSubInfo1, mSubInfo2)).when(mSubControllerMock) Loading Loading @@ -713,7 +723,7 @@ public class MultiSimSettingControllerTest extends TelephonyTest { processAllMessages(); // Create subscription grouping. replaceInstance(SubscriptionInfo.class, "mGroupUUID", mSubInfo1, mGroupUuid1); replaceInstance(SubscriptionInfo.class, "mGroupUuid", mSubInfo1, mGroupUuid1); doReturn(Arrays.asList(mSubInfo1, mSubInfo2)).when(mSubControllerMock) .getSubscriptionsInGroup(any(), anyString(), nullable(String.class)); mMultiSimSettingControllerUT.notifySubscriptionGroupChanged(mGroupUuid1); Loading Loading @@ -933,7 +943,7 @@ public class MultiSimSettingControllerTest extends TelephonyTest { public void onSubscriptionGroupChanged_allActiveSubArePartOfGroup() throws Exception { doReturn(3).when(mSubControllerMock).getDefaultDataSubId(); // Create subscription grouping of subs 1 and 2. replaceInstance(SubscriptionInfo.class, "mGroupUUID", mSubInfo1, mGroupUuid1); replaceInstance(SubscriptionInfo.class, "mGroupUuid", mSubInfo1, mGroupUuid1); doReturn(mGroupUuid1).when(mSubControllerMock).getGroupUuid(1); doReturn(mGroupUuid1).when(mSubControllerMock).getGroupUuid(2); GlobalSettingsHelper.setBoolean(mContext, Settings.Global.MOBILE_DATA, 1, true); Loading tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoTest.java +43 −59 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
src/java/com/android/internal/telephony/SubscriptionController.java +87 −94 Original line number Diff line number Diff line Loading @@ -525,33 +525,34 @@ public class SubscriptionController extends ISub.Stub { /** * New SubInfoRecord instance and fill in detail info * @param cursor * @param cursor The database cursor * @return the query result of desired SubInfoRecord */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private SubscriptionInfo getSubInfoRecord(Cursor cursor) { SubscriptionInfo.Builder builder = new SubscriptionInfo.Builder(); int id = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.UNIQUE_KEY_SUBSCRIPTION_ID)); String iccId = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.ICC_ID)); int simSlotIndex = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.SIM_SLOT_INDEX)); String displayName = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.DISPLAY_NAME)); String carrierName = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.CARRIER_NAME)); int nameSource = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.NAME_SOURCE)); int iconTint = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.HUE)); String number = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.NUMBER)); int dataRoaming = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.DATA_ROAMING)); String mcc = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.MCC_STRING)); String mnc = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.MNC_STRING)); builder.setId(id) .setIccId(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.ICC_ID))) .setSimSlotIndex(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.SIM_SLOT_INDEX))) .setDisplayName(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.DISPLAY_NAME))) .setCarrierName(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.CARRIER_NAME))) .setNameSource(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.NAME_SOURCE))) .setIconTint(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.HUE))) .setDataRoaming(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.DATA_ROAMING))) .setMcc(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.MCC_STRING))) .setMnc(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.MNC_STRING))); String ehplmnsRaw = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.EHPLMNS)); String hplmnsRaw = cursor.getString(cursor.getColumnIndexOrThrow( Loading @@ -559,77 +560,63 @@ public class SubscriptionController extends ISub.Stub { String[] ehplmns = ehplmnsRaw == null ? null : ehplmnsRaw.split(","); String[] hplmns = hplmnsRaw == null ? null : hplmnsRaw.split(","); // cardId is the private ICCID/EID string, also known as the card string String cardId = cursor.getString(cursor.getColumnIndexOrThrow( builder.setEhplmns(ehplmns).setHplmns(hplmns); // CARD_ID is the private ICCID/EID string, also known as the card string String cardString = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.CARD_ID)); String countryIso = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.ISO_COUNTRY_CODE)); builder.setCardString(cardString); // publicCardId is the publicly exposed int card ID int publicCardId = mUiccController.convertToPublicCardId(cardId); int publicCardId = mUiccController.convertToPublicCardId(cardString); builder.setCardId(publicCardId); builder.setCountryIso(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.ISO_COUNTRY_CODE))) .setCarrierId(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.CARRIER_ID))); boolean isEmbedded = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.IS_EMBEDDED)) == 1; int carrierId = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.CARRIER_ID)); UiccAccessRule[] accessRules; builder.setEmbedded(isEmbedded); if (isEmbedded) { accessRules = UiccAccessRule.decodeRules(cursor.getBlob( cursor.getColumnIndexOrThrow(SubscriptionManager.ACCESS_RULES))); } else { accessRules = null; } UiccAccessRule[] carrierConfigAccessRules = UiccAccessRule.decodeRules(cursor.getBlob( cursor.getColumnIndexOrThrow(SubscriptionManager.ACCESS_RULES_FROM_CARRIER_CONFIGS))); boolean isOpportunistic = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.IS_OPPORTUNISTIC)) == 1; String groupUUID = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.GROUP_UUID)); int profileClass = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.PROFILE_CLASS)); int portIndex = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.PORT_INDEX)); int subType = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.SUBSCRIPTION_TYPE)); String groupOwner = getOptionalStringFromCursor(cursor, SubscriptionManager.GROUP_OWNER, /*defaultVal*/ null); boolean areUiccApplicationsEnabled = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.UICC_APPLICATIONS_ENABLED)) == 1; int usageSetting = cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.USAGE_SETTING)); if (VDBG) { String iccIdToPrint = SubscriptionInfo.givePrintableIccid(iccId); String cardIdToPrint = SubscriptionInfo.givePrintableIccid(cardId); logd("[getSubInfoRecord] id:" + id + " iccid:" + iccIdToPrint + " simSlotIndex:" + simSlotIndex + " carrierid:" + carrierId + " displayName:" + displayName + " nameSource:" + nameSource + " iconTint:" + iconTint + " dataRoaming:" + dataRoaming + " mcc:" + mcc + " mnc:" + mnc + " countIso:" + countryIso + " isEmbedded:" + isEmbedded + " accessRules:" + Arrays.toString(accessRules) + " carrierConfigAccessRules: " + Arrays.toString(carrierConfigAccessRules) + " cardId:" + cardIdToPrint + " portIndex:" + portIndex + " publicCardId:" + publicCardId + " isOpportunistic:" + isOpportunistic + " groupUUID:" + groupUUID + " profileClass:" + profileClass + " subscriptionType: " + subType + " areUiccApplicationsEnabled: " + areUiccApplicationsEnabled + " usageSetting: " + usageSetting); } builder.setNativeAccessRules(UiccAccessRule.decodeRules(cursor.getBlob( cursor.getColumnIndexOrThrow(SubscriptionManager.ACCESS_RULES)))); } builder.setCarrierConfigAccessRules(UiccAccessRule.decodeRules(cursor.getBlob( cursor.getColumnIndexOrThrow( SubscriptionManager.ACCESS_RULES_FROM_CARRIER_CONFIGS)))) .setOpportunistic(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.IS_OPPORTUNISTIC)) == 1) .setGroupUuid(cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.GROUP_UUID))) .setProfileClass(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.PROFILE_CLASS))) .setPortIndex(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.PORT_INDEX))) .setType(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.SUBSCRIPTION_TYPE))) .setGroupOwner(getOptionalStringFromCursor(cursor, SubscriptionManager.GROUP_OWNER, /*defaultVal*/ null)) .setUiccApplicationsEnabled(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.UICC_APPLICATIONS_ENABLED)) == 1) .setUsageSetting(cursor.getInt(cursor.getColumnIndexOrThrow( SubscriptionManager.USAGE_SETTING))); // If line1number has been set to a different number, use it instead. String number = cursor.getString(cursor.getColumnIndexOrThrow( SubscriptionManager.NUMBER)); String line1Number = mTelephonyManager.getLine1Number(id); if (!TextUtils.isEmpty(line1Number) && !line1Number.equals(number)) { number = line1Number; } builder.setNumber(number); // FIXME(b/210771052): constructing a complete SubscriptionInfo requires a port index, // but the port index isn't available here. Should it actually be part of SubscriptionInfo? SubscriptionInfo info = new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, dataRoaming, /* icon= */ null, mcc, mnc, countryIso, isEmbedded, accessRules, cardId, publicCardId, isOpportunistic, groupUUID, /* isGroupDisabled= */ false , carrierId, profileClass, subType, groupOwner, carrierConfigAccessRules, areUiccApplicationsEnabled, portIndex, usageSetting); info.setAssociatedPlmns(ehplmns, hplmns); return info; return builder.build(); } private String getOptionalStringFromCursor(Cursor cursor, String column, String defaultVal) { Loading Loading @@ -3161,8 +3148,8 @@ public class SubscriptionController extends ISub.Stub { /** * Get the SIM state for the slot index. * For Remote-SIMs, this method returns {@link #IccCardConstants.State.UNKNOWN} * @return SIM state as the ordinal of {@See IccCardConstants.State} * For Remote-SIMs, this method returns {@link IccCardConstants.State#UNKNOWN} * @return SIM state as the ordinal of {@link IccCardConstants.State} */ @Override public int getSimStateForSlotIndex(int slotIndex) { Loading Loading @@ -4158,7 +4145,10 @@ public class SubscriptionController extends ISub.Stub { } // Can't find the existing SIM. if (slotInfo == null) return false; if (slotInfo == null) { loge("Can't find the existing SIM."); return false; } // this for physical slot which has only one port if (enable && !slotInfo.getPorts().stream().findFirst().get().isActive()) { Loading Loading @@ -4408,16 +4398,16 @@ public class SubscriptionController extends ISub.Stub { if (hasIdentifierAccess && hasPhoneNumberAccess) { return subInfo; } SubscriptionInfo result = new SubscriptionInfo(subInfo); SubscriptionInfo.Builder result = new SubscriptionInfo.Builder(subInfo); if (!hasIdentifierAccess) { result.clearIccId(); result.clearCardString(); result.clearGroupUuid(); result.setIccId(null); result.setCardString(null); result.setGroupUuid(null); } if (!hasPhoneNumberAccess) { result.clearNumber(); result.setNumber(null); } return result; return result.build(); } private synchronized boolean addToSubIdList(int slotIndex, int subId, int subscriptionType) { Loading Loading @@ -4492,20 +4482,23 @@ public class SubscriptionController extends ISub.Stub { mCacheOpportunisticSubInfoList = subList; for (SubscriptionInfo info : mCacheOpportunisticSubInfoList) { for (int i = 0; i < mCacheOpportunisticSubInfoList.size(); i++) { SubscriptionInfo info = mCacheOpportunisticSubInfoList.get(i); if (shouldDisableSubGroup(info.getGroupUuid())) { info.setGroupDisabled(true); SubscriptionInfo.Builder builder = new SubscriptionInfo.Builder(info); builder.setGroupDisabled(true); mCacheOpportunisticSubInfoList.set(i, builder.build()); } } if (DBG_CACHE) { if (!mCacheOpportunisticSubInfoList.isEmpty()) { for (SubscriptionInfo si : mCacheOpportunisticSubInfoList) { logd("[refreshCachedOpptSubscriptionInfoList] Setting Cached info=" + si); logd("[refreshCachedOpportunisticSubscriptionInfoList] Setting Cached " + "info=" + si); } } else { logdl("[refreshCachedOpptSubscriptionInfoList]- no info return"); logdl("[refreshCachedOpportunisticSubscriptionInfoList]- no info return"); } } Loading Loading @@ -4686,7 +4679,7 @@ public class SubscriptionController extends ISub.Stub { * Sets the phone number for the given {@code subId}. * * <p>The only accepted {@code source} is {@link * SubscriptionManager.PHONE_NUMBER_SOURCE_CARRIER}. * SubscriptionManager#PHONE_NUMBER_SOURCE_CARRIER}. */ @Override public void setPhoneNumber(int subId, int source, String number, Loading
tests/telephonytests/src/com/android/internal/telephony/FakeTelephonyProvider.java +1 −0 Original line number Diff line number Diff line Loading @@ -145,6 +145,7 @@ public class FakeTelephonyProvider extends MockContentProvider { @Override public Uri insert(Uri uri, ContentValues values) { Log.d(TAG, "insert. values=" + values); SQLiteDatabase db = mDbHelper.getWritableDatabase(); long id = db.insert("siminfo", null, values); return ContentUris.withAppendedId(Telephony.SimInfo.CONTENT_URI, id); Loading
tests/telephonytests/src/com/android/internal/telephony/GsmCdmaPhoneTest.java +17 −4 Original line number Diff line number Diff line Loading @@ -1658,10 +1658,23 @@ public class GsmCdmaPhoneTest extends TelephonyTest { private SubscriptionInfo makeSubscriptionInfo(boolean isOpportunistic, int usageSetting) { return new SubscriptionInfo( 1, "xxxxxxxxx", 1, "Android Test", "Android Test", 0, 0, "8675309", 0, null, "001", "01", "us", true, null, null, 0, isOpportunistic, null, false, 1, 1, 0, null, null, true, 0, usageSetting); return new SubscriptionInfo.Builder() .setId(1) .setIccId("xxxxxxxxx") .setSimSlotIndex(1) .setDisplayName("Android Test") .setDisplayName("Android Test") .setNameSource(SubscriptionManager.NAME_SOURCE_CARRIER) .setNumber("8675309") .setMcc("001") .setMnc("01") .setCountryIso("us") .setEmbedded(true) .setOpportunistic(isOpportunistic) .setCarrierId(1) .setProfileClass(SubscriptionManager.PROFILE_CLASS_PROVISIONING) .setUsageSetting(usageSetting) .build(); } @Test Loading
tests/telephonytests/src/com/android/internal/telephony/MultiSimSettingControllerTest.java +35 −25 Original line number Diff line number Diff line Loading @@ -89,28 +89,38 @@ public class MultiSimSettingControllerTest extends TelephonyTest { private DataSettingsManager mDataSettingsManagerMock2; private CommandsInterface mMockCi; private final SubscriptionInfo mSubInfo1 = new SubscriptionInfo.Builder() .setId(1) .setIccId("subInfo1 IccId") .setSimSlotIndex(0) .setDisplayName("T-mobile") .setCarrierName("T-mobile") .setNameSource(SubscriptionManager.NAME_SOURCE_CARRIER) .setIconTint(255) .setNumber("12345") .setMcc("310") .setMnc("260") .setCountryIso("us") .build(); private final SubscriptionInfo mSubInfo2 = new SubscriptionInfo.Builder(mSubInfo1) .setId(2) .setIccId("subInfo2 IccId") .setGroupUuid(mGroupUuid1.toString()) .build(); private final SubscriptionInfo mSubInfo3 = new SubscriptionInfo.Builder(mSubInfo1) .setId(3) .setIccId("subInfo3 IccId") .setGroupUuid(mGroupUuid1.toString()) .build(); private final SubscriptionInfo mSubInfo4 = new SubscriptionInfo.Builder(mSubInfo1) .setId(4) .setIccId("subInfo4 IccId") .setGroupUuid(mGroupUuid1.toString()) .build(); private final SubscriptionInfo mSubInfo1 = new SubscriptionInfo(1, "subInfo1 IccId", 0, "T-mobile", "T-mobile", 0, 255, "12345", 0, null, "310", "260", "156", false, null, null); private final SubscriptionInfo mSubInfo2 = new SubscriptionInfo(2, "subInfo2 IccId", 1, "T-mobile", "T-mobile", 0, 255, "12345", 0, null, "310", "260", "156", false, null, null, -1, false, mGroupUuid1.toString(), false, TelephonyManager.UNKNOWN_CARRIER_ID, SubscriptionManager.PROFILE_CLASS_DEFAULT, SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null, null, true, -1); private final SubscriptionInfo mSubInfo3 = new SubscriptionInfo(3, "subInfo3 IccId", -1, "T-mobile", "T-mobile", 0, 255, "12345", 0, null, "310", "260", "156", false, null, null, -1, false, mGroupUuid1.toString(), false, TelephonyManager.UNKNOWN_CARRIER_ID, SubscriptionManager.PROFILE_CLASS_DEFAULT, SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null, null, true, -1); private final SubscriptionInfo mSubInfo4 = new SubscriptionInfo(4, "subInfo4 IccId", -1, "T-mobile", "T-mobile", 0, 255, "12345", 0, null, "310", "260", "156", false, null, null, -1, false, mGroupUuid1.toString(), false, TelephonyManager.UNKNOWN_CARRIER_ID, SubscriptionManager.PROFILE_CLASS_DEFAULT, SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM, null, null, true, -1); @Before public void setUp() throws Exception { Loading Loading @@ -615,7 +625,7 @@ public class MultiSimSettingControllerTest extends TelephonyTest { public void testGroupedCbrs() throws Exception { // Mark sub 1 as opportunistic. replaceInstance(SubscriptionInfo.class, "mIsOpportunistic", mSubInfo1, true); replaceInstance(SubscriptionInfo.class, "mGroupUUID", mSubInfo1, mGroupUuid1); replaceInstance(SubscriptionInfo.class, "mGroupUuid", mSubInfo1, mGroupUuid1); doReturn(true).when(mSubControllerMock).isOpportunistic(1); // Make opportunistic sub 1 and sub 2 data enabled. doReturn(true).when(mPhoneMock1).isUserDataEnabled(); Loading Loading @@ -657,7 +667,7 @@ public class MultiSimSettingControllerTest extends TelephonyTest { @SmallTest public void testGroupedPrimaryRemoved() throws Exception { // Create subscription grouping of subs 1 and 2. replaceInstance(SubscriptionInfo.class, "mGroupUUID", mSubInfo1, mGroupUuid1); replaceInstance(SubscriptionInfo.class, "mGroupUuid", mSubInfo1, mGroupUuid1); doReturn(mGroupUuid1).when(mSubControllerMock).getGroupUuid(1); doReturn(mGroupUuid1).when(mSubControllerMock).getGroupUuid(2); doReturn(Arrays.asList(mSubInfo1, mSubInfo2)).when(mSubControllerMock) Loading Loading @@ -713,7 +723,7 @@ public class MultiSimSettingControllerTest extends TelephonyTest { processAllMessages(); // Create subscription grouping. replaceInstance(SubscriptionInfo.class, "mGroupUUID", mSubInfo1, mGroupUuid1); replaceInstance(SubscriptionInfo.class, "mGroupUuid", mSubInfo1, mGroupUuid1); doReturn(Arrays.asList(mSubInfo1, mSubInfo2)).when(mSubControllerMock) .getSubscriptionsInGroup(any(), anyString(), nullable(String.class)); mMultiSimSettingControllerUT.notifySubscriptionGroupChanged(mGroupUuid1); Loading Loading @@ -933,7 +943,7 @@ public class MultiSimSettingControllerTest extends TelephonyTest { public void onSubscriptionGroupChanged_allActiveSubArePartOfGroup() throws Exception { doReturn(3).when(mSubControllerMock).getDefaultDataSubId(); // Create subscription grouping of subs 1 and 2. replaceInstance(SubscriptionInfo.class, "mGroupUUID", mSubInfo1, mGroupUuid1); replaceInstance(SubscriptionInfo.class, "mGroupUuid", mSubInfo1, mGroupUuid1); doReturn(mGroupUuid1).when(mSubControllerMock).getGroupUuid(1); doReturn(mGroupUuid1).when(mSubControllerMock).getGroupUuid(2); GlobalSettingsHelper.setBoolean(mContext, Settings.Global.MOBILE_DATA, 1, true); Loading
tests/telephonytests/src/com/android/internal/telephony/SubscriptionInfoTest.java +43 −59 File changed.Preview size limit exceeded, changes collapsed. Show changes