diff --git a/res/values/cherish_arrays.xml b/res/values/cherish_arrays.xml index bab0a4f..73465e3 100644 --- a/res/values/cherish_arrays.xml +++ b/res/values/cherish_arrays.xml @@ -694,4 +694,67 @@ @string/volume_panel_oreo_val @string/volume_panel_tiled_val + + + + @string/status_bar_clock_style_left + @string/status_bar_clock_style_center + @string/status_bar_clock_style_right + + + 0 + 1 + 2 + + + @string/status_bar_am_pm_hidden + @string/status_bar_am_pm_small + @string/status_bar_am_pm_normal + + + 0 + 1 + 2 + + + @string/clock_date_display_none + @string/clock_date_display_small + @string/clock_date_display_normal + + + 0 + 1 + 2 + + + @string/clock_date_style_normal + @string/clock_date_style_lowercase + @string/clock_date_style_uppercase + + + 0 + 1 + 2 + + + dd/MM/yy + MM/dd/yy + yyyy-MM-dd + yyyy-dd-MM + dd-MM-yyyy + MM-dd-yyyy + MMM dd + MMM dd, yyyy + MMMM dd, yyyy + EEE + EEE dd + EEE dd/MM + EEE MM/dd + EEE dd MMM + EEE MMM dd + EEE MMMM dd + EEEE dd/MM + EEEE MM/dd + @string/clock_date_format_custom + diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml index 8142879..937bdb9 100644 --- a/res/values/cherish_strings.xml +++ b/res/values/cherish_strings.xml @@ -750,4 +750,33 @@ co.potatoproject.plugin.volume.oreo co.potatoproject.plugin.volume.tiled + + Clock Settings + Statusbar Clock Tuner + Clock settings + Show clock and date + Clock style + Right + Center + Left + AM/PM style + 24-hour clock is enabled + Normal + Small + Hidden (default) + Show seconds + Date + Display custom date before the clock + Don\'t show + Small font size + Normal font size + Date style + Normal + Lowercase + Uppercase + Custom java format + Date format + Must be in DateFormat eg. MM/dd/yy + Enter string + diff --git a/res/xml/cherish_settings_statusbar.xml b/res/xml/cherish_settings_statusbar.xml index cf59e3b..bc43c8c 100644 --- a/res/xml/cherish_settings_statusbar.xml +++ b/res/xml/cherish_settings_statusbar.xml @@ -25,6 +25,13 @@ android:fragment="com.cherish.settings.fragments.Traffic" android:title="@string/traffic_title" /> + + diff --git a/res/xml/clock_settings.xml b/res/xml/clock_settings.xml new file mode 100644 index 0000000..cf9de24 --- /dev/null +++ b/res/xml/clock_settings.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/cherish/settings/fragments/ClockSettings.java b/src/com/cherish/settings/fragments/ClockSettings.java new file mode 100644 index 0000000..b0bf576 --- /dev/null +++ b/src/com/cherish/settings/fragments/ClockSettings.java @@ -0,0 +1,277 @@ +/* + * Copyright (C) 2020 The CherishOS 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.cherish.settings.fragments; + +import android.app.AlertDialog; +import android.content.ContentResolver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnCancelListener; +import android.content.res.Resources; +import android.database.ContentObserver; +import android.content.Intent; +import android.os.Bundle; +import android.os.UserHandle; +import androidx.preference.ListPreference; +import androidx.preference.SwitchPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceScreen; +import androidx.preference.Preference.OnPreferenceChangeListener; +import android.provider.Settings; +import android.text.format.DateFormat; +import android.util.Log; +import android.view.View; +import android.widget.EditText; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.Utils; + +import com.cherish.settings.preferences.SystemSettingSwitchPreference; +import com.android.internal.logging.nano.MetricsProto; + +import java.util.Date; + +public class ClockSettings extends SettingsPreferenceFragment implements + OnPreferenceChangeListener { + + private static final String STATUS_BAR_CLOCK = "status_bar_clock"; + private static final String STATUS_BAR_CLOCK_SECONDS = "status_bar_clock_seconds"; + private static final String STATUS_BAR_CLOCK_STYLE = "statusbar_clock_style"; + private static final String STATUS_BAR_AM_PM = "status_bar_am_pm"; + private static final String STATUS_BAR_CLOCK_DATE_DISPLAY = "clock_date_display"; + private static final String STATUS_BAR_CLOCK_DATE_STYLE = "clock_date_style"; + private static final String STATUS_BAR_CLOCK_DATE_FORMAT = "clock_date_format"; + public static final int CLOCK_DATE_STYLE_LOWERCASE = 1; + public static final int CLOCK_DATE_STYLE_UPPERCASE = 2; + private static final int CUSTOM_CLOCK_DATE_FORMAT_INDEX = 18; + + private SystemSettingSwitchPreference mStatusBarClockShow; + private SystemSettingSwitchPreference mStatusBarSecondsShow; + private ListPreference mStatusBarClock; + private ListPreference mStatusBarAmPm; + private ListPreference mClockDateDisplay; + private ListPreference mClockDateStyle; + private ListPreference mClockDateFormat; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + addPreferencesFromResource(R.xml.clock_settings); + PreferenceScreen prefSet = getPreferenceScreen(); + ContentResolver resolver = getActivity().getContentResolver(); + + // clock settings + mStatusBarClockShow = (SystemSettingSwitchPreference) findPreference(STATUS_BAR_CLOCK); + mStatusBarSecondsShow = (SystemSettingSwitchPreference) findPreference(STATUS_BAR_CLOCK_SECONDS); + mStatusBarClock = (ListPreference) findPreference(STATUS_BAR_CLOCK_STYLE); + mStatusBarAmPm = (ListPreference) findPreference(STATUS_BAR_AM_PM); + mClockDateDisplay = (ListPreference) findPreference(STATUS_BAR_CLOCK_DATE_DISPLAY); + mClockDateStyle = (ListPreference) findPreference(STATUS_BAR_CLOCK_DATE_STYLE); + + mStatusBarClockShow.setChecked((Settings.System.getInt(resolver, + Settings.System.STATUS_BAR_CLOCK, 1) == 1)); + mStatusBarClockShow.setOnPreferenceChangeListener(this); + + mStatusBarSecondsShow.setChecked((Settings.System.getInt(resolver, + Settings.System.STATUS_BAR_CLOCK_SECONDS, 0) == 1)); + mStatusBarSecondsShow.setOnPreferenceChangeListener(this); + + int clockStyle = Settings.System.getInt(resolver, + Settings.System.STATUSBAR_CLOCK_STYLE, 0); + mStatusBarClock.setValue(String.valueOf(clockStyle)); + mStatusBarClock.setSummary(mStatusBarClock.getEntry()); + mStatusBarClock.setOnPreferenceChangeListener(this); + + if (DateFormat.is24HourFormat(getActivity())) { + mStatusBarAmPm.setEnabled(false); + mStatusBarAmPm.setSummary(R.string.status_bar_am_pm_info); + } else { + int statusBarAmPm = Settings.System.getInt(resolver, + Settings.System.STATUSBAR_CLOCK_AM_PM_STYLE, 2); + mStatusBarAmPm.setValue(String.valueOf(statusBarAmPm)); + mStatusBarAmPm.setSummary(mStatusBarAmPm.getEntry()); + mStatusBarAmPm.setOnPreferenceChangeListener(this); + } + + int clockDateDisplay = Settings.System.getInt(resolver, + Settings.System.STATUSBAR_CLOCK_DATE_DISPLAY, 0); + mClockDateDisplay.setValue(String.valueOf(clockDateDisplay)); + mClockDateDisplay.setSummary(mClockDateDisplay.getEntry()); + mClockDateDisplay.setOnPreferenceChangeListener(this); + + int clockDateStyle = Settings.System.getInt(resolver, + Settings.System.STATUSBAR_CLOCK_DATE_STYLE, 0); + mClockDateStyle.setValue(String.valueOf(clockDateStyle)); + mClockDateStyle.setSummary(mClockDateStyle.getEntry()); + mClockDateStyle.setOnPreferenceChangeListener(this); + + mClockDateFormat = (ListPreference) findPreference(STATUS_BAR_CLOCK_DATE_FORMAT); + mClockDateFormat.setOnPreferenceChangeListener(this); + String value = Settings.System.getString(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_DATE_FORMAT); + if (value == null || value.isEmpty()) { + value = "EEE"; + } + int index = mClockDateFormat.findIndexOfValue((String) value); + if (index == -1) { + mClockDateFormat.setValueIndex(CUSTOM_CLOCK_DATE_FORMAT_INDEX); + } else { + mClockDateFormat.setValue(value); + } + + parseClockDateFormats(); + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } + + @Override + public void onResume() { + super.onResume(); + } + + public boolean onPreferenceChange(Preference preference, Object newValue) { + AlertDialog dialog; + if (preference == mStatusBarClockShow) { + boolean value = (Boolean) newValue; + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.STATUS_BAR_CLOCK, value ? 1 : 0); + return true; + } else if (preference == mStatusBarSecondsShow) { + boolean value = (Boolean) newValue; + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.STATUS_BAR_CLOCK_SECONDS, value ? 1 : 0); + return true; + } else if (preference == mStatusBarClock) { + int clockStyle = Integer.parseInt((String) newValue); + int index = mStatusBarClock.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_STYLE, clockStyle); + mStatusBarClock.setSummary(mStatusBarClock.getEntries()[index]); + return true; + } else if (preference == mStatusBarAmPm) { + int statusBarAmPm = Integer.valueOf((String) newValue); + int index = mStatusBarAmPm.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_AM_PM_STYLE, statusBarAmPm); + mStatusBarAmPm.setSummary(mStatusBarAmPm.getEntries()[index]); + return true; + } else if (preference == mClockDateDisplay) { + int clockDateDisplay = Integer.valueOf((String) newValue); + int index = mClockDateDisplay.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_DATE_DISPLAY, clockDateDisplay); + mClockDateDisplay.setSummary(mClockDateDisplay.getEntries()[index]); + if (clockDateDisplay == 0) { + mClockDateStyle.setEnabled(false); + mClockDateFormat.setEnabled(false); + } else { + mClockDateStyle.setEnabled(true); + mClockDateFormat.setEnabled(true); + } + return true; + } else if (preference == mClockDateStyle) { + int clockDateStyle = Integer.valueOf((String) newValue); + int index = mClockDateStyle.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_DATE_STYLE, clockDateStyle); + mClockDateStyle.setSummary(mClockDateStyle.getEntries()[index]); + parseClockDateFormats(); + return true; + } else if (preference == mClockDateFormat) { + int index = mClockDateFormat.findIndexOfValue((String) newValue); + + if (index == CUSTOM_CLOCK_DATE_FORMAT_INDEX) { + AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); + alert.setTitle(R.string.clock_date_string_edittext_title); + alert.setMessage(R.string.clock_date_string_edittext_summary); + + final EditText input = new EditText(getActivity()); + String oldText = Settings.System.getString( + getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_DATE_FORMAT); + if (oldText != null) { + input.setText(oldText); + } + alert.setView(input); + + alert.setPositiveButton(R.string.menu_save, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialogInterface, int whichButton) { + String value = input.getText().toString(); + if (value.equals("")) { + return; + } + Settings.System.putString(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_DATE_FORMAT, value); + + return; + } + }); + + alert.setNegativeButton(R.string.menu_cancel, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialogInterface, int which) { + return; + } + }); + dialog = alert.create(); + dialog.show(); + } else { + if ((String) newValue != null) { + Settings.System.putString(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_DATE_FORMAT, (String) newValue); + } + } + return true; + } + return false; + } + + private void parseClockDateFormats() { + String[] dateEntries = getResources().getStringArray(R.array.clock_date_format_entries_values); + CharSequence parsedDateEntries[]; + parsedDateEntries = new String[dateEntries.length]; + Date now = new Date(); + + int lastEntry = dateEntries.length - 1; + int dateFormat = Settings.System.getInt(getActivity() + .getContentResolver(), Settings.System.STATUSBAR_CLOCK_DATE_STYLE, 0); + for (int i = 0; i < dateEntries.length; i++) { + if (i == lastEntry) { + parsedDateEntries[i] = dateEntries[i]; + } else { + String newDate; + CharSequence dateString = DateFormat.format(dateEntries[i], now); + if (dateFormat == CLOCK_DATE_STYLE_LOWERCASE) { + newDate = dateString.toString().toLowerCase(); + } else if (dateFormat == CLOCK_DATE_STYLE_UPPERCASE) { + newDate = dateString.toString().toUpperCase(); + } else { + newDate = dateString.toString(); + } + + parsedDateEntries[i] = newDate; + } + } + mClockDateFormat.setEntries(parsedDateEntries); + } +} + +