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

Commit 88a6bb96 authored by Hyosun Kim's avatar Hyosun Kim
Browse files

Fix requestProvisionSubscriberId related API to work properly

Bug: 351278182
Test: atest SatelliteManagerTestOnMockService
Test: manual test with SatelliteTestApp b/351278182#comment2
verify requestProvisionSubscriberIds, requestIsSatelliteProvisioned and provisionSatellite
Flag: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn

Change-Id: I8001c074176807ae5f38e11acbbff10ba2d77a91
parent 34db3634
Loading
Loading
Loading
Loading
+49 −33
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import static android.telephony.satellite.SatelliteManager.EMERGENCY_CALL_TO_SAT
import static android.telephony.satellite.SatelliteManager.KEY_NTN_SIGNAL_STRENGTH;
import static android.telephony.satellite.SatelliteManager.SATELLITE_COMMUNICATION_RESTRICTION_REASON_ENTITLEMENT;
import static android.telephony.satellite.SatelliteManager.SATELLITE_COMMUNICATION_RESTRICTION_REASON_USER;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_INVALID_ARGUMENTS;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_MODEM_TIMEOUT;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_REQUEST_NOT_SUPPORTED;
import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
@@ -440,7 +441,7 @@ public class SatelliteController extends Handler {
    private Map<String, Integer> mSubscriberIdPerSub = new HashMap<>();
    // key : priority, low value is high, value : List<SubscriptionInfo>
    @GuardedBy("mSatelliteTokenProvisionedLock")
    Map<Integer, List<SubscriptionInfo>> mSubsInfoListPerPriority = new HashMap<>();
    private Map<Integer, List<SubscriptionInfo>> mSubsInfoListPerPriority = new HashMap<>();
    @NonNull private final Object mSatelliteTokenProvisionedLock = new Object();
    private long mWaitTimeForSatelliteEnablingResponse;
    private long mDemoPointingAlignedDurationMillis;
@@ -1529,12 +1530,12 @@ public class SatelliteController extends Handler {
                Consumer<Integer> result = new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) {
                        logd("invoke CMD_PROVISION_SATELLITE_SERVICE done.");
                        logd("invoke CMD_PROVISION_SATELLITE_TOKEN_UPDATED done.");
                    }
                };
                ProvisionSatelliteServiceArgument internalArgument =
                        new ProvisionSatelliteServiceArgument(iccId, null, result, subId);
                sendMessage(obtainMessage(CMD_PROVISION_SATELLITE_SERVICE, internalArgument));
                sendRequestAsync(CMD_PROVISION_SATELLITE_SERVICE, internalArgument, null);
                break;
            }

