diff options
| -rwxr-xr-x | api/current.txt | 3 | ||||
| -rw-r--r-- | telephony/java/android/telephony/SubscriptionInfo.java | 40 | ||||
| -rw-r--r-- | telephony/java/android/telephony/SubscriptionManager.java | 49 | ||||
| -rwxr-xr-x | telephony/java/com/android/internal/telephony/ISub.aidl | 20 |
4 files changed, 77 insertions, 35 deletions
diff --git a/api/current.txt b/api/current.txt index 7c0311a0372f..d9adfd222a42 100755 --- a/api/current.txt +++ b/api/current.txt @@ -42811,6 +42811,7 @@ package android.telephony { method public java.lang.String getCountryIso(); method public int getDataRoaming(); method public java.lang.CharSequence getDisplayName(); + method public java.lang.String getGroupUuid(); method public java.lang.String getIccId(); method public int getIconTint(); method public deprecated int getMcc(); @@ -42818,7 +42819,6 @@ package android.telephony { method public deprecated int getMnc(); method public java.lang.String getMncString(); method public java.lang.String getNumber(); - method public int getParentSubId(); method public int getSimSlotIndex(); method public int getSubscriptionId(); method public boolean isEmbedded(); @@ -42852,6 +42852,7 @@ package android.telephony { method public static boolean isValidSubscriptionId(int); method public void removeOnOpportunisticSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnOpportunisticSubscriptionsChangedListener); method public void removeOnSubscriptionsChangedListener(android.telephony.SubscriptionManager.OnSubscriptionsChangedListener); + method public java.lang.String setSubscriptionGroup(int[]); method public void setSubscriptionOverrideCongested(int, boolean, long); method public void setSubscriptionOverrideUnmetered(int, boolean, long); method public void setSubscriptionPlans(int, java.util.List<android.telephony.SubscriptionPlan>); diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index 22c1e58449de..b41e14e09554 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -143,9 +143,11 @@ public class SubscriptionInfo implements Parcelable { private boolean mIsOpportunistic; /** - * SubId of the parent subscription, if there is one. + * A UUID assigned to the subscription group. It returns + * null if not assigned. */ - private int mParentSubId; + @Nullable + private String mGroupUUID; /** * @hide @@ -156,7 +158,7 @@ public class SubscriptionInfo implements Parcelable { @Nullable UiccAccessRule[] accessRules, String cardId) { this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, roaming, icon, mcc, mnc, countryIso, isEmbedded, accessRules, cardId, - false, SubscriptionManager.INVALID_SUBSCRIPTION_ID); + false, null); } /** @@ -166,7 +168,7 @@ public class SubscriptionInfo implements Parcelable { CharSequence carrierName, int nameSource, int iconTint, String number, int roaming, Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded, @Nullable UiccAccessRule[] accessRules, String cardId, boolean isOpportunistic, - int parentSubId) { + @Nullable String groupUUID) { this.mId = id; this.mIccId = iccId; this.mSimSlotIndex = simSlotIndex; @@ -184,7 +186,7 @@ public class SubscriptionInfo implements Parcelable { this.mAccessRules = accessRules; this.mCardId = cardId; this.mIsOpportunistic = isOpportunistic; - this.mParentSubId = parentSubId; + this.mGroupUUID = groupUUID; } /** @@ -388,16 +390,16 @@ public class SubscriptionInfo implements Parcelable { } /** - * Used in scenarios where a child subscription is bundled with a primary parent subscription. - * The child subscription will typically be opportunistic (see {@link #isOpportunistic()}) - * and will be used to provide data services where available, with the parent being the primary - * fallback subscription. + * Used in scenarios where different subscriptions are bundled as a group. + * It's typically a primary and an opportunistic subscription. (see {@link #isOpportunistic()}) + * Such that those subscriptions will have some affiliated behaviors such as opportunistic + * subscription may be invisible to the user. * - * @return subId of parent subscription if it’s bundled with a primary subscription. - * If there isn't one, {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID} + * @return group UUID a String of group UUID if it belongs to a group. Otherwise + * it will return null. */ - public int getParentSubId() { - return mParentSubId; + public String getGroupUuid() { + return mGroupUUID; } /** @@ -493,11 +495,11 @@ public class SubscriptionInfo implements Parcelable { UiccAccessRule[] accessRules = source.createTypedArray(UiccAccessRule.CREATOR); String cardId = source.readString(); boolean isOpportunistic = source.readBoolean(); - int parentSubId = source.readInt(); + String groupUUID = source.readString(); return new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, dataRoaming, iconBitmap, mcc, mnc, countryIso, - isEmbedded, accessRules, cardId, isOpportunistic, parentSubId); + isEmbedded, accessRules, cardId, isOpportunistic, groupUUID); } @Override @@ -525,7 +527,7 @@ public class SubscriptionInfo implements Parcelable { dest.writeTypedArray(mAccessRules, flags); dest.writeString(mCardId); dest.writeBoolean(mIsOpportunistic); - dest.writeInt(mParentSubId); + dest.writeString(mGroupUUID); } @Override @@ -559,13 +561,13 @@ public class SubscriptionInfo implements Parcelable { + " mnc " + mMnc + "mCountryIso=" + mCountryIso + " isEmbedded " + mIsEmbedded + " accessRules " + Arrays.toString(mAccessRules) + " cardId=" + cardIdToPrint + " isOpportunistic " + mIsOpportunistic - + " parentSubId=" + mParentSubId + "}"; + + " mGroupUUID=" + mGroupUUID + "}"; } @Override public int hashCode() { return Objects.hash(mId, mSimSlotIndex, mNameSource, mIconTint, mDataRoaming, mIsEmbedded, - mIsOpportunistic, mParentSubId, mIccId, mNumber, mMcc, mMnc, mCountryIso, + mIsOpportunistic, mGroupUUID, mIccId, mNumber, mMcc, mMnc, mCountryIso, mCardId, mDisplayName, mCarrierName, mAccessRules); } @@ -588,7 +590,7 @@ public class SubscriptionInfo implements Parcelable { && mDataRoaming == toCompare.mDataRoaming && mIsEmbedded == toCompare.mIsEmbedded && mIsOpportunistic == toCompare.mIsOpportunistic - && mParentSubId == toCompare.mParentSubId + && Objects.equals(mGroupUUID, toCompare.mGroupUUID) && Objects.equals(mIccId, toCompare.mIccId) && Objects.equals(mNumber, toCompare.mNumber) && Objects.equals(mMcc, toCompare.mMcc) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 93a062299be1..24bdf0a0acf9 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -118,7 +118,6 @@ public class SubscriptionManager { @UnsupportedAppUsage public static final Uri CONTENT_URI = Uri.parse("content://telephony/siminfo"); - /** * Generates a content {@link Uri} used to receive updates on simInfo change * on the given subscriptionId @@ -576,6 +575,15 @@ public class SubscriptionManager { public static final String PARENT_SUB_ID = "parent_sub_id"; /** + * TelephonyProvider column name for group ID. Subscriptions with same group ID + * are considered bundled together, and should behave as a single subscription at + * certain scenarios. + * + * @hide + */ + public static final String GROUP_UUID = "group_uuid"; + + /** * Broadcast Action: The user has changed one of the default subs related to * data, phone calls, or sms</p> * @@ -2355,19 +2363,40 @@ public class SubscriptionManager { } /** - * Set parent subId by simInfo index + * Inform SubscriptionManager that subscriptions in the list are bundled + * as a group. Typically it's a primary subscription and an opportunistic + * subscription. It should only affect multi-SIM scenarios where primary + * and opportunistic subscriptions can be activated together. + * Being in the same group means they might be activated or deactivated + * together, some of them may be invisible to the users, etc. * - * @param parentSubId subId of its parent subscription. - * @param subId the unique SubscriptionInfo index in database - * @return the number of records updated - * @hide + * Caller will either have {@link android.Manifest.permission.MODIFY_PHONE_STATE} + * permission or can manage all subscriptions in the list, according to their + * acess rules. + * + * @param subIdList list of subId that will be in the same group + * @return groupUUID a UUID assigned to the subscription group. It returns + * null if fails. * */ @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) - public int setParentSubId(int parentSubId, int subId) { - if (VDBG) logd("[setParentSubId]+ parentSubId:" + parentSubId + " subId:" + subId); - return setSubscriptionPropertyHelper(subId, "parentSubId", - (iSub)-> iSub.setParentSubId(parentSubId, subId)); + public String setSubscriptionGroup(int[] subIdList) { + String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>"; + if (VDBG) { + logd("[setSubscriptionGroup]+ subIdList:" + Arrays.toString(subIdList)); + } + + String groupUUID = null; + try { + ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); + if (iSub != null) { + groupUUID = iSub.setSubscriptionGroup(subIdList, pkgForDebug); + } + } catch (RemoteException ex) { + // ignore it + } + + return groupUUID; } private interface CallISubMethodHelper { diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl index 85b4941cf971..3aa7cbc7d132 100755 --- a/telephony/java/com/android/internal/telephony/ISub.aidl +++ b/telephony/java/com/android/internal/telephony/ISub.aidl @@ -165,13 +165,23 @@ interface ISub { int setOpportunistic(boolean opportunistic, int subId); /** - * Set parent subId by simInfo index + * Inform SubscriptionManager that subscriptions in the list are bundled + * as a group. Typically it's a primary subscription and an opportunistic + * subscription. It should only affect multi-SIM scenarios where primary + * and opportunistic subscriptions can be activated together. + * Being in the same group means they might be activated or deactivated + * together, some of them may be invisible to the users, etc. + * + * Caller will either have {@link android.Manifest.permission.MODIFY_PHONE_STATE} + * permission or can manage all subscriptions in the list, according to their + * acess rules. + * + * @param subIdList list of subId that will be in the same group + * @return groupUUID a UUID assigned to the subscription group. It returns + * null if fails. * - * @param parentSubId: subId of its parent subscription. - * @param subId the unique SubscriptionInfo index in database - * @return the number of records updated */ - int setParentSubId(int parentSubId, int subId); + String setSubscriptionGroup(in int[] subIdList, String callingPackage); /** * Set which subscription is preferred for cellular data. It's |