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

Commit 07b2af41 authored by Edgar Wang's avatar Edgar Wang Committed by Android (Google) Code Review
Browse files

Merge "Refactor Date & Time Settings" into main

parents b3632f2e fdab44f9
Loading
Loading
Loading
Loading
+17 −10
Original line number Original line Diff line number Diff line
@@ -24,19 +24,22 @@
        android:key="auto_time"
        android:key="auto_time"
        android:title="@string/date_time_auto"
        android:title="@string/date_time_auto"
        settings:useAdditionalSummary="true"
        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
    <com.android.settingslib.RestrictedPreference
        android:key="date"
        android:key="date"
        android:title="@string/date_time_set_date_title"
        android:title="@string/date_time_set_date_title"
        android:summary="@string/summary_placeholder"
        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
    <com.android.settingslib.RestrictedPreference
        android:key="time"
        android:key="time"
        android:title="@string/date_time_set_time_title"
        android:title="@string/date_time_set_time_title"
        android:summary="@string/summary_placeholder"
        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
    <PreferenceCategory
        android:key="timezone_preference_category"
        android:key="timezone_preference_category"
@@ -45,7 +48,8 @@
        <com.android.settingslib.RestrictedSwitchPreference
        <com.android.settingslib.RestrictedSwitchPreference
            android:key="auto_zone"
            android:key="auto_zone"
            android:title="@string/zone_auto_title"
            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
        <com.android.settingslib.widget.BannerMessagePreference
            android:key="location_time_zone_detection_status"
            android:key="location_time_zone_detection_status"
@@ -53,7 +57,7 @@
            settings:controller="com.android.settings.datetime.LocationProviderStatusPreferenceController"/>
            settings:controller="com.android.settings.datetime.LocationProviderStatusPreferenceController"/>


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


@@ -72,13 +77,15 @@
        android:key="time_format_preference_category"
        android:key="time_format_preference_category"
        android:title="@string/time_format_category_title"
        android:title="@string/time_format_category_title"
        settings:keywords="@string/keywords_time_format">
        settings:keywords="@string/keywords_time_format">
        <SwitchPreferenceCompat
        <SwitchPreference
            android:key="auto_24hour"
            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:key="24 hour"
            android:title="@string/date_time_24hour" />
            android:title="@string/date_time_24hour"
            settings:controller="com.android.settings.datetime.TimeFormatPreferenceController" />
    </PreferenceCategory>
    </PreferenceCategory>


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


import androidx.preference.Preference;
import com.android.settings.R;
import androidx.preference.TwoStatePreference;
import com.android.settings.core.TogglePreferenceController;

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


import java.util.Locale;
import java.util.Locale;


public class AutoTimeFormatPreferenceController extends AbstractPreferenceController
public class AutoTimeFormatPreferenceController extends TogglePreferenceController {
          implements PreferenceControllerMixin {

    private static final String KEY_AUTO_24_HOUR = "auto_24hour";


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


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


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


    @Override
    @Override
    public void updateState(Preference preference) {
    public boolean setChecked(boolean isChecked) {
        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();
        Boolean is24Hour;
        Boolean is24Hour;
        if (auto24HourEnabled) {
        if (isChecked) {
            is24Hour = null;
            is24Hour = null;
        } else {
        } else {
            is24Hour = is24HourLocale(mContext.getResources().getConfiguration().locale);
            is24Hour = is24HourLocale(mContext.getResources().getConfiguration().locale);
@@ -74,6 +54,11 @@ public class AutoTimeFormatPreferenceController extends AbstractPreferenceContro
        return true;
        return true;
    }
    }


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

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


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

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


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


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


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

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


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


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

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


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

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


@@ -101,6 +87,11 @@ public class AutoTimePreferenceController extends AbstractPreferenceController
        return result;
        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. */
    /** Returns whether the preference should be "checked", i.e. set to the "on" position. */
    @VisibleForTesting
    @VisibleForTesting
    public boolean isEnabled() {
    public boolean isEnabled() {
+34 −41
Original line number Original line Diff line number Diff line
@@ -27,36 +27,42 @@ import android.app.time.TimeZoneCapabilitiesAndConfig;
import android.app.time.TimeZoneConfiguration;
import android.app.time.TimeZoneConfiguration;
import android.content.Context;
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.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.TogglePreferenceController;
import com.android.settingslib.core.AbstractPreferenceController;

public class AutoTimeZonePreferenceController extends AbstractPreferenceController
        implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener {


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


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


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

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

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


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


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


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


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

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

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


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


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

    @Override
    @Override
    public CharSequence getSummary() {
    public CharSequence getSummary() {
        // If auto time zone cannot enable telephony fallback and is capable of location, then auto
        // 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 "";
        return "";
    }
    }


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

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


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


import java.util.Calendar;
import java.util.Calendar;


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


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


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


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


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


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

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


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

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


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


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

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