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

Commit fdab44f9 authored by Edgar Wang's avatar Edgar Wang
Browse files

Refactor Date & Time Settings

- Rid off AbstractPreferenceController

Test: robotest
Bug: 235445309
Change-Id: I61118a0ff580231973509c06e84e7088dba897f5
parent 6bb2c735
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -24,19 +24,22 @@
        android:key="auto_time"
        android:title="@string/date_time_auto"
        settings:useAdditionalSummary="true"
        settings:userRestriction="no_config_date_time"/>
        settings:userRestriction="no_config_date_time"
        settings:controller="com.android.settings.datetime.AutoTimePreferenceController" />

    <com.android.settingslib.RestrictedPreference
        android:key="date"
        android:title="@string/date_time_set_date_title"
        android:summary="@string/summary_placeholder"
        settings:userRestriction="no_config_date_time"/>
        settings:userRestriction="no_config_date_time"
        settings:controller="com.android.settings.datetime.DatePreferenceController" />

    <com.android.settingslib.RestrictedPreference
        android:key="time"
        android:title="@string/date_time_set_time_title"
        android:summary="@string/summary_placeholder"
        settings:userRestriction="no_config_date_time"/>
        settings:userRestriction="no_config_date_time"
        settings:controller="com.android.settings.datetime.TimePreferenceController" />

    <PreferenceCategory
        android:key="timezone_preference_category"
@@ -45,7 +48,8 @@
        <com.android.settingslib.RestrictedSwitchPreference
            android:key="auto_zone"
            android:title="@string/zone_auto_title"
            settings:userRestriction="no_config_date_time"/>
            settings:userRestriction="no_config_date_time"
            settings:controller="com.android.settings.datetime.AutoTimeZonePreferenceController" />

        <com.android.settingslib.widget.BannerMessagePreference
            android:key="location_time_zone_detection_status"
@@ -53,7 +57,7 @@
            settings:controller="com.android.settings.datetime.LocationProviderStatusPreferenceController"/>

        <!-- This preference gets removed if location-based time zone detection is not supported -->
        <SwitchPreferenceCompat
        <SwitchPreference
            android:key="location_time_zone_detection"
            android:title="@string/location_time_zone_detection_toggle_title"
            settings:controller="com.android.settings.datetime.LocationTimeZoneDetectionPreferenceController"/>
@@ -64,7 +68,8 @@
            android:summary="@string/summary_placeholder"
            android:fragment="com.android.settings.datetime.timezone.TimeZoneSettings"
            settings:userRestriction="no_config_date_time"
            settings:keywords="@string/keywords_time_zone"/>
            settings:keywords="@string/keywords_time_zone"
            settings:controller="com.android.settings.datetime.TimeZonePreferenceController" />

    </PreferenceCategory>

@@ -72,13 +77,15 @@
        android:key="time_format_preference_category"
        android:title="@string/time_format_category_title"
        settings:keywords="@string/keywords_time_format">
        <SwitchPreferenceCompat
        <SwitchPreference
            android:key="auto_24hour"
            android:title="@string/date_time_24hour_auto"/>
            android:title="@string/date_time_24hour_auto"
            settings:controller="com.android.settings.datetime.AutoTimeFormatPreferenceController" />

        <SwitchPreferenceCompat
        <SwitchPreference
            android:key="24 hour"
            android:title="@string/date_time_24hour" />
            android:title="@string/date_time_24hour"
            settings:controller="com.android.settings.datetime.TimeFormatPreferenceController" />
    </PreferenceCategory>

</PreferenceScreen>
+16 −31
Original line number Diff line number Diff line
@@ -19,53 +19,33 @@ package com.android.settings.datetime;
import android.content.Context;
import android.provider.Settings;
import android.provider.Settings.System;
import android.text.TextUtils;
import android.text.format.DateFormat;

import androidx.preference.Preference;
import androidx.preference.TwoStatePreference;

import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;

import java.util.Locale;