@@ -1637,7 +1638,7 @@ public class SatelliteController extends Handler {
                        ploge("Received invalid demo mode while satellite session is enabled"
                                + " enableDemoMode = " + enableDemoMode);
                        sendErrorAndReportSessionMetrics(
                                SatelliteManager.SATELLITE_RESULT_INVALID_ARGUMENTS, result);
                                SATELLITE_RESULT_INVALID_ARGUMENTS, result);
                        return;
                    } else {
                        plogd("Enable request matches with current state"
@@ -5170,7 +5171,6 @@ public class SatelliteController extends Handler {
        return TimeUnit.SECONDS.toMillis(duration);
    }


    /**
     * Calculate priority
     * 1. Active eSOS profiles are higher priority than inactive eSOS profiles.
@@ -5179,6 +5179,9 @@ public class SatelliteController extends Handler {
     * the highest priority.
     */
    private void evaluateESOSProfilesPrioritization() {
        if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
            return;
        }
        List<SubscriptionInfo> allSubInfos = mSubscriptionManagerService.getAllSubInfoList(
                mContext.getOpPackageName(), mContext.getAttributionTag());
        //key : priority, low value is high, value : List<SubscriptionInfo>
@@ -5190,7 +5193,6 @@ public class SatelliteController extends Handler {
            boolean isNtnOnly = info.isOnlyNonTerrestrialNetwork();
            boolean isESOSSupported = info.isSatelliteESOSSupported();
            if (!isNtnOnly && !isESOSSupported) {
                logd("evaluateESOSProfilesPrioritization: !isNtnOnly && !isESOS");
                continue;
            }

@@ -5218,28 +5220,30 @@ public class SatelliteController extends Handler {
    }

    // The subscriberId for ntnOnly SIMs is the Iccid, whereas for ESOS supported SIMs, the
    // subscriberId is the Imsi prefix 6 digit + msisdn.
    private String getSubscriberId(int subId, SubscriptionInfo info, boolean isNtnOnly) {
        if (isNtnOnly) {
    // subscriberId is the Imsi prefix 6 digit + phone number.
    private @NonNull String getSubscriberId(SubscriptionInfo info) {
        if (info.isSatelliteESOSSupported()) {
            return getPhoneNumberBasedCarrier(info.getSubscriptionId());
        }
        if (info.isOnlyNonTerrestrialNetwork()) {
            return info.getIccId();
        }
        return getSubscriberIdForCarrier(subId);
        return "";
    }

    private String getSubscriberIdForCarrier(int subId) {
    private String getPhoneNumberBasedCarrier(int subId) {
        SubscriptionInfoInternal internal = mSubscriptionManagerService.getSubscriptionInfoInternal(
                0);
        String msisdn = "";
        for (Phone phone : PhoneFactory.getPhones()) {
            if (subId == phone.getSubId()) {
                msisdn = phone.getMsisdn();
            }
        }
        if (msisdn == null) {
            logd("getSubscriberIdForCarrier: msisdn null");
                subId);
        SubscriptionManager subscriptionManager = mContext.getSystemService(
                SubscriptionManager.class);
        String phoneNumber = subscriptionManager.getPhoneNumber(subId);

        if (phoneNumber == null) {
            logd("getPhoneNumberBasedCarrier: phoneNumber null");
            return "";
        }
        return internal.getImsi().substring(0, 6) + msisdn;
        return internal.getImsi() == null ? "" : internal.getImsi().substring(0, 6)
                + phoneNumber.replaceFirst("^\\+", "");
    }

    private boolean isPriorityChanged(Map<Integer, List<SubscriptionInfo>> currentMap,
@@ -5254,10 +5258,10 @@ public class SatelliteController extends Handler {
            if (currentList == null || currentList.size() != newList.size()) {
                return true;
            }
            logd("isPriorityChanged: current.size=" + currentList.size() + " , new.size="
                    + newList.size());
            for (int i = 0; i < currentList.size(); i++) {
                if (!currentList.get(i).equals(newList.get(i))) {
                if (currentList.get(i).getSubscriptionId() != newList.get(i).getSubscriptionId()) {
                    logd("isPriorityChanged: cur=" + currentList.get(i) + " , new=" + newList.get(
                            i));
                    return true;
                }
            }
@@ -5305,11 +5309,14 @@ public class SatelliteController extends Handler {
        List<ProvisionSubscriberId> list = new ArrayList<>();
        synchronized (mSatelliteTokenProvisionedLock) {
            mSubscriberIdPerSub = new HashMap<>();
            for (int i = 0; i < mSubsInfoListPerPriority.size(); i++) {
                List<SubscriptionInfo> infoList = mSubsInfoListPerPriority.get(i);
            for (int priority : mSubsInfoListPerPriority.keySet()) {
                List<SubscriptionInfo> infoList = mSubsInfoListPerPriority.get(priority);
                if (infoList == null) {
                    logd("requestProvisionSubscriberIds: no exist this priority " + priority);
                    continue;
                }
                for (SubscriptionInfo info : infoList) {
                    String subscriberId = getSubscriberId(info.getSubscriptionId(), info,
                            info.isOnlyNonTerrestrialNetwork());
                    String subscriberId = getSubscriberId(info);
                    int carrierId = info.getCarrierId();
                    logd("requestProvisionSubscriberIds: subscriberId:" + subscriberId
                            + " , carrierId=" + carrierId);
@@ -5324,7 +5331,7 @@ public class SatelliteController extends Handler {
            }
        }

        logd("requestProvisionSubscriberIds: size=" + list.size());
        logd("requestProvisionSubscriberIds: " + list);
        final Bundle bundle = new Bundle();
        bundle.putParcelableList(SatelliteManager.KEY_REQUEST_PROVISION_SUBSCRIBER_ID_TOKEN, list);
        result.send(SATELLITE_RESULT_SUCCESS, bundle);
@@ -5337,11 +5344,16 @@ public class SatelliteController extends Handler {
     * @param result The result receiver, which returns the provisioned status of the token if the
     * request is successful or an error code if the request failed.
     */
    public void requestIsProvisioned(String satelliteSubscriberId, @NonNull ResultReceiver result) {
    public void requestIsProvisioned(@NonNull String satelliteSubscriberId,
            @NonNull ResultReceiver result) {
        if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
            result.send(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, null);
            return;
        }
        if (satelliteSubscriberId.isEmpty()) {
            result.send(SATELLITE_RESULT_INVALID_ARGUMENTS, null);
            return;
        }

        boolean isProvisioned = false;
        synchronized (mSatelliteTokenProvisionedLock) {
@@ -5369,8 +5381,12 @@ public class SatelliteController extends Handler {
            result.send(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, null);
            return;
        }
        if (list.size() == 0) {
            result.send(SATELLITE_RESULT_INVALID_ARGUMENTS, null);
            return;
        }

        logd("provisionSatellite: size=" + list.size());
        logd("provisionSatellite:" + list);
        for (ProvisionSubscriberId subscriberId : list) {
            synchronized (mSatelliteTokenProvisionedLock) {
                mProvisionedSubscriberId.put(subscriberId.getSubscriberId(), true);
@@ -5379,6 +5395,6 @@ public class SatelliteController extends Handler {

        RequestProvisionSatelliteArgument request = new RequestProvisionSatelliteArgument(list,
                result);
        sendMessage(obtainMessage(CMD_PROVISION_SATELLITE_TOKEN_UPDATED, request));
        sendRequestAsync(CMD_PROVISION_SATELLITE_TOKEN_UPDATED, request, null);
    }
}