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

Commit 33b3f9a3 authored by Sangyun Yun's avatar Sangyun Yun Committed by Android (Google) Code Review
Browse files

Merge "Override satellite display name in ServiceStateTracker" into main

parents 230b270f 1df5397b
Loading
Loading
Loading
Loading
+151 −2
Original line number Diff line number Diff line
@@ -76,6 +76,8 @@ import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
import android.telephony.VoiceSpecificRegistrationInfo;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.telephony.satellite.ISatelliteModemStateCallback;
import android.telephony.satellite.SatelliteManager;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.LocalLog;
@@ -619,6 +621,83 @@ public class ServiceStateTracker extends Handler {
     */
    private AccessNetworksManagerCallback mAccessNetworksManagerCallback = null;

    /**
     * Listens status of nb iot satellite modem.
     */
    private SatelliteModemStateListener mSatelliteModemStateListener = null;

    /**
     * SatelliteModemStateListener class
     */
    protected class SatelliteModemStateListener extends ISatelliteModemStateCallback.Stub {

        /**
         * Satellite Modem Connection Status. True when satellite is connected
         */
        private boolean mSatelliteNbIotConnected = false;

        /**
         * Marks the satellite display change as true.
         */
        private boolean mUpdateSatelliteCarrierDisplay = false;

        @Override
        public void onSatelliteModemStateChanged(int state) {
            boolean isConnected = isInConnectedState();
            if (isConnected != mSatelliteNbIotConnected) {
                log("Satellite connection state is changed to " + isConnected);
                mSatelliteNbIotConnected = isConnected;
                mUpdateSatelliteCarrierDisplay = true;
                // trigger pollStats() because the service state is already OOO in demo mode.
                pollState();
            }
        }

        @Override
        public void onEmergencyModeChanged(boolean isEmergency) {}

        @Override
        public void onRegistrationFailure(int causeCode) {}

        @Override
        public void onTerrestrialNetworkAvailableChanged(boolean isAvailable) {}

        /**
         * Returns true when statellite is connected.
         *
         * Note that this connection state is only applicable carrier roaming nb iot satellite.
         */
        public boolean isInConnectedState() {
            SatelliteController sc = SatelliteController.getInstance();
            if (sc == null) {
                return false;
            }
            int subId = sc.getSelectedSatelliteSubId();
            if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID
                    || subId != mPhone.getSubId()
                    || subId == sc.getNtnOnlySubscriptionId()) {
                return false;
            }
            return sc.isInConnectedState();
        }

        /**
         * Returns true if the satellite connection has changed and the satellite display needs
         * to be updated.
         */
        public boolean needToUpdateSatelliteCarrierDisplay() {
            return mUpdateSatelliteCarrierDisplay;
        }

        /**
         * The satellite carrier display update is complete and is marked to not be updated any
         * further.
         */
        public void doneForUpdateSatelliteCarrierDisplay() {
            mUpdateSatelliteCarrierDisplay = false;
        }
    }

    public ServiceStateTracker(GsmCdmaPhone phone, CommandsInterface ci,
            FeatureFlags featureFlags) {
        mNitzState = TelephonyComponentFactory.getInstance()
@@ -2912,6 +2991,17 @@ public class ServiceStateTracker extends Handler {
            crossSimSpnFormat = crossSimSpnFormats[crossSimSpnFormatIdx];
        }

        String satellitePlmn = null;
        SatelliteModemStateListener satelliteModemStateListener = getSatelliteModemStateListener();
        if (combinedRegState == ServiceState.STATE_OUT_OF_SERVICE
                && satelliteModemStateListener != null
                && satelliteModemStateListener.isInConnectedState()) {
            // If device is connected to the nb-iot satellite,
            // 1) No service but nb-iot satellite is connected ->
            //    expected to show "Satellite" for demo mode.
            satellitePlmn = getSatelliteDisplayName();
        }

        if (mPhone.isPhoneTypeGsm()) {
            // The values of plmn/showPlmn change in different scenarios.
            // 1) No service but emergency call allowed -> expected
@@ -2981,7 +3071,12 @@ public class ServiceStateTracker extends Handler {
                    && ((rule & CARRIER_NAME_DISPLAY_BITMASK_SHOW_SPN)
                    == CARRIER_NAME_DISPLAY_BITMASK_SHOW_SPN);
            if (DBG) log("updateCarrierDisplayName: rawSpn = " + spn);
            if (!TextUtils.isEmpty(crossSimSpnFormat)) {
            if (!TextUtils.isEmpty(satellitePlmn)) {
                plmn = satellitePlmn;
                showPlmn = true;
                showSpn = false;
                log("updateCarrierDisplayName: Update satellite network name:" + plmn);
            } else if (!TextUtils.isEmpty(crossSimSpnFormat)) {
                if (!TextUtils.isEmpty(spn)) {
                    // Show SPN + Cross-SIM Calling If SIM has SPN and SPN display condition
                    // is satisfied or SPN override is enabled for this carrier.
@@ -3077,6 +3172,46 @@ public class ServiceStateTracker extends Handler {
                .build();
    }

    private void updateSatelliteDisplayOverride() {
        String satelliteDisplayName = getSatelliteDisplayName();
        if (TextUtils.isEmpty(satelliteDisplayName)) {
            // Return, if there is no value to override.
            return;
        }

        SatelliteModemStateListener satelliteModemStateListener = getSatelliteModemStateListener();
        if (satelliteModemStateListener != null
                && satelliteModemStateListener.isInConnectedState()) {
            // override satellite display name.
            mNewSS.setOperatorName(
                    satelliteDisplayName, satelliteDisplayName, mNewSS.getOperatorNumeric());
            log("Override satellite display name to " + satelliteDisplayName);
        }
    }

    @Nullable
    private SatelliteModemStateListener getSatelliteModemStateListener() {
        if (mSatelliteModemStateListener != null) {
            return mSatelliteModemStateListener;
        }

        SatelliteController sc = SatelliteController.getInstance();
        if (sc != null) {
            SatelliteModemStateListener listener = new SatelliteModemStateListener();
            if (sc.registerForSatelliteModemStateChanged(listener)
                    == SatelliteManager.SATELLITE_RESULT_SUCCESS) {
                mSatelliteModemStateListener = listener;
                log("created SatelliteModemStateListener");
            }
        }
        return mSatelliteModemStateListener;
    }

    private String getSatelliteDisplayName() {
        return mCarrierConfig.getString(
                        CarrierConfigManager.KEY_SATELLITE_DISPLAY_NAME_STRING);
    }

    /**
     * Returns whether out-of-service will be displayed as "no service" to the user.
     */
@@ -3431,6 +3566,19 @@ public class ServiceStateTracker extends Handler {
                NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        setPhyCellInfoFromCellIdentity(mNewSS, networkRegState.getCellIdentity());

        boolean hasSatelliteConnectionChanged = false;
        SatelliteModemStateListener satelliteModemStateListener = getSatelliteModemStateListener();
        if (satelliteModemStateListener != null) {
            hasSatelliteConnectionChanged =
                    satelliteModemStateListener.needToUpdateSatelliteCarrierDisplay();
            if (hasSatelliteConnectionChanged) {
                log("Poll ServiceState done : hasSatelliteConnectionChanged="
                        + hasSatelliteConnectionChanged);
                satelliteModemStateListener.doneForUpdateSatelliteCarrierDisplay();
                updateSatelliteDisplayOverride();
            }
        }

        if (DBG) {
            log("Poll ServiceState done: oldSS=" + mSS);
            log("Poll ServiceState done: newSS=" + mNewSS);
@@ -3700,7 +3848,8 @@ public class ServiceStateTracker extends Handler {
        // Trigger updateCarrierDisplayName when
        // 1. Service state is changed.
        // 2. phone type is Cdma or CdmaLte and ERI text has changed.
        if (hasChanged || (!mPhone.isPhoneTypeGsm() && hasEriChanged)) {
        if (hasChanged || (!mPhone.isPhoneTypeGsm() && hasEriChanged)
                || hasSatelliteConnectionChanged) {
            updateCarrierDisplayName();
        }

+11 −4
Original line number Diff line number Diff line
@@ -8009,7 +8009,10 @@ public class SatelliteController extends Handler {
        }
    }

    private int getNtnOnlySubscriptionId() {
    /**
     * This method returns subscription id for supporting Ntn Only
     */
    public int getNtnOnlySubscriptionId() {
        List<SubscriptionInfo> infoList = mSubscriptionManagerService.getAllSubInfoList(
                        mContext.getOpPackageName(), mContext.getAttributionTag());
        int subId = infoList.stream()
@@ -8226,11 +8229,15 @@ public class SatelliteController extends Handler {
        return carrierRoamingNtnSignalStrength;
    }

    private boolean isInConnectedState() {
    /**
     * Returns satellite connected state from modem, return true if connected.
     */
    public boolean isInConnectedState() {
        synchronized (mSatelliteModemStateLock) {
            switch (mSatelliteModemState) {
                case SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED:
                case SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING:
                case SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED: //fallthrough
                case SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING: //fallthrough
                case SatelliteManager.SATELLITE_MODEM_STATE_DATAGRAM_RETRYING:
                    plogd("isInConnectedState: return true");
                    return true;
                default:
+46 −0
Original line number Diff line number Diff line
@@ -89,6 +89,8 @@ import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.telephony.satellite.ISatelliteModemStateCallback;
import android.telephony.satellite.SatelliteManager;
import android.text.TextUtils;
import android.util.Pair;

@@ -185,6 +187,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
    private static final String[] CARRIER_CONFIG_PNN = new String[] {
            String.format("%s,%s", HOME_PNN, "short"), "f2,s2"
    };
    private static final String SATELLITE_DISPLAY_NAME = "SatelliteTest";

    private class ServiceStateTrackerTestHandler extends HandlerThread {

@@ -391,6 +394,11 @@ public class ServiceStateTrackerTest extends TelephonyTest {
                    30  /* SIGNAL_STRENGTH_GREAT */
                });

        // satellite display name
        mBundle.putString(
                CarrierConfigManager.KEY_SATELLITE_DISPLAY_NAME_STRING,
                SATELLITE_DISPLAY_NAME);

        sendCarrierConfigUpdate(PHONE_ID);
        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());

@@ -3546,4 +3554,42 @@ public class ServiceStateTrackerTest extends TelephonyTest {
            }
        }
    }

    @Test
    public void testSatelliteModemStateCallback() throws Exception {
        ArgumentCaptor<ISatelliteModemStateCallback> captor =
                ArgumentCaptor.forClass(ISatelliteModemStateCallback.class);
        verify(mSatelliteController, times(1)).registerForSatelliteModemStateChanged(
                captor.capture());
        ISatelliteModemStateCallback callback = captor.getValue();

        doReturn(1).when(mSatelliteController).getSelectedSatelliteSubId();
        doReturn(1).when(mPhone).getSubId();

        mSimulatedCommands.setVoiceRegState(
                NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING);
        mSimulatedCommands.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN);
        mSimulatedCommands.setDataRegState(
                NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING);
        mSimulatedCommands.setDataRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN);
        doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mServiceState).getState();
        doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mServiceState).getDataRegistrationState();
        sst.mSS = mServiceState;

        mBundle.putBoolean(
                CarrierConfigManager.KEY_ENABLE_CARRIER_DISPLAY_NAME_RESOLVER_BOOL, false);
        sendCarrierConfigUpdate(PHONE_ID);

        doReturn(true).when(mSatelliteController).isInConnectedState();
        callback.onSatelliteModemStateChanged(SatelliteManager.SATELLITE_MODEM_STATE_CONNECTED);
        waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());

        // update the spn
        sst.updateCarrierDisplayName();

        Bundle b = getExtrasFromLastSpnUpdateIntent();
        assertThat(b.getString(TelephonyManager.EXTRA_PLMN)).isEqualTo(SATELLITE_DISPLAY_NAME);
        assertThat(b.getBoolean(TelephonyManager.EXTRA_SHOW_PLMN)).isTrue();
    }

}