From c3d06f3df46d0428ab6a73f861ffff8d1c3e4568 Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Wed, 31 Jul 2019 14:18:41 -0400 Subject: [PATCH] Fix "Invalid card" text on CarrierTextController If there's an invalid sim that does not have a corresponding sub, the text "Invalid card" should be appended to the current carrierText. As this was assembled after this step (when it was empty), it ended up replacing the correct carrierText instead of being appended. Test: atest CarrierTextControllerTest Bug: 138605164 Change-Id: Ibe0e2c3a218ea5c50f94e79cc46bd985b9646af0 --- .../keyguard/CarrierTextController.java | 6 +-- .../keyguard/CarrierTextControllerTest.java | 54 +++++++++++++++++++ 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java index 11d093f22840a..10d132ad27631 100644 --- a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java +++ b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java @@ -400,8 +400,11 @@ public class CarrierTextController { } } + if (TextUtils.isEmpty(displayText)) displayText = joinNotEmpty(mSeparator, carrierNames); + displayText = updateCarrierTextWithSimIoError(displayText, carrierNames, subOrderBySlot, allSimsMissing); + boolean airplaneMode = false; // APM (airplane mode) != no carrier state. There are carrier services // (e.g. WFC = Wi-Fi calling) which may operate in APM. @@ -410,9 +413,6 @@ public class CarrierTextController { airplaneMode = true; } - if (TextUtils.isEmpty(displayText) && !airplaneMode) { - displayText = joinNotEmpty(mSeparator, carrierNames); - } final CarrierTextCallbackInfo info = new CarrierTextCallbackInfo( displayText, carrierNames, diff --git a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java index db45ad788bfcd..0044ca7c04094 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/CarrierTextControllerTest.java @@ -36,6 +36,7 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.os.Handler; +import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; @@ -65,6 +66,8 @@ import java.util.List; public class CarrierTextControllerTest extends SysuiTestCase { private static final CharSequence SEPARATOR = " \u2014 "; + private static final CharSequence INVALID_CARD_TEXT = "Invalid card"; + private static final CharSequence AIRPLANE_MODE_TEXT = "Airplane mode"; private static final String TEST_CARRIER = "TEST_CARRIER"; private static final String TEST_CARRIER_2 = "TEST_CARRIER_2"; private static final String TEST_GROUP_UUID = "59b5c870-fc4c-47a4-a99e-9db826b48b24"; @@ -106,6 +109,10 @@ public class CarrierTextControllerTest extends SysuiTestCase { mContext.addMockSystemService(ConnectivityManager.class, mConnectivityManager); mContext.addMockSystemService(TelephonyManager.class, mTelephonyManager); mContext.addMockSystemService(SubscriptionManager.class, mSubscriptionManager); + mContext.getOrCreateTestableResources().addOverride( + R.string.keyguard_sim_error_message_short, INVALID_CARD_TEXT); + mContext.getOrCreateTestableResources().addOverride( + R.string.airplane_mode, AIRPLANE_MODE_TEXT); mDependency.injectMockDependency(WakefulnessLifecycle.class); mDependency.injectTestDependency(Dependency.MAIN_HANDLER, new Handler(mTestableLooper.getLooper())); @@ -121,6 +128,53 @@ public class CarrierTextControllerTest extends SysuiTestCase { mCarrierTextController.updateDisplayOpportunisticSubscriptionCarrierText(false); } + @Test + public void testAirplaneMode() { + Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1); + reset(mCarrierTextCallback); + List list = new ArrayList<>(); + list.add(TEST_SUBSCRIPTION); + when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list); + when(mKeyguardUpdateMonitor.getSimState(0)).thenReturn(IccCardConstants.State.READY); + mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); + + mCarrierTextController.updateCarrierText(); + + ArgumentCaptor captor = + ArgumentCaptor.forClass( + CarrierTextController.CarrierTextCallbackInfo.class); + + mTestableLooper.processAllMessages(); + verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); + assertEquals(AIRPLANE_MODE_TEXT, captor.getValue().carrierText); + } + + @Test + public void testCardIOError() { + reset(mCarrierTextCallback); + List list = new ArrayList<>(); + list.add(TEST_SUBSCRIPTION); + when(mKeyguardUpdateMonitor.getSubscriptionInfo(anyBoolean())).thenReturn(list); + when(mKeyguardUpdateMonitor.getSimState(0)).thenReturn(IccCardConstants.State.READY); + when(mKeyguardUpdateMonitor.getSimState(1)).thenReturn( + IccCardConstants.State.CARD_IO_ERROR); + mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); + + mCarrierTextController.mCallback.onSimStateChanged(3, 1, + IccCardConstants.State.CARD_IO_ERROR); + + ArgumentCaptor captor = + ArgumentCaptor.forClass( + CarrierTextController.CarrierTextCallbackInfo.class); + + mTestableLooper.processAllMessages(); + verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); + assertEquals("TEST_CARRIER" + SEPARATOR + INVALID_CARD_TEXT, captor.getValue().carrierText); + // There's only one subscription in the list + assertEquals(1, captor.getValue().listOfCarriers.length); + assertEquals(TEST_CARRIER, captor.getValue().listOfCarriers[0]); + } + @Test public void testWrongSlots() { reset(mCarrierTextCallback);