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

Commit a8e48e71 authored by Pengquan Meng's avatar Pengquan Meng
Browse files

Apply CDNR in SST

This add the CarrierDisplayNameResolver to SST. CDNR is eanbled only
when CarrierConfigManager#KEY_ENABLE_CARRIER_DISPLAY_NAME_RESOLVER_BOOL
is true.

This CL also refactored the OOS and Wifi-Calling override for SPN and
PLMN.

Bug: 122921456
Test: atest ServiceStateTrackerTest
Merged-In: Idbdfb56df6afd0eb9ca8711294bbb8d458ae97ba
Change-Id: Idbdfb56df6afd0eb9ca8711294bbb8d458ae97ba
(cherry picked from commit bbab680e9df517fc10ed73bec4977d1dda1ca50d)
parent c6641545
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -40,7 +40,9 @@ public interface CarrierDisplayNameResolver {
            EF_SOURCE_RUIM,
            EF_SOURCE_RUIM,
            EF_SOURCE_VOICE_OPERATOR_SIGNALLING,
            EF_SOURCE_VOICE_OPERATOR_SIGNALLING,
            EF_SOURCE_DATA_OPERATOR_SIGNALLING,
            EF_SOURCE_DATA_OPERATOR_SIGNALLING,
            EF_SOURCE_MODEM_CONFIG})
            EF_SOURCE_MODEM_CONFIG,
            EF_SOURCE_ERI
    })
    @interface EFSource {}
    @interface EFSource {}


    int EF_SOURCE_DEFAULT = 0;
    int EF_SOURCE_DEFAULT = 0;
