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

Commit 95beae00 authored by Joachim Sauer's avatar Joachim Sauer
Browse files

Implement auto 12/24h setting toggle.

This implements an explicit toggle to enable/disable automatic 12h/24h
time formatting detection based on the current locale.

Previously automatic detection was the norm on a freshly wiped device,
but could never be re-enabled once either 12h or 24h format was
configured.

Bug: 32761619
Test: m RunSettingsRoboTests
Change-Id: Idbbb8f79fccec95e33bf2f12767d5736e1118fa7
parent e69329cc
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -710,6 +710,10 @@
    <!-- Date & time setting screen setting option summary text when Automatic time zone check box is clear
        [CHAR LIMIT=100] -->
    <string name="zone_auto_summaryOff">Use network-provided time zone</string>
    <!-- Date & time setting screen setting check box title if the 24 hour setting should be determined automatically [CHAR LIMIT=30] -->
    <string name="date_time_24hour_auto">Automatic 24\u2011hour format</string>
    <!-- Date & time setting screen setting option summary text for the automatic 24 hour setting checkbox [CHAR LIMIT=100] -->
    <string name="date_time_24hour_auto_summary">Use locale default</string>
    <!-- Date & time setting screen setting check box title [CHAR LIMIT=30] -->
    <string name="date_time_24hour_title">24\u2011hour format</string>
    <!-- Date & time setting screen setting check box title -->
+48 −33
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
    android:title="@string/date_and_time"
    settings:keywords="@string/keywords_date_and_time">

    <PreferenceCategory
        android:key="date_time_preference_category">
        <com.android.settingslib.RestrictedSwitchPreference
            android:key="auto_time"
            android:title="@string/date_time_auto"
@@ -28,12 +30,6 @@
            settings:useAdditionalSummary="true"
            settings:restrictedSwitchSummary="@string/enabled_by_admin" />

    <SwitchPreference
        android:key="auto_zone"
        android:title="@string/zone_auto"
        android:summaryOn="@string/zone_auto_summaryOn"
        android:summaryOff="@string/zone_auto_summaryOff" />

        <Preference
            android:key="date"
            android:title="@string/date_time_set_date"
@@ -43,15 +39,34 @@
            android:key="time"
            android:title="@string/date_time_set_time"
            android:summary="@string/summary_placeholder" />
    </PreferenceCategory>

    <PreferenceCategory
        android:key="time_zone_preference_category">
        <SwitchPreference
            android:key="auto_zone"
            android:title="@string/zone_auto"
            android:summaryOn="@string/zone_auto_summaryOn"
            android:summaryOff="@string/zone_auto_summaryOff" />

        <Preference
            android:fragment="com.android.settings.datetime.ZonePicker"
            android:key="timezone"
            android:title="@string/date_time_set_timezone"
            android:summary="GMT-8:00" />
    </PreferenceCategory>

    <PreferenceCategory
        android:key="time_format_preference_category">
        <SwitchPreference
            android:key="auto_24hour"
            android:title="@string/date_time_24hour_auto"
            android:summaryOn="@string/date_time_24hour_auto_summary"
            android:summaryOff="@string/date_time_24hour_auto_summary" />

        <SwitchPreference
            android:key="24 hour"
            android:title="@string/date_time_24hour" />
    </PreferenceCategory>

</PreferenceScreen>
+5 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.provider.SearchIndexableResource;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.dashboard.SummaryLoader;
import com.android.settings.datetime.AutoTimeFormatPreferenceController;
import com.android.settings.datetime.AutoTimePreferenceController;
import com.android.settings.datetime.AutoTimeZonePreferenceController;
import com.android.settings.datetime.DatePreferenceController;
@@ -84,8 +85,12 @@ public class DateTimeSettings extends DashboardFragment implements
        final AutoTimePreferenceController autoTimePreferenceController =
                new AutoTimePreferenceController(
                        activity, this /* UpdateTimeAndDateCallback */);
        final AutoTimeFormatPreferenceController autoTimeFormatPreferenceController =
                new AutoTimeFormatPreferenceController(
                        activity, this /* UpdateTimeAndDateCallback */);
        controllers.add(autoTimeZonePreferenceController);
        controllers.add(autoTimePreferenceController);
        controllers.add(autoTimeFormatPreferenceController);

        controllers.add(new TimeFormatPreferenceController(
                activity, this /* UpdateTimeAndDateCallback */, isFromSUW));
