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

Commit 27d0c958 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov Committed by Android (Google) Code Review
Browse files

Merge "[SB][Sat] Always show satellite carrier text in shade if available." into main

parents c01a2d1d 91a8a43a
Loading
Loading
Loading
Loading
+30 −7
Original line number Original line Diff line number Diff line
@@ -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 {
@@ -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);
@@ -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;
        }
        }
@@ -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
                    + '}';
                    + '}';
+24 −12
Original line number Original line Diff line number Diff line
@@ -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();
@@ -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;
+9 −0
Original line number Original line Diff line number Diff line
@@ -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" })
    }
    }
+37 −5
Original line number Original line Diff line number Diff line
@@ -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);


@@ -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);
@@ -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);
@@ -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
@@ -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);
    }
    }


@@ -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");
    }
    }


+55 −16
Original line number Original line Diff line number Diff line
@@ -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());
@@ -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
@@ -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();
@@ -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();
@@ -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();
@@ -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();
@@ -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();