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 @@ + + + + + + + +