Loading packages/SystemUI/src/com/android/keyguard/CarrierTextManager.java +30 −7 Original line number Original line Diff line number Diff line Loading @@ -308,7 +308,13 @@ public class CarrierTextManager { } else { } else { // Don't listen and clear out the text when the device isn't a phone. // Don't listen and clear out the text when the device isn't a phone. mMainExecutor.execute(() -> callback.updateCarrierInfo( mMainExecutor.execute(() -> callback.updateCarrierInfo( new CarrierTextCallbackInfo("", null, false, null) new CarrierTextCallbackInfo( /* carrierText= */ "", /* listOfCarriers= */ null, /* anySimReady= */ false, /* isInSatelliteMode= */ false, /* subscriptionIds= */ null, /* airplaneMode= */ false) )); )); } } } else { } else { Loading Loading @@ -448,10 +454,12 @@ public class CarrierTextManager { displayText = currentSatelliteText; displayText = currentSatelliteText; } } boolean isInSatelliteMode = mSatelliteCarrierText != null; final CarrierTextCallbackInfo info = new CarrierTextCallbackInfo( final CarrierTextCallbackInfo info = new CarrierTextCallbackInfo( displayText, displayText, carrierNames, carrierNames, !allSimsMissing, !allSimsMissing, isInSatelliteMode, subsIds, subsIds, airplaneMode); airplaneMode); mLogger.logCallbackSentFromUpdate(info); mLogger.logCallbackSentFromUpdate(info); Loading Loading @@ -757,21 +765,35 @@ public class CarrierTextManager { public final CharSequence carrierText; public final CharSequence carrierText; public final CharSequence[] listOfCarriers; public final CharSequence[] listOfCarriers; public final boolean anySimReady; public final boolean anySimReady; public final boolean isInSatelliteMode; public final int[] subscriptionIds; public final int[] subscriptionIds; public boolean airplaneMode; public boolean airplaneMode; @VisibleForTesting @VisibleForTesting public CarrierTextCallbackInfo(CharSequence carrierText, CharSequence[] listOfCarriers, public CarrierTextCallbackInfo( boolean anySimReady, int[] subscriptionIds) { CharSequence carrierText, this(carrierText, listOfCarriers, anySimReady, subscriptionIds, false); CharSequence[] listOfCarriers, } boolean anySimReady, int[] subscriptionIds) { @VisibleForTesting this(carrierText, public CarrierTextCallbackInfo(CharSequence carrierText, CharSequence[] listOfCarriers, listOfCarriers, boolean anySimReady, int[] subscriptionIds, boolean airplaneMode) { anySimReady, /* isInSatelliteMode= */ false, subscriptionIds, /* airplaneMode= */ false); } public CarrierTextCallbackInfo( CharSequence carrierText, CharSequence[] listOfCarriers, boolean anySimReady, boolean isInSatelliteMode, int[] subscriptionIds, boolean airplaneMode) { this.carrierText = carrierText; this.carrierText = carrierText; this.listOfCarriers = listOfCarriers; this.listOfCarriers = listOfCarriers; this.anySimReady = anySimReady; this.anySimReady = anySimReady; this.isInSatelliteMode = isInSatelliteMode; this.subscriptionIds = subscriptionIds; this.subscriptionIds = subscriptionIds; this.airplaneMode = airplaneMode; this.airplaneMode = airplaneMode; } } Loading @@ -782,6 +804,7 @@ public class CarrierTextManager { + "carrierText=" + carrierText + "carrierText=" + carrierText + ", listOfCarriers=" + Arrays.toString(listOfCarriers) + ", listOfCarriers=" + Arrays.toString(listOfCarriers) + ", anySimReady=" + anySimReady + ", anySimReady=" + anySimReady + ", isInSatelliteMode=" + isInSatelliteMode + ", subscriptionIds=" + Arrays.toString(subscriptionIds) + ", subscriptionIds=" + Arrays.toString(subscriptionIds) + ", airplaneMode=" + airplaneMode + ", airplaneMode=" + airplaneMode + '}'; + '}'; Loading packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java +24 −12 Original line number Original line Diff line number Diff line Loading @@ -381,7 +381,10 @@ public class ShadeCarrierGroupController { mLogger.logHandleUpdateCarrierInfo(info); mLogger.logHandleUpdateCarrierInfo(info); mNoSimTextView.setVisibility(View.GONE); mNoSimTextView.setVisibility(View.GONE); if (!info.airplaneMode && info.anySimReady) { if (info.isInSatelliteMode) { mLogger.logUsingSatelliteText(info.carrierText); showSingleText(info.carrierText); } else if (!info.airplaneMode && 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) { mLogger.logUsingSimViews(); mLogger.logUsingSimViews(); Loading Loading @@ -416,21 +419,30 @@ public class ShadeCarrierGroupController { info.listOfCarriers.length, info.subscriptionIds.length); info.listOfCarriers.length, info.subscriptionIds.length); } } } else { } else { // No sims or airplane mode (but not WFC), so just show the main carrier text. mLogger.logUsingNoSimView(info.carrierText); mLogger.logUsingNoSimView(info.carrierText); // No sims or airplane mode (but not WFC). Do not show ShadeCarrierGroup, showSingleText(info.carrierText); // instead just show info.carrierText in a different view. } handleUpdateState(); // handleUpdateCarrierInfo is always called from main thread. } /** * Shows only the given text in a single TextView and hides ShadeCarrierGroup (which would show * individual SIM details). */ private void showSingleText(CharSequence text) { for (int i = 0; i < SIM_SLOTS; i++) { for (int i = 0; i < SIM_SLOTS; i++) { mInfos[i] = mInfos[i].changeVisibility(false); mInfos[i] = mInfos[i].changeVisibility(false); mCarrierGroups[i].setCarrierText(""); mCarrierGroups[i].setCarrierText(""); mCarrierGroups[i].setVisibility(View.GONE); mCarrierGroups[i].setVisibility(View.GONE); } } mNoSimTextView.setText(info.carrierText); // TODO(b/341841138): Re-name this view now that it's being used for more than just the if (!TextUtils.isEmpty(info.carrierText)) { // no-SIM case. mNoSimTextView.setText(text); if (!TextUtils.isEmpty(text)) { mNoSimTextView.setVisibility(View.VISIBLE); mNoSimTextView.setVisibility(View.VISIBLE); } } } } handleUpdateState(); // handleUpdateCarrierInfo is always called from main thread. } private static class H extends Handler { private static class H extends Handler { private Consumer<CarrierTextManager.CarrierTextCallbackInfo> mUpdateCarrierInfo; private Consumer<CarrierTextManager.CarrierTextCallbackInfo> mUpdateCarrierInfo; Loading packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerLogger.kt +9 −0 Original line number Original line Diff line number Diff line Loading @@ -65,6 +65,15 @@ constructor(@ShadeCarrierGroupControllerLog val buffer: LogBuffer) { ) ) } } fun logUsingSatelliteText(text: CharSequence) { buffer.log( TAG, LogLevel.VERBOSE, { str1 = "$text" }, { "┗ updating No SIM view with satellite text=$str1" }, ) } fun logUsingSimViews() { fun logUsingSimViews() { buffer.log(TAG, LogLevel.VERBOSE, {}, { "┗ updating SIM views" }) buffer.log(TAG, LogLevel.VERBOSE, {}, { "┗ updating SIM views" }) } } Loading packages/SystemUI/tests/src/com/android/keyguard/CarrierTextManagerTest.java +37 −5 Original line number Original line Diff line number Diff line Loading @@ -161,8 +161,11 @@ public class CarrierTextManagerTest extends SysuiTestCase { doAnswer(this::checkMainThread).when(mKeyguardUpdateMonitor) doAnswer(this::checkMainThread).when(mKeyguardUpdateMonitor) .removeCallback(any(KeyguardUpdateMonitorCallback.class)); .removeCallback(any(KeyguardUpdateMonitorCallback.class)); mCarrierTextCallbackInfo = new CarrierTextManager.CarrierTextCallbackInfo("", mCarrierTextCallbackInfo = new CarrierTextManager.CarrierTextCallbackInfo( new CharSequence[]{}, false, new int[]{}); /* carrierText= */ "", /* listOfCarriers= */ new CharSequence[]{}, /* anySimReady= */ false, /* subscriptionIds= */ new int[]{}); when(mTelephonyManager.getSupportedModemCount()).thenReturn(3); when(mTelephonyManager.getSupportedModemCount()).thenReturn(3); when(mTelephonyManager.getActiveModemCount()).thenReturn(3); when(mTelephonyManager.getActiveModemCount()).thenReturn(3); Loading Loading @@ -473,7 +476,7 @@ public class CarrierTextManagerTest extends SysuiTestCase { } } @Test @Test public void carrierText_satelliteTextNull_notUsed() { public void carrierText_satelliteTextNull_isSatelliteFalse_textNotUsed() { reset(mCarrierTextCallback); reset(mCarrierTextCallback); List<SubscriptionInfo> list = new ArrayList<>(); List<SubscriptionInfo> list = new ArrayList<>(); list.add(TEST_SUBSCRIPTION); list.add(TEST_SUBSCRIPTION); Loading @@ -491,11 +494,37 @@ public class CarrierTextManagerTest extends SysuiTestCase { CarrierTextManager.CarrierTextCallbackInfo.class); CarrierTextManager.CarrierTextCallbackInfo.class); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); // THEN the default subscription carrier text is used // THEN satellite mode is false and the default subscription carrier text is used verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); assertThat(captor.getValue().isInSatelliteMode).isFalse(); assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER); assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER); } } @Test public void carrierText_hasSatelliteText_isSatelliteTrue_textUsed() { reset(mCarrierTextCallback); List<SubscriptionInfo> list = new ArrayList<>(); list.add(TEST_SUBSCRIPTION); when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn( TelephonyManager.SIM_STATE_READY); when(mKeyguardUpdateMonitor.getFilteredSubscriptionInfo()).thenReturn(list); mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); // WHEN the satellite text is non-null mSatelliteViewModel.getCarrierText().setValue("Satellite Test Text"); mTestScope.getTestScheduler().runCurrent(); ArgumentCaptor<CarrierTextManager.CarrierTextCallbackInfo> captor = ArgumentCaptor.forClass( CarrierTextManager.CarrierTextCallbackInfo.class); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); // THEN satellite mode is true and the satellite text is used verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); assertThat(captor.getValue().isInSatelliteMode).isTrue(); assertThat(captor.getValue().carrierText).isEqualTo("Satellite Test Text"); } @Test @Test public void carrierText_satelliteTextUpdates_autoTriggersCallback() { public void carrierText_satelliteTextUpdates_autoTriggersCallback() { reset(mCarrierTextCallback); reset(mCarrierTextCallback); Loading @@ -517,6 +546,7 @@ public class CarrierTextManagerTest extends SysuiTestCase { FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); // AND use the satellite text as the carrier text // AND use the satellite text as the carrier text assertThat(captor.getValue().isInSatelliteMode).isTrue(); assertThat(captor.getValue().carrierText).isEqualTo("Test satellite text"); assertThat(captor.getValue().carrierText).isEqualTo("Test satellite text"); // WHEN the satellite text is reset to null // WHEN the satellite text is reset to null Loading @@ -528,6 +558,7 @@ public class CarrierTextManagerTest extends SysuiTestCase { // that doesn't include the satellite info // that doesn't include the satellite info FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); assertThat(captor.getValue().isInSatelliteMode).isFalse(); assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER); assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER); } } Loading Loading @@ -566,10 +597,11 @@ public class CarrierTextManagerTest extends SysuiTestCase { mCarrierTextManager.setListening(mCarrierTextCallback); mCarrierTextManager.setListening(mCarrierTextCallback); // THEN we should automatically re-trigger #updateCarrierText and get callback info // THEN we should automatically re-trigger #updateCarrierText and get callback info // that includes the new satellite text // that includes the new satellite state and text mTestScope.getTestScheduler().runCurrent(); mTestScope.getTestScheduler().runCurrent(); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); assertThat(captor.getValue().isInSatelliteMode).isTrue(); assertThat(captor.getValue().carrierText).isEqualTo("New satellite text"); assertThat(captor.getValue().carrierText).isEqualTo("New satellite text"); } } Loading packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java +55 −16 Original line number Original line Diff line number Diff line Loading @@ -312,9 +312,10 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { info = new CarrierTextManager.CarrierTextCallbackInfo( info = new CarrierTextManager.CarrierTextCallbackInfo( "", "", new CharSequence[]{""}, new CharSequence[]{""}, true, /* anySimReady= */ true, /* isInSatelliteMode= */ false, new int[]{0}, new int[]{0}, true /* airplaneMode */); /* airplaneMode= */ true); mCallback.updateCarrierInfo(info); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); assertEquals(View.GONE, mShadeCarrierGroup.getNoSimTextView().getVisibility()); assertEquals(View.GONE, mShadeCarrierGroup.getNoSimTextView().getVisibility()); Loading @@ -326,14 +327,58 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { info = new CarrierTextManager.CarrierTextCallbackInfo( info = new CarrierTextManager.CarrierTextCallbackInfo( "", "", new CharSequence[]{FIRST_CARRIER_NAME, ""}, new CharSequence[]{FIRST_CARRIER_NAME, ""}, true, /* anySimReady= */ true, /* isInSatelliteMode= */ false, new int[]{0, 1}, new int[]{0, 1}, false /* airplaneMode */); /* airplaneMode= */ false); mCallback.updateCarrierInfo(info); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); assertEquals(View.VISIBLE, mShadeCarrierGroupController.getShadeCarrierVisibility(0)); assertEquals(View.VISIBLE, mShadeCarrierGroupController.getShadeCarrierVisibility(0)); } } @Test public void isInSatelliteMode_true_noSimViewShownWithText() { CarrierTextManager.CarrierTextCallbackInfo info = new CarrierTextManager.CarrierTextCallbackInfo( "Satellite Mode Test", new CharSequence[]{FIRST_CARRIER_NAME}, /* anySimReady= */ true, /* isInSatelliteMode= */ true, new int[]{1}, /* airplaneMode= */ false); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); assertThat(mShadeCarrierGroup.getNoSimTextView().getVisibility()).isEqualTo(View.VISIBLE); assertThat(mShadeCarrierGroup.getNoSimTextView().getText()).isEqualTo( "Satellite Mode Test"); verify(mShadeCarrier1).setVisibility(View.GONE); verify(mShadeCarrier2).setVisibility(View.GONE); verify(mShadeCarrier3).setVisibility(View.GONE); } @Test public void isInSatelliteMode_false_normalSimViewsShown() { CarrierTextManager.CarrierTextCallbackInfo info = new CarrierTextManager.CarrierTextCallbackInfo( "Satellite Mode Test", new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, /* anySimReady= */ true, /* isInSatelliteMode= */ false, new int[]{0, 1}, /* airplaneMode= */ false); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); assertThat(mShadeCarrierGroup.getNoSimTextView().getVisibility()).isEqualTo(View.GONE); verify(mShadeCarrier1).setVisibility(View.VISIBLE); verify(mShadeCarrier2).setVisibility(View.VISIBLE); } @Test @Test public void testListenerNotCalledOnRegistreation() { public void testListenerNotCalledOnRegistreation() { mShadeCarrierGroupController mShadeCarrierGroupController Loading @@ -350,8 +395,7 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { SINGLE_CARRIER_TEXT, SINGLE_CARRIER_TEXT, new CharSequence[]{SINGLE_CARRIER_TEXT}, new CharSequence[]{SINGLE_CARRIER_TEXT}, true, true, new int[]{0}, new int[]{0}); false /* airplaneMode */); mCallback.updateCarrierInfo(info); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); Loading @@ -369,8 +413,7 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { MULTI_CARRIER_TEXT, MULTI_CARRIER_TEXT, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, true, true, new int[]{0, 1}, new int[]{0, 1}); false /* airplaneMode */); mCallback.updateCarrierInfo(info); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); Loading @@ -387,16 +430,14 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { SINGLE_CARRIER_TEXT, SINGLE_CARRIER_TEXT, new CharSequence[]{FIRST_CARRIER_NAME}, new CharSequence[]{FIRST_CARRIER_NAME}, true, true, new int[]{0}, new int[]{0}); false /* airplaneMode */); CarrierTextManager.CarrierTextCallbackInfo CarrierTextManager.CarrierTextCallbackInfo multiCarrierInfo = new CarrierTextManager.CarrierTextCallbackInfo( multiCarrierInfo = new CarrierTextManager.CarrierTextCallbackInfo( MULTI_CARRIER_TEXT, MULTI_CARRIER_TEXT, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, true, true, new int[]{0, 1}, new int[]{0, 1}); false /* airplaneMode */); mCallback.updateCarrierInfo(singleCarrierInfo); mCallback.updateCarrierInfo(singleCarrierInfo); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); Loading @@ -421,8 +462,7 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { SINGLE_CARRIER_TEXT, SINGLE_CARRIER_TEXT, new CharSequence[]{FIRST_CARRIER_NAME}, new CharSequence[]{FIRST_CARRIER_NAME}, true, true, new int[]{0}, new int[]{0}); false /* airplaneMode */); mCallback.updateCarrierInfo(singleCarrierInfo); mCallback.updateCarrierInfo(singleCarrierInfo); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); Loading @@ -443,8 +483,7 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { MULTI_CARRIER_TEXT, MULTI_CARRIER_TEXT, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, true, true, new int[]{0, 1}, new int[]{0, 1}); false /* airplaneMode */); mCallback.updateCarrierInfo(multiCarrierInfo); mCallback.updateCarrierInfo(multiCarrierInfo); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); Loading Loading
packages/SystemUI/src/com/android/keyguard/CarrierTextManager.java +30 −7 Original line number Original line Diff line number Diff line Loading @@ -308,7 +308,13 @@ public class CarrierTextManager { } else { } else { // Don't listen and clear out the text when the device isn't a phone. // Don't listen and clear out the text when the device isn't a phone. mMainExecutor.execute(() -> callback.updateCarrierInfo( mMainExecutor.execute(() -> callback.updateCarrierInfo( new CarrierTextCallbackInfo("", null, false, null) new CarrierTextCallbackInfo( /* carrierText= */ "", /* listOfCarriers= */ null, /* anySimReady= */ false, /* isInSatelliteMode= */ false, /* subscriptionIds= */ null, /* airplaneMode= */ false) )); )); } } } else { } else { Loading Loading @@ -448,10 +454,12 @@ public class CarrierTextManager { displayText = currentSatelliteText; displayText = currentSatelliteText; } } boolean isInSatelliteMode = mSatelliteCarrierText != null; final CarrierTextCallbackInfo info = new CarrierTextCallbackInfo( final CarrierTextCallbackInfo info = new CarrierTextCallbackInfo( displayText, displayText, carrierNames, carrierNames, !allSimsMissing, !allSimsMissing, isInSatelliteMode, subsIds, subsIds, airplaneMode); airplaneMode); mLogger.logCallbackSentFromUpdate(info); mLogger.logCallbackSentFromUpdate(info); Loading Loading @@ -757,21 +765,35 @@ public class CarrierTextManager { public final CharSequence carrierText; public final CharSequence carrierText; public final CharSequence[] listOfCarriers; public final CharSequence[] listOfCarriers; public final boolean anySimReady; public final boolean anySimReady; public final boolean isInSatelliteMode; public final int[] subscriptionIds; public final int[] subscriptionIds; public boolean airplaneMode; public boolean airplaneMode; @VisibleForTesting @VisibleForTesting public CarrierTextCallbackInfo(CharSequence carrierText, CharSequence[] listOfCarriers, public CarrierTextCallbackInfo( boolean anySimReady, int[] subscriptionIds) { CharSequence carrierText, this(carrierText, listOfCarriers, anySimReady, subscriptionIds, false); CharSequence[] listOfCarriers, } boolean anySimReady, int[] subscriptionIds) { @VisibleForTesting this(carrierText, public CarrierTextCallbackInfo(CharSequence carrierText, CharSequence[] listOfCarriers, listOfCarriers, boolean anySimReady, int[] subscriptionIds, boolean airplaneMode) { anySimReady, /* isInSatelliteMode= */ false, subscriptionIds, /* airplaneMode= */ false); } public CarrierTextCallbackInfo( CharSequence carrierText, CharSequence[] listOfCarriers, boolean anySimReady, boolean isInSatelliteMode, int[] subscriptionIds, boolean airplaneMode) { this.carrierText = carrierText; this.carrierText = carrierText; this.listOfCarriers = listOfCarriers; this.listOfCarriers = listOfCarriers; this.anySimReady = anySimReady; this.anySimReady = anySimReady; this.isInSatelliteMode = isInSatelliteMode; this.subscriptionIds = subscriptionIds; this.subscriptionIds = subscriptionIds; this.airplaneMode = airplaneMode; this.airplaneMode = airplaneMode; } } Loading @@ -782,6 +804,7 @@ public class CarrierTextManager { + "carrierText=" + carrierText + "carrierText=" + carrierText + ", listOfCarriers=" + Arrays.toString(listOfCarriers) + ", listOfCarriers=" + Arrays.toString(listOfCarriers) + ", anySimReady=" + anySimReady + ", anySimReady=" + anySimReady + ", isInSatelliteMode=" + isInSatelliteMode + ", subscriptionIds=" + Arrays.toString(subscriptionIds) + ", subscriptionIds=" + Arrays.toString(subscriptionIds) + ", airplaneMode=" + airplaneMode + ", airplaneMode=" + airplaneMode + '}'; + '}'; Loading
packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java +24 −12 Original line number Original line Diff line number Diff line Loading @@ -381,7 +381,10 @@ public class ShadeCarrierGroupController { mLogger.logHandleUpdateCarrierInfo(info); mLogger.logHandleUpdateCarrierInfo(info); mNoSimTextView.setVisibility(View.GONE); mNoSimTextView.setVisibility(View.GONE); if (!info.airplaneMode && info.anySimReady) { if (info.isInSatelliteMode) { mLogger.logUsingSatelliteText(info.carrierText); showSingleText(info.carrierText); } else if (!info.airplaneMode && 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) { mLogger.logUsingSimViews(); mLogger.logUsingSimViews(); Loading Loading @@ -416,21 +419,30 @@ public class ShadeCarrierGroupController { info.listOfCarriers.length, info.subscriptionIds.length); info.listOfCarriers.length, info.subscriptionIds.length); } } } else { } else { // No sims or airplane mode (but not WFC), so just show the main carrier text. mLogger.logUsingNoSimView(info.carrierText); mLogger.logUsingNoSimView(info.carrierText); // No sims or airplane mode (but not WFC). Do not show ShadeCarrierGroup, showSingleText(info.carrierText); // instead just show info.carrierText in a different view. } handleUpdateState(); // handleUpdateCarrierInfo is always called from main thread. } /** * Shows only the given text in a single TextView and hides ShadeCarrierGroup (which would show * individual SIM details). */ private void showSingleText(CharSequence text) { for (int i = 0; i < SIM_SLOTS; i++) { for (int i = 0; i < SIM_SLOTS; i++) { mInfos[i] = mInfos[i].changeVisibility(false); mInfos[i] = mInfos[i].changeVisibility(false); mCarrierGroups[i].setCarrierText(""); mCarrierGroups[i].setCarrierText(""); mCarrierGroups[i].setVisibility(View.GONE); mCarrierGroups[i].setVisibility(View.GONE); } } mNoSimTextView.setText(info.carrierText); // TODO(b/341841138): Re-name this view now that it's being used for more than just the if (!TextUtils.isEmpty(info.carrierText)) { // no-SIM case. mNoSimTextView.setText(text); if (!TextUtils.isEmpty(text)) { mNoSimTextView.setVisibility(View.VISIBLE); mNoSimTextView.setVisibility(View.VISIBLE); } } } } handleUpdateState(); // handleUpdateCarrierInfo is always called from main thread. } private static class H extends Handler { private static class H extends Handler { private Consumer<CarrierTextManager.CarrierTextCallbackInfo> mUpdateCarrierInfo; private Consumer<CarrierTextManager.CarrierTextCallbackInfo> mUpdateCarrierInfo; Loading
packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerLogger.kt +9 −0 Original line number Original line Diff line number Diff line Loading @@ -65,6 +65,15 @@ constructor(@ShadeCarrierGroupControllerLog val buffer: LogBuffer) { ) ) } } fun logUsingSatelliteText(text: CharSequence) { buffer.log( TAG, LogLevel.VERBOSE, { str1 = "$text" }, { "┗ updating No SIM view with satellite text=$str1" }, ) } fun logUsingSimViews() { fun logUsingSimViews() { buffer.log(TAG, LogLevel.VERBOSE, {}, { "┗ updating SIM views" }) buffer.log(TAG, LogLevel.VERBOSE, {}, { "┗ updating SIM views" }) } } Loading
packages/SystemUI/tests/src/com/android/keyguard/CarrierTextManagerTest.java +37 −5 Original line number Original line Diff line number Diff line Loading @@ -161,8 +161,11 @@ public class CarrierTextManagerTest extends SysuiTestCase { doAnswer(this::checkMainThread).when(mKeyguardUpdateMonitor) doAnswer(this::checkMainThread).when(mKeyguardUpdateMonitor) .removeCallback(any(KeyguardUpdateMonitorCallback.class)); .removeCallback(any(KeyguardUpdateMonitorCallback.class)); mCarrierTextCallbackInfo = new CarrierTextManager.CarrierTextCallbackInfo("", mCarrierTextCallbackInfo = new CarrierTextManager.CarrierTextCallbackInfo( new CharSequence[]{}, false, new int[]{}); /* carrierText= */ "", /* listOfCarriers= */ new CharSequence[]{}, /* anySimReady= */ false, /* subscriptionIds= */ new int[]{}); when(mTelephonyManager.getSupportedModemCount()).thenReturn(3); when(mTelephonyManager.getSupportedModemCount()).thenReturn(3); when(mTelephonyManager.getActiveModemCount()).thenReturn(3); when(mTelephonyManager.getActiveModemCount()).thenReturn(3); Loading Loading @@ -473,7 +476,7 @@ public class CarrierTextManagerTest extends SysuiTestCase { } } @Test @Test public void carrierText_satelliteTextNull_notUsed() { public void carrierText_satelliteTextNull_isSatelliteFalse_textNotUsed() { reset(mCarrierTextCallback); reset(mCarrierTextCallback); List<SubscriptionInfo> list = new ArrayList<>(); List<SubscriptionInfo> list = new ArrayList<>(); list.add(TEST_SUBSCRIPTION); list.add(TEST_SUBSCRIPTION); Loading @@ -491,11 +494,37 @@ public class CarrierTextManagerTest extends SysuiTestCase { CarrierTextManager.CarrierTextCallbackInfo.class); CarrierTextManager.CarrierTextCallbackInfo.class); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); // THEN the default subscription carrier text is used // THEN satellite mode is false and the default subscription carrier text is used verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); assertThat(captor.getValue().isInSatelliteMode).isFalse(); assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER); assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER); } } @Test public void carrierText_hasSatelliteText_isSatelliteTrue_textUsed() { reset(mCarrierTextCallback); List<SubscriptionInfo> list = new ArrayList<>(); list.add(TEST_SUBSCRIPTION); when(mKeyguardUpdateMonitor.getSimState(anyInt())).thenReturn( TelephonyManager.SIM_STATE_READY); when(mKeyguardUpdateMonitor.getFilteredSubscriptionInfo()).thenReturn(list); mKeyguardUpdateMonitor.mServiceStates = new HashMap<>(); // WHEN the satellite text is non-null mSatelliteViewModel.getCarrierText().setValue("Satellite Test Text"); mTestScope.getTestScheduler().runCurrent(); ArgumentCaptor<CarrierTextManager.CarrierTextCallbackInfo> captor = ArgumentCaptor.forClass( CarrierTextManager.CarrierTextCallbackInfo.class); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); // THEN satellite mode is true and the satellite text is used verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); assertThat(captor.getValue().isInSatelliteMode).isTrue(); assertThat(captor.getValue().carrierText).isEqualTo("Satellite Test Text"); } @Test @Test public void carrierText_satelliteTextUpdates_autoTriggersCallback() { public void carrierText_satelliteTextUpdates_autoTriggersCallback() { reset(mCarrierTextCallback); reset(mCarrierTextCallback); Loading @@ -517,6 +546,7 @@ public class CarrierTextManagerTest extends SysuiTestCase { FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); // AND use the satellite text as the carrier text // AND use the satellite text as the carrier text assertThat(captor.getValue().isInSatelliteMode).isTrue(); assertThat(captor.getValue().carrierText).isEqualTo("Test satellite text"); assertThat(captor.getValue().carrierText).isEqualTo("Test satellite text"); // WHEN the satellite text is reset to null // WHEN the satellite text is reset to null Loading @@ -528,6 +558,7 @@ public class CarrierTextManagerTest extends SysuiTestCase { // that doesn't include the satellite info // that doesn't include the satellite info FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); assertThat(captor.getValue().isInSatelliteMode).isFalse(); assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER); assertThat(captor.getValue().carrierText).isEqualTo(TEST_CARRIER); } } Loading Loading @@ -566,10 +597,11 @@ public class CarrierTextManagerTest extends SysuiTestCase { mCarrierTextManager.setListening(mCarrierTextCallback); mCarrierTextManager.setListening(mCarrierTextCallback); // THEN we should automatically re-trigger #updateCarrierText and get callback info // THEN we should automatically re-trigger #updateCarrierText and get callback info // that includes the new satellite text // that includes the new satellite state and text mTestScope.getTestScheduler().runCurrent(); mTestScope.getTestScheduler().runCurrent(); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); FakeExecutor.exhaustExecutors(mMainExecutor, mBgExecutor); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); verify(mCarrierTextCallback).updateCarrierInfo(captor.capture()); assertThat(captor.getValue().isInSatelliteMode).isTrue(); assertThat(captor.getValue().carrierText).isEqualTo("New satellite text"); assertThat(captor.getValue().carrierText).isEqualTo("New satellite text"); } } Loading
packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java +55 −16 Original line number Original line Diff line number Diff line Loading @@ -312,9 +312,10 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { info = new CarrierTextManager.CarrierTextCallbackInfo( info = new CarrierTextManager.CarrierTextCallbackInfo( "", "", new CharSequence[]{""}, new CharSequence[]{""}, true, /* anySimReady= */ true, /* isInSatelliteMode= */ false, new int[]{0}, new int[]{0}, true /* airplaneMode */); /* airplaneMode= */ true); mCallback.updateCarrierInfo(info); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); assertEquals(View.GONE, mShadeCarrierGroup.getNoSimTextView().getVisibility()); assertEquals(View.GONE, mShadeCarrierGroup.getNoSimTextView().getVisibility()); Loading @@ -326,14 +327,58 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { info = new CarrierTextManager.CarrierTextCallbackInfo( info = new CarrierTextManager.CarrierTextCallbackInfo( "", "", new CharSequence[]{FIRST_CARRIER_NAME, ""}, new CharSequence[]{FIRST_CARRIER_NAME, ""}, true, /* anySimReady= */ true, /* isInSatelliteMode= */ false, new int[]{0, 1}, new int[]{0, 1}, false /* airplaneMode */); /* airplaneMode= */ false); mCallback.updateCarrierInfo(info); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); assertEquals(View.VISIBLE, mShadeCarrierGroupController.getShadeCarrierVisibility(0)); assertEquals(View.VISIBLE, mShadeCarrierGroupController.getShadeCarrierVisibility(0)); } } @Test public void isInSatelliteMode_true_noSimViewShownWithText() { CarrierTextManager.CarrierTextCallbackInfo info = new CarrierTextManager.CarrierTextCallbackInfo( "Satellite Mode Test", new CharSequence[]{FIRST_CARRIER_NAME}, /* anySimReady= */ true, /* isInSatelliteMode= */ true, new int[]{1}, /* airplaneMode= */ false); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); assertThat(mShadeCarrierGroup.getNoSimTextView().getVisibility()).isEqualTo(View.VISIBLE); assertThat(mShadeCarrierGroup.getNoSimTextView().getText()).isEqualTo( "Satellite Mode Test"); verify(mShadeCarrier1).setVisibility(View.GONE); verify(mShadeCarrier2).setVisibility(View.GONE); verify(mShadeCarrier3).setVisibility(View.GONE); } @Test public void isInSatelliteMode_false_normalSimViewsShown() { CarrierTextManager.CarrierTextCallbackInfo info = new CarrierTextManager.CarrierTextCallbackInfo( "Satellite Mode Test", new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, /* anySimReady= */ true, /* isInSatelliteMode= */ false, new int[]{0, 1}, /* airplaneMode= */ false); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); assertThat(mShadeCarrierGroup.getNoSimTextView().getVisibility()).isEqualTo(View.GONE); verify(mShadeCarrier1).setVisibility(View.VISIBLE); verify(mShadeCarrier2).setVisibility(View.VISIBLE); } @Test @Test public void testListenerNotCalledOnRegistreation() { public void testListenerNotCalledOnRegistreation() { mShadeCarrierGroupController mShadeCarrierGroupController Loading @@ -350,8 +395,7 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { SINGLE_CARRIER_TEXT, SINGLE_CARRIER_TEXT, new CharSequence[]{SINGLE_CARRIER_TEXT}, new CharSequence[]{SINGLE_CARRIER_TEXT}, true, true, new int[]{0}, new int[]{0}); false /* airplaneMode */); mCallback.updateCarrierInfo(info); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); Loading @@ -369,8 +413,7 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { MULTI_CARRIER_TEXT, MULTI_CARRIER_TEXT, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, true, true, new int[]{0, 1}, new int[]{0, 1}); false /* airplaneMode */); mCallback.updateCarrierInfo(info); mCallback.updateCarrierInfo(info); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); Loading @@ -387,16 +430,14 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { SINGLE_CARRIER_TEXT, SINGLE_CARRIER_TEXT, new CharSequence[]{FIRST_CARRIER_NAME}, new CharSequence[]{FIRST_CARRIER_NAME}, true, true, new int[]{0}, new int[]{0}); false /* airplaneMode */); CarrierTextManager.CarrierTextCallbackInfo CarrierTextManager.CarrierTextCallbackInfo multiCarrierInfo = new CarrierTextManager.CarrierTextCallbackInfo( multiCarrierInfo = new CarrierTextManager.CarrierTextCallbackInfo( MULTI_CARRIER_TEXT, MULTI_CARRIER_TEXT, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, true, true, new int[]{0, 1}, new int[]{0, 1}); false /* airplaneMode */); mCallback.updateCarrierInfo(singleCarrierInfo); mCallback.updateCarrierInfo(singleCarrierInfo); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); Loading @@ -421,8 +462,7 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { SINGLE_CARRIER_TEXT, SINGLE_CARRIER_TEXT, new CharSequence[]{FIRST_CARRIER_NAME}, new CharSequence[]{FIRST_CARRIER_NAME}, true, true, new int[]{0}, new int[]{0}); false /* airplaneMode */); mCallback.updateCarrierInfo(singleCarrierInfo); mCallback.updateCarrierInfo(singleCarrierInfo); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); Loading @@ -443,8 +483,7 @@ public class ShadeCarrierGroupControllerTest extends LeakCheckedTest { MULTI_CARRIER_TEXT, MULTI_CARRIER_TEXT, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, new CharSequence[]{FIRST_CARRIER_NAME, SECOND_CARRIER_NAME}, true, true, new int[]{0, 1}, new int[]{0, 1}); false /* airplaneMode */); mCallback.updateCarrierInfo(multiCarrierInfo); mCallback.updateCarrierInfo(multiCarrierInfo); mTestableLooper.processAllMessages(); mTestableLooper.processAllMessages(); Loading