Merge changes from topics "subscriptionInfo_builder", "subscription_manager_service"
* changes:
Added builder for SubscriptionInfo
Added empty subscription manager service
diff --git a/core/res/res/values/config_telephony.xml b/core/res/res/values/config_telephony.xml
index ea2b988..a1d73ff 100644
--- a/core/res/res/values/config_telephony.xml
+++ b/core/res/res/values/config_telephony.xml
@@ -113,4 +113,8 @@
new network. -->
<bool name="config_enhanced_iwlan_handover_check">true</bool>
<java-symbol type="bool" name="config_enhanced_iwlan_handover_check" />
+
+ <!-- Whether using the new SubscriptionManagerService or the old SubscriptionController -->
+ <bool name="config_using_subscription_manager_service">false</bool>
+ <java-symbol type="bool" name="config_using_subscription_manager_service" />
</resources>
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index cb985bf..eb96d37 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -18,6 +18,7 @@
import static android.text.TextUtils.formatSimple;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
@@ -37,6 +38,9 @@
import android.os.Parcel;
import android.os.ParcelUuid;
import android.os.Parcelable;
+import android.telephony.SubscriptionManager.ProfileClass;
+import android.telephony.SubscriptionManager.SimDisplayNameSource;
+import android.telephony.SubscriptionManager.SubscriptionType;
import android.telephony.SubscriptionManager.UsageSetting;
import android.text.TextUtils;
import android.util.DisplayMetrics;
@@ -55,7 +59,6 @@
* A Parcelable class for Subscription Information.
*/
public class SubscriptionInfo implements Parcelable {
-
/**
* Size of text to render on the icon.
*/
@@ -65,162 +68,180 @@
* Subscription Identifier, this is a device unique number
* and not an index into an array
*/
- private int mId;
+ private final int mId;
/**
- * The GID for a SIM that maybe associated with this subscription, empty if unknown
+ * The ICCID of the SIM that is associated with this subscription, empty if unknown.
*/
- private String mIccId;
+ @NonNull
+ private final String mIccId;
/**
- * The index of the slot that currently contains the subscription
- * and not necessarily unique and maybe INVALID_SLOT_ID if unknown
+ * The index of the SIM slot that currently contains the subscription and not necessarily unique
+ * and maybe {@link SubscriptionManager#INVALID_SIM_SLOT_INDEX} if unknown or the subscription
+ * is inactive.
*/
- private int mSimSlotIndex;
+ private final int mSimSlotIndex;
/**
- * The name displayed to the user that identifies this subscription
+ * The name displayed to the user that identifies this subscription. This name is used
+ * in Settings page and can be renamed by the user.
*/
- private CharSequence mDisplayName;
+ @NonNull
+ private final CharSequence mDisplayName;
/**
- * String that identifies SPN/PLMN
- * TODO : Add a new field that identifies only SPN for a sim
+ * The name displayed to the user that identifies subscription provider name. This name is the
+ * SPN displayed in status bar and many other places. Can't be renamed by the user.
*/
- private CharSequence mCarrierName;
+ @NonNull
+ private final CharSequence mCarrierName;
/**
* The subscription carrier id.
+ *
* @see TelephonyManager#getSimCarrierId()
*/
- private int mCarrierId;
+ private final int mCarrierId;
/**
- * The source of the name, NAME_SOURCE_DEFAULT_SOURCE, NAME_SOURCE_SIM_SPN,
- * NAME_SOURCE_SIM_PNN, or NAME_SOURCE_USER_INPUT.
+ * The source of the {@link #mCarrierName}.
*/
- private int mNameSource;
+ @SimDisplayNameSource
+ private final int mNameSource;
/**
- * The color to be used for tinting the icon when displaying to the user
+ * The color to be used for tinting the icon when displaying to the user.
*/
- private int mIconTint;
+ private final int mIconTint;
/**
- * A number presented to the user identify this subscription
+ * The number presented to the user identify this subscription.
*/
- private String mNumber;
+ @NonNull
+ private final String mNumber;
/**
- * Data roaming state, DATA_ROAMING_ENABLE, DATA_ROAMING_DISABLE
+ * Whether user enables data roaming for this subscription or not. Either
+ * {@link SubscriptionManager#DATA_ROAMING_ENABLE} or
+ * {@link SubscriptionManager#DATA_ROAMING_DISABLE}.
*/
- private int mDataRoaming;
+ private final int mDataRoaming;
/**
- * SIM icon bitmap cache
- */
- @Nullable private Bitmap mIconBitmap;
-
- /**
- * Mobile Country Code
- */
- private String mMcc;
-
- /**
- * Mobile Network Code
- */
- private String mMnc;
-
- /**
- * EHPLMNs associated with the subscription
- */
- private String[] mEhplmns;
-
- /**
- * HPLMNs associated with the subscription
- */
- private String[] mHplmns;
-
- /**
- * ISO Country code for the subscription's provider
- */
- private String mCountryIso;
-
- /**
- * Whether the subscription is an embedded one.
- */
- private boolean mIsEmbedded;
-
- /**
- * The access rules for this subscription, if it is embedded and defines any.
- * This does not include access rules for non-embedded subscriptions.
+ * SIM icon bitmap cache.
*/
@Nullable
- private UiccAccessRule[] mNativeAccessRules;
+ private Bitmap mIconBitmap;
+
+ /**
+ * Mobile Country Code.
+ */
+ @Nullable
+ private final String mMcc;
+
+ /**
+ * Mobile Network Code.
+ */
+ @Nullable
+ private final String mMnc;
+
+ /**
+ * EHPLMNs associated with the subscription.
+ */
+ @NonNull
+ private final String[] mEhplmns;
+
+ /**
+ * HPLMNs associated with the subscription.
+ */
+ @NonNull
+ private final String[] mHplmns;
+
+ /**
+ * ISO Country code for the subscription's provider.
+ */
+ @NonNull
+ private final String mCountryIso;
+
+ /**
+ * Whether the subscription is from eSIM.
+ */
+ private final boolean mIsEmbedded;
+
+ /**
+ * The access rules for this subscription, if it is embedded and defines any. This does not
+ * include access rules for non-embedded subscriptions.
+ */
+ @Nullable
+ private final UiccAccessRule[] mNativeAccessRules;
/**
* The carrier certificates for this subscription that are saved in carrier configs.
* This does not include access rules from the Uicc, whether embedded or non-embedded.
*/
@Nullable
- private UiccAccessRule[] mCarrierConfigAccessRules;
+ private final UiccAccessRule[] mCarrierConfigAccessRules;
/**
* The string ID of the SIM card. It is the ICCID of the active profile for a UICC card and the
* EID for an eUICC card.
*/
- private String mCardString;
+ @NonNull
+ private final String mCardString;
/**
- * The card ID of the SIM card. This maps uniquely to the card string.
+ * The card ID of the SIM card. This maps uniquely to {@link #mCardString}.
*/
- private int mCardId;
+ private final int mCardId;
/**
* Whether the subscription is opportunistic.
*/
- private boolean mIsOpportunistic;
+ private final boolean mIsOpportunistic;
/**
- * A UUID assigned to the subscription group. It returns null if not assigned.
- * Check {@link SubscriptionManager#createSubscriptionGroup(List)} for more details.
+ * A UUID assigned to the subscription group. {@code null} if not assigned.
+ *
+ * @see SubscriptionManager#createSubscriptionGroup(List)
*/
@Nullable
- private ParcelUuid mGroupUUID;
+ private final ParcelUuid mGroupUuid;
/**
- * A package name that specifies who created the group. Null if mGroupUUID is null.
+ * A package name that specifies who created the group. Empty if not available.
*/
- private String mGroupOwner;
+ @NonNull
+ private final String mGroupOwner;
/**
- * Whether group of the subscription is disabled.
- * This is only useful if it's a grouped opportunistic subscription. In this case, if all
- * primary (non-opportunistic) subscriptions in the group are deactivated (unplugged pSIM
- * or deactivated eSIM profile), we should disable this opportunistic subscription.
+ * Whether group of the subscription is disabled. This is only useful if it's a grouped
+ * opportunistic subscription. In this case, if all primary (non-opportunistic) subscriptions
+ * in the group are deactivated (unplugged pSIM or deactivated eSIM profile), we should disable
+ * this opportunistic subscription.
*/
- private boolean mIsGroupDisabled = false;
+ private final boolean mIsGroupDisabled;
/**
- * Profile class, PROFILE_CLASS_TESTING, PROFILE_CLASS_OPERATIONAL
- * PROFILE_CLASS_PROVISIONING, or PROFILE_CLASS_UNSET.
- * A profile on the eUICC can be defined as test, operational, provisioning, or unset.
- * The profile class will be populated from the profile metadata if present. Otherwise,
- * the profile class defaults to unset if there is no profile metadata or the subscription
- * is not on an eUICC ({@link #isEmbedded} returns false).
+ * The profile class populated from the profile metadata if present. Otherwise,
+ * the profile class defaults to {@link SubscriptionManager#PROFILE_CLASS_UNSET} if there is no
+ * profile metadata or the subscription is not on an eUICC ({@link #isEmbedded} returns
+ * {@code false}).
*/
- private int mProfileClass;
+ @ProfileClass
+ private final int mProfileClass;
/**
- * Type of subscription
+ * Type of the subscription.
*/
- private int mSubscriptionType;
+ @SubscriptionType
+ private final int mType;
/**
* Whether uicc applications are configured to enable or disable.
* By default it's true.
*/
- private boolean mAreUiccApplicationsEnabled = true;
+ private final boolean mAreUiccApplicationsEnabled;
/**
* The port index of the Uicc card.
@@ -230,25 +251,16 @@
/**
* Subscription's preferred usage setting.
*/
- private @UsageSetting int mUsageSetting = SubscriptionManager.USAGE_SETTING_UNKNOWN;
-
- /**
- * Public copy constructor.
- * @hide
- */
- public SubscriptionInfo(SubscriptionInfo info) {
- this(info.mId, info.mIccId, info.mSimSlotIndex, info.mDisplayName, info.mCarrierName,
- info.mNameSource, info.mIconTint, info.mNumber, info.mDataRoaming, info.mIconBitmap,
- info.mMcc, info.mMnc, info.mCountryIso, info.mIsEmbedded, info.mNativeAccessRules,
- info.mCardString, info.mCardId, info.mIsOpportunistic,
- info.mGroupUUID == null ? null : info.mGroupUUID.toString(), info.mIsGroupDisabled,
- info.mCarrierId, info.mProfileClass, info.mSubscriptionType, info.mGroupOwner,
- info.mCarrierConfigAccessRules, info.mAreUiccApplicationsEnabled);
- }
+ @UsageSetting
+ private final int mUsageSetting;
/**
* @hide
+ *
+ * @deprecated Use {@link SubscriptionInfo.Builder}.
*/
+ // TODO: Clean up after external usages moved to builder model.
+ @Deprecated
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
@@ -262,7 +274,11 @@
/**
* @hide
+ *
+ * @deprecated Use {@link SubscriptionInfo.Builder}.
*/
+ // TODO: Clean up after external usages moved to builder model.
+ @Deprecated
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
@@ -276,7 +292,11 @@
/**
* @hide
+ *
+ * @deprecated Use {@link SubscriptionInfo.Builder}.
*/
+ // TODO: Clean up after external usages moved to builder model.
+ @Deprecated
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
@@ -293,7 +313,11 @@
/**
* @hide
+ *
+ * @deprecated Use {@link SubscriptionInfo.Builder}.
*/
+ // TODO: Clean up after external usages moved to builder model.
+ @Deprecated
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
@@ -311,49 +335,94 @@
/**
* @hide
+ *
+ * @deprecated Use {@link SubscriptionInfo.Builder}.
*/
+ // TODO: Clean up after external usages moved to builder model.
+ @Deprecated
public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName,
CharSequence carrierName, int nameSource, int iconTint, String number, int roaming,
Bitmap icon, String mcc, String mnc, String countryIso, boolean isEmbedded,
@Nullable UiccAccessRule[] nativeAccessRules, String cardString, int cardId,
- boolean isOpportunistic, @Nullable String groupUUID, boolean isGroupDisabled,
+ boolean isOpportunistic, @Nullable String groupUuid, boolean isGroupDisabled,
int carrierId, int profileClass, int subType, @Nullable String groupOwner,
@Nullable UiccAccessRule[] carrierConfigAccessRules,
boolean areUiccApplicationsEnabled, int portIndex, @UsageSetting int usageSetting) {
this.mId = id;
this.mIccId = iccId;
this.mSimSlotIndex = simSlotIndex;
- this.mDisplayName = displayName;
+ this.mDisplayName = displayName;
this.mCarrierName = carrierName;
this.mNameSource = nameSource;
this.mIconTint = iconTint;
this.mNumber = number;
this.mDataRoaming = roaming;
this.mIconBitmap = icon;
- this.mMcc = mcc;
- this.mMnc = mnc;
- this.mCountryIso = countryIso;
+ this.mMcc = TextUtils.emptyIfNull(mcc);
+ this.mMnc = TextUtils.emptyIfNull(mnc);
+ this.mHplmns = null;
+ this.mEhplmns = null;
+ this.mCountryIso = TextUtils.emptyIfNull(countryIso);
this.mIsEmbedded = isEmbedded;
this.mNativeAccessRules = nativeAccessRules;
- this.mCardString = cardString;
+ this.mCardString = TextUtils.emptyIfNull(cardString);
this.mCardId = cardId;
this.mIsOpportunistic = isOpportunistic;
- this.mGroupUUID = groupUUID == null ? null : ParcelUuid.fromString(groupUUID);
+ this.mGroupUuid = groupUuid == null ? null : ParcelUuid.fromString(groupUuid);
this.mIsGroupDisabled = isGroupDisabled;
this.mCarrierId = carrierId;
this.mProfileClass = profileClass;
- this.mSubscriptionType = subType;
- this.mGroupOwner = groupOwner;
+ this.mType = subType;
+ this.mGroupOwner = TextUtils.emptyIfNull(groupOwner);
this.mCarrierConfigAccessRules = carrierConfigAccessRules;
this.mAreUiccApplicationsEnabled = areUiccApplicationsEnabled;
this.mPortIndex = portIndex;
this.mUsageSetting = usageSetting;
}
+
/**
- * @return the subscription ID.
+ * Constructor from builder.
+ *
+ * @param builder Builder of {@link SubscriptionInfo}.
+ */
+ private SubscriptionInfo(@NonNull Builder builder) {
+ this.mId = builder.mId;
+ this.mIccId = builder.mIccId;
+ this.mSimSlotIndex = builder.mSimSlotIndex;
+ this.mDisplayName = builder.mDisplayName;
+ this.mCarrierName = builder.mCarrierName;
+ this.mNameSource = builder.mNameSource;
+ this.mIconTint = builder.mIconTint;
+ this.mNumber = builder.mNumber;
+ this.mDataRoaming = builder.mDataRoaming;
+ this.mIconBitmap = builder.mIconBitmap;
+ this.mMcc = builder.mMcc;
+ this.mMnc = builder.mMnc;
+ this.mEhplmns = builder.mEhplmns;
+ this.mHplmns = builder.mHplmns;
+ this.mCountryIso = builder.mCountryIso;
+ this.mIsEmbedded = builder.mIsEmbedded;
+ this.mNativeAccessRules = builder.mNativeAccessRules;
+ this.mCardString = builder.mCardString;
+ this.mCardId = builder.mCardId;
+ this.mIsOpportunistic = builder.mIsOpportunistic;
+ this.mGroupUuid = builder.mGroupUuid;
+ this.mIsGroupDisabled = builder.mIsGroupDisabled;
+ this.mCarrierId = builder.mCarrierId;
+ this.mProfileClass = builder.mProfileClass;
+ this.mType = builder.mType;
+ this.mGroupOwner = builder.mGroupOwner;
+ this.mCarrierConfigAccessRules = builder.mCarrierConfigAccessRules;
+ this.mAreUiccApplicationsEnabled = builder.mAreUiccApplicationsEnabled;
+ this.mPortIndex = builder.mPortIndex;
+ this.mUsageSetting = builder.mUsageSetting;
+ }
+
+ /**
+ * @return The subscription ID.
*/
public int getSubscriptionId() {
- return this.mId;
+ return mId;
}
/**
@@ -370,78 +439,56 @@
* @return the ICC ID, or an empty string if one of these requirements is not met
*/
public String getIccId() {
- return this.mIccId;
+ return mIccId;
}
/**
- * @hide
- */
- public void clearIccId() {
- this.mIccId = "";
- }
-
- /**
- * @return the slot index of this Subscription's SIM card.
+ * @return The index of the SIM slot that currently contains the subscription and not
+ * necessarily unique and maybe {@link SubscriptionManager#INVALID_SIM_SLOT_INDEX} if unknown or
+ * the subscription is inactive.
*/
public int getSimSlotIndex() {
- return this.mSimSlotIndex;
+ return mSimSlotIndex;
}
/**
- * @return the carrier id of this Subscription carrier.
+ * @return The carrier id of this subscription carrier.
+ *
* @see TelephonyManager#getSimCarrierId()
*/
public int getCarrierId() {
- return this.mCarrierId;
+ return mCarrierId;
}
/**
- * @return the name displayed to the user that identifies this subscription
+ * @return The name displayed to the user that identifies this subscription. This name is
+ * used in Settings page and can be renamed by the user.
+ *
+ * @see #getCarrierName()
*/
public CharSequence getDisplayName() {
- return this.mDisplayName;
+ return mDisplayName;
}
/**
- * Sets the name displayed to the user that identifies this subscription
- * @hide
- */
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public void setDisplayName(CharSequence name) {
- this.mDisplayName = name;
- }
-
- /**
- * @return the name displayed to the user that identifies Subscription provider name
+ * @return The name displayed to the user that identifies subscription provider name. This name
+ * is the SPN displayed in status bar and many other places. Can't be renamed by the user.
+ *
+ * @see #getDisplayName()
*/
public CharSequence getCarrierName() {
- return this.mCarrierName;
+ return mCarrierName;
}
/**
- * Sets the name displayed to the user that identifies Subscription provider name
- * @hide
- */
- public void setCarrierName(CharSequence name) {
- this.mCarrierName = name;
- }
-
- /**
- * @return the source of the name, eg NAME_SOURCE_DEFAULT_SOURCE, NAME_SOURCE_SIM_SPN or
- * NAME_SOURCE_USER_INPUT.
+ * @return The source of the {@link #getCarrierName()}.
+ *
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+ @SimDisplayNameSource
public int getNameSource() {
- return this.mNameSource;
- }
-
- /**
- * @hide
- */
- public void setAssociatedPlmns(String[] ehplmns, String[] hplmns) {
- mEhplmns = ehplmns;
- mHplmns = hplmns;
+ return mNameSource;
}
/**
@@ -499,15 +546,6 @@
}
/**
- * Sets the color displayed to the user that identifies this subscription
- * @hide
- */
- @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public void setIconTint(int iconTint) {
- this.mIconTint = iconTint;
- }
-
- /**
* Returns the number of this subscription.
*
* Starting with API level 30, returns the number of this subscription if the calling app meets
@@ -533,28 +571,23 @@
}
/**
- * @hide
- */
- public void clearNumber() {
- mNumber = "";
- }
-
- /**
- * @return the data roaming state for this subscription, either
- * {@link SubscriptionManager#DATA_ROAMING_ENABLE} or {@link SubscriptionManager#DATA_ROAMING_DISABLE}.
+ * Whether user enables data roaming for this subscription or not. Either
+ * {@link SubscriptionManager#DATA_ROAMING_ENABLE} or
+ * {@link SubscriptionManager#DATA_ROAMING_DISABLE}.
*/
public int getDataRoaming() {
- return this.mDataRoaming;
+ return mDataRoaming;
}
/**
- * @return the MCC.
+ * @return The mobile country code.
+ *
* @deprecated Use {@link #getMccString()} instead.
*/
@Deprecated
public int getMcc() {
try {
- return this.mMcc == null ? 0 : Integer.valueOf(this.mMcc);
+ return mMcc == null ? 0 : Integer.parseInt(mMcc);
} catch (NumberFormatException e) {
Log.w(SubscriptionInfo.class.getSimpleName(), "MCC string is not a number");
return 0;
@@ -562,13 +595,14 @@
}
/**
- * @return the MNC.
+ * @return The mobile network code.
+ *
* @deprecated Use {@link #getMncString()} instead.
*/
@Deprecated
public int getMnc() {
try {
- return this.mMnc == null ? 0 : Integer.valueOf(this.mMnc);
+ return mMnc == null ? 0 : Integer.parseInt(mMnc);
} catch (NumberFormatException e) {
Log.w(SubscriptionInfo.class.getSimpleName(), "MNC string is not a number");
return 0;
@@ -576,36 +610,40 @@
}
/**
- * @return The MCC, as a string.
+ * @return The mobile country code.
*/
- public @Nullable String getMccString() {
- return this.mMcc;
+ @Nullable
+ public String getMccString() {
+ return mMcc;
}
/**
- * @return The MNC, as a string.
+ * @return The mobile network code.
*/
- public @Nullable String getMncString() {
- return this.mMnc;
+ @Nullable
+ public String getMncString() {
+ return mMnc;
}
/**
- * @return the ISO country code
+ * @return The ISO country code. Empty if not available.
*/
public String getCountryIso() {
- return this.mCountryIso;
+ return mCountryIso;
}
- /** @return whether the subscription is an eUICC one. */
+ /**
+ * @return {@code true} if the subscription is from eSIM.
+ */
public boolean isEmbedded() {
- return this.mIsEmbedded;
+ return mIsEmbedded;
}
/**
* An opportunistic subscription connects to a network that is
* limited in functionality and / or coverage.
*
- * @return whether subscription is opportunistic.
+ * @return Whether subscription is opportunistic.
*/
public boolean isOpportunistic() {
return mIsOpportunistic;
@@ -617,23 +655,18 @@
* Such that those subscriptions will have some affiliated behaviors such as opportunistic
* subscription may be invisible to the user.
*
- * @return group UUID a String of group UUID if it belongs to a group. Otherwise
- * it will return null.
+ * @return Group UUID a String of group UUID if it belongs to a group. Otherwise
+ * {@code null}.
*/
- public @Nullable ParcelUuid getGroupUuid() {
- return mGroupUUID;
+ @Nullable
+ public ParcelUuid getGroupUuid() {
+ return mGroupUuid;
}
/**
* @hide
*/
- public void clearGroupUuid() {
- this.mGroupUUID = null;
- }
-
- /**
- * @hide
- */
+ @NonNull
public List<String> getEhplmns() {
return mEhplmns == null ? Collections.emptyList() : Arrays.asList(mEhplmns);
}
@@ -641,36 +674,45 @@
/**
* @hide
*/
+ @NonNull
public List<String> getHplmns() {
return mHplmns == null ? Collections.emptyList() : Arrays.asList(mHplmns);
}
/**
- * Return owner package of group the subscription belongs to.
+ * @return The owner package of group the subscription belongs to.
*
* @hide
*/
- public @Nullable String getGroupOwner() {
+ @NonNull
+ public String getGroupOwner() {
return mGroupOwner;
}
/**
- * @return the profile class of this subscription.
+ * @return The profile class populated from the profile metadata if present. Otherwise,
+ * the profile class defaults to {@link SubscriptionManager#PROFILE_CLASS_UNSET} if there is no
+ * profile metadata or the subscription is not on an eUICC ({@link #isEmbedded} return
+ * {@code false}).
+ *
* @hide
*/
@SystemApi
- public @SubscriptionManager.ProfileClass int getProfileClass() {
- return this.mProfileClass;
+ @ProfileClass
+ public int getProfileClass() {
+ return mProfileClass;
}
/**
* This method returns the type of a subscription. It can be
* {@link SubscriptionManager#SUBSCRIPTION_TYPE_LOCAL_SIM} or
* {@link SubscriptionManager#SUBSCRIPTION_TYPE_REMOTE_SIM}.
- * @return the type of subscription
+ *
+ * @return The type of the subscription.
*/
- public @SubscriptionManager.SubscriptionType int getSubscriptionType() {
- return mSubscriptionType;
+ @SubscriptionType
+ public int getSubscriptionType() {
+ return mType;
}
/**
@@ -679,7 +721,7 @@
* returns true).
*
* @param context Context of the application to check.
- * @return whether the app is authorized to manage this subscription per its metadata.
+ * @return Whether the app is authorized to manage this subscription per its metadata.
* @hide
* @deprecated - Do not use.
*/
@@ -700,7 +742,7 @@
*/
@Deprecated
public boolean canManageSubscription(Context context, String packageName) {
- List<UiccAccessRule> allAccessRules = getAllAccessRules();
+ List<UiccAccessRule> allAccessRules = getAccessRules();
if (allAccessRules == null) {
return false;
}
@@ -723,27 +765,17 @@
}
/**
- * @return the {@link UiccAccessRule}s that are stored in Uicc, dictating who
- * is authorized to manage this subscription.
- * TODO and fix it properly in R / master: either deprecate this and have 3 APIs
- * native + carrier + all, or have this return all by default.
+ * @return The {@link UiccAccessRule}s that are stored in Uicc, dictating who is authorized to
+ * manage this subscription.
+ *
* @hide
*/
@SystemApi
- public @Nullable List<UiccAccessRule> getAccessRules() {
- if (mNativeAccessRules == null) return null;
- return Arrays.asList(mNativeAccessRules);
- }
-
- /**
- * @return the {@link UiccAccessRule}s that are both stored on Uicc and in carrierConfigs
- * dictating who is authorized to manage this subscription.
- * @hide
- */
- public @Nullable List<UiccAccessRule> getAllAccessRules() {
+ @Nullable
+ public List<UiccAccessRule> getAccessRules() {
List<UiccAccessRule> merged = new ArrayList<>();
if (mNativeAccessRules != null) {
- merged.addAll(getAccessRules());
+ merged.addAll(Arrays.asList(mNativeAccessRules));
}
if (mCarrierConfigAccessRules != null) {
merged.addAll(Arrays.asList(mCarrierConfigAccessRules));
@@ -762,50 +794,38 @@
* href="https://developer.android.com/work/managed-profiles">Work profiles</a>. Profile
* owner access is deprecated and will be removed in a future release.
*
- * @return the card string of the SIM card which contains the subscription or an empty string
+ * @return The card string of the SIM card which contains the subscription or an empty string
* if these requirements are not met. The card string is the ICCID for UICCs or the EID for
* eUICCs.
+ *
* @hide
- * //TODO rename usages in LPA: UiccSlotUtil.java, UiccSlotsManager.java, UiccSlotInfoTest.java
*/
+ @NonNull
public String getCardString() {
- return this.mCardString;
+ return mCardString;
}
/**
- * @hide
- */
- public void clearCardString() {
- this.mCardString = "";
- }
-
- /**
- * Returns the card ID of the SIM card which contains the subscription (see
- * {@link UiccCardInfo#getCardId()}.
- * @return the cardId
+ * @return The card ID of the SIM card which contains the subscription.
+ *
+ * @see UiccCardInfo#getCardId().
*/
public int getCardId() {
- return this.mCardId;
+ return mCardId;
}
/**
- * Returns the port index of the SIM card which contains the subscription.
- *
- * @return the portIndex
+ * @return The port index of the SIM card which contains the subscription.
*/
public int getPortIndex() {
- return this.mPortIndex;
+ return mPortIndex;
}
/**
- * Set whether the subscription's group is disabled.
- * @hide
- */
- public void setGroupDisabled(boolean isGroupDisabled) {
- this.mIsGroupDisabled = isGroupDisabled;
- }
-
- /**
- * Return whether the subscription's group is disabled.
+ * @return {@code true} if the group of the subscription is disabled. This is only useful if
+ * it's a grouped opportunistic subscription. In this case, if all primary (non-opportunistic)
+ * subscriptions in the group are deactivated (unplugged pSIM or deactivated eSIM profile), we
+ * should disable this opportunistic subscription.
+ *
* @hide
*/
@SystemApi
@@ -814,7 +834,7 @@
}
/**
- * Return whether uicc applications are set to be enabled or disabled.
+ * @return {@code true} if Uicc applications are set to be enabled or disabled.
* @hide
*/
@SystemApi
@@ -825,56 +845,50 @@
/**
* Get the usage setting for this subscription.
*
- * @return the usage setting used for this subscription.
+ * @return The usage setting used for this subscription.
*/
- public @UsageSetting int getUsageSetting() {
+ @UsageSetting
+ public int getUsageSetting() {
return mUsageSetting;
}
- public static final @android.annotation.NonNull
- Parcelable.Creator<SubscriptionInfo> CREATOR =
- new Parcelable.Creator<SubscriptionInfo>() {
+ @NonNull
+ public static final Parcelable.Creator<SubscriptionInfo> CREATOR =
+ new Parcelable.Creator<SubscriptionInfo>() {
@Override
public SubscriptionInfo createFromParcel(Parcel source) {
- int id = source.readInt();
- String iccId = source.readString();
- int simSlotIndex = source.readInt();
- CharSequence displayName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
- CharSequence carrierName = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source);
- int nameSource = source.readInt();
- int iconTint = source.readInt();
- String number = source.readString();
- int dataRoaming = source.readInt();
- String mcc = source.readString();
- String mnc = source.readString();
- String countryIso = source.readString();
- boolean isEmbedded = source.readBoolean();
- UiccAccessRule[] nativeAccessRules = source.createTypedArray(UiccAccessRule.CREATOR);
- String cardString = source.readString();
- int cardId = source.readInt();
- int portId = source.readInt();
- boolean isOpportunistic = source.readBoolean();
- String groupUUID = source.readString();
- boolean isGroupDisabled = source.readBoolean();
- int carrierid = source.readInt();
- int profileClass = source.readInt();
- int subType = source.readInt();
- String[] ehplmns = source.createStringArray();
- String[] hplmns = source.createStringArray();
- String groupOwner = source.readString();
- UiccAccessRule[] carrierConfigAccessRules = source.createTypedArray(
- UiccAccessRule.CREATOR);
- boolean areUiccApplicationsEnabled = source.readBoolean();
- int usageSetting = source.readInt();
-
- SubscriptionInfo info = new SubscriptionInfo(id, iccId, simSlotIndex, displayName,
- carrierName, nameSource, iconTint, number, dataRoaming, /* icon= */ null,
- mcc, mnc, countryIso, isEmbedded, nativeAccessRules, cardString, cardId,
- isOpportunistic, groupUUID, isGroupDisabled, carrierid, profileClass, subType,
- groupOwner, carrierConfigAccessRules, areUiccApplicationsEnabled,
- portId, usageSetting);
- info.setAssociatedPlmns(ehplmns, hplmns);
- return info;
+ return new Builder()
+ .setId(source.readInt())
+ .setIccId(source.readString())
+ .setSimSlotIndex(source.readInt())
+ .setDisplayName(TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source))
+ .setCarrierName(TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source))
+ .setNameSource(source.readInt())
+ .setIconTint(source.readInt())
+ .setNumber(source.readString())
+ .setDataRoaming(source.readInt())
+ .setMcc(source.readString())
+ .setMnc(source.readString())
+ .setCountryIso(source.readString())
+ .setEmbedded(source.readBoolean())
+ .setNativeAccessRules(source.createTypedArray(UiccAccessRule.CREATOR))
+ .setCardString(source.readString())
+ .setCardId(source.readInt())
+ .setPortIndex(source.readInt())
+ .setOpportunistic(source.readBoolean())
+ .setGroupUuid(source.readString8())
+ .setGroupDisabled(source.readBoolean())
+ .setCarrierId(source.readInt())
+ .setProfileClass(source.readInt())
+ .setType(source.readInt())
+ .setEhplmns(source.createStringArray())
+ .setHplmns(source.createStringArray())
+ .setGroupOwner(source.readString())
+ .setCarrierConfigAccessRules(source.createTypedArray(
+ UiccAccessRule.CREATOR))
+ .setUiccApplicationsEnabled(source.readBoolean())
+ .setUsageSetting(source.readInt())
+ .build();
}
@Override
@@ -904,11 +918,11 @@
dest.writeInt(mCardId);
dest.writeInt(mPortIndex);
dest.writeBoolean(mIsOpportunistic);
- dest.writeString(mGroupUUID == null ? null : mGroupUUID.toString());
+ dest.writeString8(mGroupUuid == null ? null : mGroupUuid.toString());
dest.writeBoolean(mIsGroupDisabled);
dest.writeInt(mCarrierId);
dest.writeInt(mProfileClass);
- dest.writeInt(mSubscriptionType);
+ dest.writeInt(mType);
dest.writeStringArray(mEhplmns);
dest.writeStringArray(mHplmns);
dest.writeString(mGroupOwner);
@@ -923,6 +937,11 @@
}
/**
+ * Get ICCID stripped PII information on user build.
+ *
+ * @param iccId The original ICCID.
+ * @return The stripped string.
+ *
* @hide
*/
public static String givePrintableIccid(String iccId) {
@@ -951,12 +970,12 @@
+ " nativeAccessRules=" + Arrays.toString(mNativeAccessRules)
+ " cardString=" + cardStringToPrint + " cardId=" + mCardId
+ " portIndex=" + mPortIndex
- + " isOpportunistic=" + mIsOpportunistic + " groupUUID=" + mGroupUUID
+ + " isOpportunistic=" + mIsOpportunistic + " groupUuid=" + mGroupUuid
+ " isGroupDisabled=" + mIsGroupDisabled
+ " profileClass=" + mProfileClass
+ " ehplmns=" + Arrays.toString(mEhplmns)
+ " hplmns=" + Arrays.toString(mHplmns)
- + " subscriptionType=" + mSubscriptionType
+ + " mType=" + mType
+ " groupOwner=" + mGroupOwner
+ " carrierConfigAccessRules=" + Arrays.toString(mCarrierConfigAccessRules)
+ " areUiccApplicationsEnabled=" + mAreUiccApplicationsEnabled
@@ -966,7 +985,7 @@
@Override
public int hashCode() {
return Objects.hash(mId, mSimSlotIndex, mNameSource, mIconTint, mDataRoaming, mIsEmbedded,
- mIsOpportunistic, mGroupUUID, mIccId, mNumber, mMcc, mMnc, mCountryIso, mCardString,
+ mIsOpportunistic, mGroupUuid, mIccId, mNumber, mMcc, mMnc, mCountryIso, mCardString,
mCardId, mDisplayName, mCarrierName, Arrays.hashCode(mNativeAccessRules),
mIsGroupDisabled, mCarrierId, mProfileClass, mGroupOwner,
mAreUiccApplicationsEnabled, mPortIndex, mUsageSetting);
@@ -974,16 +993,9 @@
@Override
public boolean equals(Object obj) {
- if (obj == null) return false;
- if (obj == this) return true;
-
- SubscriptionInfo toCompare;
- try {
- toCompare = (SubscriptionInfo) obj;
- } catch (ClassCastException ex) {
- return false;
- }
-
+ if (this == obj) return true;
+ if (obj == null || getClass() != obj.getClass()) return false;
+ SubscriptionInfo toCompare = (SubscriptionInfo) obj;
return mId == toCompare.mId
&& mSimSlotIndex == toCompare.mSimSlotIndex
&& mNameSource == toCompare.mNameSource
@@ -994,7 +1006,7 @@
&& mIsGroupDisabled == toCompare.mIsGroupDisabled
&& mAreUiccApplicationsEnabled == toCompare.mAreUiccApplicationsEnabled
&& mCarrierId == toCompare.mCarrierId
- && Objects.equals(mGroupUUID, toCompare.mGroupUUID)
+ && Objects.equals(mGroupUuid, toCompare.mGroupUuid)
&& Objects.equals(mIccId, toCompare.mIccId)
&& Objects.equals(mNumber, toCompare.mNumber)
&& Objects.equals(mMcc, toCompare.mMcc)
@@ -1012,4 +1024,629 @@
&& Arrays.equals(mHplmns, toCompare.mHplmns)
&& mUsageSetting == toCompare.mUsageSetting;
}
+
+ /**
+ * The builder class of {@link SubscriptionInfo}.
+ *
+ * @hide
+ */
+ public static class Builder {
+ /**
+ * The subscription id.
+ */
+ private int mId = 0;
+
+ /**
+ * The ICCID of the SIM that is associated with this subscription, empty if unknown.
+ */
+ @NonNull
+ private String mIccId = "";
+
+ /**
+ * The index of the SIM slot that currently contains the subscription and not necessarily
+ * unique and maybe {@link SubscriptionManager#INVALID_SIM_SLOT_INDEX} if unknown or the
+ * subscription is inactive.
+ */
+ private int mSimSlotIndex = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
+
+ /**
+ * The name displayed to the user that identifies this subscription. This name is used
+ * in Settings page and can be renamed by the user.
+ */
+ @NonNull
+ private CharSequence mDisplayName = "";
+
+ /**
+ * The name displayed to the user that identifies subscription provider name. This name
+ * is the SPN displayed in status bar and many other places. Can't be renamed by the user.
+ */
+ @NonNull
+ private CharSequence mCarrierName = "";
+
+ /**
+ * The source of the carrier name.
+ */
+ @SimDisplayNameSource
+ private int mNameSource = SubscriptionManager.NAME_SOURCE_CARRIER_ID;
+
+ /**
+ * The color to be used for tinting the icon when displaying to the user.
+ */
+ private int mIconTint = 0;
+
+ /**
+ * The number presented to the user identify this subscription.
+ */
+ @NonNull
+ private String mNumber = "";
+
+ /**
+ * Whether user enables data roaming for this subscription or not. Either
+ * {@link SubscriptionManager#DATA_ROAMING_ENABLE} or
+ * {@link SubscriptionManager#DATA_ROAMING_DISABLE}.
+ */
+ private int mDataRoaming = SubscriptionManager.DATA_ROAMING_DISABLE;
+
+ /**
+ * SIM icon bitmap cache.
+ */
+ @Nullable
+ private Bitmap mIconBitmap = null;
+
+ /**
+ * The mobile country code.
+ */
+ @Nullable
+ private String mMcc = null;
+
+ /**
+ * The mobile network code.
+ */
+ @Nullable
+ private String mMnc = null;
+
+ /**
+ * EHPLMNs associated with the subscription.
+ */
+ @NonNull
+ private String[] mEhplmns = new String[0];
+
+ /**
+ * HPLMNs associated with the subscription.
+ */
+ @NonNull
+ private String[] mHplmns = new String[0];
+
+ /**
+ * The ISO Country code for the subscription's provider.
+ */
+ @NonNull
+ private String mCountryIso = "";
+
+ /**
+ * Whether the subscription is from eSIM.
+ */
+ private boolean mIsEmbedded = false;
+
+ /**
+ * The native access rules for this subscription, if it is embedded and defines any. This
+ * does not include access rules for non-embedded subscriptions.
+ */
+ @Nullable
+ private UiccAccessRule[] mNativeAccessRules = null;
+
+ /**
+ * The card string of the SIM card.
+ */
+ @NonNull
+ private String mCardString = "";
+
+ /**
+ * The card ID of the SIM card which contains the subscription.
+ */
+ private int mCardId = -1;
+
+ /**
+ * Whether the subscription is opportunistic or not.
+ */
+ private boolean mIsOpportunistic = false;
+
+ /**
+ * The group UUID of the subscription group.
+ */
+ @Nullable
+ private ParcelUuid mGroupUuid = null;
+
+ /**
+ * Whether group of the subscription is disabled. This is only useful if it's a grouped
+ * opportunistic subscription. In this case, if all primary (non-opportunistic)
+ * subscriptions in the group are deactivated (unplugged pSIM or deactivated eSIM profile),
+ * we should disable this opportunistic subscription.
+ */
+ private boolean mIsGroupDisabled = false;
+
+ /**
+ * The carrier id.
+ *
+ * @see TelephonyManager#getSimCarrierId()
+ */
+ private int mCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
+
+ /**
+ * The profile class populated from the profile metadata if present. Otherwise, the profile
+ * class defaults to {@link SubscriptionManager#PROFILE_CLASS_UNSET} if there is no profile
+ * metadata or the subscription is not on an eUICC ({@link #isEmbedded} returns
+ * {@code false}).
+ */
+ @ProfileClass
+ private int mProfileClass = SubscriptionManager.PROFILE_CLASS_UNSET;
+
+ /**
+ * The subscription type.
+ */
+ @SubscriptionType
+ private int mType = SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM;
+
+ /**
+ * The owner package of group the subscription belongs to.
+ */
+ @NonNull
+ private String mGroupOwner = "";
+
+ /**
+ * The carrier certificates for this subscription that are saved in carrier configs.
+ * This does not include access rules from the Uicc, whether embedded or non-embedded.
+ */
+ @Nullable
+ private UiccAccessRule[] mCarrierConfigAccessRules = null;
+
+ /**
+ * Whether Uicc applications are configured to enable or not.
+ */
+ private boolean mAreUiccApplicationsEnabled = true;
+
+ /**
+ * the port index of the Uicc card.
+ */
+ private int mPortIndex = 0;
+
+ /**
+ * Subscription's preferred usage setting.
+ */
+ @UsageSetting
+ private int mUsageSetting = SubscriptionManager.USAGE_SETTING_UNKNOWN;
+
+ /**
+ * Default constructor.
+ */
+ public Builder() {
+ }
+
+ /**
+ * Constructor from {@link SubscriptionInfo}.
+ *
+ * @param info The subscription info.
+ */
+ public Builder(@NonNull SubscriptionInfo info) {
+ mId = info.mId;
+ mIccId = info.mIccId;
+ mSimSlotIndex = info.mSimSlotIndex;
+ mDisplayName = info.mDisplayName;
+ mCarrierName = info.mCarrierName;
+ mNameSource = info.mNameSource;
+ mIconTint = info.mIconTint;
+ mNumber = info.mNumber;
+ mDataRoaming = info.mDataRoaming;
+ mIconBitmap = info.mIconBitmap;
+ mMcc = info.mMcc;
+ mMnc = info.mMnc;
+ mEhplmns = info.mEhplmns;
+ mHplmns = info.mHplmns;
+ mCountryIso = info.mCountryIso;
+ mIsEmbedded = info.mIsEmbedded;
+ mNativeAccessRules = info.mNativeAccessRules;
+ mCardString = info.mCardString;
+ mCardId = info.mCardId;
+ mIsOpportunistic = info.mIsOpportunistic;
+ mGroupUuid = info.mGroupUuid;
+ mIsGroupDisabled = info.mIsGroupDisabled;
+ mCarrierId = info.mCarrierId;
+ mProfileClass = info.mProfileClass;
+ mType = info.mType;
+ mGroupOwner = info.mGroupOwner;
+ mCarrierConfigAccessRules = info.mCarrierConfigAccessRules;
+ mAreUiccApplicationsEnabled = info.mAreUiccApplicationsEnabled;
+ mPortIndex = info.mPortIndex;
+ mUsageSetting = info.mUsageSetting;
+ }
+
+ /**
+ * Set the subscription id.
+ *
+ * @param id The subscription id.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setId(int id) {
+ mId = id;
+ return this;
+ }
+
+ /**
+ * Set the ICCID of the SIM that is associated with this subscription.
+ *
+ * @param iccId The ICCID of the SIM that is associated with this subscription.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setIccId(@Nullable String iccId) {
+ mIccId = TextUtils.emptyIfNull(iccId);
+ return this;
+ }
+
+ /**
+ * Set the SIM index of the slot that currently contains the subscription. Set to
+ * {@link SubscriptionManager#INVALID_SIM_SLOT_INDEX} if the subscription is inactive.
+ *
+ * @param simSlotIndex The SIM slot index.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setSimSlotIndex(int simSlotIndex) {
+ mSimSlotIndex = simSlotIndex;
+ return this;
+ }
+
+ /**
+ * The name displayed to the user that identifies this subscription. This name is used
+ * in Settings page and can be renamed by the user.
+ *
+ * @param displayName The display name.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setDisplayName(@Nullable CharSequence displayName) {
+ mDisplayName = displayName == null ? "" : displayName;
+ return this;
+ }
+
+ /**
+ * The name displayed to the user that identifies subscription provider name. This name
+ * is the SPN displayed in status bar and many other places. Can't be renamed by the user.
+ *
+ * @param carrierName The carrier name.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setCarrierName(@Nullable CharSequence carrierName) {
+ mCarrierName = carrierName == null ? "" : carrierName;
+ return this;
+ }
+
+ /**
+ * Set the source of the carrier name.
+ *
+ * @param nameSource The source of the carrier name.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setNameSource(@SimDisplayNameSource int nameSource) {
+ mNameSource = nameSource;
+ return this;
+ }
+
+ /**
+ * Set the color to be used for tinting the icon when displaying to the user.
+ *
+ * @param iconTint The color to be used for tinting the icon when displaying to the user.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setIconTint(int iconTint) {
+ mIconTint = iconTint;
+ return this;
+ }
+
+ /**
+ * Set the number presented to the user identify this subscription.
+ *
+ * @param number the number presented to the user identify this subscription.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setNumber(@Nullable String number) {
+ mNumber = TextUtils.emptyIfNull(number);
+ return this;
+ }
+
+ /**
+ * Set whether user enables data roaming for this subscription or not.
+ *
+ * @param dataRoaming Data roaming mode. Either
+ * {@link SubscriptionManager#DATA_ROAMING_ENABLE} or
+ * {@link SubscriptionManager#DATA_ROAMING_DISABLE}
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setDataRoaming(int dataRoaming) {
+ mDataRoaming = dataRoaming;
+ return this;
+ }
+
+ /**
+ * Set SIM icon bitmap cache.
+ *
+ * @param iconBitmap SIM icon bitmap cache.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setIcon(@Nullable Bitmap iconBitmap) {
+ mIconBitmap = iconBitmap;
+ return this;
+ }
+
+ /**
+ * Set the mobile country code.
+ *
+ * @param mcc The mobile country code.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setMcc(@Nullable String mcc) {
+ mMcc = mcc;
+ return this;
+ }
+
+ /**
+ * Set the mobile network code.
+ *
+ * @param mnc Mobile network code.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setMnc(@Nullable String mnc) {
+ mMnc = mnc;
+ return this;
+ }
+
+ /**
+ * Set EHPLMNs associated with the subscription.
+ *
+ * @param ehplmns EHPLMNs associated with the subscription.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setEhplmns(@Nullable String[] ehplmns) {
+ mEhplmns = ehplmns == null ? new String[0] : ehplmns;
+ return this;
+ }
+
+ /**
+ * Set HPLMNs associated with the subscription.
+ *
+ * @param hplmns HPLMNs associated with the subscription.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setHplmns(@Nullable String[] hplmns) {
+ mHplmns = hplmns == null ? new String[0] : hplmns;
+ return this;
+ }
+
+ /**
+ * Set the ISO Country code for the subscription's provider.
+ *
+ * @param countryIso The ISO Country code for the subscription's provider.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setCountryIso(@Nullable String countryIso) {
+ mCountryIso = TextUtils.emptyIfNull(countryIso);
+ return this;
+ }
+
+ /**
+ * Set whether the subscription is from eSIM or not.
+ *
+ * @param isEmbedded {@code true} if the subscription is from eSIM.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setEmbedded(boolean isEmbedded) {
+ mIsEmbedded = isEmbedded;
+ return this;
+ }
+
+ /**
+ * Set the native access rules for this subscription, if it is embedded and defines any.
+ * This does not include access rules for non-embedded subscriptions.
+ *
+ * @param nativeAccessRules The native access rules for this subscription.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setNativeAccessRules(@Nullable UiccAccessRule[] nativeAccessRules) {
+ mNativeAccessRules = nativeAccessRules;
+ return this;
+ }
+
+ /**
+ * Set the card string of the SIM card.
+ *
+ * @param cardString The card string of the SIM card.
+ * @return The builder.
+ *
+ * @see #getCardString()
+ */
+ @NonNull
+ public Builder setCardString(@Nullable String cardString) {
+ mCardString = TextUtils.emptyIfNull(cardString);
+ return this;
+ }
+
+ /**
+ * Set the card ID of the SIM card which contains the subscription.
+ *
+ * @param cardId The card ID of the SIM card which contains the subscription.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setCardId(int cardId) {
+ mCardId = cardId;
+ return this;
+ }
+
+ /**
+ * Set whether the subscription is opportunistic or not.
+ *
+ * @param isOpportunistic {@code true} if the subscription is opportunistic.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setOpportunistic(boolean isOpportunistic) {
+ mIsOpportunistic = isOpportunistic;
+ return this;
+ }
+
+ /**
+ * Set the group UUID of the subscription group.
+ *
+ * @param groupUuid The group UUID.
+ * @return The builder.
+ *
+ * @see #getGroupUuid()
+ */
+ @NonNull
+ public Builder setGroupUuid(@Nullable String groupUuid) {
+ mGroupUuid = groupUuid == null ? null : ParcelUuid.fromString(groupUuid);
+ return this;
+ }
+
+ /**
+ * Whether group of the subscription is disabled. This is only useful if it's a grouped
+ * opportunistic subscription. In this case, if all primary (non-opportunistic)
+ * subscriptions in the group are deactivated (unplugged pSIM or deactivated eSIM profile),
+ * we should disable this opportunistic subscription.
+ *
+ * @param isGroupDisabled {@code true} if group of the subscription is disabled.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setGroupDisabled(boolean isGroupDisabled) {
+ mIsGroupDisabled = isGroupDisabled;
+ return this;
+ }
+
+ /**
+ * Set the subscription carrier id.
+ *
+ * @param carrierId The carrier id.
+ * @return The builder
+ *
+ * @see TelephonyManager#getSimCarrierId()
+ */
+ @NonNull
+ public Builder setCarrierId(int carrierId) {
+ mCarrierId = carrierId;
+ return this;
+ }
+
+ /**
+ * Set the profile class populated from the profile metadata if present.
+ *
+ * @param profileClass the profile class populated from the profile metadata if present.
+ * @return The builder
+ *
+ * @see #getProfileClass()
+ */
+ @NonNull
+ public Builder setProfileClass(@ProfileClass int profileClass) {
+ mProfileClass = profileClass;
+ return this;
+ }
+
+ /**
+ * Set the subscription type.
+ *
+ * @param type Subscription type.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setType(@SubscriptionType int type) {
+ mType = type;
+ return this;
+ }
+
+ /**
+ * Set the owner package of group the subscription belongs to.
+ *
+ * @param groupOwner Owner package of group the subscription belongs to.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setGroupOwner(@Nullable String groupOwner) {
+ mGroupOwner = TextUtils.emptyIfNull(groupOwner);
+ return this;
+ }
+
+ /**
+ * Set the carrier certificates for this subscription that are saved in carrier configs.
+ * This does not include access rules from the Uicc, whether embedded or non-embedded.
+ *
+ * @param carrierConfigAccessRules The carrier certificates for this subscription
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setCarrierConfigAccessRules(
+ @Nullable UiccAccessRule[] carrierConfigAccessRules) {
+ mCarrierConfigAccessRules = carrierConfigAccessRules;
+ return this;
+ }
+
+ /**
+ * Set whether Uicc applications are configured to enable or not.
+ *
+ * @param uiccApplicationsEnabled {@code true} if Uicc applications are configured to
+ * enable.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setUiccApplicationsEnabled(boolean uiccApplicationsEnabled) {
+ mAreUiccApplicationsEnabled = uiccApplicationsEnabled;
+ return this;
+ }
+
+ /**
+ * Set the port index of the Uicc card.
+ *
+ * @param portIndex The port index of the Uicc card.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setPortIndex(int portIndex) {
+ mPortIndex = portIndex;
+ return this;
+ }
+
+ /**
+ * Set subscription's preferred usage setting.
+ *
+ * @param usageSetting Subscription's preferred usage setting.
+ * @return The builder.
+ */
+ @NonNull
+ public Builder setUsageSetting(@UsageSetting int usageSetting) {
+ mUsageSetting = usageSetting;
+ return this;
+ }
+
+ /**
+ * Build the {@link SubscriptionInfo}.
+ *
+ * @return The {@link SubscriptionInfo} instance.
+ */
+ public SubscriptionInfo build() {
+ return new SubscriptionInfo(this);
+ }
+ }
}
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 8665858..94ff7f9 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -3079,7 +3079,7 @@
@SystemApi
public boolean canManageSubscription(@NonNull SubscriptionInfo info,
@NonNull String packageName) {
- if (info == null || info.getAllAccessRules() == null || packageName == null) {
+ if (info == null || info.getAccessRules() == null || packageName == null) {
return false;
}
PackageManager packageManager = mContext.getPackageManager();
@@ -3091,7 +3091,7 @@
logd("Unknown package: " + packageName);
return false;
}
- for (UiccAccessRule rule : info.getAllAccessRules()) {
+ for (UiccAccessRule rule : info.getAccessRules()) {
if (rule.getCarrierPrivilegeStatus(packageInfo)
== TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
return true;