Android自动使用24小时制和使用24小时制(Automatic 24-hour format&Use 24-hour format)代码流程浅析

packages/apps/Settings/src/com/android/settings/DateTimeSettings.java
    @Override
    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
        final List<AbstractPreferenceController> controllers = new ArrayList<>();
        final Activity activity = getActivity();
        final Intent intent = activity.getIntent();
        final boolean isFromSUW = intent.getBooleanExtra(EXTRA_IS_FROM_SUW, false);

        final AutoTimeZonePreferenceController autoTimeZonePreferenceController =
                new AutoTimeZonePreferenceController(
                        activity, this /* UpdateTimeAndDateCallback */, isFromSUW);
        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));
        controllers.add(new TimeZonePreferenceController(
                activity, autoTimeZonePreferenceController));
        controllers.add(new TimePreferenceController(
                activity, this /* UpdateTimeAndDateCallback */, autoTimePreferenceController));
        controllers.add(new DatePreferenceController(
                activity, this /* UpdateTimeAndDateCallback */, autoTimePreferenceController));
        return controllers;
    }

packages/apps/Settings/res/xml/date_time_prefs.xml

    <PreferenceCategory
        android:key="time_format_preference_category"
        android:layout="@layout/preference_category_no_label">
        <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>


packages/apps/Settings/src/com/android/settings/datetime/AutoTimeFormatPreferenceController.java

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;
    }
}


frameworks/base/core/java/android/provider/Settings.java

        /**
         * Display times as 12 or 24 hours
         *   12
         *   24
         */
        public static final String TIME_12_24 = "time_12_24";

        /** @hide */
        public static final Validator TIME_12_24_VALIDATOR =
                new SettingsValidators.DiscreteValueValidator(new String[] {"12", "24", null});

frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

    private void loadSystemSettings(SQLiteDatabase db) {
        SQLiteStatement stmt = null;
        try {
            stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
                    + " VALUES(?,?);");
            loadSetting(stmt, Settings.System.TIME_12_24,  24);
   }


而在
packages/apps/Settings/src/com/android/settings/datetime/TimeFormatPreferenceController.java

    private static final String KEY_TIME_FORMAT = "24 hour";

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

    @Override
    public void updateState(Preference preference) {
        if (!(preference instanceof TwoStatePreference)) {
            return;
        }
        preference.setEnabled(
            !AutoTimeFormatPreferenceController.isAutoTimeFormatSelection(mContext));
        ((TwoStatePreference) preference).setChecked(is24Hour());
        final Calendar now = Calendar.getInstance();
        mDummyDate.setTimeZone(now.getTimeZone());
        // We use December 31st because it's unambiguous when demonstrating the date format.
        // We use 13:00 so we can demonstrate the 12/24 hour options.
        mDummyDate.set(now.get(Calendar.YEAR), 11, 31, 13, 0, 0);
        final Date dummyDate = mDummyDate.getTime();
        preference.setSummary(DateFormat.getTimeFormat(mContext).format(dummyDate));
    }

    private boolean is24Hour() {
        return DateFormat.is24HourFormat(mContext);
    }


即如果Automatic 24-hour format选项为true.
则Use 24-hour format选项置灰(disable), 根据当前地区设置, 该选项默认值(true/false)和summary显示值(下午1点/13:00)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值