From ada18278fac15a961b1893d3c08ff581f308d551 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 28 Sep 2025 09:52:25 +0000 Subject: [PATCH] Feat: Add manual update and URL change for holiday alarm data This change adds two new features to the alarm settings page: 1. A preference to manually trigger an update of the holiday and work schedule data. 2. An `EditTextPreference` that allows users to change the URL from which the holiday data is fetched. This provides users with more control over the holiday alarm functionality, allowing them to force an update if the data is stale and to use custom data sources. The following changes were made: - Modified `app/src/main/res/xml/settings_alarm.xml` to add the new preferences. - Added new string resources in English, Simplified Chinese, and Traditional Chinese. - Modified `AlarmSettingsFragment.java` to handle the logic for the new preferences. - Modified `HolidayRepository.java` to use the configurable URL for holiday data. - Added getter and setter methods for the holiday data URL to `DataModel.java` and `SettingsDAO.java`. - Added new preference keys to `PreferencesKeys.java` and a default URL to `PreferencesDefaultValues.java`. --- .../com/best/deskclock/data/DataModel.java | 21 ++++++++++++++++ .../com/best/deskclock/data/SettingsDAO.java | 15 +++++++++++ .../deskclock/holiday/HolidayRepository.java | 6 +++-- .../settings/AlarmSettingsFragment.java | 25 +++++++++++++++++++ .../settings/PreferencesDefaultValues.java | 1 + .../deskclock/settings/PreferencesKeys.java | 2 ++ app/src/main/res/values-zh-rCN/strings.xml | 12 +++++++++ app/src/main/res/values-zh-rTW/strings.xml | 12 +++++++++ app/src/main/res/values/strings.xml | 13 ++++++++++ app/src/main/res/xml/settings_alarm.xml | 25 +++++++++++++++++++ 10 files changed, 130 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/best/deskclock/data/DataModel.java b/app/src/main/java/com/best/deskclock/data/DataModel.java index aec0d85f6..0b938a335 100644 --- a/app/src/main/java/com/best/deskclock/data/DataModel.java +++ b/app/src/main/java/com/best/deskclock/data/DataModel.java @@ -94,6 +94,11 @@ public final class DataModel { */ private RingtoneModel mRingtoneModel; + /** + * The preferences for the application. + */ + private SharedPreferences mPrefs; + private DataModel() { } @@ -107,6 +112,7 @@ public static DataModel getDataModel() { public void init(Context context, SharedPreferences prefs) { if (mContext != context) { mContext = context.getApplicationContext(); + mPrefs = prefs; final String themeValue = prefs.getString(KEY_THEME, SYSTEM_THEME); switch (themeValue) { @@ -128,6 +134,21 @@ public void init(Context context, SharedPreferences prefs) { } } + /** + * @return the holiday data url. + */ + public String getHolidayDataUrl() { + return SettingsDAO.getHolidayDataUrl(mPrefs); + } + + /** + * @param url the holiday data url + */ + public void setHolidayDataUrl(String url) { + enforceMainLooper(); + SettingsDAO.setHolidayDataUrl(mPrefs, url); + } + /** * Convenience for {@code run(runnable, 0)}, i.e. waits indefinitely. */ diff --git a/app/src/main/java/com/best/deskclock/data/SettingsDAO.java b/app/src/main/java/com/best/deskclock/data/SettingsDAO.java index f7af44b74..05a4bb2cc 100644 --- a/app/src/main/java/com/best/deskclock/data/SettingsDAO.java +++ b/app/src/main/java/com/best/deskclock/data/SettingsDAO.java @@ -942,6 +942,21 @@ public static int getRingtoneTitleColor(SharedPreferences prefs) { return prefs.getInt(KEY_RINGTONE_TITLE_COLOR, DEFAULT_RINGTONE_TITLE_COLOR); } + /** + * @return the holiday data url. + */ + public static String getHolidayDataUrl(SharedPreferences prefs) { + // Default value must match the one in res/values/strings.xml + return prefs.getString(KEY_HOLIDAY_DATA_URL, DEFAULT_HOLIDAY_DATA_URL); + } + + /** + * @param url the holiday data url + */ + public static void setHolidayDataUrl(SharedPreferences prefs, String url) { + prefs.edit().putString(KEY_HOLIDAY_DATA_URL, url).apply(); + } + private static ClockStyle getClockStyle(SharedPreferences prefs, String key) { final String clockStyle = prefs.getString(key, DEFAULT_CLOCK_STYLE); // Use hardcoded locale to perform toUpperCase, because in some languages toUpperCase adds diff --git a/app/src/main/java/com/best/deskclock/holiday/HolidayRepository.java b/app/src/main/java/com/best/deskclock/holiday/HolidayRepository.java index 950fb21e3..7e3837fbe 100644 --- a/app/src/main/java/com/best/deskclock/holiday/HolidayRepository.java +++ b/app/src/main/java/com/best/deskclock/holiday/HolidayRepository.java @@ -18,6 +18,8 @@ import android.app.Application; +import com.best.deskclock.data.DataModel; + import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; @@ -40,10 +42,10 @@ public HolidayRepository(Application application) { mExecutorService = Executors.newSingleThreadExecutor(); } - public void downloadHolidays() { + public void updateWorkdayData() { mExecutorService.execute(() -> { try { - URL url = new URL("https://raw.githubusercontent.com/lanceliao/china-holiday-calender/master/holidayAPI.json"); + URL url = new URL(DataModel.getDataModel().getHolidayDataUrl()); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); Type listType = new TypeToken>() {}.getType(); List holidays = new Gson().fromJson(in, listType); diff --git a/app/src/main/java/com/best/deskclock/settings/AlarmSettingsFragment.java b/app/src/main/java/com/best/deskclock/settings/AlarmSettingsFragment.java index 7abb91d80..73dc120f3 100644 --- a/app/src/main/java/com/best/deskclock/settings/AlarmSettingsFragment.java +++ b/app/src/main/java/com/best/deskclock/settings/AlarmSettingsFragment.java @@ -15,6 +15,7 @@ import static com.best.deskclock.settings.PreferencesKeys.KEY_ENABLE_PER_ALARM_VOLUME; import static com.best.deskclock.settings.PreferencesKeys.KEY_ENABLE_SNOOZED_OR_DISMISSED_ALARM_VIBRATIONS; import static com.best.deskclock.settings.PreferencesKeys.KEY_FLIP_ACTION; +import static com.best.deskclock.settings.PreferencesKeys.KEY_HOLIDAY_DATA_URL; import static com.best.deskclock.settings.PreferencesKeys.KEY_MATERIAL_DATE_PICKER_STYLE; import static com.best.deskclock.settings.PreferencesKeys.KEY_MATERIAL_TIME_PICKER_STYLE; import static com.best.deskclock.settings.PreferencesKeys.KEY_POWER_BUTTON; @@ -23,9 +24,11 @@ import static com.best.deskclock.settings.PreferencesKeys.KEY_SHAKE_INTENSITY; import static com.best.deskclock.settings.PreferencesKeys.KEY_SYSTEM_MEDIA_VOLUME; import static com.best.deskclock.settings.PreferencesKeys.KEY_TURN_ON_BACK_FLASH_FOR_TRIGGERED_ALARM; +import static com.best.deskclock.settings.PreferencesKeys.KEY_UPDATE_HOLIDAY_DATA; import static com.best.deskclock.settings.PreferencesKeys.KEY_VOLUME_BUTTONS; import static com.best.deskclock.settings.PreferencesKeys.KEY_WEEK_START; +import android.app.Application; import android.content.ContentResolver; import android.content.Context; import android.hardware.Sensor; @@ -50,6 +53,7 @@ import com.best.deskclock.data.DataModel; import com.best.deskclock.data.SettingsDAO; import com.best.deskclock.data.Weekdays; +import com.best.deskclock.holiday.HolidayRepository; import com.best.deskclock.provider.Alarm; import com.best.deskclock.ringtone.RingtonePickerActivity; import com.best.deskclock.utils.AlarmUtils; @@ -85,6 +89,9 @@ public class AlarmSettingsFragment extends ScreenFragment ListPreference mMaterialTimePickerStylePref; ListPreference mMaterialDatePickerStylePref; Preference mAlarmDisplayCustomizationPref; + Preference mUpdateHolidayDataPref; + Preference mHolidayDataUrlPref; + private HolidayRepository mHolidayRepository; @Override protected String getFragmentTitle() { @@ -97,6 +104,9 @@ public void onCreate(Bundle savedInstanceState) { addPreferencesFromResource(R.xml.settings_alarm); + final Application application = requireActivity().getApplication(); + mHolidayRepository = new HolidayRepository(application); + mAlarmRingtonePref = findPreference(KEY_DEFAULT_ALARM_RINGTONE); mEnablePerAlarmVolumePref = findPreference(KEY_ENABLE_PER_ALARM_VOLUME); mAlarmVolumePref = findPreference(KEY_ALARM_VOLUME_SETTING); @@ -118,6 +128,8 @@ public void onCreate(Bundle savedInstanceState) { mMaterialTimePickerStylePref = findPreference(KEY_MATERIAL_TIME_PICKER_STYLE); mMaterialDatePickerStylePref = findPreference(KEY_MATERIAL_DATE_PICKER_STYLE); mAlarmDisplayCustomizationPref = findPreference(KEY_ALARM_DISPLAY_CUSTOMIZATION); + mUpdateHolidayDataPref = findPreference(KEY_UPDATE_HOLIDAY_DATA); + mHolidayDataUrlPref = findPreference(KEY_HOLIDAY_DATA_URL); setupPreferences(); } @@ -229,6 +241,12 @@ public boolean onPreferenceChange(Preference pref, Object newValue) { // Set result so DeskClock knows to refresh itself requireActivity().setResult(REQUEST_CHANGE_SETTINGS); } + + case KEY_HOLIDAY_DATA_URL -> { + final String url = (String) newValue; + DataModel.getDataModel().setHolidayDataUrl(url); + pref.setSummary(url); + } } return true; @@ -246,6 +264,8 @@ public boolean onPreferenceClick(@NonNull Preference pref) { startActivity(RingtonePickerActivity.createAlarmRingtonePickerIntentForSettings(context)); case KEY_ALARM_DISPLAY_CUSTOMIZATION -> animateAndShowFragment(new AlarmDisplayCustomizationFragment()); + + case KEY_UPDATE_HOLIDAY_DATA -> mHolidayRepository.updateWorkdayData(); } return true; @@ -400,6 +420,11 @@ private void setupPreferences() { mMaterialDatePickerStylePref.setSummary(mMaterialDatePickerStylePref.getEntry()); mAlarmDisplayCustomizationPref.setOnPreferenceClickListener(this); + + mUpdateHolidayDataPref.setOnPreferenceClickListener(this); + + mHolidayDataUrlPref.setOnPreferenceChangeListener(this); + mHolidayDataUrlPref.setSummary(DataModel.getDataModel().getHolidayDataUrl()); } private void initAudioDeviceCallback() { diff --git a/app/src/main/java/com/best/deskclock/settings/PreferencesDefaultValues.java b/app/src/main/java/com/best/deskclock/settings/PreferencesDefaultValues.java index 6cee868ec..4f654c266 100644 --- a/app/src/main/java/com/best/deskclock/settings/PreferencesDefaultValues.java +++ b/app/src/main/java/com/best/deskclock/settings/PreferencesDefaultValues.java @@ -89,6 +89,7 @@ public class PreferencesDefaultValues { public static final String SPINNER_TIME_PICKER_STYLE = "spinner"; public static final String DEFAULT_DATE_PICKER_STYLE = "calendar"; public static final String SPINNER_DATE_PICKER_STYLE = "spinner"; + public static final String DEFAULT_HOLIDAY_DATA_URL = "https://raw.githubusercontent.com/lanceliao/china-holiday-calender/master/holidayAPI.json"; // Alarm Display Customization diff --git a/app/src/main/java/com/best/deskclock/settings/PreferencesKeys.java b/app/src/main/java/com/best/deskclock/settings/PreferencesKeys.java index 80e28d6e0..8a808adfe 100644 --- a/app/src/main/java/com/best/deskclock/settings/PreferencesKeys.java +++ b/app/src/main/java/com/best/deskclock/settings/PreferencesKeys.java @@ -88,6 +88,8 @@ public class PreferencesKeys { public static final String KEY_MATERIAL_TIME_PICKER_STYLE = "key_material_time_picker_style"; public static final String KEY_MATERIAL_DATE_PICKER_STYLE = "key_material_date_picker_style"; public static final String KEY_ALARM_DISPLAY_CUSTOMIZATION = "key_alarm_display_customization"; + public static final String KEY_UPDATE_HOLIDAY_DATA = "key_update_holiday_data"; + public static final String KEY_HOLIDAY_DATA_URL = "key_holiday_data_url"; // Alarm Display Customization public static final String KEY_ALARM_CLOCK_STYLE = "key_alarm_clock_style"; diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 28c4aed51..f7356ed20 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -646,4 +646,16 @@ 请断开蓝牙设备的连接以访问此设置 仅在连接蓝牙设备时有效 将边距应用于微件两侧 + + 节假日闹钟 + + 更新节假日数据 + + 手动更新节假日和工作日数据 + + 节假日数据 URL + + 设置节假日和工作日数据的 URL + + 输入节假日和工作日数据的 URL diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d556ae0c1..a173a7b98 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -637,4 +637,16 @@ 藍牙裝置鬧鐘音量 請連接藍牙裝置以變更這項設定 請中斷連接藍牙裝置以存取這項設定 + + 節假日鬧鐘 + + 更新節假日資料 + + 手動更新節假日和工作日資料 + + 節假日資料 URL + + 設定節假日和工作日資料的 URL + + 輸入節假日和工作日資料的 URL diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2423dfc6e..748cc42c3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1325,6 +1325,19 @@ • <b>FULL SCREEN NOTIFICATIONS;</b> <br> <br> Quit Are you sure you want to leave the application? + + Holiday alarm + + Update holiday data + + Manually update holiday and work schedule data + + Holiday data URL + + Set the URL for holiday and work schedule data + + Enter the URL for the holiday and work schedule data + diff --git a/app/src/main/res/xml/settings_alarm.xml b/app/src/main/res/xml/settings_alarm.xml index c1c17bd01..0c187a557 100644 --- a/app/src/main/res/xml/settings_alarm.xml +++ b/app/src/main/res/xml/settings_alarm.xml @@ -252,4 +252,29 @@ + + + + + + + +