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

Commit 911573f2 authored by Weng Su's avatar Weng Su
Browse files

[RESTRICT AUTOMERGE] Show default data SIM in Wi-Fi details when dual SIMs have the same carrier ID

- Because the wifiConfiguration is only save the carrier ID for EAP-SIM authentication

- If multiple SIMs have the same carrier ID, the Wi-Fi framework will use the default data SIM for EAP-SIM authentication

- Show default data SIM in Wi-Fi details settings, when dual SIMs have the same carrier ID

Bug: 233765468
Test: manual test
make RunSettingsRoboTests ROBOTEST_FILTER=WifiDetailPreferenceController2Test

Change-Id: I350fe637f506134770ccf316e47c0e225661bb6a
Merged-In: I350fe637f506134770ccf316e47c0e225661bb6a
(cherry picked from commit 2732be59)
parent f38346a5
Loading
Loading
Loading
Loading
+26 −24
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
import static android.net.NetworkCapabilities.NET_CAPABILITY_PARTIAL_CONNECTIVITY;
import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
import static android.telephony.TelephonyManager.UNKNOWN_CARRIER_ID;

import android.app.Activity;
import android.app.AlertDialog;
@@ -49,7 +50,6 @@ import android.os.Handler;
import android.provider.Telephony.CarrierId;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import android.util.Log;
@@ -711,34 +711,17 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
        // Checks if the SIM subscription is active.
        final List<SubscriptionInfo> activeSubscriptionInfos = mContext
                .getSystemService(SubscriptionManager.class).getActiveSubscriptionInfoList();
        final int defaultDataSubscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
        if (activeSubscriptionInfos != null) {
            CharSequence firstCarrierIdMatchedDisplayName = null;
            for (SubscriptionInfo subscriptionInfo : activeSubscriptionInfos) {
                final CharSequence displayName = SubscriptionUtil.getUniqueSubscriptionDisplayName(
                        subscriptionInfo, mContext);
                if (firstCarrierIdMatchedDisplayName == null
                        && config.carrierId == subscriptionInfo.getCarrierId()) {
                    firstCarrierIdMatchedDisplayName = displayName;
                }

                // When it's UNKNOWN_CARRIER_ID or matched with configured CarrierId,
                // devices connects it with the SIM subscription of defaultDataSubscriptionId.
                if (defaultDataSubscriptionId == subscriptionInfo.getSubscriptionId()
                        && (config.carrierId == subscriptionInfo.getCarrierId()
                                || config.carrierId == TelephonyManager.UNKNOWN_CARRIER_ID)) {
                    mEapSimSubscriptionPref.setSummary(displayName);
            SubscriptionInfo info = fineSubscriptionInfo(config.carrierId, activeSubscriptionInfos,
                    SubscriptionManager.getDefaultDataSubscriptionId());
            if (info != null) {
                mEapSimSubscriptionPref.setSummary(
                        SubscriptionUtil.getUniqueSubscriptionDisplayName(info, mContext));
                return;
            }
        }

            if (firstCarrierIdMatchedDisplayName != null) {
                mEapSimSubscriptionPref.setSummary(firstCarrierIdMatchedDisplayName);
                return;
            }
        }

        if (config.carrierId == TelephonyManager.UNKNOWN_CARRIER_ID) {
        if (config.carrierId == UNKNOWN_CARRIER_ID) {
            mEapSimSubscriptionPref.setSummary(R.string.wifi_no_related_sim_card);
            return;
        }
@@ -757,6 +740,25 @@ public class WifiDetailPreferenceController2 extends AbstractPreferenceControlle
                null /* orderBy */);
    }

    @VisibleForTesting
    SubscriptionInfo fineSubscriptionInfo(int carrierId,
            List<SubscriptionInfo> activeSubscriptionInfos, int defaultDataSubscriptionId) {
        SubscriptionInfo firstMatchedInfo = null;
        for (SubscriptionInfo info : activeSubscriptionInfos) {
            // When it's UNKNOWN_CARRIER_ID or matched with configured CarrierId,
            // devices connects it with the SIM subscription of defaultDataSubscriptionId.
            if (defaultDataSubscriptionId == info.getSubscriptionId()
                    && (carrierId == info.getCarrierId() || carrierId == UNKNOWN_CARRIER_ID)) {
                return info;
            }

            if (firstMatchedInfo == null && carrierId == info.getCarrierId()) {
                firstMatchedInfo = info;
            }
        }
        return firstMatchedInfo;
    }

    private void refreshMacAddress() {
        final String macAddress = mWifiEntry.getMacAddress();
        if (TextUtils.isEmpty(macAddress)) {
+72 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.provider.Settings;
import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyManager;
import android.view.View;
import android.view.View.OnClickListener;
@@ -108,6 +109,7 @@ import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

// TODO(b/143326832): Should add test cases for connect button.
@@ -1791,4 +1793,74 @@ public class WifiDetailPreferenceController2Test {

        return pref;
    }

    @Test
    public void fineSubscriptionInfo_noMatchedCarrierId_returnNull() {
        setUpSpyController();
        SubscriptionInfo sub1 = mockSubscriptionInfo(1, "sim1", 1111);
        SubscriptionInfo sub2 = mockSubscriptionInfo(2, "sim2", 2222);
        List<SubscriptionInfo> activeSubInfos = Arrays.asList(sub1, sub2);

        SubscriptionInfo info = mController.fineSubscriptionInfo(3333, activeSubInfos, 1);

        assertThat(info).isNull();

        info = mController.fineSubscriptionInfo(3333, activeSubInfos, 2);

        assertThat(info).isNull();
    }

    @Test
    public void fineSubscriptionInfo_diffCarrierId_returnMatchedOne() {
        setUpSpyController();
        SubscriptionInfo sub1 = mockSubscriptionInfo(1, "sim1", 1111);
        SubscriptionInfo sub2 = mockSubscriptionInfo(2, "sim2", 2222);
        List<SubscriptionInfo> activeSubInfos = Arrays.asList(sub1, sub2);

        SubscriptionInfo info = mController.fineSubscriptionInfo(1111, activeSubInfos, 1);

        assertThat(info).isNotNull();
        assertThat(info.getDisplayName().toString()).isEqualTo("sim1");

        info = mController.fineSubscriptionInfo(1111, activeSubInfos, 2);

        assertThat(info).isNotNull();
        assertThat(info.getDisplayName().toString()).isEqualTo("sim1");

        info = mController.fineSubscriptionInfo(2222, activeSubInfos, 1);

        assertThat(info).isNotNull();
        assertThat(info.getDisplayName().toString()).isEqualTo("sim2");

        info = mController.fineSubscriptionInfo(2222, activeSubInfos, 2);

        assertThat(info).isNotNull();
        assertThat(info.getDisplayName().toString()).isEqualTo("sim2");
    }

    @Test
    public void fineSubscriptionInfo_sameCarrierId_returnDefaultDataOne() {
        setUpSpyController();
        SubscriptionInfo sub1 = mockSubscriptionInfo(1, "sim1", 1111);
        SubscriptionInfo sub2 = mockSubscriptionInfo(2, "sim2", 1111);
        List<SubscriptionInfo> activeSubInfos = Arrays.asList(sub1, sub2);

        SubscriptionInfo info = mController.fineSubscriptionInfo(1111, activeSubInfos, 1);

        assertThat(info).isNotNull();
        assertThat(info.getDisplayName().toString()).isEqualTo("sim1");

        info = mController.fineSubscriptionInfo(1111, activeSubInfos, 2);

        assertThat(info).isNotNull();
        assertThat(info.getDisplayName().toString()).isEqualTo("sim2");
    }

    private SubscriptionInfo mockSubscriptionInfo(int subId, String displayName, int carrierId) {
        SubscriptionInfo info = mock(SubscriptionInfo.class);
        when(info.getSubscriptionId()).thenReturn(subId);
        when(info.getDisplayName()).thenReturn(displayName);
        when(info.getCarrierId()).thenReturn(carrierId);
        return info;
    }
}