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

Commit 5358a140 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Refactor ServiceState SPN Updating" into main

parents 57badbf4 c27c0e4a
Loading
Loading
Loading
Loading
+83 −103
Original line number Diff line number Diff line
@@ -327,18 +327,10 @@ public class ServiceStateTracker extends Handler {
    private boolean mImsRegistrationOnOff = false;
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    private boolean mDeviceShuttingDown = false;
    private CarrierDisplayNameData mCarrierDisplayNameData =
            new CarrierDisplayNameData.Builder().build();
    /** Keep track of SPN display rules, so we only broadcast intent if something changes. */
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    private String mCurSpn = null;
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    private String mCurDataSpn = null;
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    private String mCurPlmn = null;
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    private boolean mCurShowPlmn = false;
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    private boolean mCurShowSpn = false;
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    @VisibleForTesting
    public int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
    private int mPrevSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -452,7 +444,7 @@ public class ServiceStateTracker extends Handler {
                // Once sub id becomes valid, we need to update the service provider name
                // displayed on the UI again. The old SPN update intents sent to
                // MobileSignalController earlier were actually ignored due to invalid sub id.
                updateSpnDisplay();
                updateCarrierDisplayName();
            }
            mSubId = curSubId;
        }
@@ -559,12 +551,12 @@ public class ServiceStateTracker extends Handler {
                pollState();
                // Depends on modem, ServiceState is not necessarily updated, so make sure updating
                // SPN.
                updateSpnDisplay();
                updateCarrierDisplayName();
            } else if (action.equals(TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED)) {
                String lastKnownNetworkCountry = intent.getStringExtra(
                        TelephonyManager.EXTRA_LAST_KNOWN_NETWORK_COUNTRY);
                if (!mLastKnownNetworkCountry.equals(lastKnownNetworkCountry)) {
                    updateSpnDisplay();
                    updateCarrierDisplayName();
                }
            }
        }
