From 0f49f207c6eed589926e6317ad0c113af0bc77f6 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Thu, 29 Aug 2019 09:47:07 -0400 Subject: [PATCH] Fix incorrect text when on Airplane Mode Only generate missing sim text if there are no CarrierName present AND no sims READY. This was an issue when airplane mode with WFC. Also, replace using mCarrierGroups[0] for its text when the sims are missing. Instead use a different view that is made visible when all the QSCarrierGroups should be invisible. Test: manual, using APM Test: atest Fixes: 139556559 Change-Id: I9d83b0eb2a21b786d50c243903bf32b6e761dc77 --- .../SystemUI/res/layout/qs_carrier_group.xml | 11 +++ .../keyguard/CarrierTextController.java | 4 +- .../android/systemui/qs/QSCarrierGroup.java | 80 ++++++++++--------- .../keyguard/CarrierTextControllerTest.java | 68 ++++++++++++++++ 4 files changed, 123 insertions(+), 40 deletions(-) diff --git a/packages/SystemUI/res/layout/qs_carrier_group.xml b/packages/SystemUI/res/layout/qs_carrier_group.xml index 36f382b19f4a5..56efb4911cd0e 100644 --- a/packages/SystemUI/res/layout/qs_carrier_group.xml +++ b/packages/SystemUI/res/layout/qs_carrier_group.xml @@ -25,6 +25,17 @@ android:orientation="horizontal"> + + = SIM_SLOTS) { - Log.w(TAG, "updateInfoCarrier - slot: " + slot); - continue; - } - if (slot == SubscriptionManager.INVALID_SIM_SLOT_INDEX) { - Log.e(TAG, - "Invalid SIM slot index for subscription: " - + info.subscriptionIds[i]); - continue; - } - mInfos[slot].visible = true; - slotSeen[slot] = true; - mCarrierGroups[slot].setCarrierText( - info.listOfCarriers[i].toString().trim()); - mCarrierGroups[slot].setVisibility(View.VISIBLE); + mNoSimTextView.setVisibility(View.GONE); + if (!info.airplaneMode && info.anySimReady) { + boolean[] slotSeen = new boolean[SIM_SLOTS]; + if (info.listOfCarriers.length == info.subscriptionIds.length) { + for (int i = 0; i < SIM_SLOTS && i < info.listOfCarriers.length; i++) { + int slot = getSlotIndex(info.subscriptionIds[i]); + if (slot >= SIM_SLOTS) { + Log.w(TAG, "updateInfoCarrier - slot: " + slot); + continue; } - for (int i = 0; i < SIM_SLOTS; i++) { - if (!slotSeen[i]) { - mInfos[i].visible = false; - mCarrierGroups[i].setVisibility(View.GONE); - } + if (slot == SubscriptionManager.INVALID_SIM_SLOT_INDEX) { + Log.e(TAG, + "Invalid SIM slot index for subscription: " + + info.subscriptionIds[i]); + continue; + } + mInfos[slot].visible = true; + slotSeen[slot] = true; + mCarrierGroups[slot].setCarrierText( + info.listOfCarriers[i].toString().trim()); + mCarrierGroups[slot].setVisibility(View.VISIBLE); + } + for (int i = 0; i < SIM_SLOTS; i++) { + if (!slotSeen[i]) { + mInfos[i].visible = false; + mCarrierGroups[i].setVisibility(View.GONE); } - } else { - Log.e(TAG, "Carrier information arrays not of same length"); } } else { - mInfos[0].visible = false; - mCarrierGroups[0].setCarrierText(info.carrierText); - mCarrierGroups[0].setVisibility(View.VISIBLE); - for (int i = 1; i < SIM_SLOTS; i++) { - mInfos[i].visible = false; - mCarrierGroups[i].setCarrierText(""); - mCarrierGroups[i].setVisibility(View.GONE); - } + Log.e(TAG, "Carrier information arrays not of same length"); } + } else { + // No sims or airplane mode (but not WFC). Do not show QSCarrierGroup, instead just show + // info.carrierText in a different view. + for (int i = 0; i < SIM_SLOTS; i++) { + mInfos[i].visible = false; + mCarrierGroups[i].setCarrierText(""); + mCarrierGroups[i].setVisibility(View.GONE); + } + mNoSimTextView.setText(info.carrierText); + mNoSimTextView.setVisibility(View.VISIBLE); } handleUpdateState(); } diff --git a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java index 6d433d2c07709..2e94c7c12cd88 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java @@ -22,11 +22,14 @@ import static android.telephony.SubscriptionManager.DATA_ROAMING_ENABLE; import static android.telephony.SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE; import static junit.framework.Assert.assertTrue; +import static junit.framework.TestCase.assertFalse; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; @@ -34,15 +37,18 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.net.ConnectivityManager; +import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Handler; import android.provider.Settings; +import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.text.TextUtils; import com.android.internal.telephony.IccCardConstants; import com.android.systemui.Dependency; @@ -76,6 +82,9 @@ public class CarrierTextControllerTest extends SysuiTestCase { TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "", DATA_ROAMING_DISABLE, null, null, null, null, false, null, "", false, null, 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, TEST_CARRIER, TEST_CARRIER, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "", DATA_ROAMING_ENABLE, null, null, null, null, false, null, ""); @@ -280,6 +289,65 @@ public class CarrierTextControllerTest extends SysuiTestCase { assertEquals(1, info.subscriptionIds.length); } + @Test + public void testCarrierText_noTextOnReadySimWhenNull() { + reset(mCarrierTextCallback); + List 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 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 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 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 public void testCreateInfo_noSubscriptions() { reset(mCarrierTextCallback);