+86 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.datetime;

import android.content.Context;
import android.provider.Settings;
import android.provider.Settings.System;
import android.support.v14.preference.SwitchPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.TwoStatePreference;
import android.text.TextUtils;
import android.text.format.DateFormat;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import java.util.Locale;

public class AutoTimeFormatPreferenceController extends AbstractPreferenceController
          implements PreferenceControllerMixin {

    private static final String KEY_AUTO_24_HOUR = "auto_24hour";

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

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

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

    @Override
    public void updateState(Preference preference) {
        if (!(preference instanceof SwitchPreference)) {
            return;
        }
        ((SwitchPreference) 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 = ((SwitchPreference) preference).isChecked();
        Boolean is24Hour;
        if (auto24HourEnabled) {
            is24Hour = null;
        } else {
            is24Hour = is24HourLocale(mContext.getResources().getConfiguration().locale);
        }
        TimeFormatPreferenceController.update24HourFormat(mContext, is24Hour);
        return true;
    }

    boolean is24HourLocale(Locale locale) {
        return DateFormat.is24HourLocale(locale);
    }

    /**
     * Returns if the system is currently configured to pick the time format automatically based on
     * the locale.
     */
    static boolean isAutoTimeFormatSelection(Context context) {
        return Settings.System.getString(context.getContentResolver(), System.TIME_12_24) == null;
    }
}
+22 −11
Original line number Diff line number Diff line
@@ -63,6 +63,8 @@ public class TimeFormatPreferenceController extends AbstractPreferenceController
        if (!(preference instanceof TwoStatePreference)) {
            return;
        }
        preference.setEnabled(
            !AutoTimeFormatPreferenceController.isAutoTimeFormatSelection(mContext));
        ((TwoStatePreference) preference).setChecked(is24Hour());
        final Calendar now = Calendar.getInstance();
        mDummyDate.setTimeZone(now.getTimeZone());
@@ -80,8 +82,7 @@ public class TimeFormatPreferenceController extends AbstractPreferenceController
            return false;
        }
        final boolean is24Hour = ((SwitchPreference) preference).isChecked();
        set24Hour(is24Hour);
        timeUpdated(is24Hour);
        update24HourFormat(mContext, is24Hour);
        mUpdateTimeAndDateCallback.updateTimeAndDateDisplay(mContext);
        return true;
    }
@@ -95,18 +96,28 @@ public class TimeFormatPreferenceController extends AbstractPreferenceController
        return DateFormat.is24HourFormat(mContext);
    }

    private void timeUpdated(boolean is24Hour) {
    static void update24HourFormat(Context context, Boolean is24Hour) {
        set24Hour(context, is24Hour);
        timeUpdated(context, is24Hour);
    }

    static void timeUpdated(Context context, Boolean is24Hour) {
        Intent timeChanged = new Intent(Intent.ACTION_TIME_CHANGED);
        int timeFormatPreference =
                is24Hour ? Intent.EXTRA_TIME_PREF_VALUE_USE_24_HOUR
        int timeFormatPreference;
        if (is24Hour == null) {
            timeFormatPreference = Intent.EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT;
        } else {
            timeFormatPreference = is24Hour ? Intent.EXTRA_TIME_PREF_VALUE_USE_24_HOUR
                : Intent.EXTRA_TIME_PREF_VALUE_USE_12_HOUR;
        }
        timeChanged.putExtra(Intent.EXTRA_TIME_PREF_24_HOUR_FORMAT, timeFormatPreference);
        mContext.sendBroadcast(timeChanged);
        context.sendBroadcast(timeChanged);
    }

    private void set24Hour(boolean is24Hour) {
        Settings.System.putString(mContext.getContentResolver(),
                Settings.System.TIME_12_24,
                is24Hour ? HOURS_24 : HOURS_12);
    static void set24Hour(Context context, Boolean is24Hour) {
        String value = is24Hour == null ? null :
            is24Hour ? HOURS_24 : HOURS_12;
        Settings.System.putString(context.getContentResolver(),
                Settings.System.TIME_12_24, value);
    }
}
Loading