├── .editorconfig ├── .github └── FUNDING.yml ├── .gitignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app ├── .gitignore ├── build.gradle.kts ├── proguard-rules.pro ├── schemas │ └── com.simplemobiletools.clock.databases.AppDatabase │ │ ├── 1.json │ │ └── 2.json └── src │ ├── debug │ └── res │ │ └── values │ │ └── strings.xml │ ├── fdroid │ └── res │ │ └── values │ │ └── bools.xml │ ├── main │ ├── AndroidManifest.xml │ ├── kotlin │ │ └── com │ │ │ └── simplemobiletools │ │ │ └── clock │ │ │ ├── App.kt │ │ │ ├── activities │ │ │ ├── IntentHandlerActivity.kt │ │ │ ├── MainActivity.kt │ │ │ ├── ReminderActivity.kt │ │ │ ├── SettingsActivity.kt │ │ │ ├── SimpleActivity.kt │ │ │ ├── SnoozeReminderActivity.kt │ │ │ ├── SplashActivity.kt │ │ │ ├── WidgetAnalogueConfigureActivity.kt │ │ │ └── WidgetDigitalConfigureActivity.kt │ │ │ ├── adapters │ │ │ ├── AlarmsAdapter.kt │ │ │ ├── SelectTimeZonesAdapter.kt │ │ │ ├── StopwatchAdapter.kt │ │ │ ├── TimeZonesAdapter.kt │ │ │ ├── TimerAdapter.kt │ │ │ └── ViewPagerAdapter.kt │ │ │ ├── databases │ │ │ └── AppDatabase.kt │ │ │ ├── dialogs │ │ │ ├── AddTimeZonesDialog.kt │ │ │ ├── ChangeAlarmSortDialog.kt │ │ │ ├── EditAlarmDialog.kt │ │ │ ├── EditTimeZoneDialog.kt │ │ │ ├── EditTimerDialog.kt │ │ │ ├── MyTimePickerDialogDialog.kt │ │ │ └── SelectAlarmDialog.kt │ │ │ ├── extensions │ │ │ ├── Activity.kt │ │ │ ├── Context.kt │ │ │ ├── Fragment.kt │ │ │ ├── Int.kt │ │ │ ├── Logs.kt │ │ │ ├── Long.kt │ │ │ ├── TextView.kt │ │ │ └── gson │ │ │ │ ├── RuntimeTypeAdapterFactory.java │ │ │ │ └── TypeAdapter.kt │ │ │ ├── fragments │ │ │ ├── AlarmFragment.kt │ │ │ ├── ClockFragment.kt │ │ │ ├── StopwatchFragment.kt │ │ │ └── TimerFragment.kt │ │ │ ├── helpers │ │ │ ├── Config.kt │ │ │ ├── Constants.kt │ │ │ ├── Converters.kt │ │ │ ├── DBHelper.kt │ │ │ ├── DisabledItemChangeAnimator.kt │ │ │ ├── MyAnalogueTimeWidgetProvider.kt │ │ │ ├── MyDigitalTimeWidgetProvider.kt │ │ │ ├── Stopwatch.kt │ │ │ └── TimerHelper.kt │ │ │ ├── interfaces │ │ │ ├── TimerDao.kt │ │ │ └── ToggleAlarmInterface.kt │ │ │ ├── models │ │ │ ├── Alarm.kt │ │ │ ├── AlarmEvent.kt │ │ │ ├── Lap.kt │ │ │ ├── MyTimeZone.kt │ │ │ ├── StateWrapper.kt │ │ │ ├── Timer.kt │ │ │ ├── TimerEvent.kt │ │ │ └── TimerState.kt │ │ │ ├── receivers │ │ │ ├── AlarmReceiver.kt │ │ │ ├── BootCompletedReceiver.kt │ │ │ ├── DismissAlarmReceiver.kt │ │ │ ├── EarlyAlarmDismissalReceiver.kt │ │ │ ├── HideAlarmReceiver.kt │ │ │ ├── HideTimerReceiver.kt │ │ │ └── UpdateWidgetReceiver.kt │ │ │ └── services │ │ │ ├── SnoozeService.kt │ │ │ ├── StopwatchService.kt │ │ │ └── TimerService.kt │ └── res │ │ ├── anim │ │ └── pulsing_animation.xml │ │ ├── drawable-hdpi │ │ └── ic_clock_shadowed.png │ │ ├── drawable-nodpi │ │ ├── img_analogue_widget_preview.png │ │ └── img_digital_widget_preview.png │ │ ├── drawable-v26 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable-xhdpi │ │ └── ic_clock_shadowed.png │ │ ├── drawable-xxhdpi │ │ └── ic_clock_shadowed.png │ │ ├── drawable-xxxhdpi │ │ └── ic_clock_shadowed.png │ │ ├── drawable │ │ ├── circle_background_filled.xml │ │ ├── circle_background_stroke.xml │ │ ├── ic_alarm_filled_vector.xml │ │ ├── ic_alarm_off_vector.xml │ │ ├── ic_alarm_vector.xml │ │ ├── ic_clock_small.xml │ │ ├── ic_hourglass_filled_vector.xml │ │ ├── ic_hourglass_small.xml │ │ ├── ic_hourglass_vector.xml │ │ ├── ic_launcher_monochrome.xml │ │ ├── ic_sorting_triangle_vector.xml │ │ ├── ic_stopwatch_filled_vector.xml │ │ ├── ic_stopwatch_vector.xml │ │ ├── pulsing_background.xml │ │ └── shortcut_stopwatch.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── activity_reminder.xml │ │ ├── activity_settings.xml │ │ ├── alarm_day.xml │ │ ├── dialog_change_alarm_sort.xml │ │ ├── dialog_edit_alarm.xml │ │ ├── dialog_edit_time_zone.xml │ │ ├── dialog_edit_timer.xml │ │ ├── dialog_my_time_picker.xml │ │ ├── dialog_select_alarm.xml │ │ ├── dialog_select_time_zones.xml │ │ ├── fragment_alarm.xml │ │ ├── fragment_clock.xml │ │ ├── fragment_stopwatch.xml │ │ ├── fragment_timer.xml │ │ ├── item_add_time_zone.xml │ │ ├── item_alarm.xml │ │ ├── item_lap.xml │ │ ├── item_radio_button.xml │ │ ├── item_time_zone.xml │ │ ├── item_timer.xml │ │ ├── widget_analogue.xml │ │ ├── widget_config_analogue.xml │ │ ├── widget_config_digital.xml │ │ └── widget_digital.xml │ │ ├── menu │ │ ├── cab_alarms.xml │ │ ├── cab_timezones.xml │ │ └── menu.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ ├── ic_launcher_amber.xml │ │ ├── ic_launcher_blue.xml │ │ ├── ic_launcher_blue_grey.xml │ │ ├── ic_launcher_brown.xml │ │ ├── ic_launcher_cyan.xml │ │ ├── ic_launcher_deep_orange.xml │ │ ├── ic_launcher_deep_purple.xml │ │ ├── ic_launcher_green.xml │ │ ├── ic_launcher_grey_black.xml │ │ ├── ic_launcher_indigo.xml │ │ ├── ic_launcher_light_blue.xml │ │ ├── ic_launcher_light_green.xml │ │ ├── ic_launcher_lime.xml │ │ ├── ic_launcher_pink.xml │ │ ├── ic_launcher_purple.xml │ │ ├── ic_launcher_red.xml │ │ ├── ic_launcher_teal.xml │ │ └── ic_launcher_yellow.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_amber.png │ │ ├── ic_launcher_blue.png │ │ ├── ic_launcher_blue_grey.png │ │ ├── ic_launcher_brown.png │ │ ├── ic_launcher_cyan.png │ │ ├── ic_launcher_deep_orange.png │ │ ├── ic_launcher_deep_purple.png │ │ ├── ic_launcher_foreground.png │ │ ├── ic_launcher_green.png │ │ ├── ic_launcher_grey_black.png │ │ ├── ic_launcher_indigo.png │ │ ├── ic_launcher_light_blue.png │ │ ├── ic_launcher_light_green.png │ │ ├── ic_launcher_lime.png │ │ ├── ic_launcher_pink.png │ │ ├── ic_launcher_purple.png │ │ ├── ic_launcher_red.png │ │ ├── ic_launcher_teal.png │ │ └── ic_launcher_yellow.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_amber.png │ │ ├── ic_launcher_blue.png │ │ ├── ic_launcher_blue_grey.png │ │ ├── ic_launcher_brown.png │ │ ├── ic_launcher_cyan.png │ │ ├── ic_launcher_deep_orange.png │ │ ├── ic_launcher_deep_purple.png │ │ ├── ic_launcher_foreground.png │ │ ├── ic_launcher_green.png │ │ ├── ic_launcher_grey_black.png │ │ ├── ic_launcher_indigo.png │ │ ├── ic_launcher_light_blue.png │ │ ├── ic_launcher_light_green.png │ │ ├── ic_launcher_lime.png │ │ ├── ic_launcher_pink.png │ │ ├── ic_launcher_purple.png │ │ ├── ic_launcher_red.png │ │ ├── ic_launcher_teal.png │ │ └── ic_launcher_yellow.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_amber.png │ │ ├── ic_launcher_blue.png │ │ ├── ic_launcher_blue_grey.png │ │ ├── ic_launcher_brown.png │ │ ├── ic_launcher_cyan.png │ │ ├── ic_launcher_deep_orange.png │ │ ├── ic_launcher_deep_purple.png │ │ ├── ic_launcher_foreground.png │ │ ├── ic_launcher_green.png │ │ ├── ic_launcher_grey_black.png │ │ ├── ic_launcher_indigo.png │ │ ├── ic_launcher_light_blue.png │ │ ├── ic_launcher_light_green.png │ │ ├── ic_launcher_lime.png │ │ ├── ic_launcher_pink.png │ │ ├── ic_launcher_purple.png │ │ ├── ic_launcher_red.png │ │ ├── ic_launcher_teal.png │ │ └── ic_launcher_yellow.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ ├── ic_launcher_amber.png │ │ ├── ic_launcher_blue.png │ │ ├── ic_launcher_blue_grey.png │ │ ├── ic_launcher_brown.png │ │ ├── ic_launcher_cyan.png │ │ ├── ic_launcher_deep_orange.png │ │ ├── ic_launcher_deep_purple.png │ │ ├── ic_launcher_foreground.png │ │ ├── ic_launcher_green.png │ │ ├── ic_launcher_grey_black.png │ │ ├── ic_launcher_indigo.png │ │ ├── ic_launcher_light_blue.png │ │ ├── ic_launcher_light_green.png │ │ ├── ic_launcher_lime.png │ │ ├── ic_launcher_pink.png │ │ ├── ic_launcher_purple.png │ │ ├── ic_launcher_red.png │ │ ├── ic_launcher_teal.png │ │ └── ic_launcher_yellow.png │ │ ├── values-ar │ │ └── strings.xml │ │ ├── values-az │ │ └── strings.xml │ │ ├── values-be │ │ └── strings.xml │ │ ├── values-bg │ │ └── strings.xml │ │ ├── values-ca │ │ └── strings.xml │ │ ├── values-cs │ │ └── strings.xml │ │ ├── values-cy │ │ └── strings.xml │ │ ├── values-da │ │ └── strings.xml │ │ ├── values-de │ │ └── strings.xml │ │ ├── values-el │ │ └── strings.xml │ │ ├── values-eo │ │ └── strings.xml │ │ ├── values-es │ │ └── strings.xml │ │ ├── values-et │ │ └── strings.xml │ │ ├── values-eu │ │ └── strings.xml │ │ ├── values-fi │ │ └── strings.xml │ │ ├── values-fr │ │ └── strings.xml │ │ ├── values-gl │ │ └── strings.xml │ │ ├── values-hr │ │ └── strings.xml │ │ ├── values-hu │ │ └── strings.xml │ │ ├── values-in │ │ └── strings.xml │ │ ├── values-it │ │ └── strings.xml │ │ ├── values-iw │ │ └── strings.xml │ │ ├── values-ja │ │ └── strings.xml │ │ ├── values-lt │ │ └── strings.xml │ │ ├── values-ml │ │ └── strings.xml │ │ ├── values-my │ │ └── strings.xml │ │ ├── values-nb-rNO │ │ └── strings.xml │ │ ├── values-nl │ │ └── strings.xml │ │ ├── values-pa-rPK │ │ └── strings.xml │ │ ├── values-pl │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ └── strings.xml │ │ ├── values-pt │ │ └── strings.xml │ │ ├── values-ro │ │ └── strings.xml │ │ ├── values-ru │ │ └── strings.xml │ │ ├── values-sk │ │ └── strings.xml │ │ ├── values-sl │ │ └── strings.xml │ │ ├── values-sr │ │ └── strings.xml │ │ ├── values-sv │ │ └── strings.xml │ │ ├── values-th │ │ └── strings.xml │ │ ├── values-tr │ │ └── strings.xml │ │ ├── values-uk │ │ └── strings.xml │ │ ├── values-zh-rCN │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ └── strings.xml │ │ ├── values │ │ ├── dimens.xml │ │ ├── donottranslate.xml │ │ ├── integers.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ ├── widget_analogue_clock_info.xml │ │ └── widget_digital_clock_info.xml │ └── prepaid │ └── res │ └── values │ └── bools.xml ├── build.gradle.kts ├── fastlane ├── Appfile ├── Fastfile └── metadata │ └── android │ ├── ar │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── bg │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── ca │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── cs-CZ │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── da-DK │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── de-DE │ ├── full_description.txt │ ├── images │ │ ├── phoneScreenshots │ │ │ ├── 1_de-DE.jpeg │ │ │ ├── 2_de-DE.jpeg │ │ │ ├── 3_de-DE.jpeg │ │ │ └── 4_de-DE.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_de-DE.jpeg │ │ │ └── 2_de-DE.jpeg │ │ └── tenInchScreenshots │ │ │ ├── 1_de-DE.jpeg │ │ │ └── 2_de-DE.jpeg │ ├── short_description.txt │ └── title.txt │ ├── el-GR │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── en-GB │ ├── full_description.txt │ ├── images │ │ ├── featureGraphic.jpeg │ │ ├── phoneScreenshots │ │ │ ├── 1_en-GB.jpeg │ │ │ ├── 2_en-GB.jpeg │ │ │ ├── 3_en-GB.jpeg │ │ │ └── 4_en-GB.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_en-GB.jpeg │ │ │ └── 2_en-GB.jpeg │ │ ├── tenInchScreenshots │ │ │ ├── 1_en-GB.jpeg │ │ │ └── 2_en-GB.jpeg │ │ └── tvBanner.png │ ├── short_description.txt │ └── title.txt │ ├── en-IN │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── en-US │ ├── changelogs │ │ ├── 33.txt │ │ ├── 34.txt │ │ ├── 35.txt │ │ ├── 36.txt │ │ ├── 37.txt │ │ ├── 38.txt │ │ ├── 39.txt │ │ ├── 40.txt │ │ ├── 41.txt │ │ └── 42.txt │ ├── full_description.txt │ ├── images │ │ ├── featureGraphic.jpeg │ │ ├── icon.png │ │ ├── phoneScreenshots │ │ │ ├── 1_en-US.jpeg │ │ │ ├── 2_en-US.jpeg │ │ │ ├── 3_en-US.jpeg │ │ │ └── 4_en-US.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_en-US.jpeg │ │ │ └── 2_en-US.jpeg │ │ ├── tenInchScreenshots │ │ │ ├── 1_en-US.jpeg │ │ │ └── 2_en-US.jpeg │ │ └── tvBanner.png │ ├── short_description.txt │ └── title.txt │ ├── es-ES │ ├── full_description.txt │ ├── images │ │ ├── phoneScreenshots │ │ │ ├── 1_es-ES.jpeg │ │ │ ├── 2_es-ES.jpeg │ │ │ ├── 3_es-ES.jpeg │ │ │ └── 4_es-ES.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_es-ES.jpeg │ │ │ └── 2_es-ES.jpeg │ │ └── tenInchScreenshots │ │ │ ├── 1_es-ES.jpeg │ │ │ └── 2_es-ES.jpeg │ ├── short_description.txt │ └── title.txt │ ├── es-US │ ├── full_description.txt │ ├── images │ │ ├── phoneScreenshots │ │ │ ├── 1_es-US.jpeg │ │ │ ├── 2_es-US.jpeg │ │ │ ├── 3_es-US.jpeg │ │ │ └── 4_es-US.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_es-US.jpeg │ │ │ └── 2_es-US.jpeg │ │ └── tenInchScreenshots │ │ │ ├── 1_es-US.jpeg │ │ │ └── 2_es-US.jpeg │ ├── short_description.txt │ └── title.txt │ ├── et │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── eu-ES │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── fi-FI │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── fr-FR │ ├── full_description.txt │ ├── images │ │ ├── phoneScreenshots │ │ │ ├── 1_fr-FR.jpeg │ │ │ ├── 2_fr-FR.jpeg │ │ │ ├── 3_fr-FR.jpeg │ │ │ └── 4_fr-FR.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_fr-FR.jpeg │ │ │ └── 2_fr-FR.jpeg │ │ └── tenInchScreenshots │ │ │ ├── 1_fr-FR.jpeg │ │ │ └── 2_fr-FR.jpeg │ ├── short_description.txt │ └── title.txt │ ├── gl-ES │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── hi-IN │ ├── full_description.txt │ ├── images │ │ ├── phoneScreenshots │ │ │ ├── 1_hi-IN.jpeg │ │ │ ├── 2_hi-IN.jpeg │ │ │ ├── 3_hi-IN.jpeg │ │ │ └── 4_hi-IN.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_hi-IN.jpeg │ │ │ └── 2_hi-IN.jpeg │ │ └── tenInchScreenshots │ │ │ ├── 1_hi-IN.jpeg │ │ │ └── 2_hi-IN.jpeg │ ├── short_description.txt │ └── title.txt │ ├── hr │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── hu-HU │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── id │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── it-IT │ ├── full_description.txt │ ├── images │ │ ├── phoneScreenshots │ │ │ ├── 1_it-IT.jpeg │ │ │ ├── 2_it-IT.jpeg │ │ │ ├── 3_it-IT.jpeg │ │ │ └── 4_it-IT.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_it-IT.jpeg │ │ │ └── 2_it-IT.jpeg │ │ └── tenInchScreenshots │ │ │ ├── 1_it-IT.jpeg │ │ │ └── 2_it-IT.jpeg │ ├── short_description.txt │ └── title.txt │ ├── iw-IL │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── ja-JP │ ├── full_description.txt │ ├── images │ │ ├── phoneScreenshots │ │ │ ├── 1_ja-JP.jpeg │ │ │ ├── 2_ja-JP.jpeg │ │ │ ├── 3_ja-JP.jpeg │ │ │ └── 4_ja-JP.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_ja-JP.jpeg │ │ │ └── 2_ja-JP.jpeg │ │ └── tenInchScreenshots │ │ │ ├── 1_ja-JP.jpeg │ │ │ └── 2_ja-JP.jpeg │ ├── short_description.txt │ └── title.txt │ ├── ko-KR │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── lt │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── ml-IN │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── nl-NL │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── pl-PL │ ├── full_description.txt │ ├── images │ │ ├── phoneScreenshots │ │ │ ├── 1_pl-PL.jpeg │ │ │ ├── 2_pl-PL.jpeg │ │ │ ├── 3_pl-PL.jpeg │ │ │ └── 4_pl-PL.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_pl-PL.jpeg │ │ │ └── 2_pl-PL.jpeg │ │ └── tenInchScreenshots │ │ │ ├── 1_pl-PL.jpeg │ │ │ └── 2_pl-PL.jpeg │ ├── short_description.txt │ └── title.txt │ ├── pt-BR │ ├── full_description.txt │ ├── images │ │ ├── phoneScreenshots │ │ │ ├── 1_pt-BR.jpeg │ │ │ ├── 2_pt-BR.jpeg │ │ │ ├── 3_pt-BR.jpeg │ │ │ └── 4_pt-BR.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_pt-BR.jpeg │ │ │ └── 2_pt-BR.jpeg │ │ └── tenInchScreenshots │ │ │ ├── 1_pt-BR.jpeg │ │ │ └── 2_pt-BR.jpeg │ ├── short_description.txt │ └── title.txt │ ├── pt-PT │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── ro │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── ru-RU │ ├── full_description.txt │ ├── images │ │ ├── phoneScreenshots │ │ │ ├── 1_ru-RU.jpeg │ │ │ ├── 2_ru-RU.jpeg │ │ │ ├── 3_ru-RU.jpeg │ │ │ └── 4_ru-RU.jpeg │ │ ├── sevenInchScreenshots │ │ │ ├── 1_ru-RU.jpeg │ │ │ └── 2_ru-RU.jpeg │ │ └── tenInchScreenshots │ │ │ ├── 1_ru-RU.jpeg │ │ │ └── 2_ru-RU.jpeg │ ├── short_description.txt │ └── title.txt │ ├── sk │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── sl │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── sr │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── sv-SE │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── tr-TR │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── uk │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ ├── zh-CN │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt │ └── zh-TW │ ├── full_description.txt │ ├── short_description.txt │ └── title.txt ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── graphics ├── app_icon.png ├── featureGraphic.jpg ├── featureGraphic.xcf ├── icon.png ├── promo_graphic.png ├── square.png ├── square.xcf └── tv_banner.png ├── keystore.properties_sample └── settings.gradle.kts /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig 2 | # http://EditorConfig.org 3 | 4 | # top-most EditorConfig file 5 | root = true 6 | 7 | # LF end-of-line, insert an empty new line and UTF-8 8 | [*] 9 | end_of_line = lf 10 | insert_final_newline = true 11 | charset = utf-8 12 | indent_style = space 13 | indent_size = 4 14 | continuation_indent_size = 4 15 | max_line_length = 160 16 | 17 | [*.xml] 18 | continuation_indent_size = 4 19 | 20 | [*.kt] 21 | ij_kotlin_name_count_to_use_star_import = 5 22 | ij_kotlin_name_count_to_use_star_import_for_members = 5 23 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [tibbi] 2 | patreon: tiborkaputa 3 | custom: ["https://www.paypal.me/simplemobiletools"] 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | *.aab 3 | .gradle 4 | /local.properties 5 | /.idea/ 6 | .DS_Store 7 | /build 8 | /captures 9 | keystore.jks 10 | keystore.properties 11 | fastlane/fastlane.json 12 | Gemfile 13 | Gemfile.lock 14 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ### Reporting 2 | Before you report something, read the reporting rules [here](https://github.com/SimpleMobileTools/General-Discussion#how-do-i-suggest-an-improvement-ask-a-question-or-report-an-issue) please. 3 | 4 | ### Contributing as a developer 5 | Some instructions about code style and everything that has to be done to increase the change of your code getting accepted can be found at the [General Discussion](https://github.com/SimpleMobileTools/General-Discussion#contribution-rules-for-developers) section. 6 | 7 | ### Contributing as a non developer 8 | In case you just want to for example improve a translation, you can find the way of doing it [here](https://github.com/SimpleMobileTools/General-Discussion#how-can-i-suggest-an-edit-to-a-file). 9 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # EventBus 2 | -keepattributes *Annotation* 3 | -keepclassmembers class ** { 4 | @org.greenrobot.eventbus.Subscribe ; 5 | } 6 | -keep enum org.greenrobot.eventbus.ThreadMode { *; } 7 | -------------------------------------------------------------------------------- /app/schemas/com.simplemobiletools.clock.databases.AppDatabase/1.json: -------------------------------------------------------------------------------- 1 | { 2 | "formatVersion": 1, 3 | "database": { 4 | "version": 1, 5 | "identityHash": "d1a9a1d39e0899af980c9ddc7632dd8f", 6 | "entities": [ 7 | { 8 | "tableName": "timers", 9 | "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `seconds` INTEGER NOT NULL, `state` TEXT NOT NULL, `vibrate` INTEGER NOT NULL, `soundUri` TEXT NOT NULL, `soundTitle` TEXT NOT NULL, `label` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `channelId` TEXT)", 10 | "fields": [ 11 | { 12 | "fieldPath": "id", 13 | "columnName": "id", 14 | "affinity": "INTEGER", 15 | "notNull": false 16 | }, 17 | { 18 | "fieldPath": "seconds", 19 | "columnName": "seconds", 20 | "affinity": "INTEGER", 21 | "notNull": true 22 | }, 23 | { 24 | "fieldPath": "state", 25 | "columnName": "state", 26 | "affinity": "TEXT", 27 | "notNull": true 28 | }, 29 | { 30 | "fieldPath": "vibrate", 31 | "columnName": "vibrate", 32 | "affinity": "INTEGER", 33 | "notNull": true 34 | }, 35 | { 36 | "fieldPath": "soundUri", 37 | "columnName": "soundUri", 38 | "affinity": "TEXT", 39 | "notNull": true 40 | }, 41 | { 42 | "fieldPath": "soundTitle", 43 | "columnName": "soundTitle", 44 | "affinity": "TEXT", 45 | "notNull": true 46 | }, 47 | { 48 | "fieldPath": "label", 49 | "columnName": "label", 50 | "affinity": "TEXT", 51 | "notNull": true 52 | }, 53 | { 54 | "fieldPath": "createdAt", 55 | "columnName": "createdAt", 56 | "affinity": "INTEGER", 57 | "notNull": true 58 | }, 59 | { 60 | "fieldPath": "channelId", 61 | "columnName": "channelId", 62 | "affinity": "TEXT", 63 | "notNull": false 64 | } 65 | ], 66 | "primaryKey": { 67 | "autoGenerate": true, 68 | "columnNames": [ 69 | "id" 70 | ] 71 | }, 72 | "indices": [], 73 | "foreignKeys": [] 74 | } 75 | ], 76 | "views": [], 77 | "setupQueries": [ 78 | "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", 79 | "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd1a9a1d39e0899af980c9ddc7632dd8f')" 80 | ] 81 | } 82 | } -------------------------------------------------------------------------------- /app/schemas/com.simplemobiletools.clock.databases.AppDatabase/2.json: -------------------------------------------------------------------------------- 1 | { 2 | "formatVersion": 1, 3 | "database": { 4 | "version": 2, 5 | "identityHash": "70b55e9d6e9c68ce252a7c25a4809ea3", 6 | "entities": [ 7 | { 8 | "tableName": "timers", 9 | "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `seconds` INTEGER NOT NULL, `state` TEXT NOT NULL, `vibrate` INTEGER NOT NULL, `soundUri` TEXT NOT NULL, `soundTitle` TEXT NOT NULL, `label` TEXT NOT NULL, `createdAt` INTEGER NOT NULL, `channelId` TEXT, `oneShot` INTEGER NOT NULL)", 10 | "fields": [ 11 | { 12 | "fieldPath": "id", 13 | "columnName": "id", 14 | "affinity": "INTEGER", 15 | "notNull": false 16 | }, 17 | { 18 | "fieldPath": "seconds", 19 | "columnName": "seconds", 20 | "affinity": "INTEGER", 21 | "notNull": true 22 | }, 23 | { 24 | "fieldPath": "state", 25 | "columnName": "state", 26 | "affinity": "TEXT", 27 | "notNull": true 28 | }, 29 | { 30 | "fieldPath": "vibrate", 31 | "columnName": "vibrate", 32 | "affinity": "INTEGER", 33 | "notNull": true 34 | }, 35 | { 36 | "fieldPath": "soundUri", 37 | "columnName": "soundUri", 38 | "affinity": "TEXT", 39 | "notNull": true 40 | }, 41 | { 42 | "fieldPath": "soundTitle", 43 | "columnName": "soundTitle", 44 | "affinity": "TEXT", 45 | "notNull": true 46 | }, 47 | { 48 | "fieldPath": "label", 49 | "columnName": "label", 50 | "affinity": "TEXT", 51 | "notNull": true 52 | }, 53 | { 54 | "fieldPath": "createdAt", 55 | "columnName": "createdAt", 56 | "affinity": "INTEGER", 57 | "notNull": true 58 | }, 59 | { 60 | "fieldPath": "channelId", 61 | "columnName": "channelId", 62 | "affinity": "TEXT", 63 | "notNull": false 64 | }, 65 | { 66 | "fieldPath": "oneShot", 67 | "columnName": "oneShot", 68 | "affinity": "INTEGER", 69 | "notNull": true 70 | } 71 | ], 72 | "primaryKey": { 73 | "autoGenerate": true, 74 | "columnNames": [ 75 | "id" 76 | ] 77 | }, 78 | "indices": [], 79 | "foreignKeys": [] 80 | } 81 | ], 82 | "views": [], 83 | "setupQueries": [ 84 | "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", 85 | "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '70b55e9d6e9c68ce252a7c25a4809ea3')" 86 | ] 87 | } 88 | } -------------------------------------------------------------------------------- /app/src/debug/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Clock_debug 4 | 5 | -------------------------------------------------------------------------------- /app/src/fdroid/res/values/bools.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | true 4 | true 5 | true 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/activities/SimpleActivity.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.activities 2 | 3 | import com.simplemobiletools.clock.R 4 | import com.simplemobiletools.commons.activities.BaseSimpleActivity 5 | 6 | open class SimpleActivity : BaseSimpleActivity() { 7 | override fun getAppIconIDs() = arrayListOf( 8 | R.mipmap.ic_launcher_red, 9 | R.mipmap.ic_launcher_pink, 10 | R.mipmap.ic_launcher_purple, 11 | R.mipmap.ic_launcher_deep_purple, 12 | R.mipmap.ic_launcher_indigo, 13 | R.mipmap.ic_launcher_blue, 14 | R.mipmap.ic_launcher_light_blue, 15 | R.mipmap.ic_launcher_cyan, 16 | R.mipmap.ic_launcher_teal, 17 | R.mipmap.ic_launcher_green, 18 | R.mipmap.ic_launcher_light_green, 19 | R.mipmap.ic_launcher_lime, 20 | R.mipmap.ic_launcher_yellow, 21 | R.mipmap.ic_launcher_amber, 22 | R.mipmap.ic_launcher, 23 | R.mipmap.ic_launcher_deep_orange, 24 | R.mipmap.ic_launcher_brown, 25 | R.mipmap.ic_launcher_blue_grey, 26 | R.mipmap.ic_launcher_grey_black 27 | ) 28 | 29 | override fun getAppLauncherName() = getString(R.string.app_launcher_name) 30 | } 31 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/activities/SnoozeReminderActivity.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.activities 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import com.simplemobiletools.clock.extensions.config 6 | import com.simplemobiletools.clock.extensions.dbHelper 7 | import com.simplemobiletools.clock.extensions.hideNotification 8 | import com.simplemobiletools.clock.extensions.setupAlarmClock 9 | import com.simplemobiletools.clock.helpers.ALARM_ID 10 | import com.simplemobiletools.commons.extensions.showPickSecondsDialog 11 | import com.simplemobiletools.commons.helpers.MINUTE_SECONDS 12 | 13 | class SnoozeReminderActivity : AppCompatActivity() { 14 | override fun onCreate(savedInstanceState: Bundle?) { 15 | super.onCreate(savedInstanceState) 16 | val id = intent.getIntExtra(ALARM_ID, -1) 17 | val alarm = dbHelper.getAlarmWithId(id) ?: return 18 | hideNotification(id) 19 | showPickSecondsDialog(config.snoozeTime * MINUTE_SECONDS, true, cancelCallback = { dialogCancelled() }) { 20 | config.snoozeTime = it / MINUTE_SECONDS 21 | setupAlarmClock(alarm, it) 22 | finishActivity() 23 | } 24 | } 25 | 26 | private fun dialogCancelled() { 27 | finishActivity() 28 | } 29 | 30 | private fun finishActivity() { 31 | finish() 32 | overridePendingTransition(0, 0) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/activities/SplashActivity.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.activities 2 | 3 | import android.content.Intent 4 | import com.simplemobiletools.clock.helpers.* 5 | import com.simplemobiletools.commons.activities.BaseSplashActivity 6 | 7 | class SplashActivity : BaseSplashActivity() { 8 | override fun initActivity() { 9 | when { 10 | intent?.action == "android.intent.action.SHOW_ALARMS" -> { 11 | Intent(this, MainActivity::class.java).apply { 12 | putExtra(OPEN_TAB, TAB_ALARM) 13 | startActivity(this) 14 | } 15 | } 16 | 17 | intent?.action == "android.intent.action.SHOW_TIMERS" -> { 18 | Intent(this, MainActivity::class.java).apply { 19 | putExtra(OPEN_TAB, TAB_TIMER) 20 | startActivity(this) 21 | } 22 | } 23 | 24 | intent?.action == STOPWATCH_TOGGLE_ACTION -> { 25 | Intent(this, MainActivity::class.java).apply { 26 | putExtra(OPEN_TAB, TAB_STOPWATCH) 27 | putExtra(TOGGLE_STOPWATCH, intent.getBooleanExtra(TOGGLE_STOPWATCH, false)) 28 | startActivity(this) 29 | } 30 | } 31 | 32 | intent.extras?.containsKey(OPEN_TAB) == true -> { 33 | Intent(this, MainActivity::class.java).apply { 34 | putExtra(OPEN_TAB, intent.getIntExtra(OPEN_TAB, TAB_CLOCK)) 35 | putExtra(TIMER_ID, intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID)) 36 | startActivity(this) 37 | } 38 | } 39 | 40 | IntentHandlerActivity.HANDLED_ACTIONS.contains(intent?.action) -> { 41 | Intent(intent).apply { 42 | setClass(this@SplashActivity, IntentHandlerActivity::class.java) 43 | startActivity(this) 44 | } 45 | } 46 | 47 | else -> startActivity(Intent(this, MainActivity::class.java)) 48 | } 49 | finish() 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/adapters/ViewPagerAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.adapters 2 | 3 | import android.view.ViewGroup 4 | import androidx.fragment.app.Fragment 5 | import androidx.fragment.app.FragmentManager 6 | import androidx.fragment.app.FragmentStatePagerAdapter 7 | import com.simplemobiletools.clock.fragments.AlarmFragment 8 | import com.simplemobiletools.clock.fragments.ClockFragment 9 | import com.simplemobiletools.clock.fragments.StopwatchFragment 10 | import com.simplemobiletools.clock.fragments.TimerFragment 11 | import com.simplemobiletools.clock.helpers.* 12 | import com.simplemobiletools.commons.models.AlarmSound 13 | 14 | class ViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) { 15 | private val fragments = HashMap() 16 | 17 | override fun getItem(position: Int): Fragment { 18 | return getFragment(position) 19 | } 20 | 21 | override fun instantiateItem(container: ViewGroup, position: Int): Any { 22 | val fragment = super.instantiateItem(container, position) 23 | if (fragment is Fragment) { 24 | fragments[position] = fragment 25 | } 26 | return fragment 27 | } 28 | 29 | override fun destroyItem(container: ViewGroup, position: Int, item: Any) { 30 | fragments.remove(position) 31 | super.destroyItem(container, position, item) 32 | } 33 | 34 | override fun getCount() = TABS_COUNT 35 | 36 | private fun getFragment(position: Int) = when (position) { 37 | 0 -> ClockFragment() 38 | 1 -> AlarmFragment() 39 | 2 -> StopwatchFragment() 40 | 3 -> TimerFragment() 41 | else -> throw RuntimeException("Trying to fetch unknown fragment id $position") 42 | } 43 | 44 | fun showAlarmSortDialog() { 45 | (fragments[TAB_ALARM] as? AlarmFragment)?.showSortingDialog() 46 | } 47 | 48 | fun updateClockTabAlarm() { 49 | (fragments[TAB_CLOCK] as? ClockFragment)?.updateAlarm() 50 | } 51 | 52 | fun updateAlarmTabAlarmSound(alarmSound: AlarmSound) { 53 | (fragments[TAB_ALARM] as? AlarmFragment)?.updateAlarmSound(alarmSound) 54 | } 55 | 56 | fun updateTimerTabAlarmSound(alarmSound: AlarmSound) { 57 | (fragments[TAB_TIMER] as? TimerFragment)?.updateAlarmSound(alarmSound) 58 | } 59 | 60 | fun updateTimerPosition(timerId: Int) { 61 | (fragments[TAB_TIMER] as? TimerFragment)?.updatePosition(timerId) 62 | } 63 | 64 | fun startStopWatch() { 65 | (fragments[TAB_STOPWATCH] as? StopwatchFragment)?.startStopWatch() 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/dialogs/AddTimeZonesDialog.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.dialogs 2 | 3 | import com.simplemobiletools.clock.activities.SimpleActivity 4 | import com.simplemobiletools.clock.adapters.SelectTimeZonesAdapter 5 | import com.simplemobiletools.clock.databinding.DialogSelectTimeZonesBinding 6 | import com.simplemobiletools.clock.extensions.config 7 | import com.simplemobiletools.clock.helpers.getAllTimeZones 8 | import com.simplemobiletools.commons.extensions.getAlertDialogBuilder 9 | import com.simplemobiletools.commons.extensions.setupDialogStuff 10 | 11 | class AddTimeZonesDialog(val activity: SimpleActivity, private val callback: () -> Unit) { 12 | private val binding = DialogSelectTimeZonesBinding.inflate(activity.layoutInflater) 13 | 14 | init { 15 | binding.selectTimeZonesList.adapter = SelectTimeZonesAdapter(activity, getAllTimeZones()) 16 | 17 | activity.getAlertDialogBuilder() 18 | .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() } 19 | .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) 20 | .apply { 21 | activity.setupDialogStuff(binding.root, this) 22 | } 23 | } 24 | 25 | private fun dialogConfirmed() { 26 | val adapter = binding.selectTimeZonesList.adapter as? SelectTimeZonesAdapter 27 | val selectedTimeZones = adapter?.selectedKeys?.map { it.toString() }?.toHashSet() ?: LinkedHashSet() 28 | activity.config.selectedTimeZones = selectedTimeZones 29 | callback() 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/dialogs/ChangeAlarmSortDialog.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.dialogs 2 | 3 | import com.simplemobiletools.clock.R 4 | import com.simplemobiletools.clock.databinding.DialogChangeAlarmSortBinding 5 | import com.simplemobiletools.clock.extensions.config 6 | import com.simplemobiletools.clock.helpers.SORT_BY_ALARM_TIME 7 | import com.simplemobiletools.clock.helpers.SORT_BY_CREATION_ORDER 8 | import com.simplemobiletools.clock.helpers.SORT_BY_DATE_AND_TIME 9 | import com.simplemobiletools.commons.activities.BaseSimpleActivity 10 | import com.simplemobiletools.commons.extensions.getAlertDialogBuilder 11 | import com.simplemobiletools.commons.extensions.setupDialogStuff 12 | 13 | class ChangeAlarmSortDialog(val activity: BaseSimpleActivity, val callback: () -> Unit) { 14 | private val binding = DialogChangeAlarmSortBinding.inflate(activity.layoutInflater).apply { 15 | val activeRadioButton = when (activity.config.alarmSort) { 16 | SORT_BY_ALARM_TIME -> sortingDialogRadioAlarmTime 17 | SORT_BY_DATE_AND_TIME -> sortingDialogRadioDayAndTime 18 | else -> sortingDialogRadioCreationOrder 19 | } 20 | activeRadioButton.isChecked = true 21 | } 22 | 23 | init { 24 | activity.getAlertDialogBuilder() 25 | .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { _, _ -> dialogConfirmed() } 26 | .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) 27 | .apply { 28 | activity.setupDialogStuff(binding.root, this, com.simplemobiletools.commons.R.string.sort_by) 29 | } 30 | } 31 | 32 | private fun dialogConfirmed() { 33 | val sort = when (binding.sortingDialogRadioSorting.checkedRadioButtonId) { 34 | R.id.sorting_dialog_radio_alarm_time -> SORT_BY_ALARM_TIME 35 | R.id.sorting_dialog_radio_day_and_time -> SORT_BY_DATE_AND_TIME 36 | else -> SORT_BY_CREATION_ORDER 37 | } 38 | 39 | activity.config.alarmSort = sort 40 | callback() 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/dialogs/EditTimeZoneDialog.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.dialogs 2 | 3 | import com.simplemobiletools.clock.activities.SimpleActivity 4 | import com.simplemobiletools.clock.databinding.DialogEditTimeZoneBinding 5 | import com.simplemobiletools.clock.extensions.config 6 | import com.simplemobiletools.clock.extensions.getEditedTimeZonesMap 7 | import com.simplemobiletools.clock.extensions.getModifiedTimeZoneTitle 8 | import com.simplemobiletools.clock.helpers.EDITED_TIME_ZONE_SEPARATOR 9 | import com.simplemobiletools.clock.helpers.getDefaultTimeZoneTitle 10 | import com.simplemobiletools.clock.models.MyTimeZone 11 | import com.simplemobiletools.commons.extensions.getAlertDialogBuilder 12 | import com.simplemobiletools.commons.extensions.setupDialogStuff 13 | import com.simplemobiletools.commons.extensions.showKeyboard 14 | import com.simplemobiletools.commons.extensions.value 15 | 16 | class EditTimeZoneDialog(val activity: SimpleActivity, val myTimeZone: MyTimeZone, val callback: () -> Unit) { 17 | 18 | init { 19 | val binding = DialogEditTimeZoneBinding.inflate(activity.layoutInflater).apply { 20 | editTimeZoneTitle.setText(activity.getModifiedTimeZoneTitle(myTimeZone.id)) 21 | editTimeZoneLabel.setText(getDefaultTimeZoneTitle(myTimeZone.id)) 22 | } 23 | 24 | activity.getAlertDialogBuilder() 25 | .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed(binding.editTimeZoneTitle.value) } 26 | .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) 27 | .apply { 28 | activity.setupDialogStuff(binding.root, this) { alertDialog -> 29 | alertDialog.showKeyboard(binding.editTimeZoneTitle) 30 | } 31 | } 32 | } 33 | 34 | private fun dialogConfirmed(newTitle: String) { 35 | val editedTitlesMap = activity.getEditedTimeZonesMap() 36 | 37 | if (newTitle.isEmpty()) { 38 | editedTitlesMap.remove(myTimeZone.id) 39 | } else { 40 | editedTitlesMap[myTimeZone.id] = newTitle 41 | } 42 | 43 | val newTitlesSet = HashSet() 44 | for ((key, value) in editedTitlesMap) { 45 | newTitlesSet.add("$key$EDITED_TIME_ZONE_SEPARATOR$value") 46 | } 47 | 48 | activity.config.editedTimeZoneTitles = newTitlesSet 49 | callback() 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/dialogs/MyTimePickerDialogDialog.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.dialogs 2 | 3 | import com.simplemobiletools.clock.activities.SimpleActivity 4 | import com.simplemobiletools.clock.databinding.DialogMyTimePickerBinding 5 | import com.simplemobiletools.commons.extensions.getAlertDialogBuilder 6 | import com.simplemobiletools.commons.extensions.getProperTextColor 7 | import com.simplemobiletools.commons.extensions.setupDialogStuff 8 | 9 | class MyTimePickerDialogDialog(val activity: SimpleActivity, val initialSeconds: Int, val callback: (result: Int) -> Unit) { 10 | private val binding = DialogMyTimePickerBinding.inflate(activity.layoutInflater) 11 | 12 | init { 13 | binding.apply { 14 | val textColor = activity.getProperTextColor() 15 | arrayOf(myTimePickerHours, myTimePickerMinutes, myTimePickerSeconds).forEach { 16 | it.textColor = textColor 17 | it.selectedTextColor = textColor 18 | it.dividerColor = textColor 19 | } 20 | 21 | myTimePickerHours.value = initialSeconds / 3600 22 | myTimePickerMinutes.value = (initialSeconds) / 60 % 60 23 | myTimePickerSeconds.value = initialSeconds % 60 24 | } 25 | 26 | activity.getAlertDialogBuilder() 27 | .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { dialog, which -> dialogConfirmed() } 28 | .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) 29 | .apply { 30 | activity.setupDialogStuff(binding.root, this) 31 | } 32 | } 33 | 34 | private fun dialogConfirmed() { 35 | binding.apply { 36 | val hours = myTimePickerHours.value 37 | val minutes = myTimePickerMinutes.value 38 | val seconds = myTimePickerSeconds.value 39 | callback(hours * 3600 + minutes * 60 + seconds) 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/dialogs/SelectAlarmDialog.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.dialogs 2 | 3 | import android.view.ViewGroup 4 | import android.widget.RadioGroup 5 | import androidx.appcompat.app.AlertDialog 6 | import com.simplemobiletools.clock.databinding.DialogSelectAlarmBinding 7 | import com.simplemobiletools.clock.databinding.ItemRadioButtonBinding 8 | import com.simplemobiletools.clock.models.Alarm 9 | import com.simplemobiletools.commons.activities.BaseSimpleActivity 10 | import com.simplemobiletools.commons.extensions.* 11 | 12 | class SelectAlarmDialog( 13 | val activity: BaseSimpleActivity, 14 | val alarms: List, 15 | val titleResId: Int, 16 | val onAlarmPicked: (alarm: Alarm?) -> Unit 17 | ) { 18 | private val binding = DialogSelectAlarmBinding.inflate(activity.layoutInflater, null, false) 19 | private var dialog: AlertDialog? = null 20 | 21 | init { 22 | addYourAlarms() 23 | 24 | activity.getAlertDialogBuilder() 25 | .setOnDismissListener { onAlarmPicked(null) } 26 | .setPositiveButton(com.simplemobiletools.commons.R.string.ok) { _, _ -> dialogConfirmed() } 27 | .setNegativeButton(com.simplemobiletools.commons.R.string.cancel, null) 28 | .apply { 29 | activity.setupDialogStuff(binding.root, this, titleResId) { alertDialog -> 30 | dialog = alertDialog 31 | } 32 | } 33 | } 34 | 35 | private fun addYourAlarms() { 36 | binding.dialogSelectAlarmRadio.removeAllViews() 37 | alarms.forEach { addAlarm(it) } 38 | } 39 | 40 | private fun addAlarm(alarm: Alarm) { 41 | val radioButton = ItemRadioButtonBinding.inflate(activity.layoutInflater).root.apply { 42 | text = alarm.label 43 | isChecked = false 44 | id = alarm.id 45 | setColors(activity.getProperTextColor(), activity.getProperPrimaryColor(), activity.getProperBackgroundColor()) 46 | } 47 | 48 | binding.dialogSelectAlarmRadio.addView(radioButton, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)) 49 | } 50 | 51 | private fun dialogConfirmed() { 52 | val checkedId = binding.dialogSelectAlarmRadio.checkedRadioButtonId 53 | onAlarmPicked(alarms.firstOrNull { it.id == checkedId }) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/extensions/Activity.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.extensions 2 | 3 | import com.simplemobiletools.clock.BuildConfig 4 | import com.simplemobiletools.commons.activities.BaseSimpleActivity 5 | import com.simplemobiletools.commons.dialogs.PermissionRequiredDialog 6 | import com.simplemobiletools.commons.extensions.canUseFullScreenIntent 7 | import com.simplemobiletools.commons.extensions.openFullScreenIntentSettings 8 | import com.simplemobiletools.commons.extensions.openNotificationSettings 9 | 10 | fun BaseSimpleActivity.handleFullScreenNotificationsPermission( 11 | notificationsCallback: (granted: Boolean) -> Unit, 12 | ) { 13 | handleNotificationPermission { granted -> 14 | if (granted) { 15 | if (canUseFullScreenIntent()) { 16 | notificationsCallback(true) 17 | } else { 18 | PermissionRequiredDialog( 19 | activity = this, 20 | textId = com.simplemobiletools.commons.R.string.allow_full_screen_notifications_reminders, 21 | positiveActionCallback = { 22 | openFullScreenIntentSettings(BuildConfig.APPLICATION_ID) 23 | }, 24 | negativeActionCallback = { 25 | notificationsCallback(false) 26 | } 27 | ) 28 | } 29 | } else { 30 | PermissionRequiredDialog( 31 | activity = this, 32 | textId = com.simplemobiletools.commons.R.string.allow_notifications_reminders, 33 | positiveActionCallback = { 34 | openNotificationSettings() 35 | }, 36 | negativeActionCallback = { 37 | notificationsCallback(false) 38 | } 39 | ) 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/extensions/Fragment.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.extensions 2 | 3 | import android.content.SharedPreferences 4 | import androidx.fragment.app.Fragment 5 | import androidx.fragment.app.FragmentActivity 6 | import androidx.preference.PreferenceManager 7 | 8 | val Fragment.requiredActivity: FragmentActivity get() = this.activity!! 9 | 10 | val Fragment.preferences: SharedPreferences get() = PreferenceManager.getDefaultSharedPreferences(requiredActivity) 11 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/extensions/Int.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.extensions 2 | 3 | import java.util.concurrent.TimeUnit 4 | 5 | val Int.secondsToMillis get() = TimeUnit.SECONDS.toMillis(this.toLong()) 6 | val Int.millisToSeconds get() = TimeUnit.MILLISECONDS.toSeconds(this.toLong()) 7 | 8 | fun Int.isBitSet(bit: Int) = (this shr bit and 1) > 0 9 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/extensions/Logs.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.extensions 2 | 3 | import android.util.Log 4 | import com.simplemobiletools.clock.BuildConfig 5 | 6 | fun A.log(tag: String) = apply { if (BuildConfig.DEBUG) Log.wtf(tag, this.toString()) } 7 | fun A.log(first: String, tag: String) = apply { if (BuildConfig.DEBUG) Log.wtf(tag, first) } 8 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/extensions/Long.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.extensions 2 | 3 | import android.text.format.DateFormat 4 | import com.simplemobiletools.commons.extensions.getFormattedDuration 5 | import java.util.Calendar 6 | import java.util.Locale 7 | import java.util.concurrent.TimeUnit 8 | import kotlin.math.roundToInt 9 | 10 | fun Long.formatStopwatchTime(useLongerMSFormat: Boolean): String { 11 | val MSFormat = if (useLongerMSFormat) "%03d" else "%01d" 12 | val hours = TimeUnit.MILLISECONDS.toHours(this) 13 | val minutes = TimeUnit.MILLISECONDS.toMinutes(this) - TimeUnit.HOURS.toMinutes(hours) 14 | val seconds = TimeUnit.MILLISECONDS.toSeconds(this) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(this)) 15 | var ms = this % 1000 16 | if (!useLongerMSFormat) { 17 | ms /= 100 18 | } 19 | 20 | return when { 21 | hours > 0 -> { 22 | val format = "%02d:%02d:%02d.$MSFormat" 23 | String.format(format, hours, minutes, seconds, ms) 24 | } 25 | 26 | minutes > 0 -> { 27 | val format = "%02d:%02d.$MSFormat" 28 | String.format(format, minutes, seconds, ms) 29 | } 30 | 31 | else -> { 32 | val format = "%d.$MSFormat" 33 | String.format(format, seconds, ms) 34 | } 35 | } 36 | } 37 | 38 | fun Long.timestampFormat(format: String = "dd. MM. yyyy"): String { 39 | val calendar = Calendar.getInstance(Locale.getDefault()) 40 | calendar.timeInMillis = this 41 | 42 | return DateFormat.format(format, calendar).toString() 43 | } 44 | 45 | fun Long.getFormattedDuration(forceShowHours: Boolean = false): String { 46 | return this.div(1000F).roundToInt().getFormattedDuration(forceShowHours) 47 | } 48 | 49 | val Long.secondsToMillis get() = TimeUnit.SECONDS.toMillis(this) 50 | val Long.millisToSeconds get() = TimeUnit.MILLISECONDS.toSeconds(this) 51 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/extensions/TextView.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.extensions 2 | 3 | import android.widget.TextView 4 | import com.simplemobiletools.commons.extensions.applyColorFilter 5 | 6 | fun TextView.colorCompoundDrawable(color: Int) { 7 | compoundDrawables.filterNotNull().forEach { drawable -> 8 | drawable.applyColorFilter(color) 9 | setCompoundDrawables(drawable, null, null, null) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/extensions/gson/TypeAdapter.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.extensions.gson 2 | 3 | import com.google.gson.Gson 4 | import com.google.gson.GsonBuilder 5 | import com.google.gson.TypeAdapterFactory 6 | import com.simplemobiletools.clock.models.TimerState 7 | 8 | val timerStates = valueOf() 9 | .registerSubtype(TimerState.Idle::class.java) 10 | .registerSubtype(TimerState.Running::class.java) 11 | .registerSubtype(TimerState.Paused::class.java) 12 | .registerSubtype(TimerState.Finished::class.java) 13 | 14 | inline fun valueOf(): RuntimeTypeAdapterFactory = RuntimeTypeAdapterFactory.of(T::class.java) 15 | 16 | fun GsonBuilder.registerTypes(vararg types: TypeAdapterFactory) = apply { 17 | types.forEach { registerTypeAdapterFactory(it) } 18 | } 19 | 20 | val gson: Gson = GsonBuilder().registerTypes(timerStates).create() 21 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/helpers/Converters.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.helpers 2 | 3 | import androidx.room.TypeConverter 4 | import com.simplemobiletools.clock.extensions.gson.gson 5 | import com.simplemobiletools.clock.models.StateWrapper 6 | import com.simplemobiletools.clock.models.TimerState 7 | 8 | class Converters { 9 | 10 | @TypeConverter 11 | fun jsonToTimerState(value: String): TimerState { 12 | return try { 13 | gson.fromJson(value, StateWrapper::class.java).state 14 | } catch (e: Exception) { 15 | TimerState.Idle 16 | } 17 | } 18 | 19 | @TypeConverter 20 | fun timerStateToJson(state: TimerState) = gson.toJson(StateWrapper(state)) 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/helpers/DisabledItemChangeAnimator.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.helpers 2 | 3 | import androidx.recyclerview.widget.DefaultItemAnimator 4 | import androidx.recyclerview.widget.RecyclerView 5 | 6 | /** 7 | * Simple RecyclerView animator that disable itemChange animations 8 | */ 9 | class DisabledItemChangeAnimator : DefaultItemAnimator() { 10 | override fun animateChange( 11 | oldHolder: RecyclerView.ViewHolder, 12 | newHolder: RecyclerView.ViewHolder, 13 | preInfo: ItemHolderInfo, 14 | postInfo: ItemHolderInfo 15 | ): Boolean { 16 | dispatchChangeFinished(oldHolder, false) 17 | return false 18 | } 19 | 20 | override fun animateChange( 21 | oldHolder: RecyclerView.ViewHolder?, 22 | newHolder: RecyclerView.ViewHolder?, 23 | fromX: Int, 24 | fromY: Int, 25 | toX: Int, 26 | toY: Int 27 | ): Boolean { 28 | dispatchChangeFinished(oldHolder, false) 29 | return false 30 | } 31 | 32 | override fun canReuseUpdatedViewHolder(viewHolder: RecyclerView.ViewHolder): Boolean { 33 | return true 34 | } 35 | 36 | override fun canReuseUpdatedViewHolder(viewHolder: RecyclerView.ViewHolder, payloads: MutableList): Boolean { 37 | return true 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyAnalogueTimeWidgetProvider.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.helpers 2 | 3 | import android.app.PendingIntent 4 | import android.appwidget.AppWidgetManager 5 | import android.appwidget.AppWidgetProvider 6 | import android.content.ComponentName 7 | import android.content.Context 8 | import android.content.Intent 9 | import android.os.Bundle 10 | import android.widget.RemoteViews 11 | import com.simplemobiletools.clock.R 12 | import com.simplemobiletools.clock.activities.SplashActivity 13 | import com.simplemobiletools.clock.extensions.config 14 | import com.simplemobiletools.commons.extensions.applyColorFilter 15 | import com.simplemobiletools.commons.extensions.getLaunchIntent 16 | 17 | class MyAnalogueTimeWidgetProvider : AppWidgetProvider() { 18 | override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { 19 | super.onUpdate(context, appWidgetManager, appWidgetIds) 20 | performUpdate(context) 21 | } 22 | 23 | private fun performUpdate(context: Context) { 24 | val appWidgetManager = AppWidgetManager.getInstance(context) ?: return 25 | appWidgetManager.getAppWidgetIds(getComponentName(context)).forEach { 26 | RemoteViews(context.packageName, R.layout.widget_analogue).apply { 27 | updateColors(context, this) 28 | setupAppOpenIntent(context, this) 29 | appWidgetManager.updateAppWidget(it, this) 30 | } 31 | } 32 | } 33 | 34 | private fun updateColors(context: Context, views: RemoteViews) { 35 | views.apply { 36 | applyColorFilter(R.id.widget_background, context.config.widgetBgColor) 37 | } 38 | } 39 | 40 | private fun getComponentName(context: Context) = ComponentName(context, this::class.java) 41 | 42 | private fun setupAppOpenIntent(context: Context, views: RemoteViews) { 43 | (context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)).apply { 44 | putExtra(OPEN_TAB, TAB_CLOCK) 45 | val pendingIntent = PendingIntent.getActivity(context, OPEN_APP_INTENT_ID, this, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) 46 | views.setOnClickPendingIntent(R.id.widget_date_time_holder, pendingIntent) 47 | } 48 | } 49 | 50 | override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, newOptions: Bundle?) { 51 | super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions) 52 | performUpdate(context) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/helpers/TimerHelper.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.helpers 2 | 3 | import android.content.Context 4 | import com.simplemobiletools.clock.extensions.timerDb 5 | import com.simplemobiletools.clock.models.Timer 6 | import com.simplemobiletools.commons.helpers.ensureBackgroundThread 7 | 8 | class TimerHelper(val context: Context) { 9 | private val timerDao = context.timerDb 10 | 11 | fun getTimers(callback: (timers: List) -> Unit) { 12 | ensureBackgroundThread { 13 | callback.invoke(timerDao.getTimers()) 14 | } 15 | } 16 | 17 | fun getTimer(timerId: Int, callback: (timer: Timer) -> Unit) { 18 | ensureBackgroundThread { 19 | callback.invoke(timerDao.getTimer(timerId)!!) 20 | } 21 | } 22 | 23 | fun tryGetTimer(timerId: Int, callback: (timer: Timer?) -> Unit) { 24 | ensureBackgroundThread { 25 | callback.invoke(timerDao.getTimer(timerId)) 26 | } 27 | } 28 | 29 | fun findTimers(seconds: Int, label: String, callback: (timers: List) -> Unit) { 30 | ensureBackgroundThread { 31 | callback.invoke(timerDao.findTimers(seconds, label)) 32 | } 33 | } 34 | 35 | fun insertOrUpdateTimer(timer: Timer, callback: (id: Long) -> Unit = {}) { 36 | ensureBackgroundThread { 37 | val id = timerDao.insertOrUpdateTimer(timer) 38 | callback.invoke(id) 39 | } 40 | } 41 | 42 | fun deleteTimer(id: Int, callback: () -> Unit = {}) { 43 | ensureBackgroundThread { 44 | timerDao.deleteTimer(id) 45 | callback.invoke() 46 | } 47 | } 48 | 49 | fun deleteTimers(timers: List, callback: () -> Unit = {}) { 50 | ensureBackgroundThread { 51 | timerDao.deleteTimers(timers) 52 | callback.invoke() 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/interfaces/TimerDao.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.interfaces 2 | 3 | import androidx.room.* 4 | import com.simplemobiletools.clock.models.Timer 5 | 6 | @Dao 7 | interface TimerDao { 8 | 9 | @Query("SELECT * FROM timers ORDER BY createdAt ASC") 10 | fun getTimers(): List 11 | 12 | @Query("SELECT * FROM timers WHERE id=:id") 13 | fun getTimer(id: Int): Timer? 14 | 15 | @Query("SELECT * FROM timers WHERE seconds=:seconds AND label=:label") 16 | fun findTimers(seconds: Int, label: String): List 17 | 18 | @Insert(onConflict = OnConflictStrategy.REPLACE) 19 | fun insertOrUpdateTimer(timer: Timer): Long 20 | 21 | @Query("DELETE FROM timers WHERE id=:id") 22 | fun deleteTimer(id: Int) 23 | 24 | @Delete 25 | fun deleteTimers(list: List) 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/interfaces/ToggleAlarmInterface.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.interfaces 2 | 3 | interface ToggleAlarmInterface { 4 | fun alarmToggled(id: Int, isEnabled: Boolean) 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/models/Alarm.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.models 2 | 3 | import androidx.annotation.Keep 4 | 5 | @Keep 6 | data class Alarm( 7 | var id: Int, 8 | var timeInMinutes: Int, 9 | var days: Int, 10 | var isEnabled: Boolean, 11 | var vibrate: Boolean, 12 | var soundTitle: String, 13 | var soundUri: String, 14 | var label: String, 15 | var oneShot: Boolean = false 16 | ) 17 | 18 | @Keep 19 | data class ObfuscatedAlarm( 20 | var a: Int, 21 | var b: Int, 22 | var c: Int, 23 | var d: Boolean, 24 | var e: Boolean, 25 | var f: String, 26 | var g: String, 27 | var h: String, 28 | var i: Boolean = false 29 | ) { 30 | fun toAlarm() = Alarm(a, b, c, d, e, f, g, h, i) 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/models/AlarmEvent.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.models 2 | 3 | sealed interface AlarmEvent { 4 | object Refresh : AlarmEvent 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/models/Lap.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.models 2 | 3 | import com.simplemobiletools.clock.helpers.SORT_BY_LAP 4 | import com.simplemobiletools.clock.helpers.SORT_BY_LAP_TIME 5 | import com.simplemobiletools.commons.helpers.SORT_DESCENDING 6 | 7 | data class Lap(val id: Int, var lapTime: Long, var totalTime: Long) : Comparable { 8 | companion object { 9 | var sorting = 0 10 | } 11 | 12 | override fun compareTo(other: Lap): Int { 13 | var result = when { 14 | sorting and SORT_BY_LAP != 0 -> when { 15 | id == other.id -> 0 16 | id > other.id -> 1 17 | else -> -1 18 | } 19 | 20 | sorting and SORT_BY_LAP_TIME != 0 -> when { 21 | lapTime == other.lapTime -> 0 22 | lapTime > other.lapTime -> 1 23 | else -> -1 24 | } 25 | 26 | else -> when { 27 | totalTime == other.totalTime -> 0 28 | totalTime > other.totalTime -> 1 29 | else -> -1 30 | } 31 | } 32 | 33 | if (sorting and SORT_DESCENDING != 0) { 34 | result *= -1 35 | } 36 | 37 | return result 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/models/MyTimeZone.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.models 2 | 3 | data class MyTimeZone(val id: Int, var title: String, val zoneName: String) 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/models/StateWrapper.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.models 2 | 3 | data class StateWrapper(val state: TimerState) 4 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/models/Timer.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.models 2 | 3 | import androidx.annotation.Keep 4 | import androidx.room.Entity 5 | import androidx.room.PrimaryKey 6 | 7 | @Entity(tableName = "timers") 8 | @Keep 9 | data class Timer( 10 | @PrimaryKey(autoGenerate = true) var id: Int?, 11 | var seconds: Int, 12 | val state: TimerState, 13 | var vibrate: Boolean, 14 | var soundUri: String, 15 | var soundTitle: String, 16 | var label: String, 17 | var createdAt: Long, 18 | var channelId: String? = null, 19 | var oneShot: Boolean = false 20 | ) 21 | 22 | @Keep 23 | data class ObfuscatedTimer( 24 | var a: Int?, 25 | var b: Int, 26 | // We ignore timer state and will just use idle 27 | val c: Map, 28 | var d: Boolean, 29 | var e: String, 30 | var f: String, 31 | var g: String, 32 | var h: Long, 33 | var i: String? = null, 34 | var j: Boolean = false 35 | ) { 36 | fun toTimer() = Timer(a, b, TimerState.Idle, d, e, f, g, h, i, j) 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/models/TimerEvent.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.models 2 | 3 | import com.simplemobiletools.clock.helpers.INVALID_TIMER_ID 4 | 5 | sealed class TimerEvent(open val timerId: Int) { 6 | data class Delete(override val timerId: Int) : TimerEvent(timerId) 7 | data class Reset(override val timerId: Int) : TimerEvent(timerId) 8 | data class Start(override val timerId: Int, val duration: Long) : TimerEvent(timerId) 9 | data class Pause(override val timerId: Int, val duration: Long) : TimerEvent(timerId) 10 | data class Finish(override val timerId: Int, val duration: Long) : TimerEvent(timerId) 11 | object Refresh : TimerEvent(INVALID_TIMER_ID) 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/models/TimerState.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.models 2 | 3 | import androidx.annotation.Keep 4 | 5 | @Keep 6 | sealed class TimerState { 7 | @Keep 8 | object Idle : TimerState() 9 | @Keep 10 | data class Running(val duration: Long, val tick: Long) : TimerState() 11 | @Keep 12 | data class Paused(val duration: Long, val tick: Long) : TimerState() 13 | @Keep 14 | object Finished : TimerState() 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/receivers/BootCompletedReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.receivers 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.simplemobiletools.clock.extensions.rescheduleEnabledAlarms 7 | 8 | class BootCompletedReceiver : BroadcastReceiver() { 9 | 10 | override fun onReceive(context: Context, intent: Intent) { 11 | context.rescheduleEnabledAlarms() 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/receivers/DismissAlarmReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.receivers 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.simplemobiletools.clock.extensions.* 7 | import com.simplemobiletools.clock.helpers.ALARM_ID 8 | import com.simplemobiletools.clock.helpers.NOTIFICATION_ID 9 | import com.simplemobiletools.clock.models.Alarm 10 | import com.simplemobiletools.commons.extensions.removeBit 11 | import com.simplemobiletools.commons.helpers.ensureBackgroundThread 12 | import java.util.Calendar 13 | import kotlin.math.pow 14 | 15 | class DismissAlarmReceiver : BroadcastReceiver() { 16 | override fun onReceive(context: Context, intent: Intent) { 17 | val alarmId = intent.getIntExtra(ALARM_ID, -1) 18 | val notificationId = intent.getIntExtra(NOTIFICATION_ID, -1) 19 | if (alarmId == -1) { 20 | return 21 | } 22 | 23 | context.hideNotification(notificationId) 24 | 25 | ensureBackgroundThread { 26 | context.dbHelper.getAlarmWithId(alarmId)?.let { alarm -> 27 | context.cancelAlarmClock(alarm) 28 | scheduleNextAlarm(alarm, context) 29 | if (alarm.days < 0) { 30 | if (alarm.oneShot) { 31 | alarm.isEnabled = false 32 | context.dbHelper.deleteAlarms(arrayListOf(alarm)) 33 | } else { 34 | context.dbHelper.updateAlarmEnabledState(alarm.id, false) 35 | } 36 | context.updateWidgets() 37 | } 38 | } 39 | } 40 | } 41 | 42 | private fun scheduleNextAlarm(alarm: Alarm, context: Context) { 43 | val oldBitmask = alarm.days 44 | alarm.days = removeTodayFromBitmask(oldBitmask) 45 | context.scheduleNextAlarm(alarm, false) 46 | alarm.days = oldBitmask 47 | } 48 | 49 | private fun removeTodayFromBitmask(bitmask: Int): Int { 50 | val calendar = Calendar.getInstance() 51 | calendar.firstDayOfWeek = Calendar.MONDAY 52 | val dayOfWeek = (calendar.get(Calendar.DAY_OF_WEEK) + 5) % 7 53 | val todayBitmask = 2.0.pow(dayOfWeek).toInt() 54 | return bitmask.removeBit(todayBitmask) 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/receivers/HideAlarmReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.receivers 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.simplemobiletools.clock.extensions.dbHelper 7 | import com.simplemobiletools.clock.extensions.deleteNotificationChannel 8 | import com.simplemobiletools.clock.extensions.hideNotification 9 | import com.simplemobiletools.clock.extensions.updateWidgets 10 | import com.simplemobiletools.clock.helpers.ALARM_ID 11 | import com.simplemobiletools.clock.helpers.ALARM_NOTIFICATION_CHANNEL_ID 12 | import com.simplemobiletools.commons.helpers.ensureBackgroundThread 13 | 14 | class HideAlarmReceiver : BroadcastReceiver() { 15 | override fun onReceive(context: Context, intent: Intent) { 16 | val id = intent.getIntExtra(ALARM_ID, -1) 17 | val channelId = intent.getStringExtra(ALARM_NOTIFICATION_CHANNEL_ID) 18 | channelId?.let { context.deleteNotificationChannel(channelId) } 19 | context.hideNotification(id) 20 | 21 | ensureBackgroundThread { 22 | val alarm = context.dbHelper.getAlarmWithId(id) 23 | if (alarm != null && alarm.days < 0) { 24 | if (alarm.oneShot) { 25 | alarm.isEnabled = false 26 | context.dbHelper.deleteAlarms(arrayListOf(alarm)) 27 | } else { 28 | context.dbHelper.updateAlarmEnabledState(alarm.id, false) 29 | } 30 | context.updateWidgets() 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/receivers/HideTimerReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.receivers 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.simplemobiletools.clock.extensions.hideTimerNotification 7 | import com.simplemobiletools.clock.helpers.INVALID_TIMER_ID 8 | import com.simplemobiletools.clock.helpers.TIMER_ID 9 | import com.simplemobiletools.clock.models.TimerEvent 10 | import org.greenrobot.eventbus.EventBus 11 | 12 | class HideTimerReceiver : BroadcastReceiver() { 13 | override fun onReceive(context: Context, intent: Intent) { 14 | val timerId = intent.getIntExtra(TIMER_ID, INVALID_TIMER_ID) 15 | context.hideTimerNotification(timerId) 16 | EventBus.getDefault().post(TimerEvent.Reset(timerId)) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/receivers/UpdateWidgetReceiver.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.receivers 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import com.simplemobiletools.clock.extensions.updateWidgets 7 | 8 | class UpdateWidgetReceiver : BroadcastReceiver() { 9 | override fun onReceive(context: Context, intent: Intent) { 10 | context.updateWidgets() 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /app/src/main/kotlin/com/simplemobiletools/clock/services/SnoozeService.kt: -------------------------------------------------------------------------------- 1 | package com.simplemobiletools.clock.services 2 | 3 | import android.app.IntentService 4 | import android.content.Intent 5 | import com.simplemobiletools.clock.extensions.config 6 | import com.simplemobiletools.clock.extensions.dbHelper 7 | import com.simplemobiletools.clock.extensions.hideNotification 8 | import com.simplemobiletools.clock.extensions.setupAlarmClock 9 | import com.simplemobiletools.clock.helpers.ALARM_ID 10 | import com.simplemobiletools.commons.helpers.MINUTE_SECONDS 11 | 12 | class SnoozeService : IntentService("Snooze") { 13 | override fun onHandleIntent(intent: Intent?) { 14 | val id = intent!!.getIntExtra(ALARM_ID, -1) 15 | val alarm = dbHelper.getAlarmWithId(id) ?: return 16 | hideNotification(id) 17 | setupAlarmClock(alarm, config.snoozeTime * MINUTE_SECONDS) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/res/anim/pulsing_animation.xml: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_clock_shadowed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/drawable-hdpi/ic_clock_shadowed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/img_analogue_widget_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/drawable-nodpi/img_analogue_widget_preview.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-nodpi/img_digital_widget_preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/drawable-nodpi/img_digital_widget_preview.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-v26/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_clock_shadowed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/drawable-xhdpi/ic_clock_shadowed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_clock_shadowed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/drawable-xxhdpi/ic_clock_shadowed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_clock_shadowed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/drawable-xxxhdpi/ic_clock_shadowed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_background_filled.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 9 | 10 | 12 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/circle_background_stroke.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 9 | 10 | 12 | 13 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alarm_filled_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alarm_off_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_alarm_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_clock_small.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hourglass_filled_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hourglass_small.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hourglass_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_monochrome.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_sorting_triangle_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_stopwatch_filled_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_stopwatch_vector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/pulsing_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 8 | 9 | 12 | 13 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/shortcut_stopwatch.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 21 | 22 | 27 | 28 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/alarm_day.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_change_alarm_sort.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 | 23 | 24 | 31 | 32 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_edit_time_zone.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 16 | 17 | 24 | 25 | 26 | 27 | 32 | 33 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_my_time_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 20 | 21 | 29 | 30 | 40 | 41 | 48 | 49 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_select_alarm.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/layout/dialog_select_time_zones.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_alarm.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 | 22 | 23 | 24 | 25 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_timer.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 22 | 23 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_add_time_zone.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 23 | 24 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_lap.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 23 | 24 | 35 | 36 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_radio_button.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/layout/item_time_zone.xml: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 18 | 19 | 31 | 32 | 46 | 47 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /app/src/main/res/layout/widget_analogue.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | 27 | 28 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_alarms.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/cab_timezones.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 9 | 14 | 19 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_amber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_amber.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_blue.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_brown.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_green.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_lime.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_pink.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_purple.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_red.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_teal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_teal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_green.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_red.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SimpleMobileTools/Simple-Clock/28b9866ff7baafc8447ea3075baa7720f45926ec/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png -------------------------------------------------------------------------------- /app/src/main/res/values-zh-rCN/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 简单时钟 4 | 时钟 5 | 时区 6 | 震动 7 | 未选择哪一天 8 | 时钟 9 | 定时器 10 | 秒表 11 | 开始秒表 12 | 分段 13 | 秒表已停止 14 | 定时器已停止 15 | 最长提醒持续时间 16 | 时间结束 17 | 时钟和日期 18 | 使用文字阴影 19 | 右滑关闭,或者左滑贪睡。 20 | 创建顺序 21 | 闹铃时间 22 | 天和闹铃时间 23 | 指针式时钟 24 | 数字时钟 25 | 闹钟已停止 26 | 选择要放弃的定时器 27 | 选择要放弃的闹铃 28 | 创建了闹铃 29 | 闹钟延后了 %s 30 | 未找到闹铃 31 | 添加闹钟 32 | 未找到计时器 33 | 添加计时器 34 | 即将到来的闹铃 35 | 提前取消闹铃 36 | 37 | 计时器正在运行 38 | %s 的计时器正在运行 39 | 新建计时器 40 | 41 | %d 个计时器正在运行 42 | 43 | 44 | 时钟页面 45 | 闹钟页面 46 | 秒表页面 47 | 定时器页面 48 | 显示秒数 49 | 音量渐增 50 | 51 | 秒表页面分段的排序如何更改? 52 | 只要点击任一栏位,就会依据选定的栏位做排序。再多点一下,还能切换递增或者递减顺序。 53 | 57 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 38dp 3 | 60dp 4 | 64dp 5 | 70dp 6 | 80dp 7 | 18dp 8 | 48dp 9 | 96dp 10 | 68dp 11 | 50dp 12 | 56dp 13 | 24dp 14 | 15 | 70sp 16 | 60sp 17 | 60sp 18 | 80sp 19 | 48sp 20 | 14sp 21 | 32sp 22 | 26sp 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/values/donottranslate.xml: -------------------------------------------------------------------------------- 1 | 2 | com.simplemobiletools.clock 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/integers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 0 4 | -1 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 |