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

Commit 46e91c95 authored by Hyunho Shin's avatar Hyunho Shin Committed by Android (Google) Code Review
Browse files

Merge "Added new APIs to support pSim conversion and store transfer status in...

Merge "Added new APIs to support pSim conversion and store transfer status in subscription DB" into main
parents e934163d aeba1f29
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -14757,6 +14757,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();
  }
@@ -14779,6 +14780,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;
@@ -14788,6 +14790,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;
@@ -15653,7 +15658,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