diff options
3 files changed, 58 insertions, 9 deletions
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java index b41e14e09554..bacfe61a1a10 100644 --- a/telephony/java/android/telephony/SubscriptionInfo.java +++ b/telephony/java/android/telephony/SubscriptionInfo.java @@ -150,6 +150,11 @@ public class SubscriptionInfo implements Parcelable { private String mGroupUUID; /** + * A property in opportunistic subscription to indicate whether it is metered or not. + */ + private boolean mIsMetered; + + /** * @hide */ public SubscriptionInfo(int id, String iccId, int simSlotIndex, CharSequence displayName, @@ -158,7 +163,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, null); + false, null, true); } /** @@ -168,7 +173,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, - @Nullable String groupUUID) { + @Nullable String groupUUID, boolean isMetered) { this.mId = id; this.mIccId = iccId; this.mSimSlotIndex = simSlotIndex; @@ -187,8 +192,10 @@ public class SubscriptionInfo implements Parcelable { this.mCardId = cardId; this.mIsOpportunistic = isOpportunistic; this.mGroupUUID = groupUUID; + this.mIsMetered = isMetered; } + /** * @return the subscription ID. */ @@ -403,6 +410,18 @@ public class SubscriptionInfo implements Parcelable { } /** + * Used in opportunistic subscription ({@link #isOpportunistic()}) to indicate whether it's + * metered or not.This is one of the factors when deciding to switch to the subscription. + * (a non-metered subscription, for example, would likely be preferred over a metered one). + * + * @return whether subscription is metered. + * @hide + */ + public boolean isMetered() { + return mIsMetered; + } + + /** * Checks whether the app with the given context is authorized to manage this subscription * according to its metadata. Only supported for embedded subscriptions (if {@link #isEmbedded} * returns true). @@ -496,10 +515,11 @@ public class SubscriptionInfo implements Parcelable { String cardId = source.readString(); boolean isOpportunistic = source.readBoolean(); String groupUUID = source.readString(); + boolean isMetered = source.readBoolean(); return new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number, dataRoaming, iconBitmap, mcc, mnc, countryIso, - isEmbedded, accessRules, cardId, isOpportunistic, groupUUID); + isEmbedded, accessRules, cardId, isOpportunistic, groupUUID, isMetered); } @Override @@ -528,6 +548,7 @@ public class SubscriptionInfo implements Parcelable { dest.writeString(mCardId); dest.writeBoolean(mIsOpportunistic); dest.writeString(mGroupUUID); + dest.writeBoolean(mIsMetered); } @Override @@ -561,14 +582,14 @@ public class SubscriptionInfo implements Parcelable { + " mnc " + mMnc + "mCountryIso=" + mCountryIso + " isEmbedded " + mIsEmbedded + " accessRules " + Arrays.toString(mAccessRules) + " cardId=" + cardIdToPrint + " isOpportunistic " + mIsOpportunistic - + " mGroupUUID=" + mGroupUUID + "}"; + + " mGroupUUID=" + mGroupUUID + " isMetered=" + mIsMetered + "}"; } @Override public int hashCode() { return Objects.hash(mId, mSimSlotIndex, mNameSource, mIconTint, mDataRoaming, mIsEmbedded, - mIsOpportunistic, mGroupUUID, mIccId, mNumber, mMcc, mMnc, mCountryIso, - mCardId, mDisplayName, mCarrierName, mAccessRules); + mIsOpportunistic, mGroupUUID, mIsMetered, mIccId, mNumber, mMcc, mMnc, + mCountryIso, mCardId, mDisplayName, mCarrierName, mAccessRules); } @Override @@ -591,6 +612,7 @@ public class SubscriptionInfo implements Parcelable { && mIsEmbedded == toCompare.mIsEmbedded && mIsOpportunistic == toCompare.mIsOpportunistic && Objects.equals(mGroupUUID, toCompare.mGroupUUID) + && mIsMetered == toCompare.mIsMetered && 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 781a0482733d..a7c6b84f3a53 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -567,7 +567,6 @@ public class SubscriptionManager { * @hide */ public static final String IS_OPPORTUNISTIC = "is_opportunistic"; - /** * TelephonyProvider column name for subId of parent subscription of an opportunistic * subscription. @@ -575,7 +574,6 @@ public class SubscriptionManager { * @hide */ 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 @@ -584,7 +582,12 @@ public class SubscriptionManager { * @hide */ public static final String GROUP_UUID = "group_uuid"; - + /** + * TelephonyProvider column name for whether a subscription is metered or not, that is, whether + * the network it connects to charges for subscription or not. For example, paid CBRS or unpaid. + * @hide + */ + public static final String IS_METERED = "is_metered"; /** * Broadcast Action: The user has changed one of the default subs related to * data, phone calls, or sms</p> @@ -2411,6 +2414,21 @@ public class SubscriptionManager { return groupUUID; } + /** + * Set metered by simInfo index + * + * @param isMetered whether it’s a metered subscription. + * @param subId the unique SubscriptionInfo index in database + * @return the number of records updated + * @hide + */ + @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) + public int setMetered(boolean isMetered, int subId) { + if (VDBG) logd("[setIsMetered]+ isMetered:" + isMetered + " subId:" + subId); + return setSubscriptionPropertyHelper(subId, "setIsMetered", + (iSub)-> iSub.setMetered(isMetered, subId)); + } + private interface CallISubMethodHelper { int callMethod(ISub iSub) throws RemoteException; } diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl index bc4451977d92..f9db4b0afd12 100755 --- a/telephony/java/com/android/internal/telephony/ISub.aidl +++ b/telephony/java/com/android/internal/telephony/ISub.aidl @@ -184,6 +184,15 @@ interface ISub { String setSubscriptionGroup(in int[] subIdList, String callingPackage); /** + * Set whether a subscription is metered + * + * @param isMetered whether it’s a metered subscription. + * @param subId the unique SubscriptionInfo index in database + * @return the number of records updated + */ + int setMetered(boolean isMetered, int subId); + + /** * Set which subscription is preferred for cellular data. It's * designed to overwrite default data subscription temporarily. * |