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

Commit 5115d208 authored by Matías Hernández's avatar Matías Hernández Committed by Android (Google) Code Review
Browse files

Merge "Fix update of ZenModeFragment while in started (but not resumed) state" into main

parents 30ebbb0d 968e75c8
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -115,10 +115,12 @@ abstract class ZenModeFragmentBase extends ZenModesFragmentBase {
     * do it soon).
     */
    private void maybeUpdateControllersState(@NonNull ZenMode zenMode) {
        // DashboardFragment will update every controller on first onResume. Thus, the first onStart
        // doesn't need to force it, but subsequent ones do.
        boolean needsFullUpdate =
                getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)
                && (mModeOnLastControllerUpdate == null
                        || !mModeOnLastControllerUpdate.equals(zenMode));
                getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)
                && (mModeOnLastControllerUpdate != null
                        && !mModeOnLastControllerUpdate.equals(zenMode));
        mModeOnLastControllerUpdate = zenMode.copy();

        for (var controller : getZenPreferenceControllers()) {
+31 −0
Original line number Diff line number Diff line
@@ -212,6 +212,37 @@ public class ZenModeFragmentBaseTest {
        scenario.close();
    }

    @Test
    public void fragment_onModeUpdatedWhilePaused_updatesControllers() {
        ZenMode originalMode = new TestModeBuilder().setId("id").setName("Original").build();
        when(mBackend.getMode("id")).thenReturn(originalMode);

        // Fragment starts, loads mode data.
        FragmentScenario<TestableFragment> scenario = createScenario("id");
        scenario.moveToState(State.RESUMED).onFragment(fragment -> {
            Preference preference = fragment.requirePreference("pref_name");
            assertThat(preference.getSummary()).isEqualTo("Original");
            verify(fragment.mShowsName, times(1)).updateState(any(), eq(originalMode));
        });

        // Fragment is paused (but not stopped).
        scenario.moveToState(State.STARTED).onFragment(fragment -> {
            // Now, we get a message saying something changed.
            ZenMode updatedMode = new TestModeBuilder().setId("id").setName("Updated").build();
            when(mBackend.getMode("id")).thenReturn(updatedMode);
            getSettingsContentObservers(fragment).stream().findFirst().get()
                    .dispatchChange(false, SETTINGS_URI);
            ShadowLooper.idleMainLooper();

            // The screen was updated, and only updated once.
            Preference preference = fragment.requirePreference("pref_name");
            assertThat(preference.getSummary()).isEqualTo("Updated");
            verify(fragment.mShowsName, times(1)).updateState(any(), eq(updatedMode));
        });

        scenario.close();
    }

    @Test
    public void fragment_onFragmentRestart_reloadsMode() {
        ZenMode originalMode = new TestModeBuilder().setId("id").setName("Original").build();