From 4e63d9e9e05b043681193efa773017be7662f863 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 Merged-In: 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 1421b06be6211..728debd4eca73 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; @@ -81,6 +87,9 @@ public class CarrierTextControllerTest extends SysuiTestCase { TEST_CARRIER, TEST_CARRIER_2, NAME_SOURCE_DEFAULT_SOURCE, 0xFFFFFF, "", DATA_ROAMING_DISABLE, null, null, null, null, false, null, "", true, TEST_GROUP_UUID, 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, ""); @@ -285,6 +294,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.getSubscriptionInfo(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.getSubscriptionInfo(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);