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:
@@ -25,8 +25,8 @@ import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.VisibleForTesting;
|
||||
import androidx.preference.Preference;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settingslib.core.AbstractPreferenceController;
|
||||
import com.android.settingslib.notification.modes.ZenMode;
|
||||
@@ -92,29 +92,14 @@ abstract class AbstractZenModePreferenceController extends AbstractPreferenceCon
|
||||
return true;
|
||||
}
|
||||
|
||||
// Called by parent Fragment onAttach, for any methods (such as isAvailable()) that need
|
||||
// zen mode info before onStart. Most callers should use updateZenMode instead, which will
|
||||
// do any further necessary propagation.
|
||||
protected final void setZenMode(@NonNull ZenMode zenMode) {
|
||||
/**
|
||||
* Assigns the {@link ZenMode} of this controller, so that it can be used later from
|
||||
* {@link #isAvailable()} and {@link #updateState(Preference)}.
|
||||
*/
|
||||
final void setZenMode(@NonNull ZenMode zenMode) {
|
||||
mZenMode = zenMode;
|
||||
}
|
||||
|
||||
// Called by the parent Fragment onStart, which means it will happen before resume.
|
||||
public void updateZenMode(@NonNull Preference preference, @NonNull ZenMode zenMode) {
|
||||
mZenMode = zenMode;
|
||||
updateState(preference);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayPreference(PreferenceScreen screen) {
|
||||
super.displayPreference(screen);
|
||||
if (mZenMode != null) {
|
||||
displayPreference(screen, mZenMode);
|
||||
}
|
||||
}
|
||||
|
||||
public void displayPreference(PreferenceScreen screen, @NonNull ZenMode zenMode) {}
|
||||
|
||||
@Override
|
||||
public final void updateState(Preference preference) {
|
||||
super.updateState(preference);
|
||||
@@ -167,4 +152,20 @@ abstract class AbstractZenModePreferenceController extends AbstractPreferenceCon
|
||||
return mode;
|
||||
});
|
||||
}
|
||||
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
|
||||
@Nullable
|
||||
ZenMode getZenMode() {
|
||||
return mZenMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience method for tests. Assigns the {@link ZenMode} of this controller, and calls
|
||||
* {@link #updateState(Preference)} immediately.
|
||||
*/
|
||||
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
|
||||
final void updateZenMode(@NonNull Preference preference, @NonNull ZenMode zenMode) {
|
||||
mZenMode = zenMode;
|
||||
updateState(preference);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user