@@ -1245,7 +1237,7 @@ public class ServiceStateTracker extends Handler {
                if (mUiccApplication == null
                        || mUiccApplication.getState() != AppState.APPSTATE_READY) {
                    mIsSimReady = false;
                    updateSpnDisplay();
                    updateCarrierDisplayName();
                }
                break;

@@ -1424,7 +1416,7 @@ public class ServiceStateTracker extends Handler {
                updateOtaspState();
                if (mPhone.isPhoneTypeGsm()) {
                    mCdnr.updateEfFromUsim((SIMRecords) mIccRecords);
                    updateSpnDisplay();
                    updateCarrierDisplayName();
                }
                break;

@@ -1531,7 +1523,7 @@ public class ServiceStateTracker extends Handler {

            case EVENT_IMS_CAPABILITY_CHANGED:
                if (DBG) log("EVENT_IMS_CAPABILITY_CHANGED");
                updateSpnDisplay();
                updateCarrierDisplayName();
                mImsCapabilityChangedRegistrants.notifyRegistrants();
                break;

@@ -1623,7 +1615,7 @@ public class ServiceStateTracker extends Handler {
                    mCdnr.updateEfFromRuim((RuimRecords) mIccRecords);
                    updatePhoneObject();
                    if (mPhone.isPhoneTypeCdma()) {
                        updateSpnDisplay();
                        updateCarrierDisplayName();
                    } else {
                        RuimRecords ruim = (RuimRecords) mIccRecords;
                        if (ruim != null) {
@@ -2761,53 +2753,34 @@ public class ServiceStateTracker extends Handler {
        }
    }

    private void notifySpnDisplayUpdate(CarrierDisplayNameData data) {
        int subId = mPhone.getSubId();
        // Update ACTION_SERVICE_PROVIDERS_UPDATED if any value changes
        if (mSubId != subId
                || data.shouldShowPlmn() != mCurShowPlmn
                || data.shouldShowSpn() != mCurShowSpn
                || !TextUtils.equals(data.getSpn(), mCurSpn)
                || !TextUtils.equals(data.getDataSpn(), mCurDataSpn)
                || !TextUtils.equals(data.getPlmn(), mCurPlmn)) {

            final String log = String.format("updateSpnDisplay: changed sending intent, "
                            + "rule=%d, showPlmn='%b', plmn='%s', showSpn='%b', spn='%s', "
                            + "dataSpn='%s', subId='%d'",
    private void notifyCarrierDisplayNameDataChanged() {
        final String log = String.format("notifyCarrierDisplayNameDataChanged: "
                        + "changed sending intent, "
                        + "rule=%d, CarrierDisplayNameData=%s, subId=%d",
                getCarrierNameDisplayBitmask(mSS),
                    data.shouldShowPlmn(),
                    data.getPlmn(),
                    data.shouldShowSpn(),
                    data.getSpn(),
                    data.getDataSpn(),
                    subId);
                mCarrierDisplayNameData,
                mPhone.getSubId());
        mCdnrLogs.log(log);
            if (DBG) log("updateSpnDisplay: " + log);
        if (DBG) log(log);


        Intent intent = new Intent(TelephonyManager.ACTION_SERVICE_PROVIDERS_UPDATED);
            intent.putExtra(TelephonyManager.EXTRA_SHOW_SPN, data.shouldShowSpn());
            intent.putExtra(TelephonyManager.EXTRA_SPN, data.getSpn());
            intent.putExtra(TelephonyManager.EXTRA_DATA_SPN, data.getDataSpn());
            intent.putExtra(TelephonyManager.EXTRA_SHOW_PLMN, data.shouldShowPlmn());
            intent.putExtra(TelephonyManager.EXTRA_PLMN, data.getPlmn());
        intent.putExtra(TelephonyManager.EXTRA_SHOW_SPN, mCarrierDisplayNameData.shouldShowSpn());
        intent.putExtra(TelephonyManager.EXTRA_SPN, mCarrierDisplayNameData.getSpn());
        intent.putExtra(TelephonyManager.EXTRA_DATA_SPN, mCarrierDisplayNameData.getDataSpn());
        intent.putExtra(TelephonyManager.EXTRA_SHOW_PLMN, mCarrierDisplayNameData.shouldShowPlmn());
        intent.putExtra(TelephonyManager.EXTRA_PLMN, mCarrierDisplayNameData.getPlmn());
        SubscriptionManager.putPhoneIdAndSubIdExtra(intent, mPhone.getPhoneId());
        mPhone.getContext().sendStickyBroadcastAsUser(intent, UserHandle.ALL);

            if (SubscriptionManager.isValidSubscriptionId(subId)) {
                mSubscriptionManagerService.setCarrierName(subId, TextUtils.emptyIfNull(
                        getCarrierName(data.shouldShowPlmn(), data.getPlmn(),
                                data.shouldShowSpn(), data.getSpn())));
            }
        }
        mCurShowSpn = data.shouldShowSpn();
        mCurShowPlmn = data.shouldShowPlmn();
        mCurSpn = data.getSpn();
        mCurDataSpn = data.getDataSpn();
        mCurPlmn = data.getPlmn();
    }

    @NonNull
    private String getCarrierName(boolean showPlmn, String plmn, boolean showSpn, String spn) {
    private String getCarrierName(CarrierDisplayNameData cdnd) {
        boolean showPlmn = cdnd.shouldShowPlmn();
        boolean showSpn = cdnd.shouldShowSpn();
        String plmn = cdnd.getPlmn();
        String spn = cdnd.getSpn();

        String carrierName = "";
        if (showPlmn) {
            carrierName = plmn;
@@ -2825,29 +2798,34 @@ public class ServiceStateTracker extends Handler {
        } else if (showSpn) {
            carrierName = spn;
        }
        return carrierName;
    }

    private void updateSpnDisplayCdnr() {
        log("updateSpnDisplayCdnr+");
        CarrierDisplayNameData data = mCdnr.getCarrierDisplayNameData();
        notifySpnDisplayUpdate(data);
        log("updateSpnDisplayCdnr-");
        return TextUtils.emptyIfNull(carrierName);
    }

    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    @VisibleForTesting
    public void updateSpnDisplay() {
        if (mCarrierConfig.getBoolean(
                CarrierConfigManager.KEY_ENABLE_CARRIER_DISPLAY_NAME_RESOLVER_BOOL)) {
            updateSpnDisplayCdnr();
        } else {
            updateSpnDisplayLegacy();
    public void updateCarrierDisplayName() {
        final boolean useCdnr = mCarrierConfig.getBoolean(
                CarrierConfigManager.KEY_ENABLE_CARRIER_DISPLAY_NAME_RESOLVER_BOOL);

        final CarrierDisplayNameData cdnd = useCdnr
                ? mCdnr.getCarrierDisplayNameData()
                : getCarrierDisplayNameLegacy();

        final int subId = mPhone.getSubId();

        // Avoid sending unnecessary updates
        if (subId == mSubId && cdnd.equals(mCarrierDisplayNameData)) return;

        if (SubscriptionManager.isValidSubscriptionId(subId)) {
            mSubscriptionManagerService.setCarrierName(subId, getCarrierName(cdnd));
        }

        mCarrierDisplayNameData = cdnd; // notify...() relies on the updated value
        notifyCarrierDisplayNameDataChanged();

    }

    private void updateSpnDisplayLegacy() {
        log("updateSpnDisplayLegacy+");
    private @NonNull CarrierDisplayNameData getCarrierDisplayNameLegacy() {
        log("getCarrierDisplayNameLegacy+");

        String spn = null;
        String dataSpn = null;
@@ -2888,11 +2866,12 @@ public class ServiceStateTracker extends Handler {
                    .getStringArray(com.android.internal.R.array.wfcSpnFormats);

            if (voiceIdx < 0 || voiceIdx >= wfcSpnFormats.length) {
                loge("updateSpnDisplay: KEY_WFC_SPN_FORMAT_IDX_INT out of bounds: " + voiceIdx);
                loge("updateCarrierDisplayName: KEY_WFC_SPN_FORMAT_IDX_INT out of bounds: "
                        + voiceIdx);
                voiceIdx = 0;
            }
            if (dataIdx < 0 || dataIdx >= wfcSpnFormats.length) {
                loge("updateSpnDisplay: KEY_WFC_DATA_SPN_FORMAT_IDX_INT out of bounds: "
                loge("updateCarrierDisplayName: KEY_WFC_DATA_SPN_FORMAT_IDX_INT out of bounds: "
                        + dataIdx);
                dataIdx = 0;
            }
@@ -2926,7 +2905,7 @@ public class ServiceStateTracker extends Handler {
                    .getStringArray(R.array.crossSimSpnFormats);

            if (crossSimSpnFormatIdx < 0 || crossSimSpnFormatIdx >= crossSimSpnFormats.length) {
                loge("updateSpnDisplay: KEY_CROSS_SIM_SPN_FORMAT_INT out of bounds: "
                loge("updateCarrierDisplayName: KEY_CROSS_SIM_SPN_FORMAT_INT out of bounds: "
                        + crossSimSpnFormatIdx);
                crossSimSpnFormatIdx = 0;
            }
@@ -2971,22 +2950,26 @@ public class ServiceStateTracker extends Handler {
                            .toString();
                    noService = true;
                }
                if (DBG) log("updateSpnDisplay: radio is on but out " +
                        "of service, set plmn='" + plmn + "'");
                if (DBG) {
                    log("updateCarrierDisplayName: radio is on but out "
                            + "of service, set plmn='" + plmn + "'");
                }
            } else if (combinedRegState == ServiceState.STATE_IN_SERVICE) {
                // In either home or roaming service
                plmn = mSS.getOperatorAlpha();
                showPlmn = !TextUtils.isEmpty(plmn) &&
                        ((rule & CARRIER_NAME_DISPLAY_BITMASK_SHOW_PLMN)
                                == CARRIER_NAME_DISPLAY_BITMASK_SHOW_PLMN);
                if (DBG) log("updateSpnDisplay: rawPlmn = " + plmn);
                if (DBG) log("updateCarrierDisplayName: rawPlmn = " + plmn);
            } else {
                // Power off state, such as airplane mode, show plmn as null
                showPlmn = true;
                plmn = null;
                if (DBG) log("updateSpnDisplay: radio is off w/ showPlmn="
                if (DBG) {
                    log("updateCarrierDisplayName: radio is off w/ showPlmn="
                            + showPlmn + " plmn=" + plmn);
                }
            }

            // The value of spn/showSpn are same in different scenarios.
            //    EXTRA_SHOW_SPN = depending on IccRecords rule and radio/IMS state
@@ -2997,7 +2980,7 @@ public class ServiceStateTracker extends Handler {
            showSpn = !noService && !TextUtils.isEmpty(spn)
                    && ((rule & CARRIER_NAME_DISPLAY_BITMASK_SHOW_SPN)
                    == CARRIER_NAME_DISPLAY_BITMASK_SHOW_SPN);
            if (DBG) log("updateSpnDisplay: rawSpn = " + spn);
            if (DBG) log("updateCarrierDisplayName: rawSpn = " + spn);
            if (!TextUtils.isEmpty(crossSimSpnFormat)) {
                if (!TextUtils.isEmpty(spn)) {
                    // Show SPN + Cross-SIM Calling If SIM has SPN and SPN display condition
@@ -3056,7 +3039,7 @@ public class ServiceStateTracker extends Handler {

            // mOperatorAlpha contains the ERI text
            plmn = mSS.getOperatorAlpha();
            if (DBG) log("updateSpnDisplay: cdma rawPlmn = " + plmn);
            if (DBG) log("updateCarrierDisplayName: cdma rawPlmn = " + plmn);

            showPlmn = plmn != null;

@@ -3068,8 +3051,8 @@ public class ServiceStateTracker extends Handler {
                // todo: temporary hack; should have a better fix. This is to avoid using operator
                // name from ServiceState (populated in processIwlanRegistrationInfo()) until
                // wifi calling is actually enabled
                log("updateSpnDisplay: overwriting plmn from " + plmn + " to null as radio " +
                        "state is off");
                log("updateCarrierDisplayName: overwriting plmn from "
                        + plmn + " to null as radio " + "state is off");
                plmn = null;
            }

@@ -3077,20 +3060,21 @@ public class ServiceStateTracker extends Handler {
                plmn = Resources.getSystem().getText(com.android.internal.R.string
                        .lockscreen_carrier_default).toString();
                if (DBG) {
                    log("updateSpnDisplay: radio is on but out of svc, set plmn='" + plmn + "'");
                    log("updateCarrierDisplayName: radio is on but out of svc, set plmn='"
                            + plmn + "'");
                }
            }

        }

        notifySpnDisplayUpdate(new CarrierDisplayNameData.Builder()
        log("getCarrierDisplayNameLegacy-");

        return new CarrierDisplayNameData.Builder()
                .setSpn(spn)
                .setDataSpn(dataSpn)
                .setShowSpn(showSpn)
                .setPlmn(plmn)
                .setShowPlmn(showPlmn)
                .build());
        log("updateSpnDisplayLegacy-");
                .build();
    }

    /**
@@ -3299,7 +3283,7 @@ public class ServiceStateTracker extends Handler {
        mImsRegistrationOnOff = registered;

        // It's possible ServiceState changes did not trigger SPN display update; we update it here.
        updateSpnDisplay();
        updateCarrierDisplayName();
    }

    public void onImsCapabilityChanged() {
@@ -3713,11 +3697,11 @@ public class ServiceStateTracker extends Handler {
        String eriText = mPhone.getCdmaEriText();
        boolean hasEriChanged = !TextUtils.equals(mEriText, eriText);
        mEriText = eriText;
        // Trigger updateSpnDisplay when
        // 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)) {
            updateSpnDisplay();
            updateCarrierDisplayName();
        }

        if (hasChanged) {
@@ -5279,11 +5263,7 @@ public class ServiceStateTracker extends Handler {
        pw.println(" mStartedGprsRegCheck=" + mStartedGprsRegCheck);
        pw.println(" mReportedGprsNoReg=" + mReportedGprsNoReg);
        pw.println(" mNotification=" + mNotification);
        pw.println(" mCurSpn=" + mCurSpn);
        pw.println(" mCurDataSpn=" + mCurDataSpn);
        pw.println(" mCurShowSpn=" + mCurShowSpn);
        pw.println(" mCurPlmn=" + mCurPlmn);
        pw.println(" mCurShowPlmn=" + mCurShowPlmn);
        pw.println(" mCarrierDisplayNameData=" + mCarrierDisplayNameData);
        pw.flush();
        pw.println(" mCurrentOtaspMode=" + mCurrentOtaspMode);
        pw.println(" mRoamingIndicator=" + mRoamingIndicator);
+1 −1
Original line number Diff line number Diff line
@@ -190,7 +190,7 @@ public class CarrierDisplayNameResolver {
    }

    /** Get the resolved carrier display name. */
    public CarrierDisplayNameData getCarrierDisplayNameData() {
    public @NonNull CarrierDisplayNameData getCarrierDisplayNameData() {
        resolveCarrierDisplayName();
        return mCarrierDisplayNameData;
    }
+11 −11
Original line number Diff line number Diff line
@@ -2983,7 +2983,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        doReturn(ServiceState.STATE_IN_SERVICE).when(mSST).getCombinedRegState(ss);

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Plmn should be shown, and the string is "Emergency call only"
        Bundle b = getExtrasFromLastSpnUpdateIntent();
@@ -3005,7 +3005,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        sst.mSS = ss;

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Plmn should be shown, and the string is "No service"
        Bundle b = getExtrasFromLastSpnUpdateIntent();
@@ -3026,7 +3026,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        sst.mSS = ss;

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Plmn should be shown, and the string is null
        Bundle b = getExtrasFromLastSpnUpdateIntent();
@@ -3049,7 +3049,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        doReturn(false).when(mPhone).isWifiCallingEnabled();

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Show both spn & plmn
        String spn = mBundle.getString(CarrierConfigManager.KEY_CARRIER_NAME_STRING);
@@ -3091,7 +3091,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        doReturn(formats).when(r).getStringArray(anyInt());

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Only spn should be shown
        String spn = mBundle.getString(CarrierConfigManager.KEY_CARRIER_NAME_STRING);
@@ -3128,7 +3128,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        doReturn(true).when(mPhone).isImsRegistered();

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Only spn should be shown
        String spn = mBundle.getString(CarrierConfigManager.KEY_CARRIER_NAME_STRING);
@@ -3161,7 +3161,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        doReturn(true).when(mPhone).isImsRegistered();

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Only plmn should be shown
        String plmn = mBundle.getStringArray(CarrierConfigManager.KEY_PNN_OVERRIDE_STRING_ARRAY)[0];
@@ -3187,7 +3187,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        doReturn(false).when(mPhone).isWifiCallingEnabled();

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Show both spn & plmn
        String spn = mBundle.getString(CarrierConfigManager.KEY_CARRIER_NAME_STRING);
@@ -3240,7 +3240,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        doReturn(false).when(mPhone).isWifiCallingEnabled();

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Plmn should be shown, and the string is "No service"
        Bundle b = getExtrasFromLastSpnUpdateIntent();
@@ -3271,7 +3271,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        doReturn(true).when(mPhone).isWifiCallingEnabled();

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Plmn should be shown, and the string is "No service"
        Bundle b = getExtrasFromLastSpnUpdateIntent();
@@ -3303,7 +3303,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        doReturn(true).when(mPhone).isWifiCallingEnabled();

        // update the spn
        sst.updateSpnDisplay();
        sst.updateCarrierDisplayName();

        // Plmn should be shown, and the string is "No service"
        Bundle b = getExtrasFromLastSpnUpdateIntent();