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

Commit 3c3b7780 authored by Sooraj Sasindran's avatar Sooraj Sasindran
Browse files

Cross SIM calling carrier name

Display cross sim calling carrier name

Bug: 174116055
Test: build
Change-Id: If2007f69a2f2b5a421bbd6c9b4358cf08595af8c
parent 6285d8c4
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -357,8 +357,8 @@ public class PhoneSwitcher extends Handler {

        int imsRegTech = mImsRegTechProvider.get(mContext, phoneId);
        // If IMS is registered on IWLAN or cross SIM, return false.
        boolean isOnOriginalNetwork = imsRegTech != REGISTRATION_TECH_IWLAN
                || imsRegTech != REGISTRATION_TECH_CROSS_SIM;
        boolean isOnOriginalNetwork = (imsRegTech != REGISTRATION_TECH_IWLAN)
                && (imsRegTech != REGISTRATION_TECH_CROSS_SIM);
        if (!isOnOriginalNetwork) {
            log("IMS call on IWLAN or cross SIM. Call will be ignored for DDS switch");
        }
+53 −3
Original line number Diff line number Diff line
@@ -83,6 +83,7 @@ import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
import android.telephony.VoiceSpecificRegistrationInfo;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.LocalLog;
@@ -90,6 +91,7 @@ import android.util.Pair;
import android.util.SparseArray;
import android.util.SparseBooleanArray;

import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager;
import com.android.internal.telephony.cdma.EriInfo;
@@ -2789,6 +2791,36 @@ public class ServiceStateTracker extends Handler {
            wfcFlightSpnFormat = wfcSpnFormats[flightModeIdx];
        }

        String crossSimSpnFormat = null;
        if (mPhone.getImsPhone() != null
                && (mPhone.getImsPhone() != null)
                && (mPhone.getImsPhone().getImsRegistrationTech()
                == ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM)) {
            // In Cros SIM Calling mode show SPN or PLMN + Cross SIM Calling
            //
            // 1) Show SPN + Cross SIM Calling If SIM has SPN and SPN display condition
            //    is satisfied or SPN override is enabled for this carrier
            //
            // 2) Show PLMN + Cross SIM Calling if there is no valid SPN in case 1
            PersistableBundle bundle = getCarrierConfig();
            int crossSimSpnFormatIdx =
                    bundle.getInt(CarrierConfigManager.KEY_CROSS_SIM_SPN_FORMAT_INT);
            boolean useRootLocale =
                    bundle.getBoolean(CarrierConfigManager.KEY_WFC_SPN_USE_ROOT_LOCALE);

            String[] crossSimSpnFormats = SubscriptionManager.getResourcesForSubId(
                    mPhone.getContext(),
                    mPhone.getSubId(), useRootLocale)
                    .getStringArray(R.array.crossSimSpnFormats);

            if (crossSimSpnFormatIdx < 0 || crossSimSpnFormatIdx >= crossSimSpnFormats.length) {
                loge("updateSpnDisplay: KEY_CROSS_SIM_SPN_FORMAT_INT out of bounds: "
                        + crossSimSpnFormatIdx);
                crossSimSpnFormatIdx = 0;
            }
            crossSimSpnFormat = crossSimSpnFormats[crossSimSpnFormatIdx];
        }

        if (mPhone.isPhoneTypeGsm()) {
            // The values of plmn/showPlmn change in different scenarios.
            // 1) No service but emergency call allowed -> expected
@@ -2856,9 +2888,27 @@ public class ServiceStateTracker extends Handler {
                    && ((rule & CARRIER_NAME_DISPLAY_BITMASK_SHOW_SPN)
                    == CARRIER_NAME_DISPLAY_BITMASK_SHOW_SPN);
            if (DBG) log("updateSpnDisplay: rawSpn = " + spn);

            if (!TextUtils.isEmpty(spn) && !TextUtils.isEmpty(wfcVoiceSpnFormat) &&
                    !TextUtils.isEmpty(wfcDataSpnFormat)) {
            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.
                    String originalSpn = spn.trim();
                    spn = String.format(crossSimSpnFormat, originalSpn);
                    dataSpn = spn;
                    showSpn = true;
                    showPlmn = false;
                } else if (!TextUtils.isEmpty(plmn)) {
                    // Show PLMN + Cross-SIM Calling if there is no valid SPN in the above case
                    String originalPlmn = plmn.trim();
                    PersistableBundle config = getCarrierConfig();
                    if (mIccRecords != null && config.getBoolean(
                            CarrierConfigManager.KEY_WFC_CARRIER_NAME_OVERRIDE_BY_PNN_BOOL)) {
                        originalPlmn = mIccRecords.getPnnHomeName();
                    }
                    plmn = String.format(crossSimSpnFormat, originalPlmn);
                }
            } else if (!TextUtils.isEmpty(spn) && !TextUtils.isEmpty(wfcVoiceSpnFormat)
                    && !TextUtils.isEmpty(wfcDataSpnFormat)) {
                // Show SPN + Wi-Fi Calling If SIM has SPN and SPN display condition
                // is satisfied or SPN override is enabled for this carrier.

+51 −1
Original line number Diff line number Diff line
@@ -34,10 +34,13 @@ import android.content.res.Resources;
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.text.TextUtils;
import android.util.LocalLog;
import android.util.SparseArray;

import com.android.internal.R;
import com.android.internal.telephony.GsmCdmaPhone;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.cdnr.EfData.EFSource;
@@ -377,6 +380,47 @@ public class CarrierDisplayNameResolver {
        return result;
    }

    private CarrierDisplayNameData getCarrierDisplayNameFromCrossSimCallingOverride(
            CarrierDisplayNameData rawCarrierDisplayNameData) {
        PersistableBundle config = getCarrierConfig();
        int crossSimSpnFormatIdx =
                config.getInt(CarrierConfigManager.KEY_CROSS_SIM_SPN_FORMAT_INT);
        boolean useRootLocale =
                config.getBoolean(CarrierConfigManager.KEY_WFC_SPN_USE_ROOT_LOCALE);

        String[] crossSimSpnFormats = SubscriptionManager.getResourcesForSubId(
                mPhone.getContext(),
                mPhone.getSubId(), useRootLocale)
                .getStringArray(R.array.crossSimSpnFormats);

        if (crossSimSpnFormatIdx < 0 || crossSimSpnFormatIdx >= crossSimSpnFormats.length) {
            Rlog.e(TAG, "updateSpnDisplay: KEY_CROSS_SIM_SPN_FORMAT_INT out of bounds: "
                    + crossSimSpnFormatIdx);
            crossSimSpnFormatIdx = 0;
        }
        String crossSimSpnFormat = crossSimSpnFormats[crossSimSpnFormatIdx];
        // Override the spn, data spn, plmn by Cross-SIM Calling
        List<PlmnNetworkName> efPnn = getEfPnn();
        String plmn = efPnn.isEmpty() ? "" : getPlmnNetworkName(efPnn.get(0));
        CarrierDisplayNameData result = rawCarrierDisplayNameData;
        String crossSimSpn = String.format(crossSimSpnFormat, rawCarrierDisplayNameData.getSpn());
        String crossSimPlmn = String.format(crossSimSpnFormat,
                TextUtils.isEmpty(plmn) ? rawCarrierDisplayNameData.getPlmn() : plmn);
        if (!TextUtils.isEmpty(crossSimSpn)) {
            result = new CarrierDisplayNameData.Builder()
                    .setSpn(crossSimSpn)
                    .setDataSpn(crossSimSpn)
                    .setShowSpn(true)
                    .build();
        } else if (!TextUtils.isEmpty(crossSimPlmn)) {
            result = new CarrierDisplayNameData.Builder()
                    .setPlmn(crossSimPlmn)
                    .setShowPlmn(true)
                    .build();
        }
        return result;
    }

    /**
     * Override the given carrier display name data {@code data} by out of service rule.
     * @param data the carrier display name data need to be overridden.
@@ -423,7 +467,13 @@ public class CarrierDisplayNameResolver {
    private void resolveCarrierDisplayName() {
        CarrierDisplayNameData data = getCarrierDisplayNameFromEf();
        if (DBG) Rlog.d(TAG, "CarrierName from EF: " + data);
        if (getCombinedRegState(getServiceState()) == ServiceState.STATE_IN_SERVICE) {
        if ((mPhone.getImsPhone() != null) && (mPhone.getImsPhone().getImsRegistrationTech()
                == ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM)) {
            data = getCarrierDisplayNameFromCrossSimCallingOverride(data);
            if (DBG) {
                Rlog.d(TAG, "CarrierName override by Cross-SIM Calling " + data);
            }
        } else if (getCombinedRegState(getServiceState()) == ServiceState.STATE_IN_SERVICE) {
            if (mPhone.isWifiCallingEnabled()) {
                data = getCarrierDisplayNameFromWifiCallingOverride(data);
                if (DBG) {
+5 −2
Original line number Diff line number Diff line
@@ -323,6 +323,11 @@ public class ContextFixture implements TestFixture<Context> {
            return mResources;
        }

        @Override
        public Context createConfigurationContext(Configuration overrideConfiguration) {
            return spy(new FakeContext());
        }

        @Override
        public ApplicationInfo getApplicationInfo() {
            return mApplicationInfo;
@@ -617,7 +622,6 @@ public class ContextFixture implements TestFixture<Context> {
    // The application context is the most important object this class provides to the system
    // under test.
    private final Context mContext = spy(new FakeContext());

    // We then create a spy on the application context allowing standard Mockito-style
    // when(...) logic to be used to add specific little responses where needed.

@@ -707,7 +711,6 @@ public class ContextFixture implements TestFixture<Context> {

        mDisplayMetrics.density = 2.25f;
        doReturn(mDisplayMetrics).when(mResources).getDisplayMetrics();

        mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider);
        // Settings caches the provider after first get/set call, this is needed to make sure
        // Settings is using mContentProvider as the cached provider across all tests.
+36 −0
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.cdma.CdmaCellLocation;
import android.telephony.gsm.GsmCellLocation;
import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.text.TextUtils;
@@ -162,6 +163,7 @@ public class ServiceStateTrackerTest extends TelephonyTest {
    private static final String CARRIER_NAME_DISPLAY_NO_SERVICE = "No service";
    private static final String CARRIER_NAME_DISPLAY_EMERGENCY_CALL = "emergency call";
    private static final String WIFI_CALLING_VOICE_FORMAT = "%s wifi calling";
    private static final String CROSS_SIM_CALLING_VOICE_FORMAT = "%s Cross-SIM Calling";
    private static final String WIFI_CALLING_DATA_FORMAT = "%s wifi data";
    private static final String WIFI_CALLING_FLIGHT_MODE_FORMAT = "%s flight mode";

@@ -2507,6 +2509,40 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        assertThat(b.getBoolean(TelephonyManager.EXTRA_SHOW_PLMN)).isTrue();
    }

    @Test
    public void testUpdateSpnDisplay_spnNotEmptyAndCrossSimCallingEnabled_showSpnOnly() {
        // GSM phone

        doReturn(true).when(mPhone).isPhoneTypeGsm();

        // In Service
        ServiceState ss = new ServiceState();
        ss.setVoiceRegState(ServiceState.STATE_IN_SERVICE);
        ss.setDataRegState(ServiceState.STATE_IN_SERVICE);
        sst.mSS = ss;

        // cross-sim-calling is enable
        doReturn(mImsPhone).when(mPhone).getImsPhone();
        doReturn(ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM).when(mImsPhone)
                .getImsRegistrationTech();
        String[] formats = {CROSS_SIM_CALLING_VOICE_FORMAT, "%s"};
        Resources r = mContext.getResources();
        doReturn(formats).when(r).getStringArray(anyInt());

        // update the spn
        sst.updateSpnDisplay();

        // Only spn should be shown
        String spn = mBundle.getString(CarrierConfigManager.KEY_CARRIER_NAME_STRING);
        Bundle b = getExtrasFromLastSpnUpdateIntent();
        assertThat(b.getString(TelephonyManager.EXTRA_SPN))
                .isEqualTo(String.format(CROSS_SIM_CALLING_VOICE_FORMAT, spn));
        assertThat(b.getBoolean(TelephonyManager.EXTRA_SHOW_SPN)).isTrue();
        assertThat(b.getString(TelephonyManager.EXTRA_DATA_SPN))
                .isEqualTo(String.format(CROSS_SIM_CALLING_VOICE_FORMAT, spn));
        assertThat(b.getBoolean(TelephonyManager.EXTRA_SHOW_PLMN)).isFalse();
    }

    @Test
    public void testUpdateSpnDisplay_spnNotEmptyAndWifiCallingEnabled_showSpnOnly() {
        // GSM phone