Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aeba1f29 authored by Hyunho's avatar Hyunho
Browse files

Added new APIs to support pSim conversion and store transfer status in subscription DB

Bug: b/315884067
Test: CTS SubscriptionManagerTest, EuiccManagerTest
Change-Id: Icd808e7671a8f3b443774d466581060caa4df457
parent fa838838
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -14756,6 +14756,7 @@ package android.telephony {
    method public boolean areUiccApplicationsEnabled();
    method @Nullable public java.util.List<android.telephony.UiccAccessRule> getAccessRules();
    method public int getProfileClass();
    method @FlaggedApi("com.android.internal.telephony.flags.support_psim_to_esim_conversion") public int getTransferStatus();
    method public boolean isGroupDisabled();
  }
@@ -14778,6 +14779,7 @@ package android.telephony {
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPreferredDataSubscriptionId(int, boolean, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer<java.lang.Integer>);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setSubscriptionEnabled(int, boolean);
    method @FlaggedApi("com.android.internal.telephony.flags.support_psim_to_esim_conversion") @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void setTransferStatus(int, int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUiccApplicationsEnabled(int, boolean);
    field @RequiresPermission(android.Manifest.permission.MANAGE_SUBSCRIPTION_PLANS) public static final String ACTION_SUBSCRIPTION_PLANS_CHANGED = "android.telephony.action.SUBSCRIPTION_PLANS_CHANGED";
    field @NonNull public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI;
@@ -14787,6 +14789,9 @@ package android.telephony {
    field public static final int PROFILE_CLASS_PROVISIONING = 1; // 0x1
    field public static final int PROFILE_CLASS_TESTING = 0; // 0x0
    field public static final int PROFILE_CLASS_UNSET = -1; // 0xffffffff
    field @FlaggedApi("com.android.internal.telephony.flags.support_psim_to_esim_conversion") public static final int TRANSFER_STATUS_CONVERTED = 2; // 0x2
    field @FlaggedApi("com.android.internal.telephony.flags.support_psim_to_esim_conversion") public static final int TRANSFER_STATUS_NONE = 0; // 0x0
    field @FlaggedApi("com.android.internal.telephony.flags.support_psim_to_esim_conversion") public static final int TRANSFER_STATUS_TRANSFERRED_OUT = 1; // 0x1
    field @NonNull public static final android.net.Uri VT_ENABLED_CONTENT_URI;
    field @NonNull public static final android.net.Uri WFC_ENABLED_CONTENT_URI;
    field @NonNull public static final android.net.Uri WFC_MODE_CONTENT_URI;
@@ -15652,7 +15657,9 @@ package android.telephony.euicc {
    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public int getOtaStatus();
    method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public java.util.List<java.lang.String> getSupportedCountries();
    method @NonNull @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public java.util.List<java.lang.String> getUnsupportedCountries();
    method @FlaggedApi("com.android.internal.telephony.flags.support_psim_to_esim_conversion") @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public boolean isPsimConversionSupported(int);
    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public boolean isSupportedCountry(@NonNull String);
    method @FlaggedApi("com.android.internal.telephony.flags.support_psim_to_esim_conversion") @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void setPsimConversionSupportedCarriers(@NonNull java.util.Set<java.lang.Integer>);
    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void setSupportedCountries(@NonNull java.util.List<java.lang.String>);
    method @RequiresPermission(android.Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS) public void setUnsupportedCountries(@NonNull java.util.List<java.lang.String>);
    field @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public static final String ACTION_CONVERT_TO_EMBEDDED_SUBSCRIPTION = "android.telephony.euicc.action.CONVERT_TO_EMBEDDED_SUBSCRIPTION";
+9 −1
Original line number Diff line number Diff line
@@ -4942,6 +4942,13 @@ public final class Telephony {
         */
        public static final String COLUMN_IS_NTN = "is_ntn";

        /**
         * TelephonyProvider column name for transferred status
         *
         * @hide
         */
        public static final String COLUMN_TRANSFER_STATUS = "transfer_status";

        /**
         * TelephonyProvider column name to indicate the service capability bitmasks.
         *
@@ -5021,7 +5028,8 @@ public final class Telephony {
                COLUMN_SATELLITE_ENABLED,
                COLUMN_SATELLITE_ATTACH_ENABLED_FOR_CARRIER,
                COLUMN_IS_NTN,
                COLUMN_SERVICE_CAPABILITIES
                COLUMN_SERVICE_CAPABILITIES,
                COLUMN_TRANSFER_STATUS
        );

        /**
+43 −2
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.os.Parcelable;
import android.telephony.SubscriptionManager.ProfileClass;
import android.telephony.SubscriptionManager.SimDisplayNameSource;
import android.telephony.SubscriptionManager.SubscriptionType;
import android.telephony.SubscriptionManager.TransferStatus;
import android.telephony.SubscriptionManager.UsageSetting;
import android.text.TextUtils;
import android.util.DisplayMetrics;
@@ -236,6 +237,11 @@ public class SubscriptionInfo implements Parcelable {
    @UsageSetting
    private final int mUsageSetting;

    /**
     * Subscription's transfer status
     */
    private final int mTransferStatus;

    // Below are the fields that do not exist in the database.

    /**
@@ -393,6 +399,7 @@ public class SubscriptionInfo implements Parcelable {
        this.mUsageSetting = usageSetting;
        this.mIsOnlyNonTerrestrialNetwork = false;
        this.mServiceCapabilities = 0;
        this.mTransferStatus = SubscriptionManager.TRANSFER_STATUS_NONE;
    }

    /**
@@ -433,6 +440,7 @@ public class SubscriptionInfo implements Parcelable {
        this.mUsageSetting = builder.mUsageSetting;
        this.mIsOnlyNonTerrestrialNetwork = builder.mIsOnlyNonTerrestrialNetwork;
        this.mServiceCapabilities = builder.mServiceCapabilities;
        this.mTransferStatus = builder.mTransferStatus;
    }

    /**
@@ -928,6 +936,19 @@ public class SubscriptionInfo implements Parcelable {
        return SubscriptionManager.getServiceCapabilitiesSet(mServiceCapabilities);
    }

    /**
     * Get the transfer status for this subscription.
     *
     * @return The transfer status for this subscription.
     *
     * @hide
     */
    @FlaggedApi(Flags.FLAG_SUPPORT_PSIM_TO_ESIM_CONVERSION)
    @SystemApi
    public @TransferStatus int getTransferStatus() {
        return mTransferStatus;
    }

    @NonNull
    public static final Parcelable.Creator<SubscriptionInfo> CREATOR =
            new Parcelable.Creator<SubscriptionInfo>() {
@@ -967,6 +988,7 @@ public class SubscriptionInfo implements Parcelable {
                    .setOnlyNonTerrestrialNetwork(source.readBoolean())
                    .setServiceCapabilities(
                            SubscriptionManager.getServiceCapabilitiesSet(source.readInt()))
                    .setTransferStatus(source.readInt())
                    .build();
        }

@@ -1010,6 +1032,7 @@ public class SubscriptionInfo implements Parcelable {
        dest.writeInt(mUsageSetting);
        dest.writeBoolean(mIsOnlyNonTerrestrialNetwork);
        dest.writeInt(mServiceCapabilities);
        dest.writeInt(mTransferStatus);
    }

    @Override
@@ -1075,6 +1098,7 @@ public class SubscriptionInfo implements Parcelable {
                + " isOnlyNonTerrestrialNetwork=" + mIsOnlyNonTerrestrialNetwork
                + " serviceCapabilities=" + SubscriptionManager.getServiceCapabilitiesSet(
                mServiceCapabilities).toString()
                + " transferStatus=" + mTransferStatus
                + "]";
    }

@@ -1101,7 +1125,8 @@ public class SubscriptionInfo implements Parcelable {
                that.mCarrierConfigAccessRules) && Objects.equals(mGroupUuid, that.mGroupUuid)
                && mCountryIso.equals(that.mCountryIso) && mGroupOwner.equals(that.mGroupOwner)
                && mIsOnlyNonTerrestrialNetwork == that.mIsOnlyNonTerrestrialNetwork
                && mServiceCapabilities == that.mServiceCapabilities;
                && mServiceCapabilities == that.mServiceCapabilities
                && mTransferStatus == that.mTransferStatus;
    }

    @Override
@@ -1110,7 +1135,8 @@ public class SubscriptionInfo implements Parcelable {
                mDisplayNameSource, mIconTint, mNumber, mDataRoaming, mMcc, mMnc, mIsEmbedded,
                mCardString, mIsOpportunistic, mGroupUuid, mCountryIso, mCarrierId, mProfileClass,
                mType, mGroupOwner, mAreUiccApplicationsEnabled, mPortIndex, mUsageSetting, mCardId,
                mIsGroupDisabled, mIsOnlyNonTerrestrialNetwork, mServiceCapabilities);
                mIsGroupDisabled, mIsOnlyNonTerrestrialNetwork, mServiceCapabilities,
                mTransferStatus);
        result = 31 * result + Arrays.hashCode(mEhplmns);
        result = 31 * result + Arrays.hashCode(mHplmns);
        result = 31 * result + Arrays.hashCode(mNativeAccessRules);
@@ -1314,6 +1340,8 @@ public class SubscriptionInfo implements Parcelable {
         */
        private boolean mIsOnlyNonTerrestrialNetwork = false;

        private int mTransferStatus = SubscriptionManager.TRANSFER_STATUS_NONE;

        /**
         * Service capabilities bitmasks the subscription supports.
         */
@@ -1363,6 +1391,7 @@ public class SubscriptionInfo implements Parcelable {
            mUsageSetting = info.mUsageSetting;
            mIsOnlyNonTerrestrialNetwork = info.mIsOnlyNonTerrestrialNetwork;
            mServiceCapabilities = info.mServiceCapabilities;
            mTransferStatus = info.mTransferStatus;
        }

        /**
@@ -1785,6 +1814,18 @@ public class SubscriptionInfo implements Parcelable {
            mServiceCapabilities = combinedCapabilities;
            return this;
        }
         /**
         * Set subscription's transfer status
         *
         * @param status Subscription's transfer status
         * @return The builder.
         */
        @FlaggedApi(Flags.FLAG_SUPPORT_PSIM_TO_ESIM_CONVERSION)
        @NonNull
        public Builder setTransferStatus(@TransferStatus int status) {
            mTransferStatus = status;
            return this;
        }

        /**
         * Build the {@link SubscriptionInfo}.
+66 −0
Original line number Diff line number Diff line
@@ -1148,6 +1148,14 @@ public class SubscriptionManager {
     */
    public static final String SERVICE_CAPABILITIES = SimInfo.COLUMN_SERVICE_CAPABILITIES;

    /**
     * TelephonyProvider column name to identify eSIM's transfer status.
     * By default, it's disabled.
     * <P>Type: INTEGER (int)</P>
     * @hide
     */
    public static final String TRANSFER_STATUS = SimInfo.COLUMN_TRANSFER_STATUS;

    /** @hide */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = {"USAGE_SETTING_"},
@@ -1453,6 +1461,41 @@ public class SubscriptionManager {
    private static final LruCache<Pair<String, Configuration>, Resources> sResourcesCache =
            new LruCache<>(MAX_RESOURCE_CACHE_ENTRY_COUNT);


    /**
     * The profile has not been transferred or converted to an eSIM.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_SUPPORT_PSIM_TO_ESIM_CONVERSION)
    @SystemApi
    public static final int TRANSFER_STATUS_NONE = 0;

    /**
     * The existing profile of the old device has been transferred to an eSIM of the new device.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_SUPPORT_PSIM_TO_ESIM_CONVERSION)
    @SystemApi
    public static final int TRANSFER_STATUS_TRANSFERRED_OUT = 1;

    /**
     * The existing profile of the same device has been converted to an eSIM of the same device
     * @hide
     */
    @FlaggedApi(Flags.FLAG_SUPPORT_PSIM_TO_ESIM_CONVERSION)
    @SystemApi
    public static final int TRANSFER_STATUS_CONVERTED = 2;
    /** @hide */
    @Retention(RetentionPolicy.SOURCE)
    @IntDef(prefix = {"TRANSFER_STATUS"},
            value = {
                    TRANSFER_STATUS_NONE,
                    TRANSFER_STATUS_TRANSFERRED_OUT,
                    TRANSFER_STATUS_CONVERTED,
            })
    public @interface TransferStatus {}


    /**
     * A listener class for monitoring changes to {@link SubscriptionInfo} records.
     * <p>
@@ -4716,4 +4759,27 @@ public class SubscriptionManager {
    public static int serviceCapabilityToBitmask(@ServiceCapability int capability) {
        return 1 << (capability - 1);
    }

    /**
     * Set the transfer status of the subscriptionInfo of the subId.
     * @param subscriptionId The unique SubscriptionInfo key in database.
     * @param status The transfer status to change.
     *
     *
     * @hide
     */
    @FlaggedApi(Flags.FLAG_SUPPORT_PSIM_TO_ESIM_CONVERSION)
    @SystemApi
    @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
    public void setTransferStatus(int subscriptionId, @TransferStatus int status) {
        try {
            ISub iSub = TelephonyManager.getSubscriptionService();
            if (iSub != null) {
                iSub.setTransferStatus(subscriptionId, status);
            }
        } catch (RemoteException ex) {
            logd("setTransferStatus for subId = " + subscriptionId + " failed.");
            throw ex.rethrowFromSystemServer();
        }
    }
}
+55 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
package android.telephony.euicc;

import android.Manifest;
import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -50,6 +51,7 @@ import java.lang.annotation.RetentionPolicy;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.stream.Collectors;

/**
@@ -1707,4 +1709,57 @@ public class EuiccManager {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Sets the supported carrier ids for pSIM conversion.
     *
     * <p>Any existing pSIM conversion supported carrier list will be replaced
     * by the {@code carrierIds} set here.
     *
     * @param carrierIds is a list of carrierIds that supports pSIM conversion
     *
     * @throws UnsupportedOperationException If the device does not have
     *          {@link PackageManager#FEATURE_TELEPHONY_EUICC}.
     * @throws IllegalStateException if this method is called when {@link #isEnabled} is false.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_SUPPORT_PSIM_TO_ESIM_CONVERSION)
    @SystemApi
    @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
    public void setPsimConversionSupportedCarriers(@NonNull Set<Integer> carrierIds) {
        if (!isEnabled()) {
            throw new IllegalStateException("Euicc is not enabled");
        }
        try {
            int[] arr = carrierIds.stream().mapToInt(Integer::intValue).toArray();
            getIEuiccController().setPsimConversionSupportedCarriers(arr);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
        }
    }

    /**
     * Returns whether the given carrier id supports pSIM conversion or not.
     *
     * @param carrierId to check whether pSIM conversion is supported or not
     * @return whether the given carrier id supports pSIM conversion or not,
     *         or false if {@link #isEnabled} is false
     *
     * @throws UnsupportedOperationException If the device does not have
     *          {@link PackageManager#FEATURE_TELEPHONY_EUICC}.
     * @hide
     */
    @FlaggedApi(Flags.FLAG_SUPPORT_PSIM_TO_ESIM_CONVERSION)
    @SystemApi
    @RequiresPermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
    public boolean isPsimConversionSupported(int carrierId) {
        if (!isEnabled()) {
            return false;
        }
        try {
            return getIEuiccController().isPsimConversionSupported(carrierId);
        } catch (RemoteException e) {
            throw e.rethrowAsRuntimeException();
        }
    }
}
Loading