Improve lifecycle of ZenModeFragment & friends

* Don't keep Settings observers longer than start-stop.
* Only call updateState() once on controllers during create->start->resume.
* Remove some duplicate controller update methods from ZenModesFragmentBase (we can directly call DashboardFragment's).
* Don't update controllers if unrelated modes were changed.
* Extract ZenSettingsObserver for use in the link tile later.
* Add tests.

Fixes: 353946788
Test: atest com.android.settings.notification.modes
Flag: android.app.modes_ui
Change-Id: I64b51714d699b5c3a592a76fcb615d2999998829
This commit is contained in:
Matías Hernández
2024-07-29 17:45:27 +02:00
parent cadfc0187d
commit b8b897e552
11 changed files with 577 additions and 231 deletions

View File

@@ -18,6 +18,7 @@ package com.android.settings.notification.modes;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
@@ -49,12 +50,12 @@ public class ManualDurationPreferenceController extends AbstractZenModePreferenc
return zenMode.isManualDnd();
}
// Called by parent fragment onAttach().
// Called by parent fragment onStart().
void registerSettingsObserver() {
mSettingsObserver.register();
}
// Called by parent fragment onDetach().
// Called by parent fragment onStop().
void unregisterSettingsObserver() {
mSettingsObserver.unregister();
}
@@ -69,7 +70,7 @@ public class ManualDurationPreferenceController extends AbstractZenModePreferenc
}
@Override
public void updateState(Preference preference, ZenMode unusedZenMode) {
public void updateState(Preference preference, @NonNull ZenMode unusedZenMode) {
// This controller is a link between a Settings value (ZEN_DURATION) and the manual DND
// mode. The status of the zen mode object itself doesn't affect the preference
// value, as that comes from settings; that value from settings will determine the