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

Commit 887396ff authored by Hyunho's avatar Hyunho
Browse files

Added API to verify that SubscriptionInfo is converted and to update carriers...

Added API to verify that SubscriptionInfo is converted and to update carriers that support pSIM conversion.

Bug: b/315884067
Test: atest SubscriptionDatabaseManagerTest, SubscriptionInfoInternalTest, SubscriptionInfoTest
Change-Id: Ia45a4fd99f95c00f95d2280e6b6025e1ebd8220a
parent 21dd960b
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -27,3 +27,10 @@ flag {
  description: "Support emergency call only for data only cellular service."
  bug: "296097429"
}

flag {
  name: "support_psim_to_esim_conversion"
  namespace: "telephony"
  description: "Support the psim to esim conversion."
  bug: "315073761"
}
 No newline at end of file
+31 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ import com.android.internal.telephony.uicc.UiccSlot;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Stack;
@@ -79,6 +80,7 @@ import java.util.UUID;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;

/** Backing implementation of {@link android.telephony.euicc.EuiccManager}. */
public class EuiccController extends IEuiccController.Stub {
@@ -121,6 +123,7 @@ public class EuiccController extends IEuiccController.Stub {
    // the phone process, 3) values are updated remotely by server flags.
    private List<String> mSupportedCountries;
    private List<String> mUnsupportedCountries;
    private List<Integer> mPsimConversionSupportedCarrierIds;

    /** Initialize the instance. Should only be called once. */
    public static EuiccController init(Context context, FeatureFlags featureFlags) {
@@ -2073,6 +2076,34 @@ public class EuiccController extends IEuiccController.Stub {
        return changeEnabled;
    }


    @Override
    public void setPsimConversionSupportedCarriers(int[] carrierIds) {
        if (!callerCanWriteEmbeddedSubscriptions()) {
            throw new SecurityException(
                    "Must have WRITE_EMBEDDED_SUBSCRIPTIONS to "
                            + "set pSIM conversion supported carriers");
        }
        mPsimConversionSupportedCarrierIds = Arrays.stream(carrierIds).boxed()
                .collect(Collectors.toList());
    }



    @Override
    public boolean isPsimConversionSupported(int carrierId) {
        if (!callerCanWriteEmbeddedSubscriptions()) {
            throw new SecurityException(
                    "Must have WRITE_EMBEDDED_SUBSCRIPTIONS "
                            + "to check if the carrier is supported pSIM conversion");
        }
        if (mPsimConversionSupportedCarrierIds == null
                || mPsimConversionSupportedCarrierIds.isEmpty()) {
            return false;
        }
        return mPsimConversionSupportedCarrierIds.contains(carrierId);
    }

    /**
     * Make sure the device has required telephony feature
     *
+31 −2
Original line number Diff line number Diff line
@@ -284,7 +284,10 @@ public class SubscriptionDatabaseManager extends Handler {
                    SubscriptionInfoInternal::getOnlyNonTerrestrialNetwork),
            new AbstractMap.SimpleImmutableEntry<>(
                    SimInfo.COLUMN_SERVICE_CAPABILITIES,
                    SubscriptionInfoInternal::getServiceCapabilities)
                    SubscriptionInfoInternal::getServiceCapabilities),
            new AbstractMap.SimpleImmutableEntry<>(
                    SimInfo.COLUMN_TRANSFER_STATUS,
                    SubscriptionInfoInternal::getTransferStatus)
    );

    /**
@@ -418,7 +421,10 @@ public class SubscriptionDatabaseManager extends Handler {
                    SubscriptionDatabaseManager::setNtn),
            new AbstractMap.SimpleImmutableEntry<>(
                    SimInfo.COLUMN_SERVICE_CAPABILITIES,
                    SubscriptionDatabaseManager::setServiceCapabilities)
                    SubscriptionDatabaseManager::setServiceCapabilities),
            new AbstractMap.SimpleImmutableEntry<>(
                    SimInfo.COLUMN_TRANSFER_STATUS,
                    SubscriptionDatabaseManager::setTransferStatus)
    );

    /**
@@ -2335,6 +2341,10 @@ public class SubscriptionDatabaseManager extends Handler {
            builder.setOnlyNonTerrestrialNetwork(cursor.getInt(cursor.getColumnIndexOrThrow(
                    SimInfo.COLUMN_IS_NTN)));
        }
        if (mFeatureFlags.supportPsimToEsimConversion()) {
            builder.setTransferStatus(cursor.getInt(cursor.getColumnIndexOrThrow(
                    SimInfo.COLUMN_TRANSFER_STATUS)));
        }
        return builder.build();
    }

@@ -2408,6 +2418,25 @@ public class SubscriptionDatabaseManager extends Handler {
        }
    }

    /**
     * Set the transfer status of the subscriptionInfo that corresponds to subId.
     *
     * @param subId Subscription ID.
     * @param status The transfer status to change.
     *
     * @throws IllegalArgumentException if the subscription does not exist.
     */
    public void setTransferStatus(int subId, int status) {
        if (!mFeatureFlags.supportPsimToEsimConversion()) {
            log("SubscriptionDatabaseManager:supportPsimToEsimConversion is false");
            return;
        }

        writeDatabaseAndCacheHelper(subId, SimInfo.COLUMN_TRANSFER_STATUS,
                status,
                SubscriptionInfoInternal.Builder::setTransferStatus);
    }

    /**
     * Log debug messages.
     *
+35 −2
Original line number Diff line number Diff line
@@ -473,6 +473,11 @@ public class SubscriptionInfoInternal {
     */
    private final int mServiceCapabilities;

    /**
     * The transfer status of the subscription
     */
    private final int mTransferStatus;

    /**
     * Constructor from builder.
     *
@@ -549,6 +554,7 @@ public class SubscriptionInfoInternal {
        this.mCardId = builder.mCardId;
        this.mIsGroupDisabled = builder.mIsGroupDisabled;
        this.mServiceCapabilities = builder.mServiceCapabilities;
        this.mTransferStatus = builder.mTransferStatus;
    }

    /**
@@ -1205,6 +1211,12 @@ public class SubscriptionInfoInternal {
    public int getServiceCapabilities() {
        return mServiceCapabilities;
    }
    /**
     * @return Transfer status.
     */
    public int getTransferStatus() {
        return mTransferStatus;
    }

    /** @return converted {@link SubscriptionInfo}. */
    @NonNull
@@ -1244,6 +1256,7 @@ public class SubscriptionInfoInternal {
                .setOnlyNonTerrestrialNetwork(mIsOnlyNonTerrestrialNetwork == 1)
                .setServiceCapabilities(
                        SubscriptionManager.getServiceCapabilitiesSet(mServiceCapabilities))
                .setTransferStatus(mTransferStatus)
                .build();
    }

@@ -1304,6 +1317,7 @@ public class SubscriptionInfoInternal {
                + " getOnlyNonTerrestrialNetwork=" + mIsOnlyNonTerrestrialNetwork
                + " isGroupDisabled=" + mIsGroupDisabled
                + " serviceCapabilities=" + mServiceCapabilities
                + " transferStatus=" + mTransferStatus
                + "]";
    }

@@ -1361,7 +1375,8 @@ public class SubscriptionInfoInternal {
                that.mNumberFromCarrier) && mNumberFromIms.equals(that.mNumberFromIms)
                && mIsSatelliteAttachEnabledForCarrier == that.mIsSatelliteAttachEnabledForCarrier
                && mIsOnlyNonTerrestrialNetwork == that.mIsOnlyNonTerrestrialNetwork
                && mServiceCapabilities == that.mServiceCapabilities;
                && mServiceCapabilities == that.mServiceCapabilities
                && mTransferStatus == that.mTransferStatus;
    }

    @Override
@@ -1384,7 +1399,7 @@ public class SubscriptionInfoInternal {
                mNumberFromIms, mPortIndex, mUsageSetting, mLastUsedTPMessageReference, mUserId,
                mIsSatelliteEnabled, mCardId, mIsGroupDisabled,
                mIsSatelliteAttachEnabledForCarrier, mIsOnlyNonTerrestrialNetwork,
                mServiceCapabilities);
                mServiceCapabilities, mTransferStatus);
        result = 31 * result + Arrays.hashCode(mNativeAccessRules);
        result = 31 * result + Arrays.hashCode(mCarrierConfigAccessRules);
        result = 31 * result + Arrays.hashCode(mRcsConfig);
@@ -1776,6 +1791,11 @@ public class SubscriptionInfoInternal {
         */
        private int mServiceCapabilities;

        /**
         * The transfer status of the subscription
         */
        private int mTransferStatus;

        /**
         * Default constructor.
         */
@@ -1855,6 +1875,7 @@ public class SubscriptionInfoInternal {
            mCardId = info.mCardId;
            mIsGroupDisabled = info.mIsGroupDisabled;
            mServiceCapabilities = info.mServiceCapabilities;
            mTransferStatus = info.mTransferStatus;
        }

        /**
@@ -2786,6 +2807,18 @@ public class SubscriptionInfoInternal {
            return this;
        }

        /**
         * Set the transfer status of the subscription.
         *
         * @param status The transfer status
         * @return The builder.
         */
        @NonNull
        public Builder setTransferStatus(int status) {
            mTransferStatus = status;
            return this;
        }

        /**
         * Build the {@link SubscriptionInfoInternal}.
         *
+35 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.telephony.TelephonyManager.ENABLE_FEATURE_MAPPING;
import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.ColorInt;
import android.annotation.EnforcePermission;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -1219,7 +1220,11 @@ public class SubscriptionManagerService extends ISub.Stub {
                        builder.setCardString(mUiccController.convertToCardString(cardId));
                    }

                    if (mFeatureFlags.supportPsimToEsimConversion()) {
                        builder.setTransferStatus(subInfo.getTransferStatus());
                    }
                    embeddedSubs.add(subInfo.getSubscriptionId());

                    subInfo = builder.build();
                    log("updateEmbeddedSubscriptions: update subscription " + subInfo);
                    mSubscriptionDatabaseManager.updateSubscription(subInfo);
@@ -4299,6 +4304,36 @@ public class SubscriptionManagerService extends ISub.Stub {
        }
    }



    /**
     * Set the transfer status of the subscriptionInfo that corresponds to subId.
     * @param subId The unique SubscriptionInfo key in database.
     * @param status The transfer status to change. This value must be one of the following.
     * {@link SubscriptionManager#TRANSFER_STATUS_NONE},
     * {@link SubscriptionManager#TRANSFER_STATUS_TRANSFERRED_OUT} or
     * {@link SubscriptionManager#TRANSFER_STATUS_CONVERTED}
     *
     */
    @Override
    @EnforcePermission(Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
    public void setTransferStatus(int subId, int status) {
        setTransferStatus_enforcePermission();
        if (mContext.checkCallingOrSelfPermission(
                Manifest.permission.WRITE_EMBEDDED_SUBSCRIPTIONS)
                != PackageManager.PERMISSION_GRANTED) {
            throw new SecurityException("Must have WRITE_EMBEDDED_SUBSCRIPTIONS to"
                    + "setTransferStatus");
        }
        long token = Binder.clearCallingIdentity();
        try {
            mSubscriptionDatabaseManager.setTransferStatus(subId, status);
        } finally {
            Binder.restoreCallingIdentity(token);
        }
    }


    /**
     * Get the current calling package name.
     * @return the current calling package name
Loading