public class AutoTimeFormatPreferenceController extends AbstractPreferenceController
          implements PreferenceControllerMixin {

    private static final String KEY_AUTO_24_HOUR = "auto_24hour";
public class AutoTimeFormatPreferenceController extends TogglePreferenceController {

    public AutoTimeFormatPreferenceController(Context context, UpdateTimeAndDateCallback callback) {
        super(context);
    public AutoTimeFormatPreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
    }

    @Override
    public boolean isAvailable() {
        return true;
    public int getAvailabilityStatus() {
        return AVAILABLE;
    }

    @Override
    public String getPreferenceKey() {
        return KEY_AUTO_24_HOUR;
    public boolean isChecked() {
        return isAutoTimeFormatSelection(mContext);
    }

    @Override
    public void updateState(Preference preference) {
        if (!(preference instanceof TwoStatePreference)) {
            return;
        }
        ((TwoStatePreference) preference).setChecked(isAutoTimeFormatSelection(mContext));
    }

    @Override
    public boolean handlePreferenceTreeClick(Preference preference) {
        if (!(preference instanceof TwoStatePreference)
            || !TextUtils.equals(KEY_AUTO_24_HOUR, preference.getKey())) {
            return false;
        }
        boolean auto24HourEnabled = ((TwoStatePreference) preference).isChecked();
    public boolean setChecked(boolean isChecked) {
        Boolean is24Hour;
        if (auto24HourEnabled) {
        if (isChecked) {
            is24Hour = null;
        } else {
            is24Hour = is24HourLocale(mContext.getResources().getConfiguration().locale);
@@ -74,6 +54,11 @@ public class AutoTimeFormatPreferenceController extends AbstractPreferenceContro
        return true;
    }

    @Override
    public int getSliceHighlightMenuRes() {
        return R.string.menu_key_system;
    }

    boolean is24HourLocale(Locale locale) {
        return DateFormat.is24HourLocale(locale);
    }
+21 −30
Original line number Diff line number Diff line
@@ -27,28 +27,26 @@ import android.app.time.TimeConfiguration;
import android.app.time.TimeManager;
import android.content.Context;

import androidx.preference.Preference;
import androidx.preference.TwoStatePreference;

import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settings.R;
import com.android.settings.core.TogglePreferenceController;

public class AutoTimePreferenceController extends AbstractPreferenceController
        implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
public class AutoTimePreferenceController extends TogglePreferenceController {

    private static final String KEY_AUTO_TIME = "auto_time";
    private final UpdateTimeAndDateCallback mCallback;
    private UpdateTimeAndDateCallback mCallback;
    private final TimeManager mTimeManager;

    public AutoTimePreferenceController(Context context, UpdateTimeAndDateCallback callback) {
        super(context);
    public AutoTimePreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mTimeManager = context.getSystemService(TimeManager.class);
    }

    public void setDateAndTimeCallback(UpdateTimeAndDateCallback callback) {
        mCallback = callback;
    }

    @Override
    public boolean isAvailable() {
    public int getAvailabilityStatus() {
        TimeCapabilities timeCapabilities =
                getTimeCapabilitiesAndConfig().getCapabilities();
        int capability = timeCapabilities.getConfigureAutoDetectionEnabledCapability();
@@ -57,43 +55,31 @@ public class AutoTimePreferenceController extends AbstractPreferenceController
        // This method handles the "is visible?" check.
        switch (capability) {
            case CAPABILITY_NOT_SUPPORTED:
                return false;
                return DISABLED_DEPENDENT_SETTING;
            case CAPABILITY_POSSESSED:
                return true;
            case CAPABILITY_NOT_ALLOWED:
                // This case is expected for enterprise restrictions, where the toggle should be
                // present but disabled. Disabling is handled declaratively via the
                // settings:userRestriction attribute in .xml. The client-side logic is expected to
                // concur with the capabilities logic in the system server.
                return true;
            case CAPABILITY_NOT_APPLICABLE:
                // CAPABILITY_NOT_APPLICABLE is not currently expected, so this is return value is
                // arbitrary.
                return true;
                return AVAILABLE;
            default:
                throw new IllegalStateException("Unknown capability=" + capability);
        }
    }

    @Override
    public void updateState(Preference preference) {
        if (!(preference instanceof TwoStatePreference)) {
            return;
        }

        ((TwoStatePreference) preference).setChecked(isEnabled());
    public boolean isChecked() {
        return isEnabled();
    }

    @Override
    public String getPreferenceKey() {
        return KEY_AUTO_TIME;
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        boolean autoTimeEnabled = (Boolean) newValue;
    public boolean setChecked(boolean isChecked) {
        TimeConfiguration configuration = new TimeConfiguration.Builder()
                .setAutoDetectionEnabled(autoTimeEnabled)
                .setAutoDetectionEnabled(isChecked)
                .build();
        boolean result = mTimeManager.updateTimeConfiguration(configuration);

@@ -101,6 +87,11 @@ public class AutoTimePreferenceController extends AbstractPreferenceController
        return result;
    }

    @Override
    public int getSliceHighlightMenuRes() {
        return R.string.menu_key_system;
    }

    /** Returns whether the preference should be "checked", i.e. set to the "on" position. */
    @VisibleForTesting
    public boolean isEnabled() {
+34 −41
Original line number Diff line number Diff line
@@ -27,36 +27,42 @@ import android.app.time.TimeZoneCapabilitiesAndConfig;
import android.app.time.TimeZoneConfiguration;
import android.content.Context;

import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.TwoStatePreference;

import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;

public class AutoTimeZonePreferenceController extends AbstractPreferenceController
        implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
import com.android.settings.core.TogglePreferenceController;

    private static final String KEY_AUTO_TIME_ZONE = "auto_zone";
public class AutoTimeZonePreferenceController extends TogglePreferenceController {

    private final boolean mIsFromSUW;
    private final UpdateTimeAndDateCallback mCallback;
    private boolean mIsFromSUW;
    private UpdateTimeAndDateCallback mCallback;
    private final TimeManager mTimeManager;

    public AutoTimeZonePreferenceController(Context context, UpdateTimeAndDateCallback callback,
            boolean isFromSUW) {
        super(context);
    public AutoTimeZonePreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mTimeManager = context.getSystemService(TimeManager.class);
    }

    /**
     * Set the Time and Date callback
     */
    public AutoTimeZonePreferenceController setTimeAndDateCallback(
            UpdateTimeAndDateCallback callback) {
        mCallback = callback;
        return this;
    }

    /**
     * Set if current fragment is launched via SUW
     */
    public AutoTimeZonePreferenceController setFromSUW(boolean isFromSUW) {
        mIsFromSUW = isFromSUW;
        return this;
    }

    @Override
    public boolean isAvailable() {
    public int getAvailabilityStatus() {
        if (mIsFromSUW) {
            return false;
            return DISABLED_DEPENDENT_SETTING;
        }

        TimeZoneCapabilities timeZoneCapabilities =
@@ -67,43 +73,31 @@ public class AutoTimeZonePreferenceController extends AbstractPreferenceControll
        // This method handles the "is visible?" check.
        switch (capability) {
            case CAPABILITY_NOT_SUPPORTED:
                return false;
                return DISABLED_DEPENDENT_SETTING;
            case CAPABILITY_POSSESSED:
                return true;
            case CAPABILITY_NOT_ALLOWED:
                // This case is expected for enterprise restrictions, where the toggle should be
                // present but disabled. Disabling is handled declaratively via the
                // settings:userRestriction attribute in .xml. The client-side logic is expected to
                // concur with the capabilities logic in the system server.
                return true;
            case CAPABILITY_NOT_APPLICABLE:
                // CAPABILITY_NOT_APPLICABLE is not currently expected, so this is return value is
                // arbitrary.
                return true;
                return AVAILABLE;
            default:
                throw new IllegalStateException("Unknown capability=" + capability);
        }
    }

    @Override
    public String getPreferenceKey() {
        return KEY_AUTO_TIME_ZONE;
    public boolean isChecked() {
        return isEnabled();
    }

    @Override
    public void updateState(Preference preference) {
        if (!(preference instanceof TwoStatePreference)) {
            return;
        }

        ((TwoStatePreference) preference).setChecked(isEnabled());
    }

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        boolean autoZoneEnabled = (Boolean) newValue;
    public boolean setChecked(boolean isChecked) {
        TimeZoneConfiguration configuration = new TimeZoneConfiguration.Builder()
                .setAutoDetectionEnabled(autoZoneEnabled)
                .setAutoDetectionEnabled(isChecked)
                .build();
        boolean result = mTimeManager.updateTimeZoneConfiguration(configuration);

@@ -111,6 +105,11 @@ public class AutoTimeZonePreferenceController extends AbstractPreferenceControll
        return result;
    }

    @Override
    public int getSliceHighlightMenuRes() {
        return R.string.menu_key_system;
    }

    @Override
    public CharSequence getSummary() {
        // If auto time zone cannot enable telephony fallback and is capable of location, then auto
@@ -124,12 +123,6 @@ public class AutoTimeZonePreferenceController extends AbstractPreferenceControll
        return "";
    }

    @Override
    public void displayPreference(PreferenceScreen screen) {
        super.displayPreference(screen);
        refreshSummary(screen.findPreference(getPreferenceKey()));
    }

    @VisibleForTesting
    boolean isEnabled() {
        TimeZoneConfiguration config = getTimeZoneCapabilitiesAndConfig().getConfiguration();
+21 −27
Original line number Diff line number Diff line
@@ -33,14 +33,12 @@ import android.widget.DatePicker;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;

import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.RestrictedPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settings.core.BasePreferenceController;

import java.util.Calendar;

public class DatePreferenceController extends AbstractPreferenceController
        implements PreferenceControllerMixin, DatePickerDialog.OnDateSetListener {
public class DatePreferenceController extends BasePreferenceController
        implements DatePickerDialog.OnDateSetListener {

    public interface DatePreferenceHost extends UpdateTimeAndDateCallback {
        void showDatePicker();
@@ -49,49 +47,45 @@ public class DatePreferenceController extends AbstractPreferenceController
    public static final int DIALOG_DATEPICKER = 0;

    private static final String TAG = "DatePreferenceController";
    private static final String KEY_DATE = "date";

    private final DatePreferenceHost mHost;
    private DatePreferenceHost mHost;
    private final TimeManager mTimeManager;

    public DatePreferenceController(Context context, DatePreferenceHost host) {
        super(context);
        mHost = host;
    public DatePreferenceController(Context context, String preferenceKey) {
        super(context, preferenceKey);
        mTimeManager = context.getSystemService(TimeManager.class);
    }

    public void setHost(DatePreferenceHost host) {
        mHost = host;
    }

    @Override
    public boolean isAvailable() {
        return true;
    public int getAvailabilityStatus() {
        return isEnabled() ? AVAILABLE : DISABLED_DEPENDENT_SETTING;
    }

    @Override
    public void updateState(Preference preference) {
        if (!(preference instanceof RestrictedPreference)) {
            return;
        }
        final Calendar now = Calendar.getInstance();
        preference.setSummary(DateFormat.getLongDateFormat(mContext).format(now.getTime()));
        if (!((RestrictedPreference) preference).isDisabledByAdmin()) {
            boolean enableManualDateSelection = isEnabled();
            preference.setEnabled(enableManualDateSelection);
        super.updateState(preference);
        preference.setEnabled(isEnabled());
    }

    @Override
    public CharSequence getSummary() {
        Calendar now = Calendar.getInstance();
        return DateFormat.getLongDateFormat(mContext).format(now.getTime());
    }

    @Override
    public boolean handlePreferenceTreeClick(Preference preference) {
        if (!TextUtils.equals(preference.getKey(), KEY_DATE)) {
        if (!TextUtils.equals(getPreferenceKey(), preference.getKey())) {
            return false;
        }
        mHost.showDatePicker();
        return true;
    }

    @Override
    public String getPreferenceKey() {
        return KEY_DATE;
    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day) {
        setDate(year, month, day);
Loading