@@ -53,6 +55,7 @@ public interface CarrierDisplayNameResolver {
    int EF_SOURCE_VOICE_OPERATOR_SIGNALLING = 7;
    int EF_SOURCE_VOICE_OPERATOR_SIGNALLING = 7;
    int EF_SOURCE_DATA_OPERATOR_SIGNALLING = 8;
    int EF_SOURCE_DATA_OPERATOR_SIGNALLING = 8;
    int EF_SOURCE_MODEM_CONFIG = 9;
    int EF_SOURCE_MODEM_CONFIG = 9;
    int EF_SOURCE_ERI = 10;


    /**
    /**
     * Update the service provider name for the registered PLMN.
     * Update the service provider name for the registered PLMN.
@@ -171,4 +174,3 @@ public interface CarrierDisplayNameResolver {
    @NonNull
    @NonNull
    String getServiceProviderName();
    String getServiceProviderName();
}
}
+89 −39
Original line number Original line Diff line number Diff line
@@ -20,12 +20,15 @@ import android.annotation.NonNull;
import android.telephony.Rlog;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.ServiceState;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.LocalLog;
import android.util.SparseArray;
import android.util.SparseArray;


import com.android.internal.telephony.uicc.IccRecords;
import com.android.internal.telephony.uicc.IccRecords;
import com.android.internal.telephony.uicc.IccRecords.CarrierNameDisplayConditionBitmask;
import com.android.internal.telephony.uicc.IccRecords.CarrierNameDisplayConditionBitmask;
import com.android.internal.telephony.uicc.IccRecords.OperatorPlmnInfo;
import com.android.internal.telephony.uicc.IccRecords.OperatorPlmnInfo;
import com.android.internal.telephony.uicc.IccRecords.PlmnNetworkName;
import com.android.internal.telephony.uicc.IccRecords.PlmnNetworkName;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;


import java.util.Arrays;
import java.util.Arrays;
import java.util.Collections;
import java.util.Collections;
@@ -52,8 +55,17 @@ public class CarrierDisplayNameResolverImpl implements CarrierDisplayNameResolve
    private final SparseArray<List<PlmnNetworkName>> mPlmnNetworkNames = new SparseArray<>();
    private final SparseArray<List<PlmnNetworkName>> mPlmnNetworkNames = new SparseArray<>();
    private final SparseArray<List<OperatorPlmnInfo>> mOperatorPlmns = new SparseArray<>();
    private final SparseArray<List<OperatorPlmnInfo>> mOperatorPlmns = new SparseArray<>();
    private final SparseArray<List<String>> mEhplmns = new SparseArray<>();
    private final SparseArray<List<String>> mEhplmns = new SparseArray<>();
    private final LocalLog mLocalLog;


    private ServiceState mServiceState;
    private ServiceState mServiceState;
    private boolean mShouldShowServiceProviderName;
    private boolean mShouldShowPlmnNetworkName;
    private String mServiceProviderName;
    private String mPlmnNetworkName;
    private String mHomePlmn;

    /** {@code True} if any item is changed after the previous carrier name resolved. */
    private boolean mItemChanged;


    /**
    /**
     * The priority of ef source. Lower index means higher priority.
     * The priority of ef source. Lower index means higher priority.
@@ -65,6 +77,7 @@ public class CarrierDisplayNameResolverImpl implements CarrierDisplayNameResolve
            Arrays.asList(
            Arrays.asList(
                    EF_SOURCE_CARRIER_API,
                    EF_SOURCE_CARRIER_API,
                    EF_SOURCE_CARRIER_CONFIG,
                    EF_SOURCE_CARRIER_CONFIG,
                    EF_SOURCE_ERI,
                    EF_SOURCE_USIM,
                    EF_SOURCE_USIM,
                    EF_SOURCE_SIM,
                    EF_SOURCE_SIM,
                    EF_SOURCE_CSIM,
                    EF_SOURCE_CSIM,
@@ -74,96 +87,101 @@ public class CarrierDisplayNameResolverImpl implements CarrierDisplayNameResolve
                    EF_SOURCE_MODEM_CONFIG,
                    EF_SOURCE_MODEM_CONFIG,
                    EF_SOURCE_DEFAULT);
                    EF_SOURCE_DEFAULT);


    public CarrierDisplayNameResolverImpl() {
    public CarrierDisplayNameResolverImpl(LocalLog localLog) {
        int defaultSourcePriority = getSourcePriority(EF_SOURCE_DEFAULT);
        mLocalLog = localLog;
        mServiceProviderNames.put(defaultSourcePriority, "");
        int key = getSourcePriority(EF_SOURCE_DEFAULT);
        mSpdi.put(defaultSourcePriority, Collections.EMPTY_LIST);
        mServiceProviderNames.put(key, "");
        mCarrierNameDisplayConditionRules.put(defaultSourcePriority,
        mSpdi.put(key, Collections.EMPTY_LIST);
        mCarrierNameDisplayConditionRules.put(key,
                new CarrierDisplayNameConditionRule(
                new CarrierDisplayNameConditionRule(
                        DEFAULT_CARRIER_NAME_DISPLAY_CONDITION_BITMASK));
                        DEFAULT_CARRIER_NAME_DISPLAY_CONDITION_BITMASK));
        mPlmnNetworkNames.put(defaultSourcePriority, Collections.EMPTY_LIST);
        mPlmnNetworkNames.put(key, Collections.EMPTY_LIST);
        mOperatorPlmns.put(defaultSourcePriority, Collections.EMPTY_LIST);
        mOperatorPlmns.put(key, Collections.EMPTY_LIST);
        mEhplmns.put(defaultSourcePriority, Collections.EMPTY_LIST);
        mEhplmns.put(key, Collections.EMPTY_LIST);
    }
    }


    @Override
    @Override
    public void updateServiceProviderName(@EFSource int source, @NonNull String spn) {
    public void updateServiceProviderName(@EFSource int source, String spn) {
        if (TextUtils.isEmpty(spn)) return;
        mServiceProviderNames.put(getSourcePriority(source), spn);
        mServiceProviderNames.put(getSourcePriority(source), spn);
        resolveCarrierDisplayName();
        mItemChanged = true;
    }
    }


    @Override
    @Override
    public void updateServiceProviderDisplayInformation(
    public void updateServiceProviderDisplayInformation(
            @EFSource int source, @NonNull List<String> spdi) {
            @EFSource int source, @NonNull List<String> spdi) {
        if (ArrayUtils.isEmpty(spdi)) return;
        mSpdi.put(getSourcePriority(source), spdi);
        mSpdi.put(getSourcePriority(source), spdi);
        resolveCarrierDisplayName();
        mItemChanged = true;
    }
    }


    @Override
    @Override
    public void updateServiceProviderNameDisplayCondition(
    public void updateServiceProviderNameDisplayCondition(
            @EFSource int source, int condition) {
            @EFSource int source, @CarrierNameDisplayConditionBitmask int condition) {
        if (condition == IccRecords.INVALID_CARRIER_NAME_DISPLAY_CONDITION_BITMASK) return;
        mCarrierNameDisplayConditionRules.put(getSourcePriority(source),
        mCarrierNameDisplayConditionRules.put(getSourcePriority(source),
                new CarrierDisplayNameConditionRule(condition));
                new CarrierDisplayNameConditionRule(condition));
        resolveCarrierDisplayName();
        mItemChanged = true;
    }
    }


    @Override
    @Override
    public void updatePlmnNetworkNameList(
    public void updatePlmnNetworkNameList(
            @EFSource int source, @NonNull List<PlmnNetworkName> pnnList) {
            @EFSource int source, @NonNull List<PlmnNetworkName> pnnList) {
        if (ArrayUtils.isEmpty(pnnList)) return;
        mPlmnNetworkNames.put(getSourcePriority(source), pnnList);
        mPlmnNetworkNames.put(getSourcePriority(source), pnnList);
        resolveCarrierDisplayName();
        mItemChanged = true;
    }
    }


    @Override
    @Override
    public void updateEhplmnList(@EFSource int source, List<String> ehplmns) {
    public void updateEhplmnList(@EFSource int source, @NonNull List<String> ehplmns) {
        if (ArrayUtils.isEmpty(ehplmns)) return;
        mEhplmns.put(getSourcePriority(source), ehplmns);
        mEhplmns.put(getSourcePriority(source), ehplmns);
        mItemChanged = true;
    }
    }


    @Override
    @Override
    public void updateServiceState(ServiceState serviceState) {
    public void updateServiceState(@NonNull ServiceState serviceState) {
        mServiceState = serviceState;
        mServiceState = serviceState;
        resolveCarrierDisplayName();
        mItemChanged = true;
    }
    }


    @Override
    @Override
    public void updateOperatorPlmnList(
    public void updateOperatorPlmnList(@EFSource int source, @NonNull List<OperatorPlmnInfo> opl) {
            @EFSource int source, @NonNull List<OperatorPlmnInfo> opl) {
        if (ArrayUtils.isEmpty(opl)) return;
        mOperatorPlmns.put(getSourcePriority(source), opl);
        mOperatorPlmns.put(getSourcePriority(source), opl);
        resolveCarrierDisplayName();
        mItemChanged = true;
    }
    }


    @Override
    @Override
    public void updateHomePlmnNumeric(@NonNull String homePlmnNumeric) {
    public void updateHomePlmnNumeric(@NonNull String homePlmnNumeric) {
        mHomePlmn = homePlmnNumeric;
        mHomePlmn = homePlmnNumeric;
        resolveCarrierDisplayName();
        mItemChanged = true;
    }
    }


    @Override
    @Override
    public boolean shouldShowPlmnNetworkName() {
    public boolean shouldShowPlmnNetworkName() {
        if (mItemChanged) resolveCarrierDisplayName();
        return mShouldShowPlmnNetworkName;
        return mShouldShowPlmnNetworkName;
    }
    }


    @Override
    @Override
    public boolean shouldShowServiceProviderName() {
    public boolean shouldShowServiceProviderName() {
        if (mItemChanged) resolveCarrierDisplayName();
        return mShouldShowServiceProviderName;
        return mShouldShowServiceProviderName;
    }
    }


    @Override
    @Override
    public String getPlmnNetworkName() {
    public String getPlmnNetworkName() {
        if (mItemChanged) resolveCarrierDisplayName();
        return mPlmnNetworkName;
        return mPlmnNetworkName;
    }
    }


    @Override
    @Override
    public String getServiceProviderName() {
    public String getServiceProviderName() {
        if (mItemChanged) resolveCarrierDisplayName();
        return mServiceProviderName;
        return mServiceProviderName;
    }
    }


    private boolean mShouldShowServiceProviderName;
    private boolean mShouldShowPlmnNetworkName;
    private String mServiceProviderName;
    private String mPlmnNetworkName;
    private String mHomePlmn;

    private void resolveCarrierDisplayName() {
    private void resolveCarrierDisplayName() {
        if (mServiceState == null) return;
        if (mServiceState == null) return;


@@ -176,6 +194,7 @@ public class CarrierDisplayNameResolverImpl implements CarrierDisplayNameResolve
        // Currently use the roaming state from ServiceState.
        // Currently use the roaming state from ServiceState.
        // EF_SPDI is only used when determine the service provider name and PLMN network name
        // EF_SPDI is only used when determine the service provider name and PLMN network name
        // display condition rule.
        // display condition rule.
        // All the PLMNs will be considered HOME PLMNs if there is a brand override.
        boolean isRoaming = mServiceState.getRoaming() && !efSpdi.contains(registeredPlmnNumeric);
        boolean isRoaming = mServiceState.getRoaming() && !efSpdi.contains(registeredPlmnNumeric);
        mShouldShowServiceProviderName = displayRule.shouldShowSpn(isRoaming);
        mShouldShowServiceProviderName = displayRule.shouldShowSpn(isRoaming);
        mShouldShowPlmnNetworkName = displayRule.shouldShowPnn(isRoaming);
        mShouldShowPlmnNetworkName = displayRule.shouldShowPnn(isRoaming);
@@ -202,18 +221,49 @@ public class CarrierDisplayNameResolverImpl implements CarrierDisplayNameResolve
            mPlmnNetworkName = registeredPlmnNumeric;
            mPlmnNetworkName = registeredPlmnNumeric;
        }
        }


        if (DBG) {
        String logInfo = "isRoaming = " + isRoaming
            Rlog.d(TAG, "spnDisplayCondition = " + displayRule
                    + " ,isRoaming = " + isRoaming
                + " ,registeredPLMN = " + registeredPlmnNumeric
                + " ,registeredPLMN = " + registeredPlmnNumeric
                + " ,displayRule = " + displayRule
                + " ,shouldShowPlmn = " + mShouldShowPlmnNetworkName
                + " ,plmn = " + mPlmnNetworkName
                + " ,shouldShowSpn = " + mShouldShowServiceProviderName
                + " ,spn = " + mServiceProviderName;
        if (DBG) Rlog.d(TAG, logInfo);
        mLocalLog.log(logInfo);

        mItemChanged = false;
    }

    @Override
    public String toString() {
        Boolean roamingFromSS = mServiceState != null ? mServiceState.getRoaming() : null;
        String registeredPLMN = mServiceState != null ? mServiceState.getOperatorNumeric() : null;
        return " { spnDisplayCondition = " + mCarrierNameDisplayConditionRules
                + " ,roamingFromSS = " + roamingFromSS
                + " ,registeredPLMN = " + registeredPLMN
                + " ,homePLMN = " + mHomePlmn
                + " ,homePLMN = " + mHomePlmn
                + " ,spnList = " + mServiceProviderNames
                + " ,spnList = " + mServiceProviderNames
                + " ,spnCondition " + mCarrierNameDisplayConditionRules
                + " ,spnCondition " + mCarrierNameDisplayConditionRules
                + " ,spdiList = " + mSpdi
                + " ,spdiList = " + mSpdi
                + " ,pnnList = " + mPlmnNetworkNames
                + " ,pnnList = " + mPlmnNetworkNames
                + " ,oplList = " + mOperatorPlmns
                + " ,oplList = " + mOperatorPlmns
                    + " ,ehplmn = " + mEhplmns);
                + " ,ehplmn = " + mEhplmns
                + " }";
    }
    }

    /**
     * Dumps information for carrier display name resolver.
     * @param pw information printer.
     */
    public void dump(IndentingPrintWriter pw) {
        pw.println("CDNRImpl");
        pw.increaseIndent();
        pw.println("fields = " + toString());
        pw.println("shouldShowPlmn = " + mShouldShowPlmnNetworkName);
        pw.println("plmn= " + mPlmnNetworkName);
        pw.println("showShowSpn = " + mShouldShowServiceProviderName);
        pw.println("spn = " + mServiceProviderName);
        pw.decreaseIndent();
    }
    }


    /**
    /**
+387 −27

File changed.

Preview size limit exceeded, changes collapsed.

+42 −0
Original line number Original line Diff line number Diff line
@@ -198,6 +198,10 @@ public abstract class IccRecords extends Handler implements IccConstants {
    public static final int CARRIER_NAME_DISPLAY_CONDITION_BITMASK_PLMN = 1;
    public static final int CARRIER_NAME_DISPLAY_CONDITION_BITMASK_PLMN = 1;
    public static final int CARRIER_NAME_DISPLAY_CONDITION_BITMASK_SPN = 2;
    public static final int CARRIER_NAME_DISPLAY_CONDITION_BITMASK_SPN = 2;



    // See {@link CarrierConfigManager#KEY_SPN_DISPLAY_CONDITION_OVERRIDE_INT}.
    public static final int INVALID_CARRIER_NAME_DISPLAY_CONDITION_BITMASK = -1;

    // Display SPN only and only if registered to Home PLMNs.
    // Display SPN only and only if registered to Home PLMNs.
    // Display PLMN only and only if registered to Non-Home PLMNs.
    // Display PLMN only and only if registered to Non-Home PLMNs.
    public static final int DEFAULT_CARRIER_NAME_DISPLAY_CONDITION = 0;
    public static final int DEFAULT_CARRIER_NAME_DISPLAY_CONDITION = 0;
@@ -1122,6 +1126,44 @@ public abstract class IccRecords extends Handler implements IccConstants {
        return android.util.Base64.encodeToString(auth_rsp.payload, android.util.Base64.NO_WRAP);
        return android.util.Base64.encodeToString(auth_rsp.payload, android.util.Base64.NO_WRAP);
    }
    }


    /**
     * Convert the spn display condition to a bitmask
     * {@link com.android.internal.telephony.uicc.IccRecords.CarrierNameDisplayConditionBitmask}.
     *
     * b1 is the last bit of the display condition which is used to determine whether display of
     * PLMN network name is required when registered PLMN is **either** HPLMN or a PLMN in the
     * service provider PLMN list.
     *
     * b2 is the second last bit of the display condtion which is used to determine
     * whether display of Service Provider Name is required when registered PLMN is
     * **neither** HPLMN nor PLMN in the service provider PLMN list.
     *
     * Reference: 3GPP TS 31.102 section 4.2.12 EF_SPN
     *
     * @return a carrier name display condtion bitmask.
     */
    @CarrierNameDisplayConditionBitmask
    public static int convertSpnDisplayConditionToBitmask(int condition) {
        int carrierNameDisplayCondition = 0;
        // b1 = 0: display of registered PLMN name not required when registered PLMN is
        // either HPLMN or a PLMN in the service provider PLMN list.
        // b1 = 1: display of registered PLMN name required when registered PLMN is
        // either HPLMN or a PLMN in the service provider PLMN list.
        if ((condition & 0x1) == 0x1) {
            carrierNameDisplayCondition |= CARRIER_NAME_DISPLAY_CONDITION_BITMASK_PLMN;
        }

        // b2 = 0: display of the service provider name is **required** when registered
        // PLMN is neither HPLMN nor a PLMN in the service provider PLMN list.
        // b2 = 1: display of the servier provider name is **not required** when
        // registered PLMN is neither HPLMN nor PLMN in the service provider PLMN list.
        if ((condition & 0x2) == 0) {
            carrierNameDisplayCondition |= CARRIER_NAME_DISPLAY_CONDITION_BITMASK_SPN;
        }

        return carrierNameDisplayCondition;
    }

    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        pw.println("IccRecords: " + this);
        pw.println("IccRecords: " + this);
        pw.println(" mDestroyed=" + mDestroyed);
        pw.println(" mDestroyed=" + mDestroyed);
