From 73d454eb96526eb960ae6e3ffb5a2574a0350753 Mon Sep 17 00:00:00 2001 From: Christopher Beckmann Date: Wed, 6 Sep 2017 11:27:36 +0200 Subject: [PATCH] The ExerciseSet can now be chosen in the TimerActivity. The splash screen as well as the tutorial have been built in. The navigation drawer is now functional. You can now create and delete exercise sets via the ManageExerciseSetsActivity. Started building the EditExerciseSetActivity, where should be able to edit an exercise set. --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 60 ++- app/src/main/assets/exercises.sqlite | Bin 240640 -> 240640 bytes .../ExerciseLocale.java | 30 ++ .../activities/AboutActivity.java | 6 - .../activities/EditExerciseSetActivity.java | 218 +++++++++++ .../activities/ExerciseActivity.java | 2 +- .../ExerciseSetOverviewActivity.java | 77 ---- .../activities/HelpActivity.java | 23 +- .../ManageExerciseSetsActivity.java | 352 ++++++++++++++++++ .../activities/SplashActivity.java | 35 ++ .../activities/TimerActivity.java | 69 +++- ...seAdapter.java => ExerciseSetAdapter.java} | 47 ++- .../adapter/ExerciseSetListAdapter.java | 188 ++++++++++ .../adapter/ExerciseSetSpinnerAdapter.java | 126 +++++++ .../activities/helper/BaseActivity.java | 214 +++++++++++ .../activities/{ => old}/BreakActivity.java | 2 +- .../{ => old}/BreakDeciderActivity.java | 3 +- .../activities/{ => old}/BreakReminder.java | 5 +- .../{ => old}/ExerciseTypeActivity.java | 2 +- .../activities/{ => old}/ProfileActivity.java | 3 +- .../activities/tutorial/PrefManager.java | 29 ++ .../activities/tutorial/TutorialActivity.java | 219 +++++++++++ .../database/SQLiteHelper.java | 121 ++++-- .../database/columns/ExerciseSetColumns.java | 2 +- .../database/data/Exercise.java | 16 +- .../database/data/ExerciseSet.java | 20 +- .../widget/AppWidget.java | 2 +- .../res/drawable-hdpi/ic_add_white_24dp.png | Bin 0 -> 127 bytes .../drawable-hdpi/ic_delete_black_24dp.png | Bin 0 -> 155 bytes .../res/drawable-hdpi/ic_home_black_48dp.png | Bin 303 -> 0 bytes .../res/drawable-hdpi/ic_info_black_24dp.png | Bin 321 -> 0 bytes .../res/drawable-hdpi/ic_list_white_24dp.png | Bin 0 -> 116 bytes .../drawable-hdpi/ic_mode_edit_black_24dp.png | Bin 0 -> 202 bytes .../ic_notifications_black_24dp.png | Bin 233 -> 0 bytes .../res/drawable-hdpi/ic_pause_black_48dp.png | Bin 109 -> 0 bytes .../ic_play_arrow_black_48dp.png | Bin 265 -> 0 bytes .../res/drawable-hdpi/ic_sync_black_24dp.png | Bin 368 -> 0 bytes .../res/drawable-mdpi/ic_add_white_24dp.png | Bin 0 -> 88 bytes .../drawable-mdpi/ic_delete_black_24dp.png | Bin 0 -> 111 bytes .../res/drawable-mdpi/ic_home_black_48dp.png | Bin 239 -> 0 bytes .../res/drawable-mdpi/ic_info_black_24dp.png | Bin 222 -> 0 bytes .../res/drawable-mdpi/ic_list_white_24dp.png | Bin 0 -> 86 bytes .../drawable-mdpi/ic_mode_edit_black_24dp.png | Bin 0 -> 160 bytes .../ic_notifications_black_24dp.png | Bin 182 -> 0 bytes .../res/drawable-mdpi/ic_pause_black_48dp.png | Bin 101 -> 0 bytes .../ic_play_arrow_black_48dp.png | Bin 208 -> 0 bytes .../res/drawable-mdpi/ic_sync_black_24dp.png | Bin 250 -> 0 bytes .../main/res/drawable-v21/ic_menu_manage.xml | 9 - .../res/drawable-xhdpi/ic_add_white_24dp.png | Bin 0 -> 97 bytes .../drawable-xhdpi/ic_delete_black_24dp.png | Bin 0 -> 148 bytes .../res/drawable-xhdpi/ic_home_black_48dp.png | Bin 356 -> 0 bytes .../res/drawable-xhdpi/ic_info_black_24dp.png | Bin 412 -> 0 bytes .../res/drawable-xhdpi/ic_list_white_24dp.png | Bin 0 -> 95 bytes .../ic_mode_edit_black_24dp.png} | Bin .../ic_notifications_black_24dp.png | Bin 278 -> 0 bytes .../drawable-xhdpi/ic_pause_black_48dp.png | Bin 111 -> 0 bytes .../ic_play_arrow_black_48dp.png | Bin 320 -> 0 bytes .../res/drawable-xhdpi/ic_sync_black_24dp.png | Bin 467 -> 0 bytes .../res/drawable-xxhdpi/ic_add_white_24dp.png | Bin 0 -> 97 bytes .../drawable-xxhdpi/ic_create_black_48dp.png | Bin 433 -> 0 bytes .../drawable-xxhdpi/ic_delete_black_24dp.png | Bin 0 -> 191 bytes .../drawable-xxhdpi/ic_home_black_48dp.png | Bin 485 -> 0 bytes .../drawable-xxhdpi/ic_info_black_24dp.png | Bin 579 -> 0 bytes .../drawable-xxhdpi/ic_list_white_24dp.png | Bin 0 -> 94 bytes .../ic_mode_edit_black_24dp.png} | Bin .../ic_notifications_black_24dp.png | Bin 383 -> 0 bytes .../drawable-xxhdpi/ic_pause_black_48dp.png | Bin 127 -> 0 bytes .../ic_play_arrow_black_48dp.png | Bin 394 -> 0 bytes .../drawable-xxhdpi/ic_sync_black_24dp.png | Bin 669 -> 0 bytes .../drawable-xxxhdpi/ic_add_white_24dp.png | Bin 0 -> 102 bytes .../drawable-xxxhdpi/ic_create_black_48dp.png | Bin 578 -> 0 bytes .../drawable-xxxhdpi/ic_delete_black_24dp.png | Bin 0 -> 237 bytes .../drawable-xxxhdpi/ic_home_black_48dp.png | Bin 589 -> 0 bytes .../drawable-xxxhdpi/ic_info_black_24dp.png | Bin 766 -> 0 bytes .../drawable-xxxhdpi/ic_list_white_24dp.png | Bin 0 -> 100 bytes .../ic_mode_edit_black_24dp.png} | Bin .../ic_notifications_black_24dp.png | Bin 497 -> 0 bytes .../drawable-xxxhdpi/ic_pause_black_48dp.png | Bin 128 -> 0 bytes .../ic_play_arrow_black_48dp.png | Bin 515 -> 0 bytes .../drawable-xxxhdpi/ic_sync_black_24dp.png | Bin 875 -> 0 bytes .../main/res/drawable/bg_splash_screen.xml | 11 + app/src/main/res/drawable/ic_alarm_black.xml | 9 + app/src/main/res/drawable/ic_check_white.xml | 9 + app/src/main/res/drawable/ic_close_white.xml | 9 + app/src/main/res/drawable/ic_create_black.xml | 4 + app/src/main/res/drawable/ic_delete_white.xml | 9 + app/src/main/res/drawable/ic_home_black.xml | 4 + .../ic_info_black.xml} | 0 .../main/res/drawable/ic_list_black_24px.xml | 5 + .../main/res/drawable/ic_list_white_24px.xml | 9 + .../main/res/drawable/ic_menu_tutorial.xml | 10 + .../main/res/drawable/ic_pause_black_48dp.xml | 4 + .../main/res/drawable/ic_play_arrow_black.xml | 5 + .../res/drawable/ic_settings_black_24dp.xml | 9 + .../res/drawable/ic_view_list_black_24px.xml | 5 + .../main/res/drawable/progress_circular.xml | 22 ++ ..._small.xml => progress_circular_small.xml} | 0 app/src/main/res/layout/activity_break.xml | 2 +- .../res/layout/activity_break_decider.xml | 2 +- .../res/layout/activity_break_reminder.xml | 4 +- .../res/layout/activity_edit_exercise_set.xml | 83 +++++ app/src/main/res/layout/activity_exercise.xml | 4 +- .../main/res/layout/activity_exercise_set.xml | 36 -- app/src/main/res/layout/activity_help.xml | 2 +- .../layout/activity_manage_exercise_set.xml | 93 +++++ app/src/main/res/layout/activity_timer.xml | 352 ++++++++++-------- app/src/main/res/layout/activity_tutorial.xml | 50 +++ .../res/layout/content_break_reminder.xml | 2 +- .../res/layout/dialog_add_exercise_set.xml | 30 ++ app/src/main/res/layout/layout_exercise.xml | 6 +- .../main/res/layout/layout_exercise_set.xml | 107 ++++-- .../layout/layout_round_exercise_image.xml | 25 ++ app/src/main/res/layout/layout_toolbar.xml | 16 + ...ader_break_reminder.xml => nav_header.xml} | 23 +- app/src/main/res/layout/tutorial_slide1.xml | 42 +++ app/src/main/res/layout/tutorial_slide2.xml | 44 +++ app/src/main/res/layout/tutorial_slide3.xml | 43 +++ .../menu/activity_break_reminder_drawer.xml | 19 - .../main/res/menu/menu_edit_exercise_sets.xml | 10 + .../res/menu/menu_manage_exercise_sets.xml | 5 + app/src/main/res/menu/nav_drawer.xml | 35 ++ app/src/main/res/mipmap-hdpi/splash_icon.png | Bin 0 -> 3060 bytes app/src/main/res/mipmap-mdpi/splash_icon.png | Bin 0 -> 2219 bytes app/src/main/res/mipmap-xhdpi/splash_icon.png | Bin 0 -> 4508 bytes .../main/res/mipmap-xxhdpi/splash_icon.png | Bin 0 -> 6959 bytes .../main/res/mipmap-xxxhdpi/splash_icon.png | Bin 0 -> 10397 bytes app/src/main/res/values/colors.xml | 5 + app/src/main/res/values/dimens.xml | 10 + app/src/main/res/values/strings.xml | 120 ++++++ app/src/main/res/values/styles.xml | 5 + app/src/main/res/xml/pref_headers.xml | 2 +- 132 files changed, 2736 insertions(+), 446 deletions(-) create mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/ExerciseLocale.java create mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java delete mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseSetOverviewActivity.java create mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ManageExerciseSetsActivity.java create mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/SplashActivity.java rename app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/{ExerciseAdapter.java => ExerciseSetAdapter.java} (65%) create mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetListAdapter.java create mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetSpinnerAdapter.java create mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/BaseActivity.java rename app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/{ => old}/BreakActivity.java (99%) rename app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/{ => old}/BreakDeciderActivity.java (88%) rename app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/{ => old}/BreakReminder.java (98%) rename app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/{ => old}/ExerciseTypeActivity.java (97%) rename app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/{ => old}/ProfileActivity.java (97%) create mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/PrefManager.java create mode 100644 app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/TutorialActivity.java create mode 100644 app/src/main/res/drawable-hdpi/ic_add_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_delete_black_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_home_black_48dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_info_black_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_list_white_24dp.png create mode 100644 app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_pause_black_48dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_play_arrow_black_48dp.png delete mode 100644 app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_add_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_delete_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_home_black_48dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_info_black_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_list_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_pause_black_48dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_play_arrow_black_48dp.png delete mode 100644 app/src/main/res/drawable-mdpi/ic_sync_black_24dp.png delete mode 100644 app/src/main/res/drawable-v21/ic_menu_manage.xml create mode 100644 app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_home_black_48dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_info_black_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_list_white_24dp.png rename app/src/main/res/{drawable-mdpi/ic_create_black_48dp.png => drawable-xhdpi/ic_mode_edit_black_24dp.png} (100%) delete mode 100644 app/src/main/res/drawable-xhdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_pause_black_48dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_play_arrow_black_48dp.png delete mode 100644 app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_create_black_48dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_home_black_48dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png rename app/src/main/res/{drawable-hdpi/ic_create_black_48dp.png => drawable-xxhdpi/ic_mode_edit_black_24dp.png} (100%) delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_pause_black_48dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_play_arrow_black_48dp.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_create_black_48dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_delete_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_home_black_48dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_info_black_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png rename app/src/main/res/{drawable-xhdpi/ic_create_black_48dp.png => drawable-xxxhdpi/ic_mode_edit_black_24dp.png} (100%) delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_pause_black_48dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_play_arrow_black_48dp.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png create mode 100644 app/src/main/res/drawable/bg_splash_screen.xml create mode 100644 app/src/main/res/drawable/ic_alarm_black.xml create mode 100644 app/src/main/res/drawable/ic_check_white.xml create mode 100644 app/src/main/res/drawable/ic_close_white.xml create mode 100644 app/src/main/res/drawable/ic_create_black.xml create mode 100644 app/src/main/res/drawable/ic_delete_white.xml create mode 100644 app/src/main/res/drawable/ic_home_black.xml rename app/src/main/res/{drawable-v21/ic_info_black_24dp.xml => drawable/ic_info_black.xml} (100%) create mode 100644 app/src/main/res/drawable/ic_list_black_24px.xml create mode 100644 app/src/main/res/drawable/ic_list_white_24px.xml create mode 100644 app/src/main/res/drawable/ic_menu_tutorial.xml create mode 100644 app/src/main/res/drawable/ic_pause_black_48dp.xml create mode 100644 app/src/main/res/drawable/ic_play_arrow_black.xml create mode 100644 app/src/main/res/drawable/ic_settings_black_24dp.xml create mode 100644 app/src/main/res/drawable/ic_view_list_black_24px.xml create mode 100644 app/src/main/res/drawable/progress_circular.xml rename app/src/main/res/drawable/{circular_small.xml => progress_circular_small.xml} (100%) create mode 100644 app/src/main/res/layout/activity_edit_exercise_set.xml delete mode 100644 app/src/main/res/layout/activity_exercise_set.xml create mode 100644 app/src/main/res/layout/activity_manage_exercise_set.xml create mode 100644 app/src/main/res/layout/activity_tutorial.xml create mode 100644 app/src/main/res/layout/dialog_add_exercise_set.xml create mode 100644 app/src/main/res/layout/layout_round_exercise_image.xml create mode 100644 app/src/main/res/layout/layout_toolbar.xml rename app/src/main/res/layout/{nav_header_break_reminder.xml => nav_header.xml} (69%) create mode 100644 app/src/main/res/layout/tutorial_slide1.xml create mode 100644 app/src/main/res/layout/tutorial_slide2.xml create mode 100644 app/src/main/res/layout/tutorial_slide3.xml delete mode 100644 app/src/main/res/menu/activity_break_reminder_drawer.xml create mode 100644 app/src/main/res/menu/menu_edit_exercise_sets.xml create mode 100644 app/src/main/res/menu/menu_manage_exercise_sets.xml create mode 100644 app/src/main/res/menu/nav_drawer.xml create mode 100644 app/src/main/res/mipmap-hdpi/splash_icon.png create mode 100644 app/src/main/res/mipmap-mdpi/splash_icon.png create mode 100644 app/src/main/res/mipmap-xhdpi/splash_icon.png create mode 100644 app/src/main/res/mipmap-xxhdpi/splash_icon.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/splash_icon.png diff --git a/app/build.gradle b/app/build.gradle index a670b52..6ee06b2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,6 +10,7 @@ android { targetSdkVersion 24 versionCode 2 versionName "2.0" + vectorDrawables.useSupportLibrary = true } buildTypes { release { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b8b1620..5cf9a2d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,7 +12,7 @@ android:supportsRtl="true" android:theme="@style/AppTheme"> + android:value="org.secuso.privacyfriendlybreakreminder.activities.old.BreakReminder" /> + android:name=".activities.SplashActivity" + android:icon="@mipmap/splash_icon" + android:theme="@style/SplashTheme"> - + + - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/exercises.sqlite b/app/src/main/assets/exercises.sqlite index 6aa2396f1c2f92df2a902288d5facc89b4d1ecb7..c5a29e65e968db6a8cca4519299d587ed75702fc 100644 GIT binary patch delta 669 zcmaKo&r6g+7{_PkJF_#dZM**3+|YCpRuja?4icUGl|iC`)!yZ1NfNeJze1mI})3T#gp;Q%m zWQD@x;TEM_oB;d;41!z6ezQp_AGS^(x2EX@Zc1r}8MbE}GfUt3TXt+AT9!TSW3$o3 zWGvL5jLpXrrV?%#Po|utQH_Bc_T;n?wSf_P>X8xF$vQSK@&T$`5qr&OtKLa8yM;s# zt(9be;5{7H&pt3ec}@oOx!EpvKYdJfe`=a{HVn4t4c3awc1G_lymB39T~!M@M3~DQ z)=dwMyrb(E`_8P)t#a8AiO^iH&K`_X=)%EOt>=SUrrJB~jGdZ_I`)KPrzaAVar=Qa zK6rOLG%{-9_DWm%Z8%JGe!Vf5ZT)}u@NiYf>R~p2n5Ds|_=$IUub1T^Iv65U?<|Jv kWHm*Yo_1kxtC>vG>v{E<)lt!G7E|>kw8rwGHGFCN2S78WV*mgE delta 804 zcmYk)Ur3Wt6aet=-1Gh0AE&1Cn`q9A4P~M&BT+CgT_mXe!B{AvrVA<^x^I;aZn~-T z5L$A9kJbr6fXV6dD*L=p0qqi15O+wS7=Po>g>V#YMe!(o?~f0Wh3$)?D5?rB z3HS@Q4XgSAEA1x(-MtD!!QL9^xvBsq^`U+}gU-viCSVGG;5KgJ2Cm^K1`UUG3Hh>O zbxSe=Fj11y0VOdVn1~1_CNeaESp?GflPRgWGOnaMea9{QgzLD1tN6}vI36H>rDc{Y zBBVRXyAh?`NCgp0)LIrz0A?mpFqsw$RaK6 z@+k4yOU!tP({AEP3Gv2B3>Fa68nKo`M6-x>3t^KNOT|V|45{xvgAV>SSY#{*t6`r6 za{|`lYt&f-%&`n;@d3&E_)R z5b70YG@p|%u#zL*z)&F6b6F4Q3Ju$$Xig`@BH`|feSy85y`(NaBx`3p>5KesG!HG+ z9ef(x+=|(Tu1~93A|wT7Fr6KSq#rat&mBI_UwpOlTf-TacwJoIeT+B#7`_8`^~xBN zwTPebh3guB7CNY_? zT3G`5({MpaX_ka8_&0l}9tbNLGCKDvdg AVAILABLE_LOCALE = new HashSet<>(); + + static { + AVAILABLE_LOCALE.addAll( + Arrays.asList( + "en", "de" + ) + ); + }; + + /** + * @return the available language. If the default language of the device is not available. {@code "en"} will be returned. + */ + public static String getLocale() { + String locale = Locale.getDefault().getLanguage(); + return AVAILABLE_LOCALE.contains(locale) ? locale : "en"; + } +} diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/AboutActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/AboutActivity.java index 7a326e0..d50d10e 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/AboutActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/AboutActivity.java @@ -17,12 +17,6 @@ public class AboutActivity extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.about); - - ActionBar ab = getSupportActionBar(); - if(ab != null) { - ab.setDisplayHomeAsUpEnabled(true); - } - View mainContent = findViewById(R.id.main_content); if (mainContent != null) { mainContent.setAlpha(0); diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java new file mode 100644 index 0000000..d959f26 --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/EditExerciseSetActivity.java @@ -0,0 +1,218 @@ +package org.secuso.privacyfriendlybreakreminder.activities; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.content.DialogInterface; +import android.content.Intent; +import android.support.v4.content.AsyncTaskLoader; +import android.support.v4.content.Loader; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AlertDialog; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.GridLayoutManager; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.TextView; + +import org.secuso.privacyfriendlybreakreminder.ExerciseLocale; +import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseSetAdapter; +import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper; +import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; + +public class EditExerciseSetActivity extends AppCompatActivity implements android.support.v4.app.LoaderManager.LoaderCallbacks { + + // extras + public static final String EXTRA_EXERCISE_SET_ID = "EXTRA_EXERCISE_SET_ID"; + public static final String EXTRA_EXERCISE_SET_NAME = "EXTRA_EXERCISE_SET_NAME"; + + // UI + private TextView exerciseSetNameText; + private RecyclerView exerciseList; + private ProgressBar loadingSpinner; + + private ExerciseSetAdapter exerciseSetAdapter; + private ActionBar actionBar; + private Toolbar toolbar; + + // exercise set information + private long exerciseSetId = -1L; + private String exerciseSetName = ""; + private boolean modificationsDone = false; + + //methods + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_edit_exercise_set); + + Intent i = getIntent(); + exerciseSetId = i.getLongExtra(EXTRA_EXERCISE_SET_ID, -1L); + exerciseSetName = i.getStringExtra(EXTRA_EXERCISE_SET_NAME); + + if(exerciseSetId < 0L || TextUtils.isEmpty(exerciseSetName)) { + // no valid exercise + super.onBackPressed(); + } + + initResources(); + + getSupportLoaderManager().initLoader(0, null, this); + } + + private void initResources() { + toolbar = (Toolbar) findViewById(R.id.toolbar); + exerciseSetNameText = (TextView) findViewById(R.id.exercise_set_name); + exerciseList = (RecyclerView) findViewById(R.id.exercise_list); + exerciseSetAdapter = new ExerciseSetAdapter(this, null); + exerciseList.setAdapter(exerciseSetAdapter); + //exerciseList.setLayoutManager(new GridLayoutManager(this, 2)); + exerciseList.setLayoutManager(new LinearLayoutManager(this)); + loadingSpinner = (ProgressBar) findViewById(R.id.loading_spinner); + + exerciseSetNameText.setText(exerciseSetName); + exerciseSetNameText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + + @Override + public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { } + + @Override + public void afterTextChanged(Editable editable) { + modificationsDone = true; + } + }); + + setupActionBar(); + } + + private void setupActionBar() { + if (getSupportActionBar() == null) { + setSupportActionBar(toolbar); + } + + actionBar = getSupportActionBar(); + + if(actionBar != null) { + actionBar.setTitle(R.string.activity_title_edit_exercise_set); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeAsUpIndicator(R.drawable.ic_close_white); + } + } + + @Override + public Loader onCreateLoader(int id, final Bundle args) { + return new AsyncTaskLoader(this) { + @Override + public ExerciseSet loadInBackground() { + SQLiteHelper helper = new SQLiteHelper(getContext()); + + return helper.getExerciseListForSet((int)exerciseSetId, ExerciseLocale.getLocale()); + } + + @Override + protected void onStartLoading() { + loadingSpinner.setVisibility(View.VISIBLE); + forceLoad(); + } + + @Override + protected void onReset() {} + }; + } + + @Override + public void onLoadFinished(Loader loader, ExerciseSet set) { + loadingSpinner.animate().alpha(0.0f).setDuration(500).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + loadingSpinner.setVisibility(View.GONE); + } + }); + + exerciseSetAdapter.updateData(set); + } + + @Override + public void onLoaderReset(Loader loader) {} + +// @Override +// protected void onResume() { +// super.onResume(); +// +// getSupportLoaderManager().restartLoader(0, null, this); +// } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + if(modificationsDone) { + showDiscardDialog(); + } else { + super.onBackPressed(); + } + return true; + case R.id.save: + saveChanges(); + super.onBackPressed(); + return true; + } + return super.onOptionsItemSelected(item); + } + + private void saveChanges() { + ExerciseSet set = exerciseSetAdapter.getExerciseSet(); + + // TODO: save changes to database + // man könnte den unterschied, der gespeichert werden muss rausfinden, indem man nur die änderungen speichert.. + // man könnte auch einfach alle dateneinträge zu dem set löschen und neu eintragen + // man könnte das exerciseSet clonable machen und eine original kopie abspeichern und dann mit dem aus dem adapter vergleichen + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.menu_edit_exercise_sets, menu); + return super.onCreateOptionsMenu(menu); + } + + @Override + public void onBackPressed() { + if(modificationsDone) { + showDiscardDialog(); + } else { + super.onBackPressed(); + } + } + + private void showDiscardDialog() { + new AlertDialog.Builder(this) + .setPositiveButton(R.string.keep_editing, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + dialogInterface.dismiss(); + } + }) + .setNegativeButton(R.string.discard, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + EditExerciseSetActivity.super.onBackPressed(); + } + }) + .setMessage(R.string.dialog_discard_confirmation) + .create().show(); + } +} diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java index 4b938a9..92073dc 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseActivity.java @@ -26,7 +26,7 @@ public class ExerciseActivity extends AppCompatActivity { if(isRunning) { playButton.setImageResource(R.drawable.ic_pause_black_48dp); } else { - playButton.setImageResource(R.drawable.ic_play_arrow_black_48dp); + playButton.setImageResource(R.drawable.ic_play_arrow_black); } } } diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseSetOverviewActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseSetOverviewActivity.java deleted file mode 100644 index c2047e2..0000000 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseSetOverviewActivity.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.secuso.privacyfriendlybreakreminder.activities; - -import android.database.Cursor; -import android.support.v4.content.AsyncTaskLoader; -import android.support.v4.content.Loader; -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.widget.TextView; - -import org.secuso.privacyfriendlybreakreminder.R; -import org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseAdapter; -import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper; - -public class ExerciseSetOverviewActivity extends AppCompatActivity implements android.support.v4.app.LoaderManager.LoaderCallbacks{ - - private TextView exerciseSetName; - private RecyclerView exerciseList; - - private ExerciseAdapter exerciseAdapter; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_exercise_set); - - initResources(); - } - - private void initResources() { - exerciseSetName = (TextView) findViewById(R.id.exercise_set_name); - exerciseList = (RecyclerView) findViewById(R.id.exercise_list); - exerciseAdapter = new ExerciseAdapter(this, null); - exerciseList.setAdapter(exerciseAdapter); - exerciseList.setLayoutManager(new GridLayoutManager(this, 2)); - - getSupportLoaderManager().initLoader(0, null, this); - } - - @Override - public Loader onCreateLoader(int id, final Bundle args) { - return new AsyncTaskLoader(this) { - @Override - public Cursor loadInBackground() { - SQLiteHelper helper = new SQLiteHelper(getContext()); - return helper.getExerciseCursorForSet(2, "de"); // TODO; get correct subset list - } - - @Override - protected void onStartLoading() { - forceLoad(); - } - - @Override - protected void onReset() {} - }; - } - - @Override - public void onLoadFinished(Loader loader, Cursor cursor) { - cursor.moveToFirst(); - exerciseAdapter.changeCursor(cursor); - } - - @Override - public void onLoaderReset(Loader loader) { - ((ExerciseAdapter) exerciseList.getAdapter()).changeCursor(null); - } - - @Override - protected void onResume() { - super.onResume(); - - getSupportLoaderManager().restartLoader(0, null, this); - } -} diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/HelpActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/HelpActivity.java index 38f1a60..b83a1d6 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/HelpActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/HelpActivity.java @@ -7,36 +7,21 @@ import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.helper.BaseActivity; -public class HelpActivity extends AppCompatActivity { +public class HelpActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_help); - setupActionBar(); - } - - private void setupActionBar() { - ActionBar actionBar = getSupportActionBar(); - actionBar.setTitle(R.string.help); - if (actionBar != null) { - // Show the Up button in the action bar. - actionBar.setDisplayHomeAsUpEnabled(true); - } } @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - // Respond to the action bar's Up/Home button - case android.R.id.home: - finish(); - return true; - } - return super.onOptionsItemSelected(item); + protected int getNavigationDrawerID() { + return R.id.nav_help; } public static class HelpFragment extends PreferenceFragment { diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ManageExerciseSetsActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ManageExerciseSetsActivity.java new file mode 100644 index 0000000..de04c28 --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ManageExerciseSetsActivity.java @@ -0,0 +1,352 @@ +package org.secuso.privacyfriendlybreakreminder.activities; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.ColorStateList; +import android.graphics.drawable.ColorDrawable; +import android.support.annotation.NonNull; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.TextInputEditText; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.FragmentActivity; +import android.support.v4.content.AsyncTaskLoader; +import android.support.v4.content.ContextCompat; +import android.support.v4.content.Loader; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBar; +import android.support.v7.app.AlertDialog; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; + +import org.secuso.privacyfriendlybreakreminder.ExerciseLocale; +import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseSetListAdapter; +import org.secuso.privacyfriendlybreakreminder.activities.helper.BaseActivity; +import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper; +import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; + +import java.util.List; + +import static android.view.View.GONE; +import static android.view.View.VISIBLE; + +public class ManageExerciseSetsActivity extends BaseActivity implements android.support.v4.app.LoaderManager.LoaderCallbacks> { + + private RecyclerView exerciseSetList; + private ProgressBar loadingSpinner; + private TextView noExerciseSetsText; + private FloatingActionButton fabButton; + private MenuItem toolbarDeleteIcon; + + private ExerciseSetListAdapter exerciseSetAdapter; + + private boolean deleteMode = false; + private ColorStateList fabDefaultBackgroundTint; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_manage_exercise_set); + + initResources(); + getSupportLoaderManager().initLoader(0, null, this); + } + + private void initResources() { + exerciseSetAdapter = new ExerciseSetListAdapter(this, null); + exerciseSetList = (RecyclerView) findViewById(R.id.exercise_set_list); + loadingSpinner = (ProgressBar) findViewById(R.id.loading_spinner); + loadingSpinner.setAlpha(1.0f); + noExerciseSetsText = (TextView) findViewById(R.id.no_exercise_sets_text); + fabButton = (FloatingActionButton) findViewById(R.id.add_button); + + fabDefaultBackgroundTint = fabButton.getBackgroundTintList(); + + exerciseSetList.setLayoutManager(new LinearLayoutManager(this)); + exerciseSetList.setAdapter(exerciseSetAdapter); + } + + @Override + public Loader> onCreateLoader(int id, final Bundle args) { + return new AsyncTaskLoader>(this) { + @Override + public List loadInBackground() { + SQLiteHelper helper = new SQLiteHelper(getContext()); + return helper.getExerciseSetsWithExercises(ExerciseLocale.getLocale()); + } + + @Override + protected void onStartLoading() { + setLoading(true, false); + forceLoad(); + } + + @Override + protected void onReset() {} + }; + } + + @Override + public void onLoadFinished(Loader> loader, List data) { + + boolean hasElements = data.size() > 0; + + setLoading(false, hasElements); + + exerciseSetAdapter.setData(data); + } + + @Override + public void onLoaderReset(Loader> loader) {} + + @Override + protected void onResume() { + super.onResume(); + + getSupportLoaderManager().restartLoader(0, null, this); + } + + private void setLoading(boolean isLoading, boolean hasElements) { + if(isLoading) { + loadingSpinner.setVisibility(VISIBLE); + loadingSpinner.animate().alpha(1.0f).setDuration(1000).start(); + + noExerciseSetsText.setVisibility(GONE); + exerciseSetList.setVisibility(GONE); + } else { + loadingSpinner.animate().alpha(0.0f).setDuration(500).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + loadingSpinner.setVisibility(GONE); + } + }); + + if(hasElements) { + noExerciseSetsText.setVisibility(GONE); + exerciseSetList.setVisibility(VISIBLE); + } else { + noExerciseSetsText.setVisibility(VISIBLE); + exerciseSetList.setVisibility(GONE); + } + } + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + + mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(deleteMode) + disableDeleteMode(); + } + }); + } + + public void setDrawerEnabled(final boolean enabled) { + + int lockMode = enabled ? + DrawerLayout.LOCK_MODE_UNLOCKED : + DrawerLayout.LOCK_MODE_LOCKED_CLOSED; + + mDrawerLayout.setDrawerLockMode(lockMode); + + mDrawerToggle.setDrawerIndicatorEnabled(enabled); + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(!enabled); + actionBar.setDefaultDisplayHomeAsUpEnabled(!enabled); + actionBar.setDisplayShowHomeEnabled(enabled); + actionBar.setHomeButtonEnabled(enabled); + } + + mDrawerToggle.syncState(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + if(deleteMode) + disableDeleteMode(); + else + finish(); + return true; + case R.id.action_delete: + enableDeleteMode(); + return true; + default: + Toast.makeText(this, "option selected", Toast.LENGTH_SHORT).show(); + return super.onOptionsItemSelected(item); + } + } + + @Override + public boolean onSupportNavigateUp() { + onBackPressed(); + return true; + } + + @Override + public void onBackPressed() { + if(deleteMode) + disableDeleteMode(); + else + super.onBackPressed(); + } + + @Override + protected int getNavigationDrawerID() { + return R.id.nav_manage_exercise_sets; + } + + public void onClick(View view) { + switch(view.getId()) { + case R.id.add_button: + if(deleteMode) { + SQLiteHelper helper = new SQLiteHelper(this); + + List deleteIds = exerciseSetAdapter.getDeleteIdList(); + + if(deleteIds.size() == 0) { + Toast.makeText(this, "Please select an item to delete.", Toast.LENGTH_SHORT).show(); + } else { + for (Long l : deleteIds) { + helper.deleteExerciseSet(l); + } + disableDeleteMode(); + getSupportLoaderManager().restartLoader(0, null, this); + } + + } else { + AddExerciseSetDialogFragment dialog = new AddExerciseSetDialogFragment(); + dialog.show(this.getSupportFragmentManager(), AddExerciseSetDialogFragment.TAG); + } + break; + } + } + + public void enableDeleteMode() { + deleteMode = true; + + setDrawerEnabled(false); + + exerciseSetAdapter.enableDeleteMode(); + + if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.middlegrey)); + } + getSupportActionBar().setBackgroundDrawable(new ColorDrawable(ActivityCompat.getColor(this, R.color.middlegrey))); + getSupportActionBar().setTitle(R.string.activity_title_manage_exercise_sets); + + if(toolbarDeleteIcon != null) { + toolbarDeleteIcon.setVisible(false); + } + + fabButton.setBackgroundTintList(ColorStateList.valueOf(ActivityCompat.getColor(this, R.color.red))); + fabButton.setImageResource(R.drawable.ic_delete_white); + } + + public void disableDeleteMode() { + deleteMode = false; + + setDrawerEnabled(true); + + exerciseSetAdapter.disableDeleteMode(); + + if(toolbarDeleteIcon != null) { + toolbarDeleteIcon.setVisible(true); + } + if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { + getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.colorPrimary)); + } + getSupportActionBar().setBackgroundDrawable(new ColorDrawable(ActivityCompat.getColor(this, R.color.colorPrimary))); + getSupportActionBar().setTitle(R.string.activity_title_manage_exercise_sets); + + fabButton.setBackgroundTintList(fabDefaultBackgroundTint); + fabButton.setImageResource(R.drawable.ic_add_white_24dp); + } + + public static class AddExerciseSetDialogFragment extends DialogFragment { + + static final String TAG = AddExerciseSetDialogFragment.class.getSimpleName(); + + TextInputEditText exerciseSetName; + ManageExerciseSetsActivity activity; + + @Override + public void onAttach(Context context) { + super.onAttach(context); + + activity = (ManageExerciseSetsActivity)context; + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), 0); + + LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(FragmentActivity.LAYOUT_INFLATER_SERVICE); + View v = inflater.inflate(R.layout.dialog_add_exercise_set, null); + + exerciseSetName = (TextInputEditText) v.findViewById(R.id.dialog_add_exercise_set_name); + + builder.setView(v); + builder.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + String text = exerciseSetName.getText().toString(); + + if(TextUtils.isEmpty(text)) { + Toast.makeText(getActivity(), "Please specify a name.", Toast.LENGTH_SHORT).show(); + return; + } + + SQLiteHelper sqLiteHelper = new SQLiteHelper(getActivity()); + long id = sqLiteHelper.addExerciseSet(text); + + Intent intent = new Intent(getActivity(), EditExerciseSetActivity.class); + intent.putExtra(EditExerciseSetActivity.EXTRA_EXERCISE_SET_ID, id); + intent.putExtra(EditExerciseSetActivity.EXTRA_EXERCISE_SET_NAME, text); + startActivity(intent); + + dismiss(); + } + }); + builder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + dismiss(); + } + }); + builder.setTitle(R.string.dialog_add_exercise_set_title); + + return builder.create(); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_manage_exercise_sets, menu); + toolbarDeleteIcon = menu.findItem(R.id.action_delete); + return true; + } + +} diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/SplashActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/SplashActivity.java new file mode 100644 index 0000000..5bfa318 --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/SplashActivity.java @@ -0,0 +1,35 @@ +package org.secuso.privacyfriendlybreakreminder.activities; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; + +import org.secuso.privacyfriendlybreakreminder.activities.tutorial.PrefManager; +import org.secuso.privacyfriendlybreakreminder.activities.tutorial.TutorialActivity; + +/** + * Created by yonjuni on 22.10.16. + */ + +public class SplashActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent mainIntent = null; + + PrefManager firstStartPref = new PrefManager(this); + + if(firstStartPref.isFirstTimeLaunch()) { + mainIntent = new Intent(this, TutorialActivity.class); + } else { + mainIntent = new Intent(this, TimerActivity.class); + mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + } + + SplashActivity.this.startActivity(mainIntent); + SplashActivity.this.finish(); + } + +} diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/TimerActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/TimerActivity.java index 24b4abd..b75f07d 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/TimerActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/TimerActivity.java @@ -2,7 +2,6 @@ package org.secuso.privacyfriendlybreakreminder.activities; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -11,30 +10,39 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.res.Resources; -import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.IBinder; import android.preference.PreferenceManager; import android.support.annotation.ColorRes; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.ContextCompat; +import android.support.v4.content.Loader; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; -import android.view.animation.DecelerateInterpolator; -import android.view.animation.LinearInterpolator; +import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.NumberPicker; import android.widget.ProgressBar; +import android.widget.Spinner; import android.widget.TextView; +import org.secuso.privacyfriendlybreakreminder.ExerciseLocale; import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.adapter.ExerciseSetSpinnerAdapter; +import org.secuso.privacyfriendlybreakreminder.activities.helper.BaseActivity; +import org.secuso.privacyfriendlybreakreminder.database.SQLiteHelper; +import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; import org.secuso.privacyfriendlybreakreminder.service.TimerService; +import java.util.LinkedList; +import java.util.List; import java.util.Locale; -public class TimerActivity extends AppCompatActivity { +public class TimerActivity extends BaseActivity implements android.support.v4.app.LoaderManager.LoaderCallbacks> { private static final String TAG = TimerActivity.class.getSimpleName(); private static final String PREF_PICKER_SECONDS = TAG + ".PREF_PICKER_SECONDS"; private static final String PREF_PICKER_MINUTES = TAG + ".PREF_PICKER_MINUTES"; @@ -49,6 +57,8 @@ public class TimerActivity extends AppCompatActivity { private NumberPicker minutesPicker; private NumberPicker hoursPicker; private LinearLayout pickerLayout; + private Spinner exerciseSetSpinner; + private ExerciseSetSpinnerAdapter exerciseSetAdapter; // animation private int mShortAnimationDuration; @@ -109,6 +119,12 @@ public class TimerActivity extends AppCompatActivity { setContentView(R.layout.activity_timer); initResources(); + getSupportLoaderManager().initLoader(0, null, this); + } + + @Override + protected int getNavigationDrawerID() { + return R.id.nav_timer; } @Override @@ -136,6 +152,8 @@ public class TimerActivity extends AppCompatActivity { updateProgress(mTimerService.getInitialDuration()); } updateUI(); + + getSupportLoaderManager().restartLoader(0, null, this); } @Override @@ -160,15 +178,18 @@ public class TimerActivity extends AppCompatActivity { SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); mShortAnimationDuration = getResources().getInteger(android.R.integer.config_shortAnimTime); + exerciseSetAdapter = new ExerciseSetSpinnerAdapter(this, R.layout.layout_exercise_set, new LinkedList()); progressBar = (ProgressBar) findViewById(R.id.progressBar); timerText = (TextView) findViewById(R.id.timerText); playButton = (ImageButton) findViewById(R.id.button_playPause); resetButton = (ImageButton) findViewById(R.id.button_reset); - + exerciseSetSpinner = (Spinner) findViewById(R.id.spinner_choose_exercise_set); + exerciseSetSpinner.setAdapter(exerciseSetAdapter); secondsPicker = (NumberPicker) findViewById(R.id.seconds_picker); minutesPicker = (NumberPicker) findViewById(R.id.minutes_picker); hoursPicker = (NumberPicker) findViewById(R.id.hours_picker); + pickerLayout = (LinearLayout) findViewById(R.id.picker_layout); secondsPicker.setDisplayedValues(SECONDS_MINUTES); secondsPicker.setMinValue(0); @@ -189,7 +210,6 @@ public class TimerActivity extends AppCompatActivity { setDividerColor(minutesPicker, R.color.transparent); setDividerColor(hoursPicker, R.color.transparent); - pickerLayout = (LinearLayout) findViewById(R.id.picker_layout); } private void updateProgress(long millisUntilFinished) { @@ -222,9 +242,9 @@ public class TimerActivity extends AppCompatActivity { case R.id.button_reset: mTimerService.stopAndResetTimer(); break; - case R.id.button_chooseExercise: - startActivity(new Intent(this, ExerciseSetOverviewActivity.class)); - break; + //case R.id.button_chooseExercise: + // startActivity(new Intent(this, ManageExerciseSetsActivity.class)); + // break; } updateUI(); @@ -338,7 +358,7 @@ public class TimerActivity extends AppCompatActivity { if(isRunning) { playButton.setImageResource(R.drawable.ic_pause_black_48dp); } else { - playButton.setImageResource(R.drawable.ic_play_arrow_black_48dp); + playButton.setImageResource(R.drawable.ic_play_arrow_black); } } @@ -357,4 +377,31 @@ public class TimerActivity extends AppCompatActivity { } } } + + @Override + public Loader> onCreateLoader(int id, final Bundle args) { + return new AsyncTaskLoader>(this) { + @Override + public List loadInBackground() { + SQLiteHelper helper = new SQLiteHelper(getContext()); + return helper.getExerciseSetsWithExercises(ExerciseLocale.getLocale()); + } + + @Override + protected void onStartLoading() { + forceLoad(); + } + + @Override + protected void onReset() {} + }; + } + + @Override + public void onLoadFinished(Loader> loader, List data) { + exerciseSetAdapter.updateData(data); + } + + @Override + public void onLoaderReset(Loader> loader) {} } diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseAdapter.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetAdapter.java similarity index 65% rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseAdapter.java rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetAdapter.java index 79a7ec2..4519337 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseAdapter.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetAdapter.java @@ -2,6 +2,7 @@ package org.secuso.privacyfriendlybreakreminder.activities.adapter; import android.content.Context; import android.database.Cursor; +import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.view.LayoutInflater; import android.view.View; @@ -10,18 +11,23 @@ import android.widget.ImageView; import android.widget.TextView; import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.ManageExerciseSetsActivity; import org.secuso.privacyfriendlybreakreminder.activities.helper.CursorRecyclerViewAdapter; import org.secuso.privacyfriendlybreakreminder.database.columns.ExerciseColumns; import org.secuso.privacyfriendlybreakreminder.database.data.Exercise; +import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; /** * Created by Christopher Beckmann on 30.08.2017. */ -public class ExerciseAdapter extends CursorRecyclerViewAdapter { +public class ExerciseSetAdapter extends RecyclerView.Adapter { + private ExerciseSet set; + private Context mContext; - public ExerciseAdapter(Context context, Cursor cursor) { - super(context, cursor, ExerciseColumns._ID); + public ExerciseSetAdapter(Context context, ExerciseSet set) { + this.mContext = context; + this.set = set; } @Override @@ -31,10 +37,12 @@ public class ExerciseAdapter extends CursorRecyclerViewAdapter { } @Override - public void onBindViewHolder(ViewHolder viewHolder, Cursor cursor) { - final Exercise exercise = ExerciseColumns.fromCursor(cursor); + public void onBindViewHolder(ViewHolder holder, int position) { + if(set == null) return; - ExerciseViewHolder vh = (ExerciseViewHolder) viewHolder; + final Exercise exercise = set.get(position); + + ExerciseViewHolder vh = (ExerciseViewHolder) holder; String imageID = exercise.getImageID(); String[] imageIDSplit = imageID.split(","); @@ -54,6 +62,32 @@ public class ExerciseAdapter extends CursorRecyclerViewAdapter { vh.section.setText(exercise.getSection()); } + @Override + public int getItemCount() { + if(set != null) + return set.size(); + else + return 0; + } + + public void updateData(ExerciseSet set) { + this.set = set; + notifyDataSetChanged(); + } + + public void add(Exercise e) { + if(set.add(e)) notifyItemInserted(set.size()-1); + } + + public void remove(Exercise e) { + int index = set.indexOf(e); + if(set.remove(e)) notifyItemRemoved(index); + } + + public ExerciseSet getExerciseSet() { + return set; + } + public class ExerciseViewHolder extends ViewHolder { ImageView image; @@ -70,7 +104,6 @@ public class ExerciseAdapter extends CursorRecyclerViewAdapter { executionText = (TextView) itemView.findViewById(R.id.exercise_execution); descriptionText = (TextView) itemView.findViewById(R.id.exercise_description); section = (TextView) itemView.findViewById(R.id.exercise_section); - } } } diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetListAdapter.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetListAdapter.java new file mode 100644 index 0000000..5f6e4a0 --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetListAdapter.java @@ -0,0 +1,188 @@ +package org.secuso.privacyfriendlybreakreminder.activities.adapter; + +import android.content.Intent; +import android.support.v7.widget.CardView; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.EditExerciseSetActivity; +import org.secuso.privacyfriendlybreakreminder.activities.ManageExerciseSetsActivity; +import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; + +import java.util.LinkedList; +import java.util.List; + + +/** + * Created by Christopher Beckmann on 04.09.2017. + */ + +public class ExerciseSetListAdapter extends RecyclerView.Adapter { + + List data = new LinkedList(); + List deleteIds = new LinkedList<>(); + ManageExerciseSetsActivity mContext = null; + + private boolean deleteMode = false; + + public ExerciseSetListAdapter(ManageExerciseSetsActivity context, List data) { + if(context == null) throw new IllegalArgumentException("Context may not be null"); + + mContext = context; + + if(data != null) { + this.data = data; + } + + setHasStableIds(true); + } + + public void setData(List data) { + if(data != null) { + this.data = data; + } + notifyDataSetChanged(); + } + + public void enableDeleteMode() { + deleteMode = true; + notifyDataSetChanged(); + } + + public void disableDeleteMode() { + deleteMode = false; + notifyDataSetChanged(); + } + + public List getDeleteIdList() { + return deleteIds; + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + final ExerciseSetViewHolder vh = (ExerciseSetViewHolder) holder; + + final ExerciseSet set = data.get(position); + + vh.deleteCheckBox.setVisibility(deleteMode ? View.VISIBLE : View.GONE); + vh.deleteCheckBox.setChecked(false); + + vh.name.setText(set.getName()); + vh.card.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(deleteMode) { + + if(vh.deleteCheckBox.isChecked()) { + deleteIds.remove(set.getId()); + vh.deleteCheckBox.setChecked(false); + } else { + if (!deleteIds.contains(set.getId())) deleteIds.add(set.getId()); + vh.deleteCheckBox.setChecked(true); + } + + } else { + Intent i = new Intent(mContext, EditExerciseSetActivity.class); + i.putExtra(EditExerciseSetActivity.EXTRA_EXERCISE_SET_ID, set.getId()); + i.putExtra(EditExerciseSetActivity.EXTRA_EXERCISE_SET_NAME, set.getName()); + mContext.startActivity(i); + } + } + }); + vh.card.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + if(deleteMode) { + + if(vh.deleteCheckBox.isChecked()) { + deleteIds.remove(set.getId()); + vh.deleteCheckBox.setChecked(false); + } else { + if (!deleteIds.contains(set.getId())) deleteIds.add(set.getId()); + vh.deleteCheckBox.setChecked(true); + } + + } else { + mContext.enableDeleteMode(); + } + return false; + } + }); + + vh.exerciseList.removeAllViews(); + + for(int i = 0; i < set.size(); ++i) { + View view = LayoutInflater.from(mContext).inflate(R.layout.layout_round_exercise_image, null, false); + ImageView image = (ImageView) view.findViewById(R.id.exercise_image); + + String imageID = set.get(i).getImageID(); + String[] imageIDSplit = imageID.split(","); + + if(imageIDSplit.length > 1) { + imageID = imageIDSplit[0]; // only take the first image as a display image + } + + int imageResID = mContext.getResources().getIdentifier( + "exercise_" + imageID, + "drawable", + mContext.getPackageName()); + + image.setImageResource(imageResID); + vh.exerciseList.addView(view); + } + + if(set.size() == 0) { + vh.noExercisesText.setVisibility(View.VISIBLE); + } else { + vh.noExercisesText.setVisibility(View.GONE); + } + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_exercise_set, parent, false); + return new ExerciseSetViewHolder(itemView); + } + + @Override + public long getItemId(int position) { + if(data != null) { + return data.get(position).getId(); + } + return super.getItemId(position); + } + + @Override + public int getItemCount() { + if(data != null) { + return data.size(); + } + return 0; + } + + public class ExerciseSetViewHolder extends RecyclerView.ViewHolder { + + LinearLayout exerciseList; + TextView name; + CardView card; + TextView noExercisesText; + CheckBox deleteCheckBox; + + public ExerciseSetViewHolder(View itemView) { + super(itemView); + + card = (CardView) itemView.findViewById(R.id.exercise_set_card); + name = (TextView) itemView.findViewById(R.id.exercise_set_name); + exerciseList = (LinearLayout) itemView.findViewById(R.id.exercise_list); + noExercisesText = (TextView) itemView.findViewById(R.id.exercise_none_available); + deleteCheckBox = (CheckBox) itemView.findViewById(R.id.delete_check_box); + } + } +} diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetSpinnerAdapter.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetSpinnerAdapter.java new file mode 100644 index 0000000..f9b10e4 --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/adapter/ExerciseSetSpinnerAdapter.java @@ -0,0 +1,126 @@ +package org.secuso.privacyfriendlybreakreminder.activities.adapter; + +import android.content.Context; +import android.support.annotation.LayoutRes; +import android.support.annotation.NonNull; +import android.support.v7.widget.CardView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.database.data.ExerciseSet; + +import java.util.List; + +/** + * Created by Christopher Beckmann on 05.09.2017. + */ + +public class ExerciseSetSpinnerAdapter extends ArrayAdapter { + + private int resource; + private List sets; + + public ExerciseSetSpinnerAdapter(@NonNull Context context, @LayoutRes int resource, List data) { + super(context, resource, data); + this.resource = resource; + this.sets = data; + } + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + return getCustomView(position, convertView, parent); + } + + @Override @NonNull + public View getView(int position, View convertView, ViewGroup parent) { + return getCustomView(position, convertView, parent); + } + + private View getCustomView(int position, View cv, ViewGroup parent) { + + final ExerciseSet set = sets.get(position); + + View row = null; + if(cv == null) { + LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + row = inflater.inflate(resource, parent, false); + } else { + row = cv; + } + + if(set == null) return row; + + CardView card = (CardView) row.findViewById(R.id.exercise_set_card); + TextView name = (TextView) row.findViewById(R.id.exercise_set_name); + LinearLayout exerciseList = (LinearLayout) row.findViewById(R.id.exercise_list); + TextView noExercisesText = (TextView) row.findViewById(R.id.exercise_none_available); + + card.setClickable(false); + card.setLongClickable(false); + + name.setText(set.getName()); + + exerciseList.removeAllViews(); + + for(int i = 0; i < set.size(); ++i) { + View view = LayoutInflater.from(getContext()).inflate(R.layout.layout_round_exercise_image, null, false); + ImageView image = (ImageView) view.findViewById(R.id.exercise_image); + + String imageID = set.get(i).getImageID(); + String[] imageIDSplit = imageID.split(","); + + if(imageIDSplit.length > 1) { + imageID = imageIDSplit[0]; // only take the first image as a display image + } + + int imageResID = getContext().getResources().getIdentifier( + "exercise_" + imageID, + "drawable", + getContext().getPackageName()); + + image.setImageResource(imageResID); + exerciseList.addView(view); + } + + if(set.size() == 0) { + noExercisesText.setVisibility(View.VISIBLE); + } else { + noExercisesText.setVisibility(View.GONE); + } + //LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); + //View row = inflater.inflate(resource, parent, false); + +// ImageView image = (ImageView) row.findViewById(R.id.browserIcon); +// TextView label= (TextView) row.findViewById(R.id.browserName); + + return row; + } + + public void updateData(@NonNull List data) { + this.sets = data; + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return this.sets.size(); + } + + + @Override + public ExerciseSet getItem(int location) { + return this.sets.get(location); + } + + + @Override + public long getItemId(int position) { + return sets.get(position).getId(); + } +} diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/BaseActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/BaseActivity.java new file mode 100644 index 0000000..c447937 --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/helper/BaseActivity.java @@ -0,0 +1,214 @@ +package org.secuso.privacyfriendlybreakreminder.activities.helper; + +import android.content.Intent; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.Handler; +import android.preference.PreferenceActivity; +import android.preference.PreferenceManager; +import android.support.design.widget.NavigationView; +import android.support.design.widget.NavigationView.OnNavigationItemSelectedListener; +import android.support.v4.app.TaskStackBuilder; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.view.View; + +import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.AboutActivity; +import org.secuso.privacyfriendlybreakreminder.activities.HelpActivity; +import org.secuso.privacyfriendlybreakreminder.activities.ManageExerciseSetsActivity; +import org.secuso.privacyfriendlybreakreminder.activities.SettingsActivity; +import org.secuso.privacyfriendlybreakreminder.activities.TimerActivity; +import org.secuso.privacyfriendlybreakreminder.activities.tutorial.TutorialActivity; + +import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP; + +/** + * @author Chris + * @version 20161225 + * This class is a parent class of all activities that can be accessed from the + * Navigation Drawer (example see MainActivity.java) + */ +public abstract class BaseActivity extends AppCompatActivity implements OnNavigationItemSelectedListener { + + // delay to launch nav drawer item, to allow close animation to play + protected static final int NAVDRAWER_LAUNCH_DELAY = 250; + // fade in and fade out durations for the main content when switching between + // different Activities of the app through the Nav Drawer + protected static final int MAIN_CONTENT_FADEOUT_DURATION = 150; + protected static final int MAIN_CONTENT_FADEIN_DURATION = 250; + + // Navigation drawer: + protected DrawerLayout mDrawerLayout; + private NavigationView mNavigationView; + protected Toolbar toolbar; + protected ActionBarDrawerToggle mDrawerToggle; + + // Helper + private Handler mHandler; + protected SharedPreferences mSharedPreferences; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + mHandler = new Handler(); + + overridePendingTransition(0, 0); + } + + @Override + public void onBackPressed() { + if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { + mDrawerLayout.closeDrawer(GravityCompat.START); + } else { + super.onBackPressed(); + } + } + + protected abstract int getNavigationDrawerID(); + + @Override + public boolean onNavigationItemSelected(MenuItem item) { + final int itemId = item.getItemId(); + + return goToNavigationItem(itemId); + } + + protected boolean goToNavigationItem(final int itemId) { + + if(itemId == getNavigationDrawerID()) { + // just close drawer because we are already in this activity + mDrawerLayout.closeDrawer(GravityCompat.START); + return true; + } + + // delay transition so the drawer can close + mHandler.postDelayed(new Runnable() { + @Override + public void run() { + callDrawerItem(itemId); + } + }, NAVDRAWER_LAUNCH_DELAY); + + mDrawerLayout.closeDrawer(GravityCompat.START); + + selectNavigationItem(itemId); + + // fade out the active activity + View mainContent = findViewById(R.id.main_content); + if (mainContent != null) { + mainContent.animate().alpha(0).setDuration(MAIN_CONTENT_FADEOUT_DURATION); + } + return true; + } + + // set active navigation item + private void selectNavigationItem(int itemId) { + for(int i = 0 ; i < mNavigationView.getMenu().size(); i++) { + boolean b = itemId == mNavigationView.getMenu().getItem(i).getItemId(); + mNavigationView.getMenu().getItem(i).setChecked(b); + } + } + + /** + * Enables back navigation for activities that are launched from the NavBar. See + * {@code AndroidManifest.xml} to find out the parent activity names for each activity. + * @param intent + */ + private void createBackStack(Intent intent) { + TaskStackBuilder builder = TaskStackBuilder.create(this); + builder.addNextIntentWithParentStack(intent); + builder.startActivities(); + } + + /** + * This method manages the behaviour of the navigation drawer + * Add your menu items (ids) to res/menu/activity_main_drawer.xml + * @param itemId Item that has been clicked by the user + */ + private void callDrawerItem(final int itemId) { + + Intent intent; + + switch(itemId) { + case R.id.nav_timer: + intent = new Intent(this, TimerActivity.class); + intent.addFlags(FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + break; + case R.id.nav_manage_exercise_sets: + intent = new Intent(this, ManageExerciseSetsActivity.class); + createBackStack(intent); + break; + case R.id.nav_tutorial: + intent = new Intent(this, TutorialActivity.class); + startActivity(intent); + break; + case R.id.nav_about: + intent = new Intent(this, AboutActivity.class); + createBackStack(intent); + break; + case R.id.nav_help: + intent = new Intent(this, HelpActivity.class); + createBackStack(intent); + break; + case R.id.nav_settings: + intent = new Intent(this, SettingsActivity.class); + intent.putExtra( PreferenceActivity.EXTRA_SHOW_FRAGMENT, SettingsActivity.GeneralPreferenceFragment.class.getName() ); + intent.putExtra( PreferenceActivity.EXTRA_NO_HEADERS, true ); + createBackStack(intent); + break; + default: + } + overridePendingTransition(0,0); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + + toolbar = (Toolbar) findViewById(R.id.toolbar); + if(getSupportActionBar() == null) { + setSupportActionBar(toolbar); + } + + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); + mDrawerLayout.addDrawerListener(mDrawerToggle); + mDrawerToggle.syncState(); + + mNavigationView = (NavigationView) findViewById(R.id.nav_view); + mNavigationView.setNavigationItemSelectedListener(this); + + showContent(); + } + + private void showContent() { + selectNavigationItem(getNavigationDrawerID()); + + View mainContent = findViewById(R.id.main_content); + if (mainContent != null) { + mainContent.setAlpha(0); + mainContent.animate().alpha(1).setDuration(MAIN_CONTENT_FADEIN_DURATION); + } + } + + @Override + protected void onResume() { + super.onResume(); + + selectNavigationItem(getNavigationDrawerID()); + + View mainContent = findViewById(R.id.main_content); + if (mainContent != null) { + mainContent.setAlpha(0); + mainContent.animate().alpha(1).setDuration(MAIN_CONTENT_FADEIN_DURATION); + } + } +} diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakActivity.java similarity index 99% rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakActivity.java rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakActivity.java index b9c82c9..28f73e8 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakActivity.java @@ -1,4 +1,4 @@ -package org.secuso.privacyfriendlybreakreminder.activities; +package org.secuso.privacyfriendlybreakreminder.activities.old; import android.content.SharedPreferences; import android.os.CountDownTimer; diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakDeciderActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakDeciderActivity.java similarity index 88% rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakDeciderActivity.java rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakDeciderActivity.java index 4d4c014..d34cb83 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakDeciderActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakDeciderActivity.java @@ -1,4 +1,4 @@ -package org.secuso.privacyfriendlybreakreminder.activities; +package org.secuso.privacyfriendlybreakreminder.activities.old; import android.content.Intent; import android.support.v7.app.AppCompatActivity; @@ -7,6 +7,7 @@ import android.view.View; import android.widget.Button; import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.old.BreakActivity; public class BreakDeciderActivity extends AppCompatActivity implements View.OnClickListener { diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakReminder.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakReminder.java similarity index 98% rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakReminder.java rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakReminder.java index 8c94346..2f7fa54 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/BreakReminder.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/BreakReminder.java @@ -1,4 +1,4 @@ -package org.secuso.privacyfriendlybreakreminder.activities; +package org.secuso.privacyfriendlybreakreminder.activities.old; import android.app.Activity; import android.app.Dialog; @@ -37,6 +37,9 @@ import android.widget.Spinner; import android.widget.TextView; import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.AboutActivity; +import org.secuso.privacyfriendlybreakreminder.activities.HelpActivity; +import org.secuso.privacyfriendlybreakreminder.activities.SettingsActivity; import org.secuso.privacyfriendlybreakreminder.widget.*; import java.util.Locale; diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseTypeActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ExerciseTypeActivity.java similarity index 97% rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseTypeActivity.java rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ExerciseTypeActivity.java index cd10348..8aedf79 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ExerciseTypeActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ExerciseTypeActivity.java @@ -1,4 +1,4 @@ -package org.secuso.privacyfriendlybreakreminder.activities; +package org.secuso.privacyfriendlybreakreminder.activities.old; import android.content.SharedPreferences; diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ProfileActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ProfileActivity.java similarity index 97% rename from app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ProfileActivity.java rename to app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ProfileActivity.java index 1653b1d..2e989c0 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/ProfileActivity.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/old/ProfileActivity.java @@ -1,4 +1,4 @@ -package org.secuso.privacyfriendlybreakreminder.activities; +package org.secuso.privacyfriendlybreakreminder.activities.old; import android.content.Intent; @@ -15,6 +15,7 @@ import android.widget.TextView; import android.widget.Toast; import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.old.ExerciseTypeActivity; public class ProfileActivity extends AppCompatActivity implements View.OnClickListener { diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/PrefManager.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/PrefManager.java new file mode 100644 index 0000000..7c5612e --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/PrefManager.java @@ -0,0 +1,29 @@ +package org.secuso.privacyfriendlybreakreminder.activities.tutorial; + +import android.content.Context; +import android.content.SharedPreferences; + +/** + * Class structure taken from tutorial at http://www.androidhive.info/2016/05/android-build-intro-slider-app/ + */ +public class PrefManager { + private SharedPreferences pref; + + // Shared preferences file name + private static final String PREF_NAME = "welcome"; + + private static final String IS_FIRST_TIME_LAUNCH = "IsFirstTimeLaunch"; + + public PrefManager(Context context) { + pref = context.getSharedPreferences(PREF_NAME, 0); + } + + public void setFirstTimeLaunch(boolean isFirstTime) { + pref.edit().putBoolean(IS_FIRST_TIME_LAUNCH, isFirstTime).apply(); + } + + public boolean isFirstTimeLaunch() { + return pref.getBoolean(IS_FIRST_TIME_LAUNCH, true); + } + +} diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/TutorialActivity.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/TutorialActivity.java new file mode 100644 index 0000000..0c5a891 --- /dev/null +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/activities/tutorial/TutorialActivity.java @@ -0,0 +1,219 @@ +package org.secuso.privacyfriendlybreakreminder.activities.tutorial; + +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.os.Build; +import android.os.Bundle; +import android.support.v4.content.ContextCompat; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.support.v7.app.AppCompatActivity; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.secuso.privacyfriendlybreakreminder.R; +import org.secuso.privacyfriendlybreakreminder.activities.TimerActivity; + +/** + * Class structure taken from tutorial at http://www.androidhive.info/2016/05/android-build-intro-slider-app/ + * + * @author Karola Marky, Christopher Beckmann + * @version 20161214 + */ + +public class TutorialActivity extends AppCompatActivity { + + private int[] layouts = new int[] { + R.layout.tutorial_slide1, + R.layout.tutorial_slide2, + R.layout.tutorial_slide3, + }; + + private ViewPager viewPager; + private MyViewPagerAdapter myViewPagerAdapter; + private LinearLayout dotsLayout; + private TextView[] dots; + private Button btnSkip, btnNext; + private PrefManager prefManager; + + private static final String TAG = TutorialActivity.class.getSimpleName(); + public static final String ACTION_SHOW_ANYWAYS = TAG + ".ACTION_SHOW_ANYWAYS"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + // Checking for first time launch - before calling setContentView() + prefManager = new PrefManager(this); + Intent i = getIntent(); + + // Making notification bar transparent + if(Build.VERSION.SDK_INT >=21) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + } + + setContentView(R.layout.activity_tutorial); + + viewPager = (ViewPager) findViewById(R.id.view_pager); + dotsLayout = (LinearLayout) findViewById(R.id.layoutDots); + btnSkip = (Button) findViewById(R.id.btn_skip); + btnNext = (Button) findViewById(R.id.btn_next); + + // adding bottom dots + addBottomDots(0); + + // making notification bar transparent + changeStatusBarColor(); + + myViewPagerAdapter =new MyViewPagerAdapter(); + viewPager.setAdapter(myViewPagerAdapter); + viewPager.addOnPageChangeListener(viewPagerPageChangeListener); + + btnSkip.setOnClickListener(new View.OnClickListener() + + { + @Override + public void onClick (View v){ + launchHomeScreen(); + } + }); + + btnNext.setOnClickListener(new View.OnClickListener() + + { + @Override + public void onClick (View v){ + // checking for last page + // if last page home screen will be launched + int current = getItem(+1); + if (current < layouts.length) { + // move to next screen + viewPager.setCurrentItem(current); + } else { + launchHomeScreen(); + } + } + }); +} + + private void addBottomDots(int currentPage) { + dots = new TextView[layouts.length]; + + int activeColor = ContextCompat.getColor(this, R.color.dot_light_screen); + int inactiveColor = ContextCompat.getColor(this, R.color.dot_dark_screen); + + dotsLayout.removeAllViews(); + for (int i = 0; i < dots.length; i++) { + dots[i] = new TextView(this); + dots[i].setText(Html.fromHtml("•")); + dots[i].setTextSize(35); + dots[i].setTextColor(inactiveColor); + dotsLayout.addView(dots[i]); + } + + if (dots.length > 0) + dots[currentPage].setTextColor(activeColor); + } + + private int getItem(int i) { + return viewPager.getCurrentItem() + i; + } + + private void launchHomeScreen() { + + if(prefManager.isFirstTimeLaunch()) { + Intent intent = new Intent(TutorialActivity.this, TimerActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + prefManager.setFirstTimeLaunch(false); + startActivity(intent); + } + + finish(); + } + + // viewpager change listener + ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() { + + @Override + public void onPageSelected(int position) { + addBottomDots(position); + + // changing the next button text 'NEXT' / 'GOT IT' + if (position == layouts.length - 1) { + // last page. make button text to GOT IT + btnNext.setText(getString(R.string.okay)); + btnSkip.setVisibility(View.GONE); + } else { + // still pages are left + btnNext.setText(getString(R.string.next)); + btnSkip.setVisibility(View.VISIBLE); + } + } + + @Override + public void onPageScrolled(int arg0, float arg1, int arg2) { + + } + + @Override + public void onPageScrollStateChanged(int arg0) { + + } + }; + + /** + * Making notification bar transparent + */ + private void changeStatusBarColor() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + Window window = getWindow(); + window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); + window.setStatusBarColor(Color.TRANSPARENT); + } + } + +/** + * View pager adapter + */ +public class MyViewPagerAdapter extends PagerAdapter { + private LayoutInflater layoutInflater; + + public MyViewPagerAdapter() { + } + + @Override + public View instantiateItem(ViewGroup container, int position) { + layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + View view = layoutInflater.inflate(layouts[position], container, false); + container.addView(view); + + return view; + } + + @Override + public int getCount() { + return layouts.length; + } + + @Override + public boolean isViewFromObject(View view, Object obj) { + return view == obj; + } + + + @Override + public void destroyItem(ViewGroup container, int position, Object object) { + View view = (View) object; + container.removeView(view); + } +} +} diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/SQLiteHelper.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/SQLiteHelper.java index 284a5dd..fec20cb 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/SQLiteHelper.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/SQLiteHelper.java @@ -1,6 +1,7 @@ package org.secuso.privacyfriendlybreakreminder.database; +import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; @@ -18,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; public class SQLiteHelper extends SQLiteOpenHelper { @@ -27,7 +29,7 @@ public class SQLiteHelper extends SQLiteOpenHelper { private Context mContext; private static final String DATABASE_NAME = "exercises.sqlite"; private static final String DATABASE_PATH = "/data/data/org.secuso.privacyfriendlybreakreminder/databases/"; - private static final int DATABASE_VERSION = 4; + private static final int DATABASE_VERSION = 2; private static final String[] deleteQueryList = { ExerciseColumns.SQL_DELETE_ENTRIES, @@ -64,6 +66,76 @@ public class SQLiteHelper extends SQLiteOpenHelper { } + public synchronized void deleteExerciseSet(long id) { + SQLiteDatabase database = getReadableDatabase(); + database.delete(ExerciseSetColumns.TABLE_NAME, ExerciseSetColumns._ID + " = ?", new String[]{String.valueOf(id)}); + database.close(); + } + + public synchronized long addExerciseSet(String name) { + SQLiteDatabase database = getReadableDatabase(); + + ContentValues cv = new ContentValues(); + cv.put(ExerciseSetColumns.NAME, name); + + return database.insert(ExerciseSetColumns.TABLE_NAME, null, cv); + } + + public synchronized void addExerciseToExerciseSet(int exerciseSetId, int exerciseId) { + SQLiteDatabase database = getReadableDatabase(); + + ContentValues cv = new ContentValues(); + cv.put(ExerciseSetColumns._ID, exerciseSetId); + cv.put(ExerciseColumns._ID, exerciseId); + + database.insert("exercise_set_exercises", null, cv); + database.close(); + } + + public synchronized Cursor getExerciseSetsCursor() { + SQLiteDatabase database = getReadableDatabase(); + + return database.query( + ExerciseSetColumns.TABLE_NAME, + ExerciseSetColumns.PROJECTION, + null, + null, + null, + null, + null); + } + + public synchronized List getExerciseSetsWithExercises(String language) { + + List result = new LinkedList<>(); + + Cursor c = getExerciseSetsCursor(); + + if(c != null) { + c.moveToFirst(); + + while(!c.isAfterLast()) { + + int id = c.getInt(c.getColumnIndex(ExerciseSetColumns._ID)); + + ExerciseSet set = getExerciseListForSet(id, language); + + if(set != null) { + result.add(set); + + } else { + ExerciseSet e = new ExerciseSet(); + e.setId(id); + e.setName(c.getString(c.getColumnIndexOrThrow(ExerciseSetColumns.NAME))); + result.add(e); + } + c.moveToNext(); + } + } + return result; + } + + public synchronized Cursor getExerciseCursor(String language) { SQLiteDatabase database = getReadableDatabase(); return database.rawQuery(buildQuery(false), new String[]{language}); @@ -78,27 +150,27 @@ public class SQLiteHelper extends SQLiteOpenHelper { SQLiteDatabase database = getReadableDatabase(); String sql = "SELECT *\n" + - "FROM exercise_set ES LEFT OUTER JOIN exercise_set_exercises ESE\n" + - "\tON ES.exercise_set_id = ESE.exercise_set_id\n" + - "LEFT OUTER JOIN exercises E\n" + - "\tON ESE.exercise_id = E.exercise_id\n" + - "LEFT OUTER JOIN exercises_local L\n" + - "\tON E.exercise_id = L.exercise_id\n" + - "WHERE ES.exercise_set_id = ? AND L.language = ?\n" + - "ORDER BY ESE.exercise_id ASC"; + "FROM "+ExerciseSetColumns.TABLE_NAME+" ES LEFT OUTER JOIN exercise_set_exercises ESE\n" + + "\tON ES."+ExerciseSetColumns._ID+" = ESE."+ExerciseSetColumns._ID+"\n" + + "LEFT OUTER JOIN "+ExerciseColumns.TABLE_NAME+" E\n" + + "\tON ESE."+ExerciseColumns._ID+" = E."+ExerciseColumns._ID+"\n" + + "LEFT OUTER JOIN "+ExerciseLocalColumns.TABLE_NAME+" L\n" + + "\tON E."+ExerciseColumns._ID+" = L."+ExerciseLocalColumns.EXERCISE_ID+"\n" + + "WHERE ES."+ExerciseSetColumns._ID+" = ? AND L."+ExerciseLocalColumns.LANGUAGE+" = ?\n" + + "ORDER BY ESE."+ExerciseColumns._ID+" ASC"; - String sql2 = "SELECT *\n" + - "\tFROM (SELECT * \n" + - "\t\t\tFROM (SELECT *\n" + - "\t\t\t\tFROM "+ExerciseSetColumns.TABLE_NAME+" ES LEFT OUTER JOIN exercise_set_exercises ESE\n" + - "\t\t\t\tON ES."+ExerciseSetColumns._ID+" = ESE."+ExerciseSetColumns._ID+"\n" + - "\t\t\t\tWHERE ES."+ExerciseSetColumns._ID+" = ?\n" + - "\t\t\t\tORDER BY ESE."+ExerciseColumns._ID+" ASC) ES_ESE \n" + - "\t\t\tLEFT OUTER JOIN "+ExerciseColumns.TABLE_NAME+" E\n" + - "\t\t\tON ES_ESE."+ExerciseColumns._ID+" = E."+ExerciseColumns._ID+") ES_ESE_E \n" + - "\t\tLEFT OUTER JOIN "+ExerciseLocalColumns.TABLE_NAME+" L\n" + - "\t\tON ES_ESE_E."+ExerciseColumns._ID+" = L."+ExerciseLocalColumns.EXERCISE_ID+"\n" + - "\t\tWHERE L."+ExerciseLocalColumns.LANGUAGE+" = ?"; +// String sql2 = "SELECT *\n" + +// "\tFROM (SELECT * \n" + +// "\t\t\tFROM (SELECT *\n" + +// "\t\t\t\tFROM "+ExerciseSetColumns.TABLE_NAME+" ES LEFT OUTER JOIN exercise_set_exercises ESE\n" + +// "\t\t\t\tON ES."+ExerciseSetColumns._ID+" = ESE."+ExerciseSetColumns._ID+"\n" + +// "\t\t\t\tWHERE ES."+ExerciseSetColumns._ID+" = ?\n" + +// "\t\t\t\tORDER BY ESE."+ExerciseColumns._ID+" ASC) ES_ESE \n" + +// "\t\t\tLEFT OUTER JOIN "+ExerciseColumns.TABLE_NAME+" E\n" + +// "\t\t\tON ES_ESE."+ExerciseColumns._ID+" = E."+ExerciseColumns._ID+") ES_ESE_E \n" + +// "\t\tLEFT OUTER JOIN "+ExerciseLocalColumns.TABLE_NAME+" L\n" + +// "\t\tON ES_ESE_E."+ExerciseColumns._ID+" = L."+ExerciseLocalColumns.EXERCISE_ID+"\n" + +// "\t\tWHERE L."+ExerciseLocalColumns.LANGUAGE+" = ?"; return database.rawQuery(sql, new String[]{String.valueOf(setId), language}); } @@ -112,7 +184,9 @@ public class SQLiteHelper extends SQLiteOpenHelper { c.moveToFirst(); - result = ExerciseSetColumns.fromCursor(c); + if(!c.isAfterLast()) { + result = ExerciseSetColumns.fromCursor(c); + } while(!c.isAfterLast()) { result.add(ExerciseColumns.fromCursor(c)); @@ -251,6 +325,8 @@ public class SQLiteHelper extends SQLiteOpenHelper { OutputStream myOutput = null; try { // Open db packaged as asset as the input stream + mContext.deleteDatabase(DATABASE_NAME); + myInput = mContext.getAssets().open(DATABASE_NAME); // Open the db in the application package context: @@ -288,4 +364,5 @@ public class SQLiteHelper extends SQLiteOpenHelper { } } } + } diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseSetColumns.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseSetColumns.java index e14306b..b33cc68 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseSetColumns.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/columns/ExerciseSetColumns.java @@ -16,7 +16,7 @@ public final class ExerciseSetColumns { public static final String TABLE_NAME = "exercise_set"; public static final String _ID = "exercise_set_id"; - public static final String NAME = "name"; + public static final String NAME = "exercise_set_name"; public static final String[] PROJECTION = { _ID, diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/Exercise.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/Exercise.java index d43b898..ff5c0b2 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/Exercise.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/Exercise.java @@ -82,13 +82,13 @@ public class Exercise { if(!(object instanceof Exercise)) return false; Exercise other = (Exercise) object; - return this.id != other.id - || this.localId != other.localId - || !this.section.equals(other.section) - || !this.execution.equals(other.execution) - || !this.description.equals(other.description) - || !this.name.equals(other.name) - || !this.imageID.equals(other.imageID) - || !this.language.equals(other.language); + return this.id == other.id + && this.localId == other.localId + && this.section.equals(other.section) + && this.execution.equals(other.execution) + && this.description.equals(other.description) + && this.name.equals(other.name) + && this.imageID.equals(other.imageID) + && this.language.equals(other.language); } } diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/ExerciseSet.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/ExerciseSet.java index acf1568..8766078 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/ExerciseSet.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/database/data/ExerciseSet.java @@ -8,17 +8,17 @@ import java.util.List; */ public class ExerciseSet { - private int id = -1; + private long id = -1L; private String name = null; private List exercises = new ArrayList<>(); public ExerciseSet() {} - public int getId() { + public long getId() { return id; } - public void setId(int id) { + public void setId(long id) { this.id = id; } @@ -30,20 +30,26 @@ public class ExerciseSet { this.name = name; } - public void add(Exercise exercise) { + public boolean add(Exercise exercise) { if(!exercises.contains(exercise)) { exercises.add(exercise); + return true; } + return false; } - public void remove(Exercise exercise) { + public boolean remove(Exercise exercise) { if(exercises.contains(exercise)) { exercises.remove(exercise); + return true; } + return false; } - public void get(int index) { - exercises.get(index); + public int indexOf(Exercise e) { return exercises.indexOf(e); } + + public Exercise get(int index) { + return exercises.get(index); } public int size() { diff --git a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/widget/AppWidget.java b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/widget/AppWidget.java index 6203f57..f13b1c5 100644 --- a/app/src/main/java/org/secuso/privacyfriendlybreakreminder/widget/AppWidget.java +++ b/app/src/main/java/org/secuso/privacyfriendlybreakreminder/widget/AppWidget.java @@ -10,7 +10,7 @@ import android.os.Bundle; import android.preference.PreferenceManager; import android.widget.RemoteViews; -import org.secuso.privacyfriendlybreakreminder.activities.BreakReminder; +import org.secuso.privacyfriendlybreakreminder.activities.old.BreakReminder; import org.secuso.privacyfriendlybreakreminder.R; /** diff --git a/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..694179bd46b685e55da1b4dde2575bde0b2bfd64 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K;o2QFoh{y5d1PRu~4CX)Hf7s8+ zA**4&;-Ni|k0wldT1B8K8lBbJfNCo5DGaETu4Mf}?2B)#l zb-AONd&)YjO`v_^^{gD%3xA&6WO--#_jr6|V@s@Giq9W;kX&`+h3Nr=!>9&BGH7*ROEODjfLq?tE}C&^887S3j3^P61kUOFI fTfgBkiO*~+jBKH-qjnO!mZF74z`KYHotZQj~G9OBG_t^ED_kIXRP z8;w~~Qsa5P=BYWdU__EBJMKte9gdtxYdq4khJueW&Pc>cvi{6361huX>Wn1p1Yv6= zaRmWW!dHC7;kXjM_MA66Bsd3vLxS6)G3IUxb&OD!2oiZTy*WyW7pRP32C|k0wldT1B8K;wWo_?h{y5d1PRu~2@%cz`Tk2c zTwv_<E5juBY?z2sqDoGA^{8xbs2ogzZvA71C3$u MboFyt=akR{08!Q;k^lez literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_mode_edit_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e531d72a5b717f4eeccbea70fa4bd8f53cc117fc GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpL{AsTkP61P7i_r>If%GEZ1z2K zZqg3>wYjYh2jpF1B6Lz%|k+Hiq>)?FnR#(|jB< zXJfC_Gl$@rr~a@ucR3zikQ89JLL!7mzGu%Z=7meuW_4=1G65aO;OXk;vd$@?2>`qC BP#^#R literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_notifications_black_24dp.png deleted file mode 100644 index e200012181c392372b6c950a9464239709367fcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8Lp22U5qkP61PXEvTZ6d>a8@UZ?1 zA+c-66fgaBRuc>lIKkqWwEBhLN~4B^=^YF1?lx0w{jkHlvNhq4U%kY(4%UYj${gxU zt{#`?C=^ypw+}YdKA#S3~g6)IW)n6udaq z+)GOiED3ODRoiN{EBVotiHBXj>?{2uy>wZi)V_=1zmDyj)K|Gw_IHc)r4T`te0NDl hwI^3XQhFp;iAM+Z&9%(1ZU(xY!PC{xWt~$(698`;Th;&o diff --git a/app/src/main/res/drawable-hdpi/ic_pause_black_48dp.png b/app/src/main/res/drawable-hdpi/ic_pause_black_48dp.png deleted file mode 100644 index bb707eab97b3d48167a29bb8c21fc02cf582ffac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xf3?%cF6f9D;UIQtYDYfuzAy#I~!Bp9Eok4p0B{HuiHB}$V+qS6!&d`8=uTAZp(j*(RKzESv+D^YJz!E~ySM++u72Lv s%Lwqa0{zC|>FVdQ&MBb@0JEE2djJ3c diff --git a/app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-hdpi/ic_sync_black_24dp.png deleted file mode 100644 index a5ebdbd072989517b8c6230f65f7064d7c2ac017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmV-$0gwKPP)Bnh6NK+0$5`HOv#KS=tYj%F$hmx(`HEa6MGCz zVd+xXR3C*q>XmoYu)EvRqLNoKN9vrWebtl-5=snn_&aj!VDzSo@fq7N>%r!;1bAd`3JYD@<);T3K0RTZ}7R&$u literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_delete_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_delete_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..999aa4ccc3f87967d30bed76cd980653d9ad2e95 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1Gfx-CkP60R2`-1mhm42oHEI~1 zJY@V|=xk&fz~^CFA98pF+nfiYVNdl7vOlC(bh_?*uW)yDOtOuIF;OXk; Jvd$@?2>??mBq{&^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_home_black_48dp.png b/app/src/main/res/drawable-mdpi/ic_home_black_48dp.png deleted file mode 100644 index dcdcfc0a80de0fe05a62160fc706e9363a0239e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DZJsWUAr*{oC+`((au8vg-ry4~ zb%Adko37L81$?_NsI6eMUeMTmlA}UM!ovJt4Ria&+qwyhkN!0FJD9pDLDeho#*?X& zL~mS5@Rv4AS@x)J?~R~|6K!Ru-Pous+}N?#Q0T;giE_Ua&NsHsk=&rqHz&g3Y{%b% zCG+g3b}svTGWaEe*cS3BWY?jZLm|5+D)=nbIHT^Pss$vLYM)6rp1RSpO5rH8+y{qq d4eT<ojwUa*oC)#{gQu&X%Q~loCIET=VpRYD diff --git a/app/src/main/res/drawable-mdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_info_black_24dp.png deleted file mode 100644 index 5ef3dc0809e2030ac573605e4d50a1b15be283f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+irJgR1Ar*{!&pBo_7znsMbQe4M zmu2aqie+Lg_Z%-OYdThQ-1WK3yF`&wq~^cgljetCWtg?+{hpb=@c6_R&GITYJe^Gr zn+wS+w{7@Qu3Fze@l2LUOog?>hoS^g9uF~&xlN*)H`W{wZ;U+{TXN|u|AX!W%Mvu1 zCO7Tl*uo`~E>@u<#XBj|^}>ul|6C>19PJEUR$ER;nAhbpt#9Vs*Ef&3bU%Gs$9S4s WW8+=f3r;`>GkCiCxvXgTe~DWM4fOr#gq literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_mode_edit_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9efbaae2884ce2b15d160cbc1b1d3aa806545068 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+ibWaz@kP61D=hpHz7>Kw&+${6o zc#5UgjfG8?g)9b3IOaK+ZePjZ_qKfYae3(oPRl=yvsP5SM2GG$rsh6 zMNd}k{yVQ?;_V}i=US6@3GLf|`nFNrWWDK=Pgj0m)0|tso;$cJM>=9x638tKp00i_ I>zopr03PT%=>Px# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-mdpi/ic_notifications_black_24dp.png deleted file mode 100644 index b36475d7fa83a40c21ebab1109c6d2a73d2484a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iT2B|pkP60R355ekCY+gYkP61PXBGJv7&w>>|NYOr vpwSdtHCcG=3ze_;ezP+$lmnFk!KFziX4m!waNe;`1aUoG{an^LB{Ts5hM^k< diff --git a/app/src/main/res/drawable-mdpi/ic_play_arrow_black_48dp.png b/app/src/main/res/drawable-mdpi/ic_play_arrow_black_48dp.png deleted file mode 100644 index f208795fccb514a4b7b698bbf9b3550c5cbed580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0D>7Fi*Ar*{ory2?#3J_p5=S^i< zz+kd~N%R3zNCUUe5oW#@nU_^~t_E*7>YF#eLHFOe+F8CAO!U94SW~mpXhze2wZ3%; zsn5=x6HLkX>r;rXFtTcTbNHrEN@uu`N}TV63RlNRS6Mp4MZlcZTw-!PuJV=7($cI7 z4g8O`9<(o8dakrd=SQlVMjCCUMHOLgs0@uOIM+hc=c_OeCtYY$lmfH>|_qY(a5Lp zBC`?BMt+0`nYqvz>4i$B5_%&SVO?^iM%c@|3GYT~gU&Mf*o80860LBx0>q!>QEKKS zbPhJ=;$MP1X$|6brX|#l&bsLVpmeTu&enbW0-8ozYX{n?_5c6?07*qoM6N<$f=D}Y AIRF3v diff --git a/app/src/main/res/drawable-v21/ic_menu_manage.xml b/app/src/main/res/drawable-v21/ic_menu_manage.xml deleted file mode 100644 index c1be60b..0000000 --- a/app/src/main/res/drawable-v21/ic_menu_manage.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..67bb598e52a36b6caba846efe733501479965a41 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZA`BpB)|k7xlYrjj7PUCQj>eo}T~gdcQ3PU;8~!-+H4~OaKZjoIg)3i005} qiMH7Fyj-Y9Kzr+B%hn@D&gi|3kyH5eQnCbS4TGnvpUXO@geCyhvNFd2 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_home_black_48dp.png b/app/src/main/res/drawable-xhdpi/ic_home_black_48dp.png deleted file mode 100644 index 04e2b26ff139fe6c17fdfd5ae816dfe8b94c32ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z^Lu%;uuoF_~zh7UMEG7wu}8u ze$iqVcxO1aUzmAM?7Zp>NAm>6EUQ`Ct*wSx>5qK>6$=Oo3Qm;g)G0o&@&xPba3#K6 z%^S&y&BmS5-@bSqnrJIp9eMMi%d*6LGb28kmp9tyGS|O5b6}s$oE^sD?xs9P9R!Z_ z75`B8Z(s2HaaOv+jvdD3_xj(@iQ5wQ?NL}~*gq)I8fJEYcY)~s9ia=R@)j^>s50MS zi2B(b%@}o%$-H0e=-I`tg`YD5@7P3%U~s1aWuF3ND}l0d=Ka%-V{k(oZvXyV8UMT3 y0~izy3@`p?t4o+3U}gbk7>D5($61se024W16Y9PdLry5vdn5qWG7(8}rf#0;i^i3`Bz)3@LmB1SV3Ir;F zXA1R55y$7>4m@$40i?z@(7tAuhqf9h{9DK(kS9VPYq@pj?P({$*j*$70e+edaK1ul_2NP&A~Pg39!*_#v? zkeRk$7|4Mf$N?t@T-x(e!eI;N(w!F)7P$0*|EtF)>xk}V7O04Biy9mEOaUnp*K{AN cD9HYhcl4RW{G`P`$^ZZW07*qoM6N<$f+&V{8UO$Q diff --git a/app/src/main/res/drawable-xhdpi/ic_pause_black_48dp.png b/app/src/main/res/drawable-xhdpi/ic_pause_black_48dp.png deleted file mode 100644 index 792104ff329b894c2df7d2ea574bb0d076b36c23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeK3?y%aJ*@^(YymzYu0R?HmZtAK52P4Ng8YIR z9G=}s19HSYT^vIy7?T;A13&z?=ipaAr;$Fzn2Ukwzwc3d zf(=X;8n{9lxC0pV3s}T;nne-? z)~>paPb2Pm^0|K<=BZzL=UhB(GofEdzxb2E^TH}`gTLOMTxqQ$XU@Gn_$BM&>AQ0e zeqmy>mM7*}PBNfg!`- M>FVdQ&MBb@05rae3;+NC diff --git a/app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xhdpi/ic_sync_black_24dp.png deleted file mode 100644 index 860a5db38b393009a7407ced8d9fec8da0b460e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmV;^0WAKBP)Y8m235b4thfjq5s2xGL-&my=8Y}rO#iqNL_sAt7# zbGQi8aPN&dD}Q(UKmQ-YoO`)AM%MLWT`$)4VqGuR^3-I(3JalY4Vwc%W0i@p9B?ix{5h)DbUhjrRWQ zC$I66YjjKu6StQJ zPo5IU6w&jpC@59DAecvdaf&5rK~PjglW}m0Jwp-{q$)-COd;&Jrcaw1Qk^1WgA`Ad ziaHZcwhG9|xiJ$cDFbG#IB*wVAB%B4*7aD|V_lDRJ&d?8{sN$?X^Ds6w;2Ec002ov JPDHLkV1g1j%<2FD diff --git a/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..0fdced8fce76a0f9a527388935adecebf63d0dae GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^9w5vJBp7O^^}Pa8OeH~n!3+##lh0ZJc~YJ(jv*C{ s$r5`OFVdQ&MBb@07vc`*Z=?k literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_create_black_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_create_black_48dp.png deleted file mode 100644 index 9160023a2b4c62625d6f297506a171dac2973d8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ)^zFjjcFIEGX(zP(}X)f_0&dhxP^ zhw2U24}$6HOG?=M4j(Fv$W9bI=%w>0nJud0slHi~&Zg!Vk-Tf$(>JU-tm!#P1%z&0 zI93|;xoZ9PUF#xyvow8QuWQTSz0$LG>Efz&50Agg-oE8bv&KgSE}IS}{zV6xH9mlu z{%VJsGt@sSSgmCgTvV?*OCf4+Wv*h>-p5gri%#!*H}A8QxmwlBw>o<=e7@WgKYwA) zi&f_HuDNXfR}m$2_u2~idEZ>RZ@q3`ZhLXjx9Vq|E)`0G^E_JAg&ra?JzZiy_|%^l z?%eiKMagC+2hh&RogZA3Z01`ZzWmpjnP1MP;=_ZJ4-Yo8^UquE3#R34_<>>|5s+lb zq2dk*YmKm+4Le*W7N{h+!U+cJPcpyQXg}|eFkZOX4-#OLzAzf{m|r*Bc|!#l6%3xP KelF{r5}E+H+_{ec diff --git a/app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_delete_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..6d7cb81c566fddaa41239598fabbbd79e95644f3 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhaw+B{txLn;{GUfRfe$biA+V!W!g z!(>+78J86lXD9?ml%z3p{T2}VQ_sEUk%94MA8G5qXUn$f7kye{^E`RUy!i@_O?8T| zXL1UuyzqByVgb?~6M$kc#(9qAg0H0*LzCtzFK}8j^|;CNV@?~Czk8l*EYMch+tR2V g&c&TPbLLHMiMh-N{H%+20$s%5>FVdQ&MBb@004zT7ytkO literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_home_black_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_home_black_48dp.png deleted file mode 100644 index d66401cc7ee5247323db1d0e5fda5a4abc986449..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 485 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q1xWh(YZ)^zFs|`*aSW+od~3)ejt(0xBY_Z3`g?>#w;r?yH3Mn@>gyZoOhh0;t4|kLXOqVG4!-_PpVOP z-aGBek=(OPwwe~g{Qe>@@_e25clsfI>{4yS*i@w#W^D{rz1-|>AY{nKWX$hsQ2NUm_Zew|kB`R>yWO+Byd{gCa6 z;F1F8&o6>^e6IYWdFQ9iFOepjX+a#HBD@q&Bx|-R^e=@AEIgHL-)h%y*J{%LSL7E^ z=>}8DJ^Px3_)tn7z0fVQjpUXO@geCym4Z)}Y diff --git a/app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_info_black_24dp.png deleted file mode 100644 index a81eeb9ee7ef8ab1662b5b6bc88cf74912e4cb5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 579 zcmV-J0=)f+P)YDX|Txx7F9T)MSz5C z%me$p#<(@Ec}8Mx!WA`)S?3W+u@6bG_Q+CN{iWZ6iFpgn8im7?Un+GeL)QF6AA4ghWDNXmU%KBG@?RmKM)K1 zMojBSqWw=2twt=5)`ISdVGXesBvgrXZ8hkU2o;{K22Jn?b%0n667~qyLM-o&5Jdv( zL4TP?X$x_%4U`&Af{svXIte;OspBN5jZz=6{@DvXl!i`%1}Ftig2q!9G`&wY{XgoC zlb|+AO(#JoC^eh}9ip`9BT! zt3hvwp=B+|Cze%9K`*Qj(>Y>cXT-L|$au~Wj|A$*gSJWNv(cQ7Bv#Y(JK#w*j9P*Yqa=F};`Uf%+Z6V(b RSUCUy002ovPDHLkV1jt6`k4R# diff --git a/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2807e4ebe3f77a5b830c06d76082532d9a91de GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^9w5vJBp7O^^}Pa8OeH~n!3+##lh0ZJdE%Zfjv*C{ p$r5b~`u^Gr{8653n)QAHJHzX3N$>My@67>e^mO%eS?83{1OWFN8fX9j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_create_black_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_mode_edit_black_24dp.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_create_black_48dp.png rename to app/src/main/res/drawable-xxhdpi/ic_mode_edit_black_24dp.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_notifications_black_24dp.png deleted file mode 100644 index ab8a9c464c6c30f54a49d18e1d48b3b8637a9295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 383 zcmV-_0f7FAP)z9Eb5|s``^)CE_}yje)z64pu{@M5;_j>;{9|U?dVTN(BQGf?Y^x(n#9o)!|G% zjU4BEPu~u|&vOG0CJAFqk!rUBLt&b8T-X^?co*)3o#I&$*V6)CRU<=Ncojs30vigA zQsRV0WT?S0E94odF?RXD{n0zygPU6B6&Ist78!sYI=Gm%sgSV)+&|kVLp5B2*2%~c zokT+|3ZOU68!lmw`W^j}en-C~ z-w`ZncLYl=0<4vB2$j%)(JeuRaXJ-b_M%dt*X16+J datt|R%rC40J4*F-*<%0z002ovPDHLkV1n31phf@y diff --git a/app/src/main/res/drawable-xxhdpi/ic_pause_black_48dp.png b/app/src/main/res/drawable-xxhdpi/ic_pause_black_48dp.png deleted file mode 100644 index dc63538f31b9c96551808271cee9d704697e0b8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^6F``e8A#skDEJMe*aCb)T!AzYEKT2e9!N2k1o;Is zI6S+N2IQ!Fx;TbZFeWR=_cR3_`2YVuJ4a`HMhF6S4-4ofl{Z7~H@0_RqYg zGmm4=^jkLWd6)Ok@1euYtTP0@B%S;zO=7AU{CD^|j?_jXg?g7W|RFJPhZfk|cV$(bQ@w)cZXJYD@< J);T3K0RUM-zj6Qo diff --git a/app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_sync_black_24dp.png deleted file mode 100644 index f7990080d1d7d7e30b1844c18be8928128af147c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 669 zcmV;O0%HA%P)Ri)#A+rN#ZV}M#KrnQ=uoUdx&}e)B(84V)X*Zhb`j|=Sg}(VanQLY z)jde5NeBw@b}N@>BJX?O$-+X_Zyy1Q~JX9W8v!)}~bi|sDSkn<}I$}*ntm%j~ z9kHe(+;B;meM-zT*nOQ~j#(ySLPw>+CRr0gDs@&#*-{ct8MUTVV>WrE=cE~@z!sG@ zN-c^>D`}?Kp%s)$S}DjF2Y0^GOt&A`B27f)iji)gA9<>X$_XjF_`tB|ftCv>t>D2c zYFva=>dYif^r{>pGMfkzQt3Vx5tVf!(nkXct#m(!=r=AyBtEK=GClZ^L+_;}B5|xL zzT(TSYC9qVSwtm|FVm{+mI0huPzAs6=LzSkaSmrbtML+Xu&o+5aOQ^^e@7hXZ@z~! zzt#9_;$T8Gp5aVQjlU!g`c-2UXKvN_Q{tdkHD2S)4f-04gC6v4WI#|=enhvb-FnQ!32goiP%3qR|00000NkvXXu0mjf DBY7@j diff --git a/app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d64c22e9edfdcf9babea9681c44e2dee53a6d2f6 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^2_Vb}Bp6OT_L>T$m`Z~Df*BafCZDwc^5i{T978G? xlN*`>5BzUTIj7P7-(I3-fns}2dtZ?oBSS_(`pg9u0+k>GJYD@<);T3K0RZru9Krwq literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_create_black_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_create_black_48dp.png deleted file mode 100644 index a09d3627a8c580713139121e82dc86b26cf3db5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 578 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE1xWt5x}=AJfr-=8#WAFU@$H@cZ~Y1-+8;jO z-gtvMXFkDe%RLdo_;*p6=`}jy=!zeR(|_&>%2) zz_9N8;-41xpFOXcx4k%jU7M`!jQ5{k_y0C9Z=bs-=Hd0Tm3h3@63H_Tn=x4hOqIBd1RSldz7O#ra;vxexxv@V;azZ!c*w-+XXxtojd= zKce5i_6h%y*p^s6_koS{r}x$eci)^)f1gwCoYMby!ZmZVixuk)4*uOa!G6Yrk1;3Y zeF|oA|7_-b692FXNL&OF2SLO}5U~(MOau{)AfgaNB!Y-Q5a9?S3_--t$(#}LzP~u1 zyjP#Ff4;-NI;Nk8IiK*W0WER(_aM*TS*pMNv{82(KDbo@#G$@&h)dA$GC>V1*KigE%|WE~;_ky~ z9J-g7C00J`4^4Q(VxGV~>&)ykk80L8RtvRxOj23tnLW?`p4GoUTuy)g1Of3yPXFiG zazK+98kT&N|Lg!_5daPIFZ~QZ^;?g1j^_KtA{&7HA)pELjSa6-mD^^%2jmpgE4=UB)lG zfRc*%BtbflfOYCwcwb~q*WC3$$5njJ(icserD6-NE#^K~RdO)0U(bU30&6rj0X+cK zypAEg`QH5h+5LT)z?czW_?n-~akpjxQ#BI{hk$}Z0|O&EqhT7R7|9}kI1z>e?S%sY XC$})ypEvhZfDuaOF?qdkw!ZaV?`>xjy6gVLBv5If;S){v5mCXA=Y@H1rfw?2k|s36`TsO zNHkbQ$!A*+5eLd!$4>T2_S$>D#r=D(;16rBEP_R$P$(1%^^m2=ItNs!^UUj8&(x`~ z&l*LtbfZ#|309~g2Axu3oCHcl$g<57(qs*`7$HKSIw(*>Ty)MH?F1shPyB;e=#~ZI z_$<#QVzCQy_@bx0J~enA3k6_=)wfSbaFejbp3yC+S{ z_7DY?X;B_gQjQiRTt1lJbNASe)3hHEH3Nk2X;KG&s~Yf`BuyzGss;$NVD1ZQ>IR$< z!B`eiH$cc>Y+L1kO$;S@QaRv}I7TKArHx@^1yR}(MyiO?PB74eD6Y%=3f0*#j*5ul z=5e%+D6WK~14MDVII194dQYr$jH9~h0XH~$Rz0ABqgT}fUjFw3KEM%D{t z0UH<_Q90l{j72zCH=xQV%rU2Kzzj`k=T_B#ItiMzplU#Yrp38XGoVI{7UU2mP12$= zqM+YsSs!;u!2L@vF65Db%i+>05@0{$T9iX1pnj(f3sO{(06L`;O9r??eD0Do77h74 z;V-_%vH{L~JUnSU(9NMwpKd1}iL!=x+!AegYKnUge|2;CAWhk$H%~9V$#H>L?3_t_ z7Uu^(BNnPtAVwgP%(}c>tIUufP!Te0^4P-PR2zKDCzOaY#u9%b231&Olo%?d7-pUl wyBu>vgO|4&+;Gee%M{4ag*Bm2C=?3)2UQ-CT`xs~ZvX%Q07*qoM6N<$g2UHD;{X5v diff --git a/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_list_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6d3b0449b8c59366b29c2209bb23e80325080c GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^2_Vb}Bp6OT_L>T$m`Z~Df*BafCZDwc@?O(%@xS>XdsLA^!WH|)|0G!%Hn8t^oG?pW9;DsV)z4*}Q$iB}k@*`j literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_create_black_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_mode_edit_black_24dp.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_create_black_48dp.png rename to app/src/main/res/drawable-xxxhdpi/ic_mode_edit_black_24dp.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_notifications_black_24dp.png deleted file mode 100644 index 86f89d75000ada881e4c14891ceec47c27c7fb0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmVtWS;T; zaYBz`tPu^nL@|bq0naE#)fn)NVnp*CkjTQsfCVzQ#5%jgl8xP!>8N(0U!w=NC1j@$!jz5g diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pause_black_48dp.png b/app/src/main/res/drawable-xxxhdpi/ic_pause_black_48dp.png deleted file mode 100644 index 66178aad156f79acd86025ab885a37c06ef39a6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvS8AxUb{c{0QYymzYu0R?HmZtAK52P4Ng8YIR z9G=}s19CJxT^vIy7~h`U$jHFJa>U`ce(yQH_m`IJ_%&(Cy>|=^Iv|Y=OCGT4%Gazj Sbjw)>;(NOKxvXV{bI|OvU|_#&b6JW zyPvtPy`W)kf90Idiqa2uT;C~qh_TG>d8J-kPQ&AS&&oL1E&S#jWA3rKXX=n;(S$qh*R>Hg7a?cvsY7WT<=tNeUSKmoF(0-;MhPA g>d4{G!0_RG4P%>>?y~Mn&TBw2p00i_>zopr0E+m~NdN!< diff --git a/app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_sync_black_24dp.png deleted file mode 100644 index b9f56f327d6346a39fa6f69d8827ff0be7a4337d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 875 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z-;8{;uuoF_;%J_Z=H0J_W3g( z>AlH{ab;?9Jg@dus zS3Fj^r{zaz$Fn8&d}%W(?;Egx`}y_xAGvkbzxP>-ufMV)F!@|n?Z&wHHP^*oe?5wo z*(xr#vgi7N3?sowUJv(kS~`R% zow7(}bPUo|SvZet(WVAxsUOmwD<|~i{SA0Jjcv|H-KHfW9;dh#88sV!vHwuMW4TLc z?n;3NEp{$XwQCG|SA2Qc5^DNw7L%QZ&`RIc7LN4~*FWgi-TG35eT$OT-5-m@12Ywk z4`)4*|DpUKDpy*`xI61f|BsaL+}Y~JzxMp#wVN4q``d{#ol-yL=JTw|J)YuLzqh8z z|JK!Q+(w^QxJ~=ux%t*NhqQlz%FH!E0k`L!Jj4B~TyB2LueVLV?H8)me44mVe)oTY z?GGoLeV0%ADLma@Wb+3-&*@0 zm+`E+S*O?kbK^c8_wV_OIqO#k&$L$k;39r3-p+pV|bchu(99KY6clnh~I|v&r15vZHo?-24CqcCN)9K3XN}A}1OT zxve=QtUaZ}y=d`*_!BEbW-dFCt&-2h$|v|pc%!R+qu7c0hwMJNt-G1p<#;P|S;Lb+ z#T4F?6J#_FaD2ZeYGtu$oq&;BN;IQX6N%zUvB3!n~xic v+kD7bYbW*k>&7^F?8L|D{cgQd|C!2ftO$D&n7s#>i5NUx{an^LB{Ts5h>e~y diff --git a/app/src/main/res/drawable/bg_splash_screen.xml b/app/src/main/res/drawable/bg_splash_screen.xml new file mode 100644 index 0000000..5ee60fc --- /dev/null +++ b/app/src/main/res/drawable/bg_splash_screen.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_alarm_black.xml b/app/src/main/res/drawable/ic_alarm_black.xml new file mode 100644 index 0000000..87e80a6 --- /dev/null +++ b/app/src/main/res/drawable/ic_alarm_black.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_check_white.xml b/app/src/main/res/drawable/ic_check_white.xml new file mode 100644 index 0000000..6541ee3 --- /dev/null +++ b/app/src/main/res/drawable/ic_check_white.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_close_white.xml b/app/src/main/res/drawable/ic_close_white.xml new file mode 100644 index 0000000..d11cc5c --- /dev/null +++ b/app/src/main/res/drawable/ic_close_white.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_create_black.xml b/app/src/main/res/drawable/ic_create_black.xml new file mode 100644 index 0000000..7575f1a --- /dev/null +++ b/app/src/main/res/drawable/ic_create_black.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/drawable/ic_delete_white.xml b/app/src/main/res/drawable/ic_delete_white.xml new file mode 100644 index 0000000..2b8ab5b --- /dev/null +++ b/app/src/main/res/drawable/ic_delete_white.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_home_black.xml b/app/src/main/res/drawable/ic_home_black.xml new file mode 100644 index 0000000..31e1a7a --- /dev/null +++ b/app/src/main/res/drawable/ic_home_black.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/drawable-v21/ic_info_black_24dp.xml b/app/src/main/res/drawable/ic_info_black.xml similarity index 100% rename from app/src/main/res/drawable-v21/ic_info_black_24dp.xml rename to app/src/main/res/drawable/ic_info_black.xml diff --git a/app/src/main/res/drawable/ic_list_black_24px.xml b/app/src/main/res/drawable/ic_list_black_24px.xml new file mode 100644 index 0000000..5ab5d87 --- /dev/null +++ b/app/src/main/res/drawable/ic_list_black_24px.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_list_white_24px.xml b/app/src/main/res/drawable/ic_list_white_24px.xml new file mode 100644 index 0000000..f5ea0e9 --- /dev/null +++ b/app/src/main/res/drawable/ic_list_white_24px.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_menu_tutorial.xml b/app/src/main/res/drawable/ic_menu_tutorial.xml new file mode 100644 index 0000000..f8d18b2 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_tutorial.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_pause_black_48dp.xml b/app/src/main/res/drawable/ic_pause_black_48dp.xml new file mode 100644 index 0000000..0887d64 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause_black_48dp.xml @@ -0,0 +1,4 @@ + + + diff --git a/app/src/main/res/drawable/ic_play_arrow_black.xml b/app/src/main/res/drawable/ic_play_arrow_black.xml new file mode 100644 index 0000000..54a30db --- /dev/null +++ b/app/src/main/res/drawable/ic_play_arrow_black.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings_black_24dp.xml b/app/src/main/res/drawable/ic_settings_black_24dp.xml new file mode 100644 index 0000000..ace746c --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_view_list_black_24px.xml b/app/src/main/res/drawable/ic_view_list_black_24px.xml new file mode 100644 index 0000000..0873a39 --- /dev/null +++ b/app/src/main/res/drawable/ic_view_list_black_24px.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/progress_circular.xml b/app/src/main/res/drawable/progress_circular.xml new file mode 100644 index 0000000..d448196 --- /dev/null +++ b/app/src/main/res/drawable/progress_circular.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/circular_small.xml b/app/src/main/res/drawable/progress_circular_small.xml similarity index 100% rename from app/src/main/res/drawable/circular_small.xml rename to app/src/main/res/drawable/progress_circular_small.xml diff --git a/app/src/main/res/layout/activity_break.xml b/app/src/main/res/layout/activity_break.xml index 000b62f..e1d5dbc 100644 --- a/app/src/main/res/layout/activity_break.xml +++ b/app/src/main/res/layout/activity_break.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="15dp" - tools:context="org.secuso.privacyfriendlybreakreminder.activities.BreakActivity"> + tools:context="org.secuso.privacyfriendlybreakreminder.activities.old.BreakActivity"> + tools:context=".activities.old.BreakDeciderActivity">