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

Commit 053c2ebe authored by Fabian Kozynski's avatar Fabian Kozynski Committed by Android (Google) Code Review
Browse files

Merge "Fix incorrect text when on Airplane Mode"

parents f986b4e9 0f49f207
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
@@ -25,6 +25,17 @@
    android:orientation="horizontal">
    android:orientation="horizontal">




    <com.android.systemui.util.AutoMarqueeTextView
        android:id="@+id/no_carrier_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="@style/TextAppearance.QS.Status"
        android:textDirection="locale"
        android:marqueeRepeatLimit="marquee_forever"
        android:singleLine="true"
        android:maxEms="7"
        android:visibility="gone"/>

    <include
    <include
        layout="@layout/qs_carrier"
        layout="@layout/qs_carrier"
        android:id="@+id/carrier1"
        android:id="@+id/carrier1"
+3 −1
Original line number Original line Diff line number Diff line
@@ -299,7 +299,9 @@ public class CarrierTextController {
                }
                }
            }
            }
        }
        }
        if (allSimsMissing) {
        // Only create "No SIM card" if no cards with CarrierName && no wifi when some sim is READY
        // This condition will also be true always when numSubs == 0
        if (allSimsMissing && !anySimReadyAndInService) {
            if (numSubs != 0) {
            if (numSubs != 0) {
                // Shows "No SIM card | Emergency calls only" on devices that are voice-capable.
                // Shows "No SIM card | Emergency calls only" on devices that are voice-capable.
                // This depends on mPlmn containing the text "Emergency calls only" when the radio
                // This depends on mPlmn containing the text "Emergency calls only" when the radio
+41 −39
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ import android.util.AttributeSet;
import android.util.Log;
import android.util.Log;
import android.view.View;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.LinearLayout;
import android.widget.TextView;


import androidx.annotation.VisibleForTesting;
import androidx.annotation.VisibleForTesting;


@@ -55,6 +56,7 @@ public class QSCarrierGroup extends LinearLayout implements


    private View[] mCarrierDividers = new View[SIM_SLOTS - 1];
    private View[] mCarrierDividers = new View[SIM_SLOTS - 1];
    private QSCarrier[] mCarrierGroups = new QSCarrier[SIM_SLOTS];
    private QSCarrier[] mCarrierGroups = new QSCarrier[SIM_SLOTS];
    private TextView mNoSimTextView;
    private final CellSignalState[] mInfos = new CellSignalState[SIM_SLOTS];
    private final CellSignalState[] mInfos = new CellSignalState[SIM_SLOTS];
    private CarrierTextController mCarrierTextController;
    private CarrierTextController mCarrierTextController;
    private ActivityStarter mActivityStarter;
    private ActivityStarter mActivityStarter;
@@ -94,10 +96,13 @@ public class QSCarrierGroup extends LinearLayout implements
        mCarrierDividers[0] = findViewById(R.id.qs_carrier_divider1);
        mCarrierDividers[0] = findViewById(R.id.qs_carrier_divider1);
        mCarrierDividers[1] = findViewById(R.id.qs_carrier_divider2);
        mCarrierDividers[1] = findViewById(R.id.qs_carrier_divider2);


        mNoSimTextView = findViewById(R.id.no_carrier_text);

        for (int i = 0; i < SIM_SLOTS; i++) {
        for (int i = 0; i < SIM_SLOTS; i++) {
            mInfos[i] = new CellSignalState();
            mInfos[i] = new CellSignalState();
            mCarrierGroups[i].setOnClickListener(this);
            mCarrierGroups[i].setOnClickListener(this);
        }
        }
        mNoSimTextView.setOnClickListener(this);


        CharSequence separator = mContext.getString(
        CharSequence separator = mContext.getString(
                com.android.internal.R.string.kg_text_message_separator);
                com.android.internal.R.string.kg_text_message_separator);
@@ -155,11 +160,8 @@ public class QSCarrierGroup extends LinearLayout implements


    @Override
    @Override
    public void updateCarrierInfo(CarrierTextController.CarrierTextCallbackInfo info) {
    public void updateCarrierInfo(CarrierTextController.CarrierTextCallbackInfo info) {
        if (info.airplaneMode) {
        mNoSimTextView.setVisibility(View.GONE);
            setVisibility(View.GONE);
        if (!info.airplaneMode && info.anySimReady) {
        } else {
            setVisibility(View.VISIBLE);
            if (info.anySimReady) {
            boolean[] slotSeen = new boolean[SIM_SLOTS];
            boolean[] slotSeen = new boolean[SIM_SLOTS];
            if (info.listOfCarriers.length == info.subscriptionIds.length) {
            if (info.listOfCarriers.length == info.subscriptionIds.length) {
                for (int i = 0; i < SIM_SLOTS && i < info.listOfCarriers.length; i++) {
                for (int i = 0; i < SIM_SLOTS && i < info.listOfCarriers.length; i++) {
@@ -190,15 +192,15 @@ public class QSCarrierGroup extends LinearLayout implements
                Log.e(TAG, "Carrier information arrays not of same length");
                Log.e(TAG, "Carrier information arrays not of same length");
            }
            }
        } else {
        } else {
                mInfos[0].visible = false;
            // No sims or airplane mode (but not WFC). Do not show QSCarrierGroup, instead just show
                mCarrierGroups[0].setCarrierText(info.carrierText);
            // info.carrierText in a different view.
                mCarrierGroups[0].setVisibility(View.VISIBLE);
            for (int i = 0; i < SIM_SLOTS; i++) {
                for (int i = 1; i < SIM_SLOTS; i++) {
                mInfos[i].visible = false;
                mInfos[i].visible = false;
                mCarrierGroups[i].setCarrierText("");
                mCarrierGroups[i].setCarrierText("");
                mCarrierGroups[i].setVisibility(View.GONE);
                mCarrierGroups[i].setVisibility(View.GONE);
            }
            }
            }
            mNoSimTextView.setText(info.carrierText);
            mNoSimTextView.setVisibility(View.VISIBLE);
        }
        }
        handleUpdateState();
        handleUpdateState();
    }
    }
+68 −0
Original line number Original line Diff line number Diff line
@@ -22,11 +22,14 @@ import static android.telephony.SubscriptionManager.DATA_ROAMING_ENABLE;
import static android.telephony.SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE;
import static android.telephony.SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE;


import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.assertTrue;
import static junit.framework.TestCase.assertFalse;


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
@@ -34,15 +37,18 @@ import static org.mockito.Mockito.when;


import android.content.Context;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Handler;
import android.provider.Settings;
import android.provider.Settings;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyManager;
import android.test.suitebuilder.annotation.SmallTest;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper;
import android.text.TextUtils;


import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.IccCardConstants;
import com.android.systemui.Dependency;
import com.android.systemui.Dependency;
@@ -76,6 +82,9 @@ public class CarrierTextControllerTest extends SysuiTestCase {
            TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "",
            TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "",
            DATA_ROAMING_DISABLE, null, null, null, null, false, null, "", false, null,
            DATA_ROAMING_DISABLE, null, null, null, null, false, null, "", false, null,
            TEST_CARRIER_ID, 0);
            TEST_CARRIER_ID, 0);
    private static final SubscriptionInfo TEST_SUBSCRIPTION_NULL = new SubscriptionInfo(0, "", 0,
            TEST_CARRIER, null, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "", DATA_ROAMING_DISABLE,
            null, null, null, null, false, null, "");
    private static final SubscriptionInfo TEST_SUBSCRIPTION_ROAMING = new SubscriptionInfo(0, "", 0,
    private static final SubscriptionInfo TEST_SUBSCRIPTION_ROAMING = new SubscriptionInfo(0, "", 0,
            TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "",
            TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "",
            DATA_ROAMING_ENABLE, null, null, null, null, false, null, "");
            DATA_ROAMING_ENABLE, null, null, null, null, false, null, "");
@@ -280,6 +289,65 @@ public class CarrierTextControllerTest extends SysuiTestCase {
        assertEquals(1, info.subscriptionIds.length);
        assertEquals(1, info.subscriptionIds.length);
    }
    }


    @Test
    public void testCarrierText_noTextOnReadySimWhenNull() {
        reset(mCarrierTextCallback);
        List<SubscriptionInfo> list = new ArrayList<>();
        list.add(TEST_SUBSCRIPTION_NULL);
        when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(IccCardConstants.State.READY);
        when(mKeyguardUpdateMonitor.getFilteredSubscriptionInfo(anyBoolean())).thenReturn(list);

        mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();

        ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor =
                ArgumentCaptor.forClass(
                        CarrierTextController.CarrierTextCallbackInfo.class);

        mCarrierTextController.updateCarrierText();
        mTestableLooper.processAllMessages();
        verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());

        assertTrue("Carrier text should be empty, instead it's " + captor.getValue().carrierText,
                TextUtils.isEmpty(captor.getValue().carrierText));
        assertFalse("No SIM should be available", captor.getValue().anySimReady);
    }

    @Test
    public void testCarrierText_noTextOnReadySimWhenNull_airplaneMode_wifiOn() {
        Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
        reset(mCarrierTextCallback);
        List<SubscriptionInfo> list = new ArrayList<>();
        list.add(TEST_SUBSCRIPTION_NULL);
        when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn(IccCardConstants.State.READY);
        when(mKeyguardUpdateMonitor.getFilteredSubscriptionInfo(anyBoolean())).thenReturn(list);
        mockWifi();

        mKeyguardUpdateMonitor.mServiceStates = new HashMap<>();
        ServiceState ss = mock(ServiceState.class);
        when(ss.getDataRegState()).thenReturn(ServiceState.STATE_IN_SERVICE);
        mKeyguardUpdateMonitor.mServiceStates.put(TEST_SUBSCRIPTION_NULL.getSubscriptionId(), ss);

        ArgumentCaptor<CarrierTextController.CarrierTextCallbackInfo> captor =
                ArgumentCaptor.forClass(
                        CarrierTextController.CarrierTextCallbackInfo.class);

        mCarrierTextController.updateCarrierText();
        mTestableLooper.processAllMessages();
        verify(mCarrierTextCallback).updateCarrierInfo(captor.capture());

        assertFalse("No SIM should be available", captor.getValue().anySimReady);
        // There's no airplane mode if at least one SIM is State.READY and there's wifi
        assertFalse("Device should not be in airplane mode", captor.getValue().airplaneMode);
        assertNotEquals(AIRPLANE_MODE_TEXT, captor.getValue().carrierText);
    }

    private void mockWifi() {
        when(mWifiManager.isWifiEnabled()).thenReturn(true);
        WifiInfo wifiInfo = mock(WifiInfo.class);
        when(wifiInfo.getBSSID()).thenReturn("");
        when(mWifiManager.getConnectionInfo()).thenReturn(wifiInfo);
    }

    @Test
    @Test
    public void testCreateInfo_noSubscriptions() {
    public void testCreateInfo_noSubscriptions() {
        reset(mCarrierTextCallback);
        reset(mCarrierTextCallback);