+2 −26
Original line number Original line Diff line number Diff line
@@ -1698,32 +1698,8 @@ public class SIMRecords extends IccRecords {


                    // Reference: 3GPP TS 31.102 section 4.2.12 EF_SPN
                    // Reference: 3GPP TS 31.102 section 4.2.12 EF_SPN
                    // The first byte is display condition.
                    // The first byte is display condition.
                    //
                    mCarrierNameDisplayCondition =
                    // b1 is the last bit of the display condition which is used to determine
                            convertSpnDisplayConditionToBitmask(data[0] & 0xff);
                    // whether display of PLMN network name is required when registered PLMN is
                    // **either** HPLMN or a PLMN in the service provider PLMN list.
                    //
                    // b2 is the second last bit of the display condtion which is used to determine
                    // whether display of Service Provider Name is required when registered PLMN is
                    // **neither** HPLMN nor PLMN in the service provider PLMN list.
                    int displayCondition = data[0] & 0xff;
                    mCarrierNameDisplayCondition = 0;

                    // b1 = 0: display of registered PLMN name not required when registered PLMN is
                    // either HPLMN or a PLMN in the service provider PLMN list.
                    // b1 = 1: display of registered PLMN name required when registered PLMN is
                    // either HPLMN or a PLMN in the service provider PLMN list.
                    if ((displayCondition & 0x1) == 0x1) {
                        mCarrierNameDisplayCondition |= CARRIER_NAME_DISPLAY_CONDITION_BITMASK_PLMN;
                    }

                    // b2 = 0: display of the service provider name is **required** when registered
                    // PLMN is neither HPLMN nor a PLMN in the service provider PLMN list.
                    // b2 = 1: display of the servier provider name is **not required** when
                    // registered PLMN is neither HPLMN nor PLMN in the service provider PLMN list.
                    if ((displayCondition & 0x2) == 0) {
                        mCarrierNameDisplayCondition |= CARRIER_NAME_DISPLAY_CONDITION_BITMASK_SPN;
                    }


                    setServiceProviderName(IccUtils.adnStringFieldToString(
                    setServiceProviderName(IccUtils.adnStringFieldToString(
                                data, 1, data.length - 1));
                                data, 1, data.length - 1));
Loading