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

Commit 91a8a43a authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB][Sat] Always show satellite carrier text in shade if available.

This isn't my favorite way to fix this, but it's what we can do given
the state of the current code and what little time we have left.

Fixes: 341841138
Flag: com.android.internal.telephony.flags.oem_enabled_satellite_flag
Test: In SysUI demo mode, enter satellite mode then open the shade
-> verify the header has the satellite carrier text
Test: atest CarrierTextManagerTest ShareCarrierGroupControllerTest

Change-Id: I1bd7a67d7a2f0f9971ad5fab638adf2d78eac6be
parent ee08101f
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();