diff --git a/res/values/cherish_arrays.xml b/res/values/cherish_arrays.xml index e8c3d81..eee11f5 100644 --- a/res/values/cherish_arrays.xml +++ b/res/values/cherish_arrays.xml @@ -74,4 +74,71 @@ 2 + + + @string/am_pm_clock_none + @string/am_pm_clock_small + @string/am_pm_clock_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 + + + + @string/clock_date_left + @string/clock_date_right + + + + 0 + 1 + + diff --git a/res/values/cherish_strings.xml b/res/values/cherish_strings.xml index 95ff91f..5e6308c 100644 --- a/res/values/cherish_strings.xml +++ b/res/values/cherish_strings.xml @@ -231,4 +231,35 @@ Pulldown statusbar from right side Pulldown statusbar from left side + + Clock settings + Clock & Date + Enabled + Disabled + Reset color + Show clock & date + AM/PM + 24-hour clock is enabled + Day of the week + Abbreviated day of the week before the time + Don\'t show + Date + Display custom date before the clock + Date style + Date format + Must be in DateFormat eg. MM/dd/yy + Enter string + Normal font size + Small font size + Don\'t show + Don\'t show + Small font size + Normal font size + Normal + Lowercase + Uppercase + Right of time + Left of time + Date position + diff --git a/res/xml/cherish_settings_statusbar.xml b/res/xml/cherish_settings_statusbar.xml index d15316e..5b2a104 100644 --- a/res/xml/cherish_settings_statusbar.xml +++ b/res/xml/cherish_settings_statusbar.xml @@ -30,6 +30,11 @@ android:key="statusbar_icons" android:title="@string/sb_icons"> + + + + + + + + + + + + + + + + + + diff --git a/src/com/cherish/settings/fragments/ClockDateSettings.java b/src/com/cherish/settings/fragments/ClockDateSettings.java new file mode 100644 index 0000000..81b7c08 --- /dev/null +++ b/src/com/cherish/settings/fragments/ClockDateSettings.java @@ -0,0 +1,290 @@ +/* + * 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.os.Bundle; +import android.provider.Settings; +import android.provider.SearchIndexableResource; +import androidx.preference.PreferenceCategory; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.preference.Preference.OnPreferenceChangeListener; +import androidx.preference.SwitchPreference; +import android.text.format.DateFormat; +import android.util.Log; +import android.view.View; +import android.widget.EditText; + +import com.android.internal.logging.nano.MetricsProto; + +import com.android.settings.R; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.Utils; + +import com.android.settingslib.search.Indexable; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class ClockDateSettings extends SettingsPreferenceFragment + implements Preference.OnPreferenceChangeListener, Indexable { + + private static final String PREF_AM_PM_STYLE = "status_bar_am_pm"; + private static final String PREF_CLOCK_DATE_DISPLAY = "clock_date_display"; + private static final String PREF_CLOCK_DATE_STYLE = "clock_date_style"; + private static final String PREF_CLOCK_DATE_FORMAT = "clock_date_format"; + private static final String PREF_STATUS_BAR_CLOCK = "status_bar_show_clock"; + private static final String PREF_CLOCK_DATE_POSITION = "clock_date_position"; + + 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 ListPreference mClockAmPmStyle; + private ListPreference mClockDateDisplay; + private ListPreference mClockDateStyle; + private ListPreference mClockDateFormat; + private ListPreference mClockDatePosition; + private SwitchPreference mStatusBarClock; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.clock_date_settings); + + mClockAmPmStyle = (ListPreference) findPreference(PREF_AM_PM_STYLE); + mClockAmPmStyle.setOnPreferenceChangeListener(this); + mClockAmPmStyle.setValue(Integer.toString(Settings.System.getInt(getActivity() + .getContentResolver(), Settings.System.STATUSBAR_CLOCK_AM_PM_STYLE, + 0))); + boolean is24hour = DateFormat.is24HourFormat(getActivity()); + if (is24hour) { + mClockAmPmStyle.setSummary(R.string.status_bar_am_pm_info); + } else { + mClockAmPmStyle.setSummary(mClockAmPmStyle.getEntry()); + } + mClockAmPmStyle.setEnabled(!is24hour); + + mClockDateDisplay = (ListPreference) findPreference(PREF_CLOCK_DATE_DISPLAY); + mClockDateDisplay.setOnPreferenceChangeListener(this); + mClockDateDisplay.setValue(Integer.toString(Settings.System.getInt(getActivity() + .getContentResolver(), Settings.System.STATUSBAR_CLOCK_DATE_DISPLAY, + 0))); + mClockDateDisplay.setSummary(mClockDateDisplay.getEntry()); + + mClockDateStyle = (ListPreference) findPreference(PREF_CLOCK_DATE_STYLE); + mClockDateStyle.setOnPreferenceChangeListener(this); + mClockDateStyle.setValue(Integer.toString(Settings.System.getInt(getActivity() + .getContentResolver(), Settings.System.STATUSBAR_CLOCK_DATE_STYLE, + 0))); + mClockDateStyle.setSummary(mClockDateStyle.getEntry()); + + mClockDateFormat = (ListPreference) findPreference(PREF_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(); + + mStatusBarClock = (SwitchPreference) findPreference(PREF_STATUS_BAR_CLOCK); + mStatusBarClock.setChecked((Settings.System.getInt( + getActivity().getApplicationContext().getContentResolver(), + Settings.System.STATUSBAR_CLOCK, 1) == 1)); + mStatusBarClock.setOnPreferenceChangeListener(this); + + mClockDatePosition = (ListPreference) findPreference(PREF_CLOCK_DATE_POSITION); + mClockDatePosition.setOnPreferenceChangeListener(this); + mClockDatePosition.setValue(Integer.toString(Settings.System.getInt(getActivity() + .getContentResolver(), Settings.System.STATUSBAR_CLOCK_DATE_POSITION, + 0))); + mClockDatePosition.setSummary(mClockDatePosition.getEntry()); + + boolean mClockDateToggle = Settings.System.getInt(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_DATE_DISPLAY, 0) != 0; + if (!mClockDateToggle) { + mClockDateStyle.setEnabled(false); + mClockDateFormat.setEnabled(false); + mClockDatePosition.setEnabled(false); + } + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + AlertDialog dialog; + + if (preference == mClockAmPmStyle) { + int val = Integer.parseInt((String) newValue); + int index = mClockAmPmStyle.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_AM_PM_STYLE, val); + mClockAmPmStyle.setSummary(mClockAmPmStyle.getEntries()[index]); + return true; + } else if (preference == mClockDateDisplay) { + int val = Integer.parseInt((String) newValue); + int index = mClockDateDisplay.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_DATE_DISPLAY, val); + mClockDateDisplay.setSummary(mClockDateDisplay.getEntries()[index]); + if (val == 0) { + mClockDateStyle.setEnabled(false); + mClockDateFormat.setEnabled(false); + mClockDatePosition.setEnabled(false); + } else { + mClockDateStyle.setEnabled(true); + mClockDateFormat.setEnabled(true); + mClockDatePosition.setEnabled(true); + } + return true; + } else if (preference == mClockDateStyle) { + int val = Integer.parseInt((String) newValue); + int index = mClockDateStyle.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_DATE_STYLE, val); + mClockDateStyle.setSummary(mClockDateStyle.getEntries()[index]); + parseClockDateFormats(); + return true; + } else if (preference == mStatusBarClock) { + Settings.System.putInt(getActivity().getApplicationContext().getContentResolver(), + Settings.System.STATUSBAR_CLOCK, + (Boolean) newValue ? 1 : 0); + 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; + } else if (preference == mClockDatePosition) { + int val = Integer.parseInt((String) newValue); + int index = mClockDatePosition.findIndexOfValue((String) newValue); + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.STATUSBAR_CLOCK_DATE_POSITION, val); + mClockDatePosition.setSummary(mClockDatePosition.getEntries()[index]); + parseClockDateFormats(); + 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); + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.CHERISH_SETTINGS; + } + + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider() { + @Override + public List getXmlResourcesToIndex(Context context, + boolean enabled) { + final ArrayList result = new ArrayList<>(); + final SearchIndexableResource sir = new SearchIndexableResource(context); + sir.xmlResId = R.xml.clock_date_settings; + result.add(sir); + return result; + } + + @Override + public List getNonIndexableKeys(Context context) { + final List keys = super.getNonIndexableKeys(context); + return keys; + } + }; +}