Merge "Add APIs in SubscriptionManager for opportunistic subscriptions" am: c0a2488df6
am: edf51aebaf
Change-Id: I99a45e113c76123af1d91d05171456c468ea5fb1
This commit is contained in:
@@ -42408,9 +42408,11 @@ 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();
|
||||
method public boolean isOpportunistic();
|
||||
method public void writeToParcel(android.os.Parcel, int);
|
||||
field public static final android.os.Parcelable.Creator<android.telephony.SubscriptionInfo> CREATOR;
|
||||
}
|
||||
@@ -42435,6 +42437,7 @@ package android.telephony {
|
||||
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>);
|
||||
method public void switchToSubscription(int, android.app.PendingIntent);
|
||||
field public static final java.lang.String ACTION_DEFAULT_SMS_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SMS_SUBSCRIPTION_CHANGED";
|
||||
field public static final java.lang.String ACTION_DEFAULT_SUBSCRIPTION_CHANGED = "android.telephony.action.DEFAULT_SUBSCRIPTION_CHANGED";
|
||||
field public static final java.lang.String ACTION_MANAGE_SUBSCRIPTION_PLANS = "android.telephony.action.MANAGE_SUBSCRIPTION_PLANS";
|
||||
|
||||
@@ -134,6 +134,16 @@ public class SubscriptionInfo implements Parcelable {
|
||||
*/
|
||||
private String mCardId;
|
||||
|
||||
/**
|
||||
* Whether the subscription is opportunistic.
|
||||
*/
|
||||
private boolean mIsOpportunistic;
|
||||
|
||||
/**
|
||||
* SubId of the parent subscription, if there is one.
|
||||
*/
|
||||
private int mParentSubId;
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
@@ -141,6 +151,19 @@ 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) {
|
||||
this(id, iccId, simSlotIndex, displayName, carrierName, nameSource, iconTint, number,
|
||||
roaming, icon, mcc, mnc, countryIso, isEmbedded, accessRules, cardId,
|
||||
false, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
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[] accessRules, String cardId, boolean isOpportunistic,
|
||||
int parentSubId) {
|
||||
this.mId = id;
|
||||
this.mIccId = iccId;
|
||||
this.mSimSlotIndex = simSlotIndex;
|
||||
@@ -157,6 +180,8 @@ public class SubscriptionInfo implements Parcelable {
|
||||
this.mIsEmbedded = isEmbedded;
|
||||
this.mAccessRules = accessRules;
|
||||
this.mCardId = cardId;
|
||||
this.mIsOpportunistic = isOpportunistic;
|
||||
this.mParentSubId = parentSubId;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -346,6 +371,29 @@ public class SubscriptionInfo implements Parcelable {
|
||||
return this.mIsEmbedded;
|
||||
}
|
||||
|
||||
/**
|
||||
* An opportunistic subscription connects to a network that is
|
||||
* limited in functionality and / or coverage.
|
||||
*
|
||||
* @return whether subscription is opportunistic.
|
||||
*/
|
||||
public boolean isOpportunistic() {
|
||||
return mIsOpportunistic;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @return subId of parent subscription if it’s bundled with a primary subscription.
|
||||
* If there isn't one, {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID}
|
||||
*/
|
||||
public int getParentSubId() {
|
||||
return mParentSubId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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}
|
||||
@@ -438,10 +486,12 @@ public class SubscriptionInfo implements Parcelable {
|
||||
boolean isEmbedded = source.readBoolean();
|
||||
UiccAccessRule[] accessRules = source.createTypedArray(UiccAccessRule.CREATOR);
|
||||
String cardId = source.readString();
|
||||
boolean isOpportunistic = source.readBoolean();
|
||||
int parentSubId = source.readInt();
|
||||
|
||||
return new SubscriptionInfo(id, iccId, simSlotIndex, displayName, carrierName,
|
||||
nameSource, iconTint, number, dataRoaming, iconBitmap, mcc, mnc, countryIso,
|
||||
isEmbedded, accessRules, cardId);
|
||||
isEmbedded, accessRules, cardId, isOpportunistic, parentSubId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -468,6 +518,8 @@ public class SubscriptionInfo implements Parcelable {
|
||||
dest.writeBoolean(mIsEmbedded);
|
||||
dest.writeTypedArray(mAccessRules, flags);
|
||||
dest.writeString(mCardId);
|
||||
dest.writeBoolean(mIsOpportunistic);
|
||||
dest.writeInt(mParentSubId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -500,6 +552,7 @@ public class SubscriptionInfo implements Parcelable {
|
||||
+ " dataRoaming=" + mDataRoaming + " iconBitmap=" + mIconBitmap + " mcc " + mMcc
|
||||
+ " mnc " + mMnc + " isEmbedded " + mIsEmbedded
|
||||
+ " accessRules " + Arrays.toString(mAccessRules)
|
||||
+ " cardId=" + cardIdToPrint + "}";
|
||||
+ " cardId=" + cardIdToPrint + " isOpportunistic " + mIsOpportunistic
|
||||
+ " parentSubId=" + mParentSubId + "}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import android.annotation.SuppressAutoDoc;
|
||||
import android.annotation.SystemApi;
|
||||
import android.annotation.SystemService;
|
||||
import android.app.BroadcastOptions;
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageInfo;
|
||||
@@ -43,6 +44,7 @@ import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.os.RemoteException;
|
||||
import android.os.ServiceManager;
|
||||
import android.telephony.euicc.EuiccManager;
|
||||
import android.util.DisplayMetrics;
|
||||
|
||||
import com.android.internal.telephony.IOnSubscriptionsChangedListener;
|
||||
@@ -432,6 +434,24 @@ public class SubscriptionManager {
|
||||
*/
|
||||
public static final String WFC_IMS_ROAMING_ENABLED = "wfc_ims_roaming_enabled";
|
||||
|
||||
/**
|
||||
* TelephonyProvider column name for whether a subscription is opportunistic, that is,
|
||||
* whether the network it connects to is limited in functionality or coverage.
|
||||
* For example, CBRS.
|
||||
* IS_EMBEDDED should always be true.
|
||||
* <p>Type: INTEGER (int), 1 for opportunistic or 0 for non-opportunistic.
|
||||
* @hide
|
||||
*/
|
||||
public static final String IS_OPPORTUNISTIC = "is_opportunistic";
|
||||
|
||||
/**
|
||||
* TelephonyProvider column name for subId of parent subscription of an opportunistic
|
||||
* subscription.
|
||||
* if the parent sub id is valid, then is_opportunistic should always to true.
|
||||
* @hide
|
||||
*/
|
||||
public static final String PARENT_SUB_ID = "parent_sub_id";
|
||||
|
||||
/**
|
||||
* Broadcast Action: The user has changed one of the default subs related to
|
||||
* data, phone calls, or sms</p>
|
||||
@@ -1940,6 +1960,91 @@ public class SubscriptionManager {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set preferred default data.
|
||||
* Set on which slot default data will be on.
|
||||
*
|
||||
* @param slotId which slot is preferred to for cellular data.
|
||||
* @hide
|
||||
*
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
|
||||
public void setPreferredData(int slotId) {
|
||||
if (VDBG) logd("[setPreferredData]+ slotId:" + slotId);
|
||||
setSubscriptionPropertyHelper(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
|
||||
"setPreferredData", (iSub)-> iSub.setPreferredData(slotId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get User downloaded Profiles.
|
||||
*
|
||||
* Provide all available user downloaded profile on the phone.
|
||||
* @param slotId on which phone the switch will operate on
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
|
||||
List<SubscriptionInfo> getOpportunisticSubscriptions(int slotId) {
|
||||
String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
|
||||
List<SubscriptionInfo> subInfoList = null;
|
||||
|
||||
try {
|
||||
ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub"));
|
||||
if (iSub != null) {
|
||||
subInfoList = iSub.getOpportunisticSubscriptions(slotId, pkgForDebug);
|
||||
}
|
||||
} catch (RemoteException ex) {
|
||||
// ignore it
|
||||
}
|
||||
|
||||
if (subInfoList == null) {
|
||||
subInfoList = new ArrayList<>();
|
||||
}
|
||||
|
||||
return subInfoList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch to a certain subscription
|
||||
*
|
||||
* @param subId sub id
|
||||
* @param callbackIntent pending intent that will be sent after operation is done.
|
||||
*/
|
||||
@RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
|
||||
public void switchToSubscription(int subId, PendingIntent callbackIntent) {
|
||||
EuiccManager euiccManager = new EuiccManager(mContext);
|
||||
euiccManager.switchToSubscription(subId, callbackIntent);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set opportunistic by simInfo index
|
||||
*
|
||||
* @param opportunistic whether it’s opportunistic 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 setOpportunistic(boolean opportunistic, int subId) {
|
||||
if (VDBG) logd("[setOpportunistic]+ opportunistic:" + opportunistic + " subId:" + subId);
|
||||
return setSubscriptionPropertyHelper(subId, "setOpportunistic",
|
||||
(iSub)-> iSub.setOpportunistic(opportunistic, subId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set parent subId by simInfo index
|
||||
*
|
||||
* @param parentSubId subId of its parent 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 setParentSubId(int parentSubId, int subId) {
|
||||
if (VDBG) logd("[setParentSubId]+ parentSubId:" + parentSubId + " subId:" + subId);
|
||||
return setSubscriptionPropertyHelper(subId, "parentSubId",
|
||||
(iSub)-> iSub.setParentSubId(parentSubId, subId));
|
||||
}
|
||||
|
||||
private interface CallISubMethodHelper {
|
||||
int callMethod(ISub iSub) throws RemoteException;
|
||||
}
|
||||
|
||||
@@ -156,6 +156,42 @@ interface ISub {
|
||||
*/
|
||||
int setDataRoaming(int roaming, int subId);
|
||||
|
||||
/**
|
||||
* Switch to a certain subscription
|
||||
*
|
||||
* @param opportunistic whether it’s opportunistic subscription.
|
||||
* @param subId the unique SubscriptionInfo index in database
|
||||
* @return the number of records updated
|
||||
*/
|
||||
int setOpportunistic(boolean opportunistic, int subId);
|
||||
|
||||
/**
|
||||
* Set parent subId by simInfo index
|
||||
*
|
||||
* @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);
|
||||
|
||||
/**
|
||||
* Set preferred default data.
|
||||
* Set on which slot default data will be on.
|
||||
*
|
||||
* @param slotId which slot is preferred to for cellular data.
|
||||
* @hide
|
||||
*
|
||||
*/
|
||||
int setPreferredData(int slotId);
|
||||
|
||||
/**
|
||||
* Get User downloaded Profiles.
|
||||
*
|
||||
* Provide all available user downloaded profile on the phone.
|
||||
* @param slotId on which phone the switch will operate on
|
||||
*/
|
||||
List<SubscriptionInfo> getOpportunisticSubscriptions(int slotId, String callingPackage);
|
||||
|
||||
int getSlotIndex(int subId);
|
||||
|
||||
int[] getSubId(int slotIndex);
|
||||
@@ -186,7 +222,7 @@ interface ISub {
|
||||
|
||||
int[] getActiveSubIdList();
|
||||
|
||||
void setSubscriptionProperty(int subId, String propKey, String propValue);
|
||||
int setSubscriptionProperty(int subId, String propKey, String propValue);
|
||||
|
||||
String getSubscriptionProperty(int subId, String propKey, String callingPackage);
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@
|
||||
*/
|
||||
|
||||
package com.android.internal.telephony;
|
||||
import android.content.Intent;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.telephony.SubscriptionManager;
|
||||
|
||||
Reference in New Issue
Block a user