From f7cd796b9a0201beab165146e68badad68b8c8f2 Mon Sep 17 00:00:00 2001 From: smileomi18 Date: Tue, 14 Aug 2018 12:39:29 +0530 Subject: [PATCH] Added sources for Android app --- Android/.gitignore | 9 + Android/app/.gitignore | 1 + Android/app/build.gradle | 40 + Android/app/google-services.json | 42 + Android/app/proguard-rules.pro | 21 + Android/app/src/main/AndroidManifest.xml | 94 ++ .../bookmypcr/activities/AboutUs.java | 34 + .../bookmypcr/activities/AddPCR.java | 59 + .../activities/CalendarActivity.java | 469 ++++++++ .../bookmypcr/activities/CreateLab.java | 108 ++ .../bookmypcr/activities/EditEvent.java | 335 ++++++ .../bookmypcr/activities/HelpActivity.java | 34 + .../bookmypcr/activities/JoinLab.java | 116 ++ .../bookmypcr/activities/LoginActivity.java | 544 +++++++++ .../bookmypcr/activities/NewEvent.java | 350 ++++++ .../bookmypcr/activities/NewUser.java | 149 +++ .../bookmypcr/activities/NoAccess.java | 40 + .../bookmypcr/activities/ResetPassword.java | 64 + .../bookmypcr/activities/Settings.java | 230 ++++ .../bookmypcr/activities/SignUp.java | 64 + .../bookmypcr/activities/SplashActivity.java | 111 ++ .../bookmypcr/activities/ViewEvent.java | 71 ++ .../bookmypcr/adapter/CustomAdapter.java | 85 ++ .../fragmentHandler/DayFragment.java | 201 ++++ .../bookmypcr/pojo/AppDataClass.java | 75 ++ .../sminnovations/bookmypcr/pojo/Booking.java | 145 +++ .../bookmypcr/pojo/ChildEmail.java | 68 ++ .../bookmypcr/pojo/DataModel.java | 33 + .../bookmypcr/pojo/Equipment.java | 49 + .../com/sminnovations/bookmypcr/pojo/Lab.java | 86 ++ .../com/sminnovations/bookmypcr/pojo/Pcr.java | 72 ++ .../sminnovations/bookmypcr/pojo/User.java | 57 + .../res/drawable-hdpi/ic_add_black_24dp.png | Bin 0 -> 123 bytes .../ic_add_circle_black_24dp.png | Bin 0 -> 328 bytes .../res/drawable-hdpi/ic_close_black_24dp.png | Bin 0 -> 206 bytes .../res/drawable-hdpi/ic_close_white_24dp.png | Bin 0 -> 220 bytes .../drawable-hdpi/ic_delete_white_24dp.png | Bin 0 -> 160 bytes .../res/drawable-hdpi/ic_help_black_24dp.png | Bin 0 -> 457 bytes .../ic_keyboard_arrow_left_black_24dp.png | Bin 0 -> 149 bytes .../ic_keyboard_arrow_right_black_24dp.png | Bin 0 -> 146 bytes .../drawable-hdpi/ic_settings_black_24dp.png | Bin 0 -> 452 bytes .../res/drawable-mdpi/ic_add_black_24dp.png | Bin 0 -> 85 bytes .../ic_add_circle_black_24dp.png | Bin 0 -> 221 bytes .../res/drawable-mdpi/ic_close_black_24dp.png | Bin 0 -> 163 bytes .../res/drawable-mdpi/ic_close_white_24dp.png | Bin 0 -> 174 bytes .../drawable-mdpi/ic_delete_white_24dp.png | Bin 0 -> 114 bytes .../res/drawable-mdpi/ic_help_black_24dp.png | Bin 0 -> 297 bytes .../ic_keyboard_arrow_left_black_24dp.png | Bin 0 -> 124 bytes .../ic_keyboard_arrow_right_black_24dp.png | Bin 0 -> 132 bytes .../drawable-mdpi/ic_settings_black_24dp.png | Bin 0 -> 321 bytes .../src/main/res/drawable-mdpi/shanmukha.jpg | Bin 0 -> 32680 bytes .../res/drawable-mdpi/shanmukha_splash.jpg | Bin 0 -> 5019 bytes .../app/src/main/res/drawable-mdpi/splash.png | Bin 0 -> 6582 bytes .../src/main/res/drawable-mdpi/splash3.png | Bin 0 -> 6533 bytes .../src/main/res/drawable-mdpi/splash4.png | Bin 0 -> 6607 bytes .../src/main/res/drawable-mdpi/splash_2.png | Bin 0 -> 4519 bytes .../main/res/drawable-v21/ic_menu_camera.xml | 12 + .../main/res/drawable-v21/ic_menu_gallery.xml | 9 + .../main/res/drawable-v21/ic_menu_manage.xml | 9 + .../main/res/drawable-v21/ic_menu_send.xml | 9 + .../main/res/drawable-v21/ic_menu_share.xml | 9 + .../res/drawable-v21/ic_menu_slideshow.xml | 9 + .../res/drawable-v24/background_splash.xml | 17 + .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable-xhdpi/ic_add_black_24dp.png | Bin 0 -> 107 bytes .../ic_add_circle_black_24dp.png | Bin 0 -> 407 bytes .../drawable-xhdpi/ic_close_black_24dp.png | Bin 0 -> 234 bytes .../drawable-xhdpi/ic_close_white_24dp.png | Bin 0 -> 256 bytes .../drawable-xhdpi/ic_delete_white_24dp.png | Bin 0 -> 150 bytes .../res/drawable-xhdpi/ic_help_black_24dp.png | Bin 0 -> 578 bytes .../ic_keyboard_arrow_left_black_24dp.png | Bin 0 -> 159 bytes .../ic_keyboard_arrow_right_black_24dp.png | Bin 0 -> 162 bytes .../drawable-xhdpi/ic_settings_black_24dp.png | Bin 0 -> 556 bytes .../res/drawable-xxhdpi/ic_add_black_24dp.png | Bin 0 -> 113 bytes .../ic_add_circle_black_24dp.png | Bin 0 -> 576 bytes .../drawable-xxhdpi/ic_close_black_24dp.png | Bin 0 -> 308 bytes .../drawable-xxhdpi/ic_close_white_24dp.png | Bin 0 -> 346 bytes .../drawable-xxhdpi/ic_delete_white_24dp.png | Bin 0 -> 192 bytes .../drawable-xxhdpi/ic_help_black_24dp.png | Bin 0 -> 833 bytes .../ic_keyboard_arrow_left_black_24dp.png | Bin 0 -> 214 bytes .../ic_keyboard_arrow_right_black_24dp.png | Bin 0 -> 215 bytes .../ic_settings_black_24dp.png | Bin 0 -> 826 bytes .../drawable-xxxhdpi/ic_add_black_24dp.png | Bin 0 -> 118 bytes .../ic_add_circle_black_24dp.png | Bin 0 -> 765 bytes .../drawable-xxxhdpi/ic_close_black_24dp.png | Bin 0 -> 376 bytes .../drawable-xxxhdpi/ic_close_white_24dp.png | Bin 0 -> 435 bytes .../drawable-xxxhdpi/ic_delete_white_24dp.png | Bin 0 -> 242 bytes .../drawable-xxxhdpi/ic_help_black_24dp.png | Bin 0 -> 1121 bytes .../ic_keyboard_arrow_left_black_24dp.png | Bin 0 -> 190 bytes .../ic_keyboard_arrow_right_black_24dp.png | Bin 0 -> 217 bytes .../ic_settings_black_24dp.png | Bin 0 -> 1072 bytes .../res/drawable/ic_launcher_background.xml | 170 +++ .../src/main/res/drawable/side_nav_bar.xml | 9 + .../src/main/res/layout/activity_about_us.xml | 56 + .../src/main/res/layout/activity_add_pcr.xml | 93 ++ .../src/main/res/layout/activity_calendar.xml | 25 + .../main/res/layout/activity_create_lab.xml | 169 +++ .../main/res/layout/activity_edit_event.xml | 147 +++ .../app/src/main/res/layout/activity_help.xml | 106 ++ .../src/main/res/layout/activity_join_lab.xml | 48 + .../src/main/res/layout/activity_login.xml | 101 ++ .../main/res/layout/activity_new_event.xml | 132 +++ .../src/main/res/layout/activity_new_user.xml | 111 ++ .../main/res/layout/activity_no_access.xml | 51 + .../res/layout/activity_reset_password.xml | 65 + .../src/main/res/layout/activity_settings.xml | 105 ++ .../src/main/res/layout/activity_sign_up.xml | 9 + .../main/res/layout/activity_view_event.xml | 124 ++ .../src/main/res/layout/app_bar_calendar.xml | 33 + .../src/main/res/layout/content_calendar.xml | 549 +++++++++ .../main/res/layout/content_edit_event.xml | 11 + .../src/main/res/layout/content_new_event.xml | 11 + .../main/res/layout/content_view_event.xml | 11 + .../app/src/main/res/layout/item_frame.xml | 1050 +++++++++++++++++ .../main/res/layout/nav_header_calendar.xml | 35 + Android/app/src/main/res/layout/popup.xml | 47 + .../main/res/layout/popup_confirmation.xml | 44 + Android/app/src/main/res/layout/row_item.xml | 41 + .../app/src/main/res/layout/tvtemplate.xml | 32 + .../res/menu/activity_calendar_drawer.xml | 36 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 9553 bytes .../src/main/res/mipmap-hdpi/ic_launcher3.png | Bin 0 -> 6086 bytes .../main/res/mipmap-hdpi/ic_launcher_2.png | Bin 0 -> 4490 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 5023 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 9553 bytes .../src/main/res/mipmap-mdpi/ic_launcher2.png | Bin 0 -> 2095 bytes .../src/main/res/mipmap-mdpi/ic_launcher3.png | Bin 0 -> 6086 bytes .../main/res/mipmap-mdpi/ic_launcher_2.png | Bin 0 -> 4490 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2857 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 9553 bytes .../main/res/mipmap-xhdpi/ic_launcher3.png | Bin 0 -> 6086 bytes .../main/res/mipmap-xhdpi/ic_launcher_2.png | Bin 0 -> 4490 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 7097 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9553 bytes .../main/res/mipmap-xxhdpi/ic_launcher3.png | Bin 0 -> 6086 bytes .../main/res/mipmap-xxhdpi/ic_launcher_2.png | Bin 0 -> 4490 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 10675 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9553 bytes .../main/res/mipmap-xxxhdpi/ic_launcher3.png | Bin 0 -> 6086 bytes .../main/res/mipmap-xxxhdpi/ic_launcher_2.png | Bin 0 -> 4490 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 15520 bytes .../app/src/main/res/values-v21/styles.xml | 8 + Android/app/src/main/res/values/array.xml | 26 + Android/app/src/main/res/values/colors.xml | 39 + Android/app/src/main/res/values/dimens.xml | 8 + Android/app/src/main/res/values/drawables.xml | 8 + Android/app/src/main/res/values/strings.xml | 93 ++ Android/app/src/main/res/values/styles.xml | 24 + Android/build.gradle | 27 + Android/gradlew | 160 +++ Android/gradlew.bat | 90 ++ Android/settings.gradle | 1 + 154 files changed, 7879 insertions(+) create mode 100644 Android/.gitignore create mode 100644 Android/app/.gitignore create mode 100644 Android/app/build.gradle create mode 100644 Android/app/google-services.json create mode 100644 Android/app/proguard-rules.pro create mode 100644 Android/app/src/main/AndroidManifest.xml create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/AboutUs.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/AddPCR.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/CalendarActivity.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/CreateLab.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/EditEvent.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/HelpActivity.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/JoinLab.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/LoginActivity.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NewEvent.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NewUser.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NoAccess.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/ResetPassword.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/Settings.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/SignUp.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/SplashActivity.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/activities/ViewEvent.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/adapter/CustomAdapter.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/fragmentHandler/DayFragment.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/AppDataClass.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Booking.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/ChildEmail.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/DataModel.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Equipment.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Lab.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Pcr.java create mode 100644 Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/User.java create mode 100644 Android/app/src/main/res/drawable-hdpi/ic_add_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-hdpi/ic_add_circle_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-hdpi/ic_close_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-hdpi/ic_close_white_24dp.png create mode 100644 Android/app/src/main/res/drawable-hdpi/ic_delete_white_24dp.png create mode 100644 Android/app/src/main/res/drawable-hdpi/ic_help_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_right_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-hdpi/ic_settings_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-mdpi/ic_add_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-mdpi/ic_add_circle_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-mdpi/ic_close_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-mdpi/ic_close_white_24dp.png create mode 100644 Android/app/src/main/res/drawable-mdpi/ic_delete_white_24dp.png create mode 100644 Android/app/src/main/res/drawable-mdpi/ic_help_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_right_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-mdpi/ic_settings_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-mdpi/shanmukha.jpg create mode 100644 Android/app/src/main/res/drawable-mdpi/shanmukha_splash.jpg create mode 100644 Android/app/src/main/res/drawable-mdpi/splash.png create mode 100644 Android/app/src/main/res/drawable-mdpi/splash3.png create mode 100644 Android/app/src/main/res/drawable-mdpi/splash4.png create mode 100644 Android/app/src/main/res/drawable-mdpi/splash_2.png create mode 100644 Android/app/src/main/res/drawable-v21/ic_menu_camera.xml create mode 100644 Android/app/src/main/res/drawable-v21/ic_menu_gallery.xml create mode 100644 Android/app/src/main/res/drawable-v21/ic_menu_manage.xml create mode 100644 Android/app/src/main/res/drawable-v21/ic_menu_send.xml create mode 100644 Android/app/src/main/res/drawable-v21/ic_menu_share.xml create mode 100644 Android/app/src/main/res/drawable-v21/ic_menu_slideshow.xml create mode 100644 Android/app/src/main/res/drawable-v24/background_splash.xml create mode 100644 Android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 Android/app/src/main/res/drawable-xhdpi/ic_add_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xhdpi/ic_add_circle_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xhdpi/ic_close_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xhdpi/ic_close_white_24dp.png create mode 100644 Android/app/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png create mode 100644 Android/app/src/main/res/drawable-xhdpi/ic_help_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_right_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxhdpi/ic_add_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxhdpi/ic_add_circle_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxhdpi/ic_close_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxhdpi/ic_help_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_right_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxxhdpi/ic_add_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxxhdpi/ic_add_circle_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxxhdpi/ic_close_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxxhdpi/ic_help_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_right_black_24dp.png create mode 100644 Android/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png create mode 100644 Android/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 Android/app/src/main/res/drawable/side_nav_bar.xml create mode 100644 Android/app/src/main/res/layout/activity_about_us.xml create mode 100644 Android/app/src/main/res/layout/activity_add_pcr.xml create mode 100644 Android/app/src/main/res/layout/activity_calendar.xml create mode 100644 Android/app/src/main/res/layout/activity_create_lab.xml create mode 100644 Android/app/src/main/res/layout/activity_edit_event.xml create mode 100644 Android/app/src/main/res/layout/activity_help.xml create mode 100644 Android/app/src/main/res/layout/activity_join_lab.xml create mode 100644 Android/app/src/main/res/layout/activity_login.xml create mode 100644 Android/app/src/main/res/layout/activity_new_event.xml create mode 100644 Android/app/src/main/res/layout/activity_new_user.xml create mode 100644 Android/app/src/main/res/layout/activity_no_access.xml create mode 100644 Android/app/src/main/res/layout/activity_reset_password.xml create mode 100644 Android/app/src/main/res/layout/activity_settings.xml create mode 100644 Android/app/src/main/res/layout/activity_sign_up.xml create mode 100644 Android/app/src/main/res/layout/activity_view_event.xml create mode 100644 Android/app/src/main/res/layout/app_bar_calendar.xml create mode 100644 Android/app/src/main/res/layout/content_calendar.xml create mode 100644 Android/app/src/main/res/layout/content_edit_event.xml create mode 100644 Android/app/src/main/res/layout/content_new_event.xml create mode 100644 Android/app/src/main/res/layout/content_view_event.xml create mode 100644 Android/app/src/main/res/layout/item_frame.xml create mode 100644 Android/app/src/main/res/layout/nav_header_calendar.xml create mode 100644 Android/app/src/main/res/layout/popup.xml create mode 100644 Android/app/src/main/res/layout/popup_confirmation.xml create mode 100644 Android/app/src/main/res/layout/row_item.xml create mode 100644 Android/app/src/main/res/layout/tvtemplate.xml create mode 100644 Android/app/src/main/res/menu/activity_calendar_drawer.xml create mode 100644 Android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 Android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 Android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 Android/app/src/main/res/mipmap-hdpi/ic_launcher3.png create mode 100644 Android/app/src/main/res/mipmap-hdpi/ic_launcher_2.png create mode 100644 Android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 Android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 Android/app/src/main/res/mipmap-mdpi/ic_launcher2.png create mode 100644 Android/app/src/main/res/mipmap-mdpi/ic_launcher3.png create mode 100644 Android/app/src/main/res/mipmap-mdpi/ic_launcher_2.png create mode 100644 Android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 Android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 Android/app/src/main/res/mipmap-xhdpi/ic_launcher3.png create mode 100644 Android/app/src/main/res/mipmap-xhdpi/ic_launcher_2.png create mode 100644 Android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 Android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 Android/app/src/main/res/mipmap-xxhdpi/ic_launcher3.png create mode 100644 Android/app/src/main/res/mipmap-xxhdpi/ic_launcher_2.png create mode 100644 Android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher3.png create mode 100644 Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_2.png create mode 100644 Android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 Android/app/src/main/res/values-v21/styles.xml create mode 100644 Android/app/src/main/res/values/array.xml create mode 100644 Android/app/src/main/res/values/colors.xml create mode 100644 Android/app/src/main/res/values/dimens.xml create mode 100644 Android/app/src/main/res/values/drawables.xml create mode 100644 Android/app/src/main/res/values/strings.xml create mode 100644 Android/app/src/main/res/values/styles.xml create mode 100644 Android/build.gradle create mode 100644 Android/gradlew create mode 100644 Android/gradlew.bat create mode 100644 Android/settings.gradle diff --git a/Android/.gitignore b/Android/.gitignore new file mode 100644 index 0000000..39fb081 --- /dev/null +++ b/Android/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/Android/app/.gitignore b/Android/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/Android/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Android/app/build.gradle b/Android/app/build.gradle new file mode 100644 index 0000000..f42dd37 --- /dev/null +++ b/Android/app/build.gradle @@ -0,0 +1,40 @@ +apply plugin: 'com.android.application' + +android { + signingConfigs { + } + compileSdkVersion 26 + defaultConfig { + applicationId "com.sminnovations.bookmypcr" + minSdkVersion 17 + targetSdkVersion 26 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + buildToolsVersion '26.0.2' +} + +dependencies { + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support:design:26.1.0' + implementation 'com.android.support.constraint:constraint-layout:1.0.2' + implementation 'com.android.support:support-v4:26.1.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.1' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' + compile 'com.google.firebase:firebase-core:11.8.0' + compile 'com.google.firebase:firebase-auth:11.8.0' + compile 'com.google.firebase:firebase-database:11.8.0' + compile 'com.google.firebase:firebase-invites:11.8.0' + compile 'com.firebaseui:firebase-ui-auth:3.2.2' +} + +apply plugin: 'com.google.gms.google-services' diff --git a/Android/app/google-services.json b/Android/app/google-services.json new file mode 100644 index 0000000..ea3da1f --- /dev/null +++ b/Android/app/google-services.json @@ -0,0 +1,42 @@ +{ + "project_info": { + "project_number": "1014254709438", + "firebase_url": "https://thermocycler-2bb76.firebaseio.com", + "project_id": "thermocycler-2bb76", + "storage_bucket": "thermocycler-2bb76.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:1014254709438:android:8d1ce0d4ef1274d7", + "android_client_info": { + "package_name": "com.sminnovations.bookmypcr" + } + }, + "oauth_client": [ + { + "client_id": "1014254709438-p1gujkoi1npcbfcolofjqmruhcvpepau.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyC4gJHT38PjxTE40_vL0mvu8hx-c2xeq8A" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 2 + } + } + } + ], + "configuration_version": "1" +} diff --git a/Android/app/proguard-rules.pro b/Android/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/Android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/Android/app/src/main/AndroidManifest.xml b/Android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..dd5675b --- /dev/null +++ b/Android/app/src/main/AndroidManifest.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/AboutUs.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/AboutUs.java new file mode 100644 index 0000000..e7f286f --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/AboutUs.java @@ -0,0 +1,34 @@ +package com.sminnovations.bookmypcr.activities; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; + +import com.sminnovations.R; + +public class AboutUs extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_about_us); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + this.setTitle("About Us"); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/AddPCR.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/AddPCR.java new file mode 100644 index 0000000..a4f22d9 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/AddPCR.java @@ -0,0 +1,59 @@ +package com.sminnovations.bookmypcr.activities; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.view.View; +import android.widget.EditText; +import android.widget.Toast; + +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.Pcr; + +public class AddPCR extends AppCompatActivity { + + EditText title, manufacturer,model,location,comments; + AppDataClass appDataClass; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_add_pcr); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + this.setTitle("Add PCR"); + title=(EditText)findViewById(R.id.title); + manufacturer=(EditText)findViewById(R.id.manufacturer); + model=(EditText)findViewById(R.id.model); + location=(EditText)findViewById(R.id.location); + comments=(EditText)findViewById(R.id.comments); + appDataClass = (AppDataClass) getApplicationContext(); + } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + public void savePCR(View v){ + if(title.getText().toString().trim().isEmpty()){ + Toast.makeText(AddPCR.this, + "Please enter name", + Toast.LENGTH_SHORT).show(); + return; + } + Pcr slot=new Pcr(title.getText().toString(),manufacturer.getText().toString(),appDataClass.getmDatabase().child(appDataClass.getLab().getLabuid()).push().getKey(),model.getText().toString(),location.getText().toString(),comments.getText().toString()); + appDataClass.getmDatabase().child(appDataClass.getLab().getLabuid()).child(slot.getEquipid()).setValue(slot); + finish(); + onBackPressed(); + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/CalendarActivity.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/CalendarActivity.java new file mode 100644 index 0000000..931d70e --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/CalendarActivity.java @@ -0,0 +1,469 @@ +package com.sminnovations.bookmypcr.activities; + +import android.app.DatePickerDialog; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.GestureDetectorCompat; +import android.support.v4.view.MenuItemCompat; +import android.view.View; +import android.support.design.widget.NavigationView; +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.Menu; +import android.view.MenuItem; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.DatePicker; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.Spinner; +import android.widget.TextView; + +import com.google.android.gms.appinvite.AppInviteInvitation; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.ValueEventListener; +import com.sminnovations.R; +import com.sminnovations.bookmypcr.fragmentHandler.DayFragment; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.Booking; +import com.sminnovations.bookmypcr.pojo.Equipment; +import com.sminnovations.bookmypcr.pojo.Lab; +import com.sminnovations.bookmypcr.pojo.User; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; + +public class CalendarActivity extends AppCompatActivity + implements NavigationView.OnNavigationItemSelectedListener, DayFragment.OnFragmentInteractionListener,View.OnClickListener,AdapterView.OnItemSelectedListener { + + AppDataClass appDataClass; + private Handler mHandler; + public static String CURRENT_TAG; + int eventCode=602; + private SimpleDateFormat dateFormatter,timeFormat=new SimpleDateFormat("hh:mm a", Locale.US);; + TextView datevalue; + HashMap loadedFrag= new HashMap<>(); + Calendar newDate=Calendar.getInstance(); + private DatePickerDialog fromDatePickerDialog; + private DatabaseReference mDatabase; + ArrayList categories = new ArrayList(); + ArrayList equipmentList = new ArrayList(); + ArrayAdapter dataAdapter; + Spinner spinner; + boolean firstrun=true; + NavigationView navigationView; + + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_calendar); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + this.setTitle("PCR Booking"); + mHandler=new Handler(); + dateFormatter = new SimpleDateFormat("dd-MM-yyyy", Locale.US); + mDatabase = FirebaseDatabase.getInstance().getReference(); + + +// mDatabase.child("emails").push().setValue(new ChildEmail("-L81IUsqJV_A8jvWPOy2","-L81KVrIM1OreB01CcZZ","pavann3008@gmail.com")); +// mDatabase.child("-L81IUsqJV_A8jvWPOy2").push().setValue("equipment1"); +// mDatabase.child("labs").addListenerForSingleValueEvent(new ValueEventListener() { +// @Override +// public void onDataChange(DataSnapshot dataSnapshot) { +// +// System.out.println(dataSnapshot.getValue().toString()); +// } +// +// @Override +// public void onCancelled(DatabaseError databaseError) { +// System.out.println("The read failed: " + databaseError.getCode()); +// } +// }); + appDataClass = (AppDataClass) getApplicationContext(); + appDataClass.setmDatabase(mDatabase); + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + addEvent(); + } + }); + + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( + this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); + drawer.addDrawerListener(toggle); + toggle.syncState(); + + navigationView = (NavigationView) findViewById(R.id.nav_view); + navigationView.setNavigationItemSelectedListener(this); + CURRENT_TAG=dateFormatter.format(Calendar.getInstance().getTime()); + datevalue=(TextView)findViewById(R.id.display_current_date); + + spinner = (Spinner) findViewById(R.id.spinner); + + // Spinner click listener + spinner.setOnItemSelectedListener(this); + + // Spinner Drop down elements + + // Creating adapter for spinner + dataAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, categories); + + // Drop down layout style - list view with radio button + dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + + // attaching data adapter to spinner + spinner.setAdapter(dataAdapter); + + initialize(); + setDateTimeField(); + loadHomeFragment(); + + + } + +// mDatabase.child("clubs") +// .orderByChild("name") +// .equalTo("efg") +// .addListenerForSingleValueEvent(new ValueEventListener() { +// @Override +// public void onDataChange(DataSnapshot dataSnapshot) { +// for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { +// String clubkey = childSnapshot.getKey(); + + + + private void initialize(){ + Menu nav_Menu = navigationView.getMenu(); + nav_Menu.findItem(R.id.nav_settings).setVisible(appDataClass.getChildEmail().isAdmin()); + nav_Menu.findItem(R.id.nav_addPCR).setVisible(appDataClass.getChildEmail().isAdmin()); + + mDatabase.child("labs").child(appDataClass.getChildEmail().getLabUid()).addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + appDataClass.setLab(dataSnapshot.getValue(Lab.class)); + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + mDatabase.child("users").child(appDataClass.getChildEmail().getUserUid()).addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + appDataClass.setUserObj(dataSnapshot.getValue(User.class)); + if(!appDataClass.getUserObj().isActive()) + redirectNoAccess(); + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + firstrun=true; + mDatabase.child(appDataClass.getChildEmail().getLabUid()).addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + categories.clear();equipmentList.clear(); + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + Equipment equip=childSnapshot.getValue(Equipment.class); + categories.add(equip.getName());equipmentList.add(equip); + } + if(dataAdapter!=null) { + dataAdapter.notifyDataSetChanged(); + } + updateview(); + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); +// mDatabase.child("labs").child("-L81IUsqJV_A8jvWPOy2").setValue(new Lab("OMI","IISc","Sai Siva Gorthi","9740137245","Malleshwaram, Bangalore","-L81IUsqJV_A8jvWPOy2")); +// mDatabase.child("users").child("-L81KVrIM1OreB01CcZZ").setValue(new User("Pavan",true,true,"-L81KVrIM1OreB01CcZZ")); +// mDatabase.child("-L81IUsqJV_A8jvWPOy2").child("-L81SR-2oc4HxRI8dYOF").setValue(new Equipment("Bio-rad","Thorlabs","-L81SR-2oc4HxRI8dYOF")); + } + + public void redirectNoAccess(){ + Intent intent = new Intent(this, NoAccess.class); + startActivity(intent); + } + + public void updateview(){ + System.out.println("Entering"+spinner.getSelectedItemPosition()); + int index; + if(spinner.getSelectedItemPosition()<0){ + index=0; + } + else{ + index=spinner.getSelectedItemPosition(); + } + mDatabase.child(equipmentList.get(index).getEquipid()).child(CURRENT_TAG).addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + List eventList=loadedFrag.get(CURRENT_TAG).getEventList(); + eventList.clear(); + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + eventList.add(childSnapshot.getValue(Booking.class)); + } + loadedFrag.get(CURRENT_TAG).setEventList(eventList); + loadedFrag.get(CURRENT_TAG).notifyDataChanged(); + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + firstrun=false; + } + + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + // On selecting a spinner item + String item = parent.getItemAtPosition(position).toString(); + loadedFrag=new HashMap<>(); + loadHomeFragment(); + // Showing selected spinner item + + } + + @Override + public void onNothingSelected(AdapterView arg0) { + // TODO Auto-generated method stub + + } + + private void setDateTimeField() { + datevalue.setOnClickListener(this); + datevalue.setText(dateFormatter.format(newDate.getTime())); + fromDatePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + newDate.set(year, monthOfYear, dayOfMonth); + datevalue.setText(dateFormatter.format(newDate.getTime())); + CURRENT_TAG=dateFormatter.format(newDate.getTime()); + loadHomeFragment(); + } + + }, newDate.get(Calendar.YEAR), newDate.get(Calendar.MONTH), newDate.get(Calendar.DAY_OF_MONTH)); + } + + @Override + public void onClick(View view) { + if(view == datevalue) { + fromDatePickerDialog.show(); + } + } + + + public void previousDay(View v){ + newDate.add(Calendar.DAY_OF_MONTH,-1); + datevalue.setText(dateFormatter.format(newDate.getTime())); + CURRENT_TAG=dateFormatter.format(newDate.getTime()); + fromDatePickerDialog.updateDate(newDate.get(Calendar.YEAR), newDate.get(Calendar.MONTH), newDate.get(Calendar.DAY_OF_MONTH)); + loadHomeFragment(); + + } + public void nextDay(View v){ + newDate.add(Calendar.DAY_OF_MONTH,1); + datevalue.setText(dateFormatter.format(newDate.getTime())); + CURRENT_TAG=dateFormatter.format(newDate.getTime()); + fromDatePickerDialog.updateDate(newDate.get(Calendar.YEAR), newDate.get(Calendar.MONTH), newDate.get(Calendar.DAY_OF_MONTH)); + loadHomeFragment(); + } + + public void addEvent(View v){ + Intent intent = new Intent(this, NewEvent.class); + intent.putExtra("dateSelected", datevalue.getText()); + intent.putExtra("clickid", v.getId()); + intent.putExtra("equipment", equipmentList.get(spinner.getSelectedItemPosition())); +// startActivityForResult(intent, eventCode); + startActivity(intent); + } + + public void addEvent(){ + Intent intent = new Intent(this, NewEvent.class); + intent.putExtra("dateSelected", datevalue.getText()); + intent.putExtra("equipment", equipmentList.get(spinner.getSelectedItemPosition())); + intent.putExtra("clickid", 0); + startActivity(intent); +// startActivityForResult(intent, eventCode); + } + + public void editEvent(View v)throws Exception{ + Booking slot=loadedFrag.get(CURRENT_TAG).getMapping().get((LinearLayout)v); + Intent intent; + Calendar obj=Calendar.getInstance(),obj3=Calendar.getInstance(); + obj.setTime(dateFormatter.parse(slot.getDate())); + Calendar obj2=Calendar.getInstance(); + obj2.setTime(timeFormat.parse(slot.getStartTime())); + obj.set(Calendar.HOUR_OF_DAY,obj2.get(Calendar.HOUR_OF_DAY)); + obj.set(Calendar.MINUTE,obj2.get(Calendar.MINUTE)); + if(appDataClass.getUserObj().getUseruid().equals(slot.getUserid()) && obj.compareTo(obj3)>=0 ) + intent = new Intent(this, EditEvent.class); + else + intent = new Intent(this, ViewEvent.class); + intent.putExtra("slot", slot); + intent.putExtra("equipment", equipmentList.get(spinner.getSelectedItemPosition())); + startActivity(intent); + } + + + + private void loadHomeFragment() { + +// final FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); +// if (getSupportFragmentManager().findFragmentByTag(CURRENT_TAG) != null) { +// fragmentTransaction.attach(loadedFrag.get(CURRENT_TAG)); +// return; +// } + + Runnable mPendingRunnable = new Runnable() { + @Override + public void run() { + DayFragment homeFragment=loadedFrag.get(CURRENT_TAG); + if(homeFragment==null){ + homeFragment= new DayFragment().newInstance((Calendar)newDate.clone(),appDataClass); + loadedFrag.put(CURRENT_TAG,homeFragment); + if(!firstrun){ + updateview(); + } + } + Fragment fragment = homeFragment; + FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); + fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, + android.R.anim.fade_out); + fragmentTransaction.replace(R.id.frameitem, fragment, CURRENT_TAG); + fragmentTransaction.commitAllowingStateLoss(); + ScrollView targetView = (ScrollView) findViewById(R.id.scroll); + if(CURRENT_TAG.equals(dateFormatter.format(Calendar.getInstance().getTime()))) { + int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY); + targetView.smoothScrollTo(0, hour * 90); + } + else + targetView.smoothScrollTo(0, 0); + + } + }; + + // If mPendingRunnable is not null, then add to the message queue + if (mPendingRunnable != null) { + mHandler.post(mPendingRunnable); + } + + } + @Override + public void onBackPressed() { + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + if (drawer.isDrawerOpen(GravityCompat.START)) { + drawer.closeDrawer(GravityCompat.START); + } else { + super.onBackPressed(); + } + } + +// @Override +// public boolean onCreateOptionsMenu(Menu menu) { +// // Inflate the menu; this adds items to the action bar if it is present. +// getMenuInflater().inflate(R.menu.calendar, menu); +// MenuItem item = menu.findItem(R.id.spinner); +// Spinner spinner = (Spinner) MenuItemCompat.getActionView(item); +// +// ArrayList contacts = new ArrayList<>(); +// contacts.add("Test 1"); +// contacts.add("Test 2"); +// +// ArrayAdapter adapter = new ArrayAdapter(getApplicationContext(), android.R.layout.simple_spinner_item, contacts); +// adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); +// spinner.setAdapter(adapter); +// +// return true; +// } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + +// //noinspection SimplifiableIfStatement +// if (id == R.id.spinner) { +// return true; +// } + + return super.onOptionsItemSelected(item); + } + + @SuppressWarnings("StatementWithEmptyBody") + @Override + public boolean onNavigationItemSelected(MenuItem item) { + // Handle navigation view item clicks here. + int id = item.getItemId(); + + if (id == R.id.nav_addPCR) { + Intent intent = new Intent(this, AddPCR.class); + startActivity(intent); + } else if (id == R.id.nav_settings) { + Intent intent = new Intent(this, Settings.class); + startActivity(intent); + }else if (id == R.id.nav_invite) { + Intent intent = new AppInviteInvitation.IntentBuilder("Invitation to join PCR Booking App") + .setMessage("Welcome") +// .setCustomImage(Uri.parse(getString(R.string.invitation_custom_image))) + .setCallToActionText("Install") + .build(); +// startActivity(intent); + startActivityForResult(intent, 1); + + + }else if (id == R.id.nav_help) { + Intent intent = new Intent(this, HelpActivity.class); + startActivity(intent); + + } else if (id == R.id.nav_aboutUs) { + Intent intent = new Intent(this, AboutUs.class); + startActivity(intent); + } + else if (id == R.id.nav_signOut) { + appDataClass.getmAuth().signOut(); + appDataClass=new AppDataClass(); + appDataClass.setmAuth(FirebaseAuth.getInstance()); + Intent intent = new Intent(this, LoginActivity.class); + startActivity(intent); + } + + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + drawer.closeDrawer(GravityCompat.START); + return true; + } + + + + @Override + public void onFragmentInteraction(Uri uri) { + + } + +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/CreateLab.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/CreateLab.java new file mode 100644 index 0000000..2346eaa --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/CreateLab.java @@ -0,0 +1,108 @@ +package com.sminnovations.bookmypcr.activities; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.view.View; +import android.widget.EditText; +import android.widget.Toast; + +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.ChildEmail; +import com.sminnovations.bookmypcr.pojo.Lab; +import com.sminnovations.bookmypcr.pojo.Pcr; + +public class CreateLab extends AppCompatActivity { + + EditText title, manufacturer,model,location,comments,labName,dept,univ,incharge,inchargeNo,inchargeEmail; + AppDataClass appDataClass; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_create_lab); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + this.setTitle("Create a Lab Account"); + title=(EditText)findViewById(R.id.title); + manufacturer=(EditText)findViewById(R.id.manufacturer); + model=(EditText)findViewById(R.id.model); + location=(EditText)findViewById(R.id.location); + comments=(EditText)findViewById(R.id.comments); + labName=(EditText)findViewById(R.id.labName); + dept=(EditText)findViewById(R.id.department); + univ=(EditText)findViewById(R.id.university); + incharge=(EditText)findViewById(R.id.incharge); + inchargeNo=(EditText)findViewById(R.id.inchargeNo); + inchargeEmail=(EditText)findViewById(R.id.inchargeEmail); + appDataClass = (AppDataClass) getApplicationContext(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + public void createLab(View v){ + if(labName.getText().toString().trim().isEmpty()){ + Toast.makeText(CreateLab.this, + "Please enter Lab name", + Toast.LENGTH_SHORT).show(); + return; + } + if(dept.getText().toString().trim().isEmpty()){ + Toast.makeText(CreateLab.this, + "Please enter Department name", + Toast.LENGTH_SHORT).show(); + return; + } + if(univ.getText().toString().trim().isEmpty()){ + Toast.makeText(CreateLab.this, + "Please enter University name", + Toast.LENGTH_SHORT).show(); + return; + } + if(incharge.getText().toString().trim().isEmpty()){ + Toast.makeText(CreateLab.this, + "Please enter Incharge name", + Toast.LENGTH_SHORT).show(); + return; + } + if(inchargeEmail.getText().toString().trim().isEmpty()){ + Toast.makeText(CreateLab.this, + "Please enter Incharge Email ID", + Toast.LENGTH_SHORT).show(); + return; + } + if(title.getText().toString().trim().isEmpty()){ + Toast.makeText(CreateLab.this, + "Please enter PCR name", + Toast.LENGTH_SHORT).show(); + return; + } + Lab obj=new Lab(labName.getText().toString().trim(),dept.getText().toString().trim(),univ.getText().toString().trim(),incharge.getText().toString().trim(),(inchargeNo.getText().toString()),inchargeEmail.getText().toString()); + obj.setLabuid(appDataClass.getmDatabase().child("labs").push().getKey()); + appDataClass.getmDatabase().child("labs").child(obj.getLabuid()).setValue(obj); + appDataClass.setLab(obj); + Pcr slot=new Pcr(title.getText().toString(),manufacturer.getText().toString(),appDataClass.getmDatabase().child(appDataClass.getLab().getLabuid()).push().getKey(),model.getText().toString(),location.getText().toString(),comments.getText().toString()); + appDataClass.getmDatabase().child(appDataClass.getLab().getLabuid()).child(slot.getEquipid()).setValue(slot); + ChildEmail emailObj=appDataClass.getChildEmail(); + emailObj.setLabUid(obj.getLabuid()); + emailObj.setAdmin(true); + appDataClass.getmDatabase().child("emails").child(emailObj.getEmailUid()).setValue(emailObj); + appDataClass.setChildEmail(emailObj); + Intent intent = new Intent(this, CalendarActivity.class); + startActivity(intent); + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/EditEvent.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/EditEvent.java new file mode 100644 index 0000000..ce14a39 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/EditEvent.java @@ -0,0 +1,335 @@ +package com.sminnovations.bookmypcr.activities; + +import android.app.DatePickerDialog; +import android.content.Context; +import android.graphics.Point; +import android.os.Bundle; +import android.support.design.widget.CoordinatorLayout; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.Display; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.DatePicker; +import android.widget.EditText; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.ValueEventListener; +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.Booking; +import com.sminnovations.bookmypcr.pojo.Equipment; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Locale; + +public class EditEvent extends AppCompatActivity implements View.OnClickListener,AdapterView.OnItemSelectedListener{ + + private Booking slot; + private Equipment equipment; + TextView fromdateView,enddateView; + EditText title, reaction,comments; + Calendar fromDate =Calendar.getInstance(), endDate =Calendar.getInstance(); + private DatePickerDialog fromDatePickerDialog,endDatePickerDialog; + private SimpleDateFormat dateFormatter, timestampFormat=new SimpleDateFormat("dd-MM-yyyy HH:mm", Locale.US), + timeFormat=new SimpleDateFormat("hh:mm a", Locale.US); + AppDataClass appDataClass; + List startSpinnerArray = new ArrayList(); + List endSpinnerArray = new ArrayList(); + ArrayAdapter startAdapter,endAdapter ; + Spinner sItems,eItems; + RelativeLayout mainLayout; + PopupWindow popupWindow; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_edit_event); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + this.setTitle("Edit Event"); + Bundle extras = getIntent().getExtras(); + mainLayout = (RelativeLayout) findViewById(R.id.mainLayout); + if (extras != null) { + slot= (Booking)getIntent().getSerializableExtra("slot"); + equipment = (Equipment)getIntent().getSerializableExtra("equipment"); + } + fromdateView =(TextView)findViewById(R.id.datebar); + title=(EditText)findViewById(R.id.title); + reaction=(EditText)findViewById(R.id.reaction); + comments=(EditText)findViewById(R.id.comments); + enddateView=(TextView)findViewById(R.id.enddatebar); + dateFormatter = new SimpleDateFormat("dd-MM-yyyy", Locale.US); + appDataClass = (AppDataClass) getApplicationContext(); + startAdapter = new ArrayAdapter( + this, android.R.layout.simple_spinner_item, startSpinnerArray); + endAdapter = new ArrayAdapter( + this, android.R.layout.simple_spinner_item, endSpinnerArray); + startAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + endAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + setDateTimeField(); + + } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private void setDateTimeField() { + fromdateView.setOnClickListener(this); + enddateView.setOnClickListener(this); + fromdateView.setText(slot.getDate()); + enddateView.setText(slot.getDate()); + Calendar endTime=Calendar.getInstance(); + Calendar startTime=Calendar.getInstance(); + try{ + fromDate.setTime(dateFormatter.parse(slot.getDate())); + endDate.setTime(dateFormatter.parse(slot.getDate())); + endTime.setTime(timeFormat.parse(slot.getEndTime())); + endTime.setTime(timeFormat.parse(slot.getEndTime())); + endTime.set(fromDate.get(Calendar.YEAR), fromDate.get(Calendar.MONTH), fromDate.get(Calendar.DAY_OF_MONTH)); + startTime.setTime(timeFormat.parse("12:00 AM")); + }catch (ParseException e){ + e.printStackTrace(); + } + fromDatePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + fromDate.set(year, monthOfYear, dayOfMonth); + fromdateView.setText(dateFormatter.format(fromDate.getTime())); + } + + }, fromDate.get(Calendar.YEAR), fromDate.get(Calendar.MONTH), fromDate.get(Calendar.DAY_OF_MONTH)); + + endDatePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + endDate.set(year, monthOfYear, dayOfMonth); + enddateView.setText(dateFormatter.format(endDate.getTime())); + } + + }, endDate.get(Calendar.YEAR), endDate.get(Calendar.MONTH), endDate.get(Calendar.DAY_OF_MONTH)); + + title.setText(slot.getTitle()); + reaction.setText(slot.getReactionspec()); + comments.setText(slot.getComments()); + + startSpinnerArray.add(timeFormat.format(startTime.getTime())); + int startIndex=0; + for(int i=0;i<48;i++){ + startTime.add(Calendar.MINUTE,30); + startSpinnerArray.add(timeFormat.format(startTime.getTime())); + if(timeFormat.format(startTime.getTime()).equalsIgnoreCase(slot.getStartTime())){ + startIndex=i; + } + } + + for(int i=0;i<16;i++){ + endTime.add(Calendar.MINUTE,30); + if(endTime.get(Calendar.DAY_OF_MONTH)!=fromDate.get(Calendar.DAY_OF_MONTH)){ + break; + } + endSpinnerArray.add(timeFormat.format(endTime.getTime())); + } + sItems = (Spinner) findViewById(R.id.startTime); + sItems.setAdapter(startAdapter); + sItems.setSelection(startIndex+1); + sItems.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView arg0, View arg1, + int arg2, long arg3) { + + Calendar endTime=Calendar.getInstance(); + try { + endTime.setTime(timeFormat.parse(arg0.getSelectedItem().toString())); + endTime.set(fromDate.get(Calendar.YEAR), fromDate.get(Calendar.MONTH), fromDate.get(Calendar.DAY_OF_MONTH)); + }catch (Exception e){ + e.printStackTrace(); + } + endSpinnerArray.clear(); + for(int i=0;i<16;i++){ + endTime.add(Calendar.MINUTE,30); + if(endTime.get(Calendar.DAY_OF_MONTH)!=fromDate.get(Calendar.DAY_OF_MONTH)){ + break; + } + endSpinnerArray.add(timeFormat.format(endTime.getTime())); + endAdapter.notifyDataSetChanged(); + } + } + + @Override + public void onNothingSelected(AdapterView arg0) { + } + }); + eItems = (Spinner) findViewById(R.id.endTime); + eItems.setAdapter(endAdapter); + } + + public void saveEvent(View v){ + if (title.getText().toString().trim().isEmpty()||eItems.getSelectedItem()==null) { + Toast.makeText(EditEvent.this, + "Please enter all mandatory fields", + Toast.LENGTH_SHORT).show(); + return; + } + validate(appDataClass,sItems.getSelectedItem().toString(),eItems.getSelectedItem().toString(),fromdateView.getText().toString(),equipment); + } + + public void saveData() { + + Calendar dateTemp = Calendar.getInstance(), dateTemp2 = Calendar.getInstance(), dateTemp3 = (Calendar) dateTemp.clone(); + try { + dateTemp2.setTime(dateFormatter.parse(fromdateView.getText().toString())); + dateTemp3.setTime(timeFormat.parse(sItems.getSelectedItem().toString())); + dateTemp3.set(dateTemp2.get(Calendar.YEAR), dateTemp2.get(Calendar.MONTH), dateTemp2.get(Calendar.DAY_OF_MONTH)); + if (dateTemp3.compareTo(dateTemp) < 0) { + LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View customView = layoutInflater.inflate(R.layout.popup_confirmation, null); + Button closePopupBtn = (Button) customView.findViewById(R.id.closePopupBtn); + Button confirmPopupBtn = (Button) customView.findViewById(R.id.confirmPopupBtn); + //instantiate popup window + popupWindow = new PopupWindow(customView, CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT); + popupWindow.setFocusable(true); + Display display = getWindowManager().getDefaultDisplay(); + Point size = new Point(); + display.getSize(size); + int width = size.x; + width = (int) (width - (double) width * 0.1); + popupWindow.setWidth(width); + //display the popup window + popupWindow.showAtLocation(mainLayout, Gravity.CENTER, 0, 0); + + //close the popup window on button click + closePopupBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + popupWindow.dismiss(); + } + }); + confirmPopupBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + saveDataFinal(); + popupWindow.dismiss(); + } + }); + } else { + saveDataFinal(); + } + } catch (Exception e) { + + } + } + public void saveDataFinal() { + Booking slotObj=new Booking(appDataClass.getUserObj().getUseruid(),appDataClass.getUserObj().getName(),title.getText().toString() + ,reaction.getText().toString(),comments.getText().toString(),fromdateView.getText().toString(),sItems.getSelectedItem().toString(),eItems.getSelectedItem().toString(), + timestampFormat.format(Calendar.getInstance().getTime()),slot.getKey()); + slotObj.setDuration((eItems.getSelectedItemPosition()+1)*0.5); + appDataClass.getmDatabase().child(equipment.getEquipid()).child(fromdateView.getText().toString()).child(slotObj.getKey()).setValue(slotObj); + finish(); + onBackPressed(); + + } + + public void deleteEvent(View v){ + Toast.makeText(EditEvent.this, + "Event Deleted", + Toast.LENGTH_SHORT).show(); + appDataClass.getmDatabase().child(equipment.getEquipid()).child(fromdateView.getText().toString()).child(slot.getKey()).removeValue(); + finish(); + onBackPressed(); + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + // On selecting a spinner item + String item = parent.getItemAtPosition(position).toString(); + + // Showing selected spinner item + + } + + + @Override + public void onClick(View view) { + if(view == fromdateView) { + fromDatePickerDialog.show(); + }else if(view==enddateView){ + endDatePickerDialog.show(); + } + } + + @Override + public void onNothingSelected(AdapterView arg0) { + // TODO Auto-generated method stub + + } + + public boolean validate(AppDataClass appDataClass, String fromTime, String endtime, String date, Equipment equipment){ + final Calendar startTime=Calendar.getInstance(),toTime=(Calendar)startTime.clone(); + try { + startTime.setTime(timeFormat.parse(fromTime)); + toTime.setTime(timeFormat.parse(endtime)); + }catch (Exception e){ + + } + + appDataClass.getmDatabase().child(equipment.getEquipid()).child(date).addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + Calendar tempStartTime=(Calendar)startTime.clone(),tempEndTime=(Calendar)startTime.clone(); + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + Booking slot=childSnapshot.getValue(Booking.class); + try { + tempStartTime.setTime(timeFormat.parse(slot.getStartTime())); + tempEndTime.setTime(timeFormat.parse(slot.getEndTime())); + }catch (Exception e){ + + } + if(tempStartTime.compareTo(startTime)==0 ||tempEndTime.compareTo(toTime)==0 || (tempStartTime.compareTo(startTime)>0 && tempEndTime.compareTo(toTime)<0) || (tempStartTime.compareTo(startTime)<0 && tempEndTime.compareTo(toTime)>0) + || (tempStartTime.compareTo(startTime)<0 && tempEndTime.compareTo(startTime)>0)|| (tempStartTime.compareTo(toTime)<0 && tempEndTime.compareTo(toTime)>0)) { + error(); + return; + } + } + saveData(); + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + return true; + } + + public void error(){ + Toast.makeText(EditEvent.this, + "System is busy in the selected time range", + Toast.LENGTH_SHORT).show(); + } + +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/HelpActivity.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/HelpActivity.java new file mode 100644 index 0000000..2fde79d --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/HelpActivity.java @@ -0,0 +1,34 @@ +package com.sminnovations.bookmypcr.activities; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; + +import com.sminnovations.R; + +public class HelpActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_help); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + this.setTitle("Help"); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/JoinLab.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/JoinLab.java new file mode 100644 index 0000000..b58831f --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/JoinLab.java @@ -0,0 +1,116 @@ +package com.sminnovations.bookmypcr.activities; + +import android.app.ProgressDialog; +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; + +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.ValueEventListener; +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.ChildEmail; +import com.sminnovations.bookmypcr.pojo.Lab; + +import java.util.ArrayList; +import java.util.List; + +public class JoinLab extends AppCompatActivity { + + TextView searchValue; + ProgressDialog mProgress; + AppDataClass appDataClass; + ArrayAdapter adapter; + List resultValue = new ArrayList<>(); + List resultObj = new ArrayList<>(); + private DatabaseReference mDatabase; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_join_lab); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + this.setTitle("Join a Lab Account"); + appDataClass=(AppDataClass)this.getApplicationContext(); + searchValue=(TextView)findViewById(R.id.searchValue); + ListView listView1 = (ListView) findViewById(R.id.resultList); + mProgress = new ProgressDialog(this); + mProgress.setMessage("Fetching Data ..."); + adapter = new ArrayAdapter(this, + android.R.layout.simple_list_item_1, resultValue); + listView1.setAdapter(adapter); + listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapter, View v, int position, long id) { + joinLab(position); + } + }); + mDatabase=appDataClass.getmDatabase(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + public void search(View v){ + final String search=searchValue.getText().toString().trim().toLowerCase(); + if(search.isEmpty()) { + resultValue.clear(); + resultObj.clear(); + adapter.notifyDataSetChanged(); + return; + } + mProgress.show(); + mDatabase.child("labs").orderByChild("name").addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + resultValue.clear(); + resultObj.clear(); + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + Lab obj=childSnapshot.getValue(Lab.class); + if(obj.getName().toLowerCase().contains(search)){ + resultValue.add(obj.getName()); + resultObj.add(obj); + } + } + adapter.notifyDataSetChanged(); + mProgress.hide(); + } + @Override + public void onCancelled(DatabaseError databaseError) { + mProgress.hide(); + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + } + + public void joinLab(int position){ + ChildEmail emailObj=appDataClass.getChildEmail(); + emailObj.setLabUid(resultObj.get(position).getLabuid()); + mDatabase.child("emails").child(emailObj.getEmailUid()).setValue(emailObj); + appDataClass.setChildEmail(emailObj); + Intent intent = new Intent(this, CalendarActivity.class); + startActivity(intent); + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/LoginActivity.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/LoginActivity.java new file mode 100644 index 0000000..bac4b56 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/LoginActivity.java @@ -0,0 +1,544 @@ +package com.sminnovations.bookmypcr.activities; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.annotation.TargetApi; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Handler; +import android.support.annotation.NonNull; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.app.LoaderManager.LoaderCallbacks; + +import android.content.CursorLoader; +import android.content.Loader; +import android.database.Cursor; +import android.net.Uri; +import android.os.AsyncTask; + +import android.os.Build; +import android.os.Bundle; +import android.provider.ContactsContract; +import android.text.TextUtils; +import android.view.KeyEvent; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.inputmethod.EditorInfo; +import android.widget.ArrayAdapter; +import android.widget.AutoCompleteTextView; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.UserProfileChangeRequest; +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.ValueEventListener; +import com.sminnovations.R; + +import java.util.ArrayList; +import java.util.List; + +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.ChildEmail; +import com.sminnovations.bookmypcr.pojo.User; + +import static android.Manifest.permission.READ_CONTACTS; + +/** + * A login screen that offers login via email/password. + */ +public class LoginActivity extends AppCompatActivity implements LoaderCallbacks { + + /** + * Id to identity READ_CONTACTS permission request. + */ + private static final int REQUEST_READ_CONTACTS = 0; + + /** + * A dummy authentication store containing known user names and passwords. + * TODO: remove after connecting to a real authentication system. + */ + private static final String[] DUMMY_CREDENTIALS = new String[]{ + "foo@example.com:hello", "bar@example.com:world" + }; + /** + * Keep track of the login task to ensure we can cancel it if requested. + */ + private UserLoginTask mAuthTask = null; + + // UI references. + private AutoCompleteTextView mEmailView; + private EditText mPasswordView; + private View mProgressView; + private View mLoginFormView; + private FirebaseAuth mAuth; + private AppDataClass appDataClass; + private Handler handler = new Handler(); + private DatabaseReference mDatabase; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + // Set up the login form. + mEmailView = (AutoCompleteTextView) findViewById(R.id.email); + populateAutoComplete(); + + mPasswordView = (EditText) findViewById(R.id.password); + mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) { + if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) { + attemptLogin(); + return true; + } + return false; + } + }); + + Button mEmailSignInButton = (Button) findViewById(R.id.email_sign_in_button); + mEmailSignInButton.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View view) { + attemptLogin(); + } + }); + appDataClass = (AppDataClass) getApplicationContext(); + mAuth=appDataClass.getmAuth(); + mLoginFormView = findViewById(R.id.login_form); + mProgressView = findViewById(R.id.login_progress); + } + + private void populateAutoComplete() { + if (!mayRequestContacts()) { + return; + } + + getLoaderManager().initLoader(0, null, this); + } + + private boolean mayRequestContacts() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + return true; + } + if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) { + return true; + } + if (shouldShowRequestPermissionRationale(READ_CONTACTS)) { + Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE) + .setAction(android.R.string.ok, new View.OnClickListener() { + @Override + @TargetApi(Build.VERSION_CODES.M) + public void onClick(View v) { + requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); + } + }); + } else { + requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS); + } + return false; + } + + /** + * Callback received when a permissions request has been completed. + */ + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, + @NonNull int[] grantResults) { + if (requestCode == REQUEST_READ_CONTACTS) { + if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + populateAutoComplete(); + } + } + } + + + /** + * Attempts to sign in or register the account specified by the login form. + * If there are form errors (invalid email, missing fields, etc.), the + * errors are presented and no actual login attempt is made. + */ + private void attemptLogin() { + if (mAuthTask != null) { + return; + } + + // Reset errors. + mEmailView.setError(null); + mPasswordView.setError(null); + + // Store values at the time of the login attempt. + String email = mEmailView.getText().toString(); + String password = mPasswordView.getText().toString(); + + boolean cancel = false; + View focusView = null; + + // Check for a valid password, if the user entered one. + if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) { + mPasswordView.setError(getString(R.string.error_invalid_password)); + focusView = mPasswordView; + cancel = true; + } + + // Check for a valid email address. + if (TextUtils.isEmpty(email)) { + mEmailView.setError(getString(R.string.error_field_required)); + focusView = mEmailView; + cancel = true; + } else if (!isEmailValid(email)) { + mEmailView.setError(getString(R.string.error_invalid_email)); + focusView = mEmailView; + cancel = true; + } + + if (cancel) { + // There was an error; don't attempt login and focus the first + // form field with an error. + focusView.requestFocus(); + } else { + // Show a progress spinner, and kick off a background task to + // perform the user login attempt. + showProgress(true); + + mAuth.signInWithEmailAndPassword(email, password) + .addOnCompleteListener(this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + // Sign in success, update UI with the signed-in user's information +// Log.d(TAG, "signInWithEmail:success"); + final FirebaseUser user = mAuth.getCurrentUser(); + callCalendar(user); +// updateUI(user); + } else { + // If sign in fails, display a message to the user. + Toast.makeText(LoginActivity.this, "Authentication failed.", + Toast.LENGTH_SHORT).show(); + showMessage("Failed"); + showProgress(false); +// updateUI(null); + } + + // ... + } + }); + +// mAuthTask = new UserLoginTask(email, password); +// mAuthTask.execute((Void) null); + } + } + +// private void sendEmailVerification() { +// // Disable button +// findViewById(R.id.verify_email_button).setEnabled(false); +// +// // Send verification email +// // [START send_email_verification] +// final FirebaseUser user = mAuth.getCurrentUser(); +// user.sendEmailVerification() +// .addOnCompleteListener(this, new OnCompleteListener() { +// @Override +// public void onComplete(@NonNull Task task) { +// // [START_EXCLUDE] +// // Re-enable button +// findViewById(R.id.verify_email_button).setEnabled(true); +// +// if (task.isSuccessful()) { +// Toast.makeText(EmailPasswordActivity.this, +// "Verification email sent to " + user.getEmail(), +// Toast.LENGTH_SHORT).show(); +// } else { +// Log.e(TAG, "sendEmailVerification", task.getException()); +// Toast.makeText(EmailPasswordActivity.this, +// "Failed to send verification email.", +// Toast.LENGTH_SHORT).show(); +// } +// // [END_EXCLUDE] +// } +// }); +// // [END send_email_verification] +// } + + private void callCalendar(final FirebaseUser user) { + if(user.isEmailVerified()) { + + appDataClass.setUser(user); + mDatabase = FirebaseDatabase.getInstance().getReference(); + appDataClass.setmDatabase(mDatabase); + mDatabase.child("emails").orderByChild("emailid").equalTo(user.getEmail()).addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + appDataClass.setChildEmail(childSnapshot.getValue(ChildEmail.class)); + } + navigation(user); + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + } + else{ + showProgress(false); + user.sendEmailVerification() + .addOnCompleteListener(this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + // Re-enable button + + if (task.isSuccessful()) { + Toast.makeText(LoginActivity.this, + "Email not verified. Verification email sent to " + user.getEmail(), + Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(LoginActivity.this, + "Email not verified. Failed to send verification email.", + Toast.LENGTH_SHORT).show(); + } + } + }); + } + + } + + private boolean isEmailValid(String email) { + //TODO: Replace this with your own logic + return email.contains("@"); + } + + private boolean isPasswordValid(String password) { + //TODO: Replace this with your own logic + return password.length() > 4; + } + + private void navigation(FirebaseUser user){ + if(appDataClass.getChildEmail()==null){ + Toast.makeText(LoginActivity.this, + "First time login. We are setting up your account. Please wait.", + Toast.LENGTH_SHORT).show(); + User userObj= new User(user.getDisplayName(),true,false,user.getUid()); + mDatabase.child("users").child(user.getUid()).setValue(userObj); + ChildEmail emailObj=new ChildEmail("",user.getUid(),user.getEmail(),mDatabase.child("emails").push().getKey()); + mDatabase.child("emails").child(emailObj.getEmailUid()).setValue(emailObj); + appDataClass.setChildEmail(emailObj); + } + else if(appDataClass.getChildEmail().userUid==null ||appDataClass.getChildEmail().userUid.isEmpty()) { + User userObj= new User(user.getDisplayName(),true,false,user.getUid()); + mDatabase.child("users").child(user.getUid()).setValue(userObj); + appDataClass.getChildEmail().setUserUid(user.getUid()); + mDatabase.child("emails").child(appDataClass.getChildEmail().getEmailUid()).setValue(appDataClass.getChildEmail()); + } + if(appDataClass.getChildEmail().labUid==null ||appDataClass.getChildEmail().labUid.isEmpty()){ + Intent intent = new Intent(this, NoAccess.class); + startActivity(intent); + }else { + Intent intent = new Intent(this, CalendarActivity.class); + startActivity(intent); + } + } + + @Override + public void onBackPressed() { + + } + /** + * Shows the progress UI and hides the login form. + */ + @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) + private void showProgress(final boolean show) { + // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow + // for very easy animations. If available, use these APIs to fade-in + // the progress spinner. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { + int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime); + + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + mLoginFormView.animate().setDuration(shortAnimTime).alpha( + show ? 0 : 1).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + } + }); + + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + mProgressView.animate().setDuration(shortAnimTime).alpha( + show ? 1 : 0).setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + } + }); + } else { + // The ViewPropertyAnimator APIs are not available, so simply show + // and hide the relevant UI components. + mProgressView.setVisibility(show ? View.VISIBLE : View.GONE); + mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE); + } + } + + @Override + public Loader onCreateLoader(int i, Bundle bundle) { + return new CursorLoader(this, + // Retrieve data rows for the device user's 'profile' contact. + Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, + ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION, + + // Select only email addresses. + ContactsContract.Contacts.Data.MIMETYPE + + " = ?", new String[]{ContactsContract.CommonDataKinds.Email + .CONTENT_ITEM_TYPE}, + + // Show primary email addresses first. Note that there won't be + // a primary email address if the user hasn't specified one. + ContactsContract.Contacts.Data.IS_PRIMARY + " DESC"); + } + + @Override + public void onLoadFinished(Loader cursorLoader, Cursor cursor) { + List emails = new ArrayList<>(); + cursor.moveToFirst(); + while (!cursor.isAfterLast()) { + emails.add(cursor.getString(ProfileQuery.ADDRESS)); + cursor.moveToNext(); + } + + addEmailsToAutoComplete(emails); + } + + public void newUser(View v){ + Intent intent = new Intent(this, NewUser.class); + startActivity(intent); + } + + public void resetPassword(View v){ + Intent intent = new Intent(this, ResetPassword.class); + startActivity(intent); + } + + @Override + public void onLoaderReset(Loader cursorLoader) { + + } + + private void addEmailsToAutoComplete(List emailAddressCollection) { + //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list. + ArrayAdapter adapter = + new ArrayAdapter<>(LoginActivity.this, + android.R.layout.simple_dropdown_item_1line, emailAddressCollection); + + mEmailView.setAdapter(adapter); + } + + + private interface ProfileQuery { + String[] PROJECTION = { + ContactsContract.CommonDataKinds.Email.ADDRESS, + ContactsContract.CommonDataKinds.Email.IS_PRIMARY, + }; + + int ADDRESS = 0; + int IS_PRIMARY = 1; + } + + /** + * Represents an asynchronous login/registration task used to authenticate + * the user. + */ + public class UserLoginTask extends AsyncTask { + + private final String mEmail; + private final String mPassword; + + UserLoginTask(String email, String password) { + mEmail = email; + mPassword = password; + } + + @Override + protected Boolean doInBackground(Void... params) { + // TODO: attempt authentication against a network service. + + try { +// mAuth.signInWithEmailAndPassword(mEmail, mPassword) +// .addOnCompleteListener(this, new OnCompleteListener() { +// @Override +// public void onComplete(@NonNull Task task) { +// if (task.isSuccessful()) { +// // Sign in success, update UI with the signed-in user's information +//// Log.d(TAG, "signInWithEmail:success"); +// FirebaseUser user = mAuth.getCurrentUser(); +//// updateUI(user); +// } else { +// // If sign in fails, display a message to the user. +// Log.w(TAG, "signInWithEmail:failure", task.getException()); +// Toast.makeText(LoginActivity.this, "Authentication failed.", +// Toast.LENGTH_SHORT).show(); +//// updateUI(null); +// } +// +// // ... +// } +// }); + Thread.sleep(2000); + } catch (InterruptedException e) { + return false; + } + + for (String credential : DUMMY_CREDENTIALS) { + String[] pieces = credential.split(":"); + if (pieces[0].equals(mEmail)) { + // Account exists, return true if the password matches. + return pieces[1].equals(mPassword); + } + } + + // TODO: register the new account here. + return true; + } + + @Override + protected void onPostExecute(final Boolean success) { + mAuthTask = null; + showProgress(false); + + if (success) { + finish(); + } else { + mPasswordView.setError(getString(R.string.error_incorrect_password)); + mPasswordView.requestFocus(); + } + } + + @Override + protected void onCancelled() { + mAuthTask = null; + showProgress(false); + } + } + + public void showMessage(final String message) { + + handler.post(new Runnable() { + public void run() { + Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show(); + } + }); + + } + + +} + diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NewEvent.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NewEvent.java new file mode 100644 index 0000000..307c215 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NewEvent.java @@ -0,0 +1,350 @@ +package com.sminnovations.bookmypcr.activities; + +import android.app.DatePickerDialog; +import android.content.Context; +import android.graphics.Point; +import android.os.Bundle; +import android.support.design.widget.CoordinatorLayout; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.Display; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.DatePicker; +import android.widget.EditText; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; + +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.ValueEventListener; +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.Booking; +import com.sminnovations.bookmypcr.pojo.Equipment; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Locale; + +public class NewEvent extends AppCompatActivity implements View.OnClickListener,AdapterView.OnItemSelectedListener { + + private String selectedDate; + private String clickId=""; + TextView fromdateView,enddateView; + EditText title, reaction,comments; + Calendar fromDate =Calendar.getInstance(), endDate =Calendar.getInstance(); + private DatePickerDialog fromDatePickerDialog,endDatePickerDialog; + private SimpleDateFormat dateFormatter, timestampFormat=new SimpleDateFormat("dd-MM-yyyy HH:mm", Locale.US) + ,timeFormat=new SimpleDateFormat("hh:mm a", Locale.US); + private Equipment equipment; + AppDataClass appDataClass; + List startSpinnerArray = new ArrayList(); + List endSpinnerArray = new ArrayList(); + ArrayAdapter startAdapter,endAdapter ; + Spinner sItems,eItems; + RelativeLayout mainLayout; + PopupWindow popupWindow; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_new_event); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + this.setTitle("New Event"); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + Bundle extras = getIntent().getExtras(); + mainLayout = (RelativeLayout) findViewById(R.id.mainLayout); + if (extras != null) { + selectedDate = extras.getString("dateSelected"); + int id=extras.getInt("clickid"); + if(id==0){ + Calendar temp=Calendar.getInstance(); + temp.set(Calendar.MINUTE,0); + clickId=timeFormat.format(temp.getTime()); + }else { + clickId = getResources().getResourceName(extras.getInt("clickid")); + clickId = clickId.substring(clickId.indexOf('_') + 1, clickId.lastIndexOf('_')).toUpperCase(); + if (clickId.length() == 3) { + clickId = "0" + clickId; + clickId = clickId.substring(0, clickId.length() - 2) + ":00 " + clickId.substring(clickId.length() - 2); + } else if (clickId.length() == 4) { + clickId = clickId.substring(0, clickId.length() - 2) + ":00 " + clickId.substring(clickId.length() - 2); + } else if (clickId.length() == 6) { + clickId = "0" + clickId; + clickId = clickId.replace(".", ":"); + clickId = clickId.substring(0, clickId.length() - 2) + " " + clickId.substring(clickId.length() - 2); + } else if (clickId.length() == 7) { + clickId = clickId.replace(".", ":"); + clickId = clickId.substring(0, clickId.length() - 2) + " " + clickId.substring(clickId.length() - 2); + } + } + + + equipment = (Equipment)getIntent().getSerializableExtra("equipment"); + } + + fromdateView =(TextView)findViewById(R.id.datebar); + title=(EditText)findViewById(R.id.title); + reaction=(EditText)findViewById(R.id.reaction); + comments=(EditText)findViewById(R.id.comments); + enddateView=(TextView)findViewById(R.id.enddatebar); + dateFormatter = new SimpleDateFormat("dd-MM-yyyy", Locale.US); + appDataClass = (AppDataClass) getApplicationContext(); + startAdapter = new ArrayAdapter( + this, android.R.layout.simple_spinner_item, startSpinnerArray); + endAdapter = new ArrayAdapter( + this, android.R.layout.simple_spinner_item, endSpinnerArray); + startAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + endAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + setDateTimeField(); + + } + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private void setDateTimeField() { + fromdateView.setOnClickListener(this); + enddateView.setOnClickListener(this); + fromdateView.setText(selectedDate); + enddateView.setText(selectedDate); + Calendar endTime=Calendar.getInstance(); + Calendar startTime=Calendar.getInstance(); + try{ + fromDate.setTime(dateFormatter.parse(selectedDate)); + endDate.setTime(dateFormatter.parse(selectedDate)); + endTime.setTime(timeFormat.parse(clickId)); + endTime.set(fromDate.get(Calendar.YEAR), fromDate.get(Calendar.MONTH), fromDate.get(Calendar.DAY_OF_MONTH)); + startTime.setTime(timeFormat.parse("12:00 AM")); + }catch (ParseException e){ + e.printStackTrace(); + } + fromDatePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + fromDate.set(year, monthOfYear, dayOfMonth); + fromdateView.setText(dateFormatter.format(fromDate.getTime())); + } + + }, fromDate.get(Calendar.YEAR), fromDate.get(Calendar.MONTH), fromDate.get(Calendar.DAY_OF_MONTH)); + + endDatePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { + + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + endDate.set(year, monthOfYear, dayOfMonth); + enddateView.setText(dateFormatter.format(endDate.getTime())); + } + + }, endDate.get(Calendar.YEAR), endDate.get(Calendar.MONTH), endDate.get(Calendar.DAY_OF_MONTH)); + + +// startSpinnerArray.add(clickId); +// startSpinnerArray.add("item2"); + startSpinnerArray.add(timeFormat.format(startTime.getTime())); + int startIndex=0; + for(int i=0;i<48;i++){ + startTime.add(Calendar.MINUTE,30); + startSpinnerArray.add(timeFormat.format(startTime.getTime())); + if(timeFormat.format(startTime.getTime()).equalsIgnoreCase(clickId)){ + startIndex=i; + } + } + + for(int i=0;i<16;i++){ + endTime.add(Calendar.MINUTE,30); + if(endTime.get(Calendar.DAY_OF_MONTH)!=fromDate.get(Calendar.DAY_OF_MONTH)){ + break; + } + endSpinnerArray.add(timeFormat.format(endTime.getTime())); + } + sItems = (Spinner) findViewById(R.id.startTime); + sItems.setAdapter(startAdapter); + sItems.setSelection(startIndex+1); + sItems.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView arg0, View arg1, + int arg2, long arg3) { + + Calendar endTime=Calendar.getInstance(); + try { + endTime.setTime(timeFormat.parse(arg0.getSelectedItem().toString())); + endTime.set(fromDate.get(Calendar.YEAR), fromDate.get(Calendar.MONTH), fromDate.get(Calendar.DAY_OF_MONTH)); + }catch (Exception e){ + e.printStackTrace(); + } + endSpinnerArray.clear(); + for(int i=0;i<16;i++){ + endTime.add(Calendar.MINUTE,30); + if(endTime.get(Calendar.DAY_OF_MONTH)!=fromDate.get(Calendar.DAY_OF_MONTH)){ + break; + } + endSpinnerArray.add(timeFormat.format(endTime.getTime())); + endAdapter.notifyDataSetChanged(); + } + } + + @Override + public void onNothingSelected(AdapterView arg0) { + } + }); + eItems = (Spinner) findViewById(R.id.endTime); + eItems.setAdapter(endAdapter); + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + // On selecting a spinner item + String item = parent.getItemAtPosition(position).toString(); + + // Showing selected spinner item + + } + + public void saveEvent(View v){ + if (title.getText().toString().trim().isEmpty()||eItems.getSelectedItem()==null) { + Toast.makeText(NewEvent.this, + "Please enter all mandatory fields", + Toast.LENGTH_SHORT).show(); + return; + } + + + validate(appDataClass,sItems.getSelectedItem().toString(),eItems.getSelectedItem().toString(),fromdateView.getText().toString(),equipment); + } + + public void saveData() { + Calendar dateTemp=Calendar.getInstance(), dateTemp2=Calendar.getInstance(), dateTemp3=(Calendar)dateTemp.clone(); + try { + dateTemp2.setTime(dateFormatter.parse(fromdateView.getText().toString())); + dateTemp3.setTime(timeFormat.parse(sItems.getSelectedItem().toString())); + dateTemp3.set(dateTemp2.get(Calendar.YEAR), dateTemp2.get(Calendar.MONTH), dateTemp2.get(Calendar.DAY_OF_MONTH)); + if (dateTemp3.compareTo(dateTemp)<0) { + LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View customView = layoutInflater.inflate(R.layout.popup_confirmation, null); + Button closePopupBtn = (Button) customView.findViewById(R.id.closePopupBtn); + Button confirmPopupBtn = (Button) customView.findViewById(R.id.confirmPopupBtn); + //instantiate popup window + popupWindow = new PopupWindow(customView, CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT); + popupWindow.setFocusable(true); + Display display = getWindowManager().getDefaultDisplay(); + Point size = new Point(); + display.getSize(size); + int width = size.x; + width=(int)(width-(double)width*0.1); + popupWindow.setWidth(width); + //display the popup window + popupWindow.showAtLocation(mainLayout, Gravity.CENTER, 0, 0); + + //close the popup window on button click + closePopupBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + popupWindow.dismiss(); + } + }); + confirmPopupBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + saveDataFinal(); + popupWindow.dismiss(); + } + }); + } + else{ + saveDataFinal(); + } + } catch (Exception e) { + + } + } + public void saveDataFinal(){ + + Booking slot=new Booking(appDataClass.getUserObj().getUseruid(),appDataClass.getUserObj().getName(),title.getText().toString() + ,reaction.getText().toString(),comments.getText().toString(),fromdateView.getText().toString(),sItems.getSelectedItem().toString(),eItems.getSelectedItem().toString(), + timestampFormat.format(Calendar.getInstance().getTime()),appDataClass.getmDatabase().child(equipment.getEquipid()).child(fromdateView.getText().toString()).push().getKey()); + slot.setDuration((eItems.getSelectedItemPosition()+1)*0.5); + appDataClass.getmDatabase().child(equipment.getEquipid()).child(fromdateView.getText().toString()).child(slot.getKey()).setValue(slot); + finish(); + onBackPressed(); + } + @Override + public void onClick(View view) { + if(view == fromdateView) { + fromDatePickerDialog.show(); + }else if(view==enddateView){ + endDatePickerDialog.show(); + } + } + + @Override + public void onNothingSelected(AdapterView arg0) { + // TODO Auto-generated method stub + + } + + public boolean validate(AppDataClass appDataClass, String fromTime, String endtime, String date, Equipment equipment){ + final Calendar startTime=Calendar.getInstance(),toTime=(Calendar)startTime.clone(); + try { + startTime.setTime(timeFormat.parse(fromTime)); + toTime.setTime(timeFormat.parse(endtime)); + }catch (Exception e){ + + } + + appDataClass.getmDatabase().child(equipment.getEquipid()).child(date).addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + Calendar tempStartTime=(Calendar)startTime.clone(),tempEndTime=(Calendar)startTime.clone(); + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + Booking slot=childSnapshot.getValue(Booking.class); + try { + tempStartTime.setTime(timeFormat.parse(slot.getStartTime())); + tempEndTime.setTime(timeFormat.parse(slot.getEndTime())); + }catch (Exception e){ + + } + if(tempStartTime.compareTo(startTime)==0 ||tempEndTime.compareTo(toTime)==0 || (tempStartTime.compareTo(startTime)>0 && tempEndTime.compareTo(toTime)<0) || (tempStartTime.compareTo(startTime)<0 && tempEndTime.compareTo(toTime)>0) + || (tempStartTime.compareTo(startTime)<0 && tempEndTime.compareTo(startTime)>0)|| (tempStartTime.compareTo(toTime)<0 && tempEndTime.compareTo(toTime)>0)) { + error(); + return; + } + } + saveData(); + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + return true; + } + + public void error(){ + Toast.makeText(NewEvent.this, + "System is busy in the selected time range", + Toast.LENGTH_SHORT).show(); + } + +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NewUser.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NewUser.java new file mode 100644 index 0000000..91e99aa --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NewUser.java @@ -0,0 +1,149 @@ +package com.sminnovations.bookmypcr.activities; + +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ProgressBar; +import android.widget.Toast; + +import com.firebase.ui.auth.IdpResponse; +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.EmailAuthProvider; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.auth.UserProfileChangeRequest; +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.AppDataClass; + +public class NewUser extends AppCompatActivity { + + private AppDataClass appDataClass; + private FirebaseAuth auth; + private Button btnSignUp; + private ProgressBar progressBar; + + private EditText inputEmail,inputPassword,confirmPassword,name; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_new_user); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + this.setTitle("Register"); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + appDataClass = (AppDataClass) getApplicationContext(); + auth = appDataClass.getmAuth(); + btnSignUp = (Button) findViewById(R.id.sign_up_button); + inputEmail = (EditText) findViewById(R.id.email); + inputPassword = (EditText) findViewById(R.id.password); + confirmPassword = (EditText) findViewById(R.id.confirmpassword); + name= (EditText) findViewById(R.id.name); + progressBar = (ProgressBar) findViewById(R.id.progressBar); +// btnResetPassword = (Button) findViewById(R.id.btn_reset_password); + +// btnResetPassword.setOnClickListener(new View.OnClickListener() { +// @Override +// public void onClick(View v) { +// startActivity(new Intent(SignupActivity.this, ResetPasswordActivity.class)); +// } +// }); + + + btnSignUp.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + String email = inputEmail.getText().toString().trim(); + String password = inputPassword.getText().toString().trim(); + String name2 = name.getText().toString().trim(); + String confirmpassword = confirmPassword.getText().toString().trim(); + + if (TextUtils.isEmpty(name2)) { + Toast.makeText(getApplicationContext(), "Enter name!", Toast.LENGTH_SHORT).show(); + return; + } + + if (TextUtils.isEmpty(email)) { + Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show(); + return; + } + + if (TextUtils.isEmpty(password)) { + Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show(); + return; + } + + if (password.length() < 6) { + Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show(); + return; + } + + if (!password.equals(confirmpassword) ) { + Toast.makeText(getApplicationContext(), "Password and Confirm Password do not match", Toast.LENGTH_SHORT).show(); + return; + } + + progressBar.setVisibility(View.VISIBLE); + +// mHandler.startSignIn(new IdpResponse.Builder( +// new User.Builder(EmailAuthProvider.PROVIDER_ID, email) +// .setName(name) +// .build()) +// .build(), +// password); + + //create user + auth.createUserWithEmailAndPassword(email, password) + .addOnCompleteListener(NewUser.this, new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + progressBar.setVisibility(View.GONE); + // If sign in fails, display a message to the user. If sign in succeeds + // the auth state listener will be notified and logic to handle the + // signed in user can be handled in the listener. + if (!task.isSuccessful()) { + Toast.makeText(NewUser.this, "Authentication failed." + task.getException(), + Toast.LENGTH_SHORT).show(); + } else { +// startActivity(new Intent(SignupActivity.this, MainActivity.class)); + updateUserName(FirebaseAuth.getInstance().getCurrentUser()); + } + } + }); + + } + }); + } + + public void updateUserName(FirebaseUser user) { + UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder() + .setDisplayName(name.getText().toString()) + .build(); + + user.updateProfile(profileUpdates) + .addOnCompleteListener(new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + Log.d("NewUser", "User profile updated."); + } + finish(); + } + }); + } + @Override + protected void onResume() { + super.onResume(); + progressBar.setVisibility(View.GONE); + } + +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NoAccess.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NoAccess.java new file mode 100644 index 0000000..73c9365 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/NoAccess.java @@ -0,0 +1,40 @@ +package com.sminnovations.bookmypcr.activities; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.View; + +import com.google.firebase.auth.FirebaseAuth; +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.AppDataClass; + +public class NoAccess extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_no_access); + } + @Override + public void onBackPressed() { + + } + + public void signOut(View v){ + AppDataClass appDataClass=(AppDataClass)this.getApplicationContext(); + appDataClass.getmAuth().signOut(); + appDataClass=new AppDataClass(); + appDataClass.setmAuth(FirebaseAuth.getInstance()); + Intent intent = new Intent(this, LoginActivity.class); + startActivity(intent); + } + public void createLab(View v){ + Intent intent = new Intent(this, CreateLab.class); + startActivity(intent); + } + public void joinLab(View v){ + Intent intent = new Intent(this, JoinLab.class); + startActivity(intent); + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/ResetPassword.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/ResetPassword.java new file mode 100644 index 0000000..4f39b7e --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/ResetPassword.java @@ -0,0 +1,64 @@ +package com.sminnovations.bookmypcr.activities; + +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.text.TextUtils; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.FirebaseAuth; +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.AppDataClass; + +public class ResetPassword extends AppCompatActivity { + + private AppDataClass appDataClass; + private FirebaseAuth auth; + private Button btnReset; + private EditText inputEmail; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_reset_password); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + this.setTitle("Reset Password"); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + appDataClass = (AppDataClass) getApplicationContext(); + auth = appDataClass.getmAuth(); + btnReset = (Button) findViewById(R.id.reset_button); + inputEmail = (EditText) findViewById(R.id.email); + btnReset.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String email = inputEmail.getText().toString().trim(); + + if (TextUtils.isEmpty(email)) { + Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show(); + return; + } + + auth.sendPasswordResetEmail(email) + .addOnCompleteListener(new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if (task.isSuccessful()) { + Toast.makeText(ResetPassword.this, "Check email to reset your password!", Toast.LENGTH_SHORT).show(); + finish(); + } else { + Toast.makeText(ResetPassword.this, "Fail to send reset password email!", Toast.LENGTH_SHORT).show(); + } + } + }); + } + }); + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/Settings.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/Settings.java new file mode 100644 index 0000000..ab623bc --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/Settings.java @@ -0,0 +1,230 @@ +package com.sminnovations.bookmypcr.activities; + +import android.content.Context; +import android.graphics.Point; +import android.support.design.widget.CoordinatorLayout; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.Toolbar; +import android.view.Display; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.ListView; +import android.widget.PopupWindow; +import android.widget.RelativeLayout; +import android.widget.Toast; + +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.ValueEventListener; +import com.sminnovations.R; +import com.sminnovations.bookmypcr.adapter.CustomAdapter; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.ChildEmail; +import com.sminnovations.bookmypcr.pojo.DataModel; + +import java.util.ArrayList; + +public class Settings extends AppCompatActivity implements AdapterView.OnItemClickListener { + + AppDataClass appDataClass; + EditText labName; + ListView listView; + private static CustomAdapter adapter; + ArrayList dataModels=new ArrayList<>(); + RelativeLayout mainLayout; + PopupWindow popupWindow; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_settings); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + this.setTitle("Settings"); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + mainLayout = (RelativeLayout) findViewById(R.id.mainLayout); + appDataClass=(AppDataClass)this.getApplicationContext(); + labName=(EditText)findViewById(R.id.editLabName); + labName.setText(appDataClass.getLab().getName()); + listView=(ListView)findViewById(R.id.listView1); + adapter= new CustomAdapter(dataModels,getApplicationContext()); + listView.setAdapter(adapter); + listView.setOnItemClickListener(this); + initialize(); + } + + public void saveLab(View v){ + if(labName.getText().toString().trim().isEmpty()){ + Toast.makeText(Settings.this, + "Lab name can not be empty", + Toast.LENGTH_SHORT).show(); + return; + } + appDataClass.getLab().setName(labName.getText().toString()); + appDataClass.getmDatabase().child("labs").child(appDataClass.getLab().getLabuid()).setValue(appDataClass.getLab()); + Toast.makeText(Settings.this, + "Saved", + Toast.LENGTH_SHORT).show(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + public void addPopup(View v){ + + LayoutInflater layoutInflater = (LayoutInflater) Settings.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View customView = layoutInflater.inflate(R.layout.popup, null); + Button closePopupBtn = (Button) customView.findViewById(R.id.closePopupBtn); + Button confirmPopupBtn = (Button) customView.findViewById(R.id.confirmPopupBtn); + final EditText emailid = (EditText) customView.findViewById(R.id.emailid); + + //instantiate popup window + popupWindow = new PopupWindow(customView, CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT); + popupWindow.setFocusable(true); + Display display = getWindowManager().getDefaultDisplay(); + Point size = new Point(); + display.getSize(size); + int width = size.x; + width=(int)(width-(double)width*0.1); + popupWindow.setWidth(width); + //display the popup window + popupWindow.showAtLocation(mainLayout, Gravity.CENTER, 0, 0); + + //close the popup window on button click + closePopupBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + popupWindow.dismiss(); + } + }); + confirmPopupBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + appDataClass.getmDatabase().child("emails").orderByChild("emailid").equalTo(emailid.getText().toString()).addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + boolean flag=false; + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + ChildEmail obj=childSnapshot.getValue(ChildEmail.class); + obj.setLabUid(appDataClass.getLab().getLabuid()); + appDataClass.getmDatabase().child("emails").child(obj.getEmailUid()).setValue(obj); + flag=true; + } + if(!flag){ + ChildEmail obj=new ChildEmail(appDataClass.getLab().getLabuid(),"",emailid.getText().toString(),appDataClass.getmDatabase().child("emails").push().getKey()); + appDataClass.getmDatabase().child("emails").child(obj.getEmailUid()).setValue(obj); + } + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + ArrayList temp=(ArrayList)dataModels.clone(); + temp.add(new DataModel(emailid.getText().toString(),false)); + dataModels.clear(); + dataModels.addAll(temp); + adapter.notifyDataSetChanged(); + popupWindow.dismiss(); + } + }); + } + + + public void initialize(){ + appDataClass.getmDatabase().child("emails").orderByChild("labUid").equalTo(appDataClass.getLab().getLabuid()).addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + ChildEmail obj=childSnapshot.getValue(ChildEmail.class); + dataModels.add(new DataModel(obj.getEmailid(),obj.isAdmin())); + } + adapter.notifyDataSetChanged(); + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + } + + @Override + public void onItemClick(AdapterView adapterView, View view, final int position, long l) { + long viewId = view.getId(); + + if (viewId == R.id.remove) { + + appDataClass.getmDatabase().child("emails").orderByChild("emailid").equalTo(dataModels.get(position).getEmailId()).addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + ChildEmail obj=childSnapshot.getValue(ChildEmail.class); + obj.setLabUid(""); + appDataClass.getmDatabase().child("emails").child(obj.getEmailUid()).setValue(obj); + break; + } + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + ArrayList temp=(ArrayList)dataModels.clone(); + temp.remove(position); + dataModels.clear(); + dataModels.addAll(temp); + adapter.notifyDataSetChanged(); + + } else if (viewId == R.id.checkBox) { + + final CheckBox temp=(CheckBox)view; + appDataClass.getmDatabase().child("emails").orderByChild("emailid").equalTo(dataModels.get(position).getEmailId()).addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + ChildEmail obj=childSnapshot.getValue(ChildEmail.class); + if(temp.isChecked()){ + obj.setAdmin(true); + } + else{ + obj.setAdmin(false); + } + appDataClass.getmDatabase().child("emails").child(obj.getEmailUid()).setValue(obj); + break; + } + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + if(temp.isChecked()){ + Toast.makeText(this, "Admin rights granted", Toast.LENGTH_SHORT).show(); + + } + else{ + Toast.makeText(this, "Admin rights revoked", Toast.LENGTH_SHORT).show(); + + } + + } + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/SignUp.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/SignUp.java new file mode 100644 index 0000000..f185150 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/SignUp.java @@ -0,0 +1,64 @@ +package com.sminnovations.bookmypcr.activities; + +import android.os.Handler; +import android.support.annotation.NonNull; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.View; +import android.widget.AutoCompleteTextView; +import android.widget.EditText; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.AuthResult; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.R; + +public class SignUp extends AppCompatActivity { + + + private AutoCompleteTextView mEmailView; + private EditText mPasswordView; + private View mProgressView; + private View mLoginFormView; + private FirebaseAuth mAuth; + private AppDataClass appDataClass; + private Handler handler = new Handler(); + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_sign_up); + } + + private void createUser(){ +// mAuth.createUserWithEmailAndPassword(email, password) +// .addOnCompleteListener(this, new OnCompleteListener() { +// @Override +// public void onComplete(@NonNull Task task) { +// if (task.isSuccessful()) { +// FirebaseUser user = mAuth.getCurrentUser(); +// +// } else { +// +// } +// +// // ... +// } +// }); +// mAuth.sendPasswordResetEmail(emailAddress) +// .addOnCompleteListener(new OnCompleteListener() { +// @Override +// public void onComplete(@NonNull Task task) { +// if (task.isSuccessful()) { +// // do something when mail was sent successfully. +// } else { +// // ... +// } +// } +// }); + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/SplashActivity.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/SplashActivity.java new file mode 100644 index 0000000..0b897f1 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/SplashActivity.java @@ -0,0 +1,111 @@ +package com.sminnovations.bookmypcr.activities; + +import android.content.Context; +import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.widget.Toast; + +import com.google.firebase.FirebaseApp; +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; + +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.ValueEventListener; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.ChildEmail; +import com.sminnovations.bookmypcr.pojo.User; + +public class SplashActivity extends AppCompatActivity { + + static final int REQUEST_GOOGLE_PLAY_SERVICES = 1002; + static final int REQUEST_PERMISSION_GET_ACCOUNTS = 1003; + private static final String PREF_ACCOUNT_NAME = "accountName"; + private FirebaseAuth mAuth; + private DatabaseReference mDatabase; + private AppDataClass appDataClass; + private FirebaseUser user=null; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + FirebaseApp.initializeApp(this); + if(!isDeviceOnline()){ + Toast.makeText(SplashActivity.this, + "No Internet Connection", + Toast.LENGTH_SHORT).show(); + } + mAuth = FirebaseAuth.getInstance(); + user = mAuth.getCurrentUser(); + appDataClass = (AppDataClass) getApplicationContext(); + appDataClass.setmAuth(mAuth); + if(user==null|| !user.isEmailVerified()) { + + Intent intent = new Intent(this, LoginActivity.class); + startActivity(intent); + } + else{ + appDataClass.setUser(user); + mDatabase = FirebaseDatabase.getInstance().getReference(); + appDataClass.setmDatabase(mDatabase); + mDatabase.child("emails").orderByChild("emailid").equalTo(user.getEmail()).addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { + appDataClass.setChildEmail(childSnapshot.getValue(ChildEmail.class)); + } + navigation(); + } + @Override + public void onCancelled(DatabaseError databaseError) { + System.out.println("The read failed: " + databaseError.getCode()); + } + }); + + + } + } + + private void navigation(){ + if(appDataClass.getChildEmail()==null){ + Toast.makeText(SplashActivity.this, + "First time login. We are setting up your account. Please wait.", + Toast.LENGTH_SHORT).show(); + User userObj= new User(user.getDisplayName(),true,false,user.getUid()); + mDatabase.child("users").child(user.getUid()).setValue(userObj); + ChildEmail emailObj=new ChildEmail("",user.getUid(),user.getEmail(),mDatabase.child("emails").push().getKey()); + mDatabase.child("emails").child(emailObj.getEmailUid()).setValue(emailObj); + appDataClass.setChildEmail(emailObj); + } + else if(appDataClass.getChildEmail().userUid==null ||appDataClass.getChildEmail().userUid.isEmpty()) { + User userObj= new User(user.getDisplayName(),true,false,user.getUid()); + mDatabase.child("users").child(user.getUid()).setValue(userObj); + appDataClass.getChildEmail().setUserUid(user.getUid()); + mDatabase.child("emails").child(appDataClass.getChildEmail().getEmailUid()).setValue(appDataClass.getChildEmail()); + } + if(appDataClass.getChildEmail().labUid==null ||appDataClass.getChildEmail().labUid.isEmpty()){ + Intent intent = new Intent(this, NoAccess.class); + startActivity(intent); + }else { + Intent intent = new Intent(this, CalendarActivity.class); + startActivity(intent); + } + } + + private boolean isDeviceOnline() { + ConnectivityManager connMgr = + (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); + return (networkInfo != null && networkInfo.isConnected()); + } + + @Override + public void onResume() { + super.onResume(); + } + +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/ViewEvent.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/ViewEvent.java new file mode 100644 index 0000000..02b907b --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/activities/ViewEvent.java @@ -0,0 +1,71 @@ +package com.sminnovations.bookmypcr.activities; + +import android.os.Bundle; +import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.widget.TextView; + +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.Booking; +import com.sminnovations.bookmypcr.pojo.Equipment; + +public class ViewEvent extends AppCompatActivity { + + private Booking slot; + private Equipment equipment; + TextView fromdateView,enddateView,title, reaction,comments,endTime,startTime; + AppDataClass appDataClass; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_view_event); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + this.setTitle("View Event"); + Bundle extras = getIntent().getExtras(); + if (extras != null) { + slot= (Booking)getIntent().getSerializableExtra("slot"); + equipment = (Equipment)getIntent().getSerializableExtra("equipment"); + } + fromdateView =(TextView)findViewById(R.id.datebar); + title=(TextView)findViewById(R.id.title); + reaction=(TextView)findViewById(R.id.reaction); + comments=(TextView)findViewById(R.id.comments); + enddateView=(TextView)findViewById(R.id.enddatebar); + endTime=(TextView)findViewById(R.id.endTime); + startTime=(TextView)findViewById(R.id.startTime); + appDataClass = (AppDataClass) getApplicationContext(); + + setDateTimeField(); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + onBackPressed(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private void setDateTimeField() { + fromdateView.setText(slot.getDate()); + enddateView.setText(slot.getDate()); + title.setText(slot.getTitle()); + reaction.setText(slot.getReactionspec()); + comments.setText(slot.getComments()); + endTime.setText(slot.getEndTime()); + startTime.setText(slot.getStartTime()); + } + +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/adapter/CustomAdapter.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/adapter/CustomAdapter.java new file mode 100644 index 0000000..e923fdd --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/adapter/CustomAdapter.java @@ -0,0 +1,85 @@ +package com.sminnovations.bookmypcr.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.CheckBox; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.DataModel; + +import java.util.ArrayList; + +/** + * Created by Pavan on 23-Apr-18. + */ + +public class CustomAdapter extends ArrayAdapter { + + private ArrayList dataSet; + Context mContext; + + // View lookup cache + private static class ViewHolder { + TextView txtName; + CheckBox admin; + ImageView remove; + + } + + public CustomAdapter(ArrayList data, Context context) { + super(context, R.layout.row_item, data); + this.dataSet = data; + this.mContext=context; + + } + + @Override + public View getView(final int position, View convertView, final ViewGroup parent) { + // Get the data item for this position + DataModel dataModel = getItem(position); + // Check if an existing view is being reused, otherwise inflate the view + ViewHolder viewHolder; // view lookup cache stored in tag + + final View result; + + if (convertView == null) { + + viewHolder = new ViewHolder(); + LayoutInflater inflater = LayoutInflater.from(getContext()); + convertView = inflater.inflate(R.layout.row_item, parent, false); + viewHolder.txtName = (TextView) convertView.findViewById(R.id.email); + viewHolder.admin = (CheckBox) convertView.findViewById(R.id.checkBox); + viewHolder.remove=(ImageView)convertView.findViewById(R.id.remove); + + result=convertView; + + convertView.setTag(viewHolder); + } else { + viewHolder = (ViewHolder) convertView.getTag(); + result=convertView; + } + + viewHolder.txtName.setText(dataModel.getEmailId()); + viewHolder.admin.setChecked(dataModel.isAdmin()); + viewHolder.remove.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick() + } + }); + viewHolder.admin.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ((ListView) parent).performItemClick(v, position, 0); // Let the event be handled in onItemClick() + } + }); + // Return the completed view to render on screen + return convertView; + } +} \ No newline at end of file diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/fragmentHandler/DayFragment.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/fragmentHandler/DayFragment.java new file mode 100644 index 0000000..3ca4e53 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/fragmentHandler/DayFragment.java @@ -0,0 +1,201 @@ +package com.sminnovations.bookmypcr.fragmentHandler; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.sminnovations.R; +import com.sminnovations.bookmypcr.pojo.AppDataClass; +import com.sminnovations.bookmypcr.pojo.Booking; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Random; + +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * {@link DayFragment.OnFragmentInteractionListener} interface + * to handle interaction events. + * Use the {@link DayFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class DayFragment extends Fragment { + + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + private Calendar date; + private AppDataClass appDataClass; + private RelativeLayout realtiveView; + private List eventList= new ArrayList(); + private Map mapping= new HashMap<>(); + View v; + + private OnFragmentInteractionListener mListener; + SimpleDateFormat timeFormatter = new SimpleDateFormat("hh:mm a",Locale.US); + SimpleDateFormat hourFormatter = new SimpleDateFormat("hh,mm a",Locale.US); + public DayFragment() { + // Required empty public constructor + } + + public List getEventList() { + return eventList; + } + + public void setEventList(List eventList) { + this.eventList = eventList; + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * +// * @param param1 Parameter 1. +// * @param param2 Parameter 2. + * @return A new instance of fragment DayFragment. + */ + // TODO: Rename and change types and number of parameters + public static DayFragment newInstance(Calendar date, AppDataClass appDataClass) { + DayFragment fragment = new DayFragment(); + + fragment.setDate(date); + fragment.setAppDataClass(appDataClass); + + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + + if(v==null) { + v = inflater.inflate(R.layout.item_frame, container, false); + realtiveView = (RelativeLayout) v.findViewById(R.id.realtiveViewID); + + } +// if(!eventList.isEmpty()) +// notifyDataChanged(); + return v; + } + + @Override + public void onDestroyView() { + if (v.getParent() != null) { + ((ViewGroup)v.getParent()).removeView(v); + } + super.onDestroyView(); + } + + // TODO: Rename method, update argument and hook method into UI event + public void onButtonPressed(Uri uri) { + if (mListener != null) { + mListener.onFragmentInteraction(uri); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnFragmentInteractionListener) { + mListener = (OnFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnFragmentInteractionListener"); + } + } + + public void notifyDataChanged(){ + Map mappingtemp= new HashMap<>(); + for(Booking slot:eventList){ + if(!mapping.values().contains(slot)){ + mappingtemp.put(addComponent(slot),slot); + } + } + for(LinearLayout layout:mapping.keySet()){ + if(!mappingtemp.containsKey(layout)){ + realtiveView.removeView(layout); + } + } + mapping.clear(); + mapping.putAll(mappingtemp); + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + public interface OnFragmentInteractionListener { + // TODO: Update argument type and name + void onFragmentInteraction(Uri uri); + } + + private LinearLayout addComponent(Booking slot){ + + final float scale = getContext().getResources().getDisplayMetrics().density; + int pixels = (int) (60 * scale + 0.5f); + double eventHeight=(slot.getDuration())*pixels/2; + int[] androidColors = getResources().getIntArray(R.array.androidcolors); + int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)]; + RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); + String name=slot.getStartTime(); + if(name.contains(":00")){ + name=name.replaceAll(":00",""); + } + name=name.replaceAll(":",".").replaceAll("\\s","").toLowerCase(); + name=(name.startsWith("0"))?name.replaceFirst("0",""):name; + int resourceId = getContext().getResources().getIdentifier("time_"+name+"_click", "id","com.thermalcycler"); + TextView test=(TextView)realtiveView.findViewById(resourceId); + LinearLayout myText = (LinearLayout)getLayoutInflater().inflate(R.layout.tvtemplate, null); +// myText.setClickable(slot.getUserid().equals(appDataClass.getUserObj().getUseruid())); +// myText.setText("Dummy"); + myText.setBackgroundColor(randomAndroidColor); + ((TextView)myText.findViewById(R.id.tvTemplate)).setText(slot.getUsername()); + ((TextView)myText.findViewById(R.id.tvTemplate)).setHeight((int)eventHeight); + ((TextView)myText.findViewById(R.id.moredetails)).setText(slot.getTitle()+","+slot.getReactionspec()); + ((TextView)myText.findViewById(R.id.moredetails)).setHeight((int)eventHeight); + p.addRule(RelativeLayout.ALIGN_TOP, resourceId ); + p.addRule(RelativeLayout.ALIGN_START, resourceId); + realtiveView.addView(myText,p); + return myText; + } + + public Calendar getDate() { + return date; + } + + public void setDate(Calendar date) { + this.date = date; + } + + public AppDataClass getAppDataClass() { + return appDataClass; + } + + public void setAppDataClass(AppDataClass appDataClass) { + this.appDataClass = appDataClass; + } + + public Map getMapping() { + return mapping; + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/AppDataClass.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/AppDataClass.java new file mode 100644 index 0000000..18c36a4 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/AppDataClass.java @@ -0,0 +1,75 @@ +package com.sminnovations.bookmypcr.pojo; + +import android.app.Application; + +import com.google.firebase.auth.FirebaseAuth; +import com.google.firebase.auth.FirebaseUser; +import com.google.firebase.database.DatabaseReference; + +/** + * Created by Pavan on 08-Mar-18. + */ + +public class AppDataClass extends Application { + + private FirebaseAuth mAuth; + + private FirebaseUser user; + + private ChildEmail childEmail; + + private Lab lab; + + private User userObj; + + private DatabaseReference mDatabase; + + public DatabaseReference getmDatabase() { + return mDatabase; + } + + public void setmDatabase(DatabaseReference mDatabase) { + this.mDatabase = mDatabase; + } + + public FirebaseAuth getmAuth() { + return mAuth; + } + + public void setmAuth(FirebaseAuth mAuth) { + this.mAuth = mAuth; + } + + public FirebaseUser getUser() { + return user; + } + + public void setUser(FirebaseUser user) { + this.user = user; + } + + public ChildEmail getChildEmail() { + return childEmail; + } + + public void setChildEmail(ChildEmail childEmail) { + this.childEmail = childEmail; + } + + public Lab getLab() { + return lab; + } + + public void setLab(Lab lab) { + this.lab = lab; + } + + public User getUserObj() { + return userObj; + } + + public void setUserObj(User userObj) { + this.userObj = userObj; + } +} + diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Booking.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Booking.java new file mode 100644 index 0000000..0360c05 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Booking.java @@ -0,0 +1,145 @@ +package com.sminnovations.bookmypcr.pojo; + +import com.google.firebase.database.IgnoreExtraProperties; + +import java.io.Serializable; +import java.util.Calendar; + +/** + * Created by Pavan on 20-Mar-18. + */ +@IgnoreExtraProperties +public class Booking implements Serializable { + + private String userid; + private String username; + private String title; + private String reactionspec; + private double duration; + private String comments; + private String date; + private String bookedDate; + private Calendar startTimeCal,endTimeCal; + private String startTime,endTime; + private String key; + + public Booking(String userid, String username, String title, String reactionspec, String comments, String date, String startTime, String endTime,String bookedDate,String key) { + this.userid = userid; + this.username = username; + this.title = title; + this.reactionspec = reactionspec; + this.comments = comments; + this.date = date; + this.startTime = startTime; + this.endTime = endTime; + this.bookedDate=bookedDate; + this.key=key; + } + + public Booking() { + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getReactionspec() { + return reactionspec; + } + + public void setReactionspec(String reactionspec) { + this.reactionspec = reactionspec; + } + + public double getDuration() { + return duration; + } + + public void setDuration(double duration) { + this.duration = duration; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } + + public Calendar getStartTimeCal() { + return startTimeCal; + } + + public void setStartTimeCal(Calendar startTimeCal) { + this.startTimeCal = startTimeCal; + } + + public Calendar getEndTimeCal() { + return endTimeCal; + } + + public void setEndTimeCal(Calendar endTimeCal) { + this.endTimeCal = endTimeCal; + } + + public String getStartTime() { + return startTime; + } + + public void setStartTime(String startTime) { + this.startTime = startTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public String getBookedDate() { + return bookedDate; + } + + public void setBookedDate(String bookedDate) { + this.bookedDate = bookedDate; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/ChildEmail.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/ChildEmail.java new file mode 100644 index 0000000..b4bc13c --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/ChildEmail.java @@ -0,0 +1,68 @@ +package com.sminnovations.bookmypcr.pojo; + +import com.google.firebase.database.IgnoreExtraProperties; + +/** + * Created by Pavan on 20-Mar-18. + */ +@IgnoreExtraProperties +public class ChildEmail { + + public String labUid; + public String userUid; + public String emailid; + public String emailUid; + public boolean admin; + + public ChildEmail(String labUid, String userUid, String emailid,String emailUid) { + this.labUid = labUid; + this.userUid = userUid; + this.emailid= emailid; + this.emailUid=emailUid; + } + + public ChildEmail() { + } + + public String getLabUid() { + return labUid; + } + + public void setLabUid(String labUid) { + this.labUid = labUid; + } + + public String getUserUid() { + return userUid; + } + + public void setUserUid(String userUid) { + this.userUid = userUid; + } + + public String getEmailid() { + return emailid; + } + + public void setEmailid(String emailid) { + this.emailid = emailid; + } + + public String getEmailUid() { + return emailUid; + } + + public void setEmailUid(String emailUid) { + this.emailUid = emailUid; + } + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } +} + + diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/DataModel.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/DataModel.java new file mode 100644 index 0000000..1812686 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/DataModel.java @@ -0,0 +1,33 @@ +package com.sminnovations.bookmypcr.pojo; + +/** + * Created by Pavan on 23-Apr-18. + */ + +public class DataModel { + + private String emailId; + + private boolean admin; + + public DataModel(String emailId, boolean admin) { + this.emailId = emailId; + this.admin = admin; + } + + public String getEmailId() { + return emailId; + } + + public void setEmailId(String emailId) { + this.emailId = emailId; + } + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Equipment.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Equipment.java new file mode 100644 index 0000000..63620cb --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Equipment.java @@ -0,0 +1,49 @@ +package com.sminnovations.bookmypcr.pojo; + +import com.google.firebase.database.IgnoreExtraProperties; + +import java.io.Serializable; + +/** + * Created by Pavan on 20-Mar-18. + */ +@IgnoreExtraProperties +public class Equipment implements Serializable { + + private String name; + private String manufacturer; + private String equipid; + + public Equipment(String name, String manufacturer, String equipid) { + this.name = name; + this.manufacturer = manufacturer; + this.equipid = equipid; + } + + public Equipment() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getManufacturer() { + return manufacturer; + } + + public void setManufacturer(String manufacturer) { + this.manufacturer = manufacturer; + } + + public String getEquipid() { + return equipid; + } + + public void setEquipid(String equipid) { + this.equipid = equipid; + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Lab.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Lab.java new file mode 100644 index 0000000..cc4c32a --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Lab.java @@ -0,0 +1,86 @@ +package com.sminnovations.bookmypcr.pojo; + +import com.google.firebase.database.IgnoreExtraProperties; + +/** + * Created by Pavan on 20-Mar-18. + */ +@IgnoreExtraProperties +public class Lab { + + private String name; + private String department; + private String university; + private String incharge; + private String inchargeNo; + private String inchargeEmail; + private String labuid; + + public Lab(String name, String department, String university, String incharge, String inchargeNo, String inchargeEmail) { + this.name = name; + this.department = department; + this.university = university; + this.incharge = incharge; + this.inchargeNo = inchargeNo; + this.inchargeEmail = inchargeEmail; + } + + public Lab() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDepartment() { + return department; + } + + public void setDepartment(String department) { + this.department = department; + } + + public String getUniversity() { + return university; + } + + public void setUniversity(String university) { + this.university = university; + } + + public String getIncharge() { + return incharge; + } + + public void setIncharge(String incharge) { + this.incharge = incharge; + } + + public String getInchargeNo() { + return inchargeNo; + } + + public void setInchargeNo(String inchargeNo) { + this.inchargeNo = inchargeNo; + } + + public String getInchargeEmail() { + return inchargeEmail; + } + + public void setInchargeEmail(String inchargeEmail) { + this.inchargeEmail = inchargeEmail; + } + + public String getLabuid() { + return labuid; + } + + public void setLabuid(String labuid) { + this.labuid = labuid; + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Pcr.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Pcr.java new file mode 100644 index 0000000..826b060 --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/Pcr.java @@ -0,0 +1,72 @@ +package com.sminnovations.bookmypcr.pojo; + +/** + * Created by Pavan on 22-Apr-18. + */ + +public class Pcr { + + private String name; + private String manufacturer; + private String equipid; + private String model; + private String location; + private String comments; + + public Pcr(String name, String manufacturer, String equipid, String model, String location, String comments) { + this.name = name; + this.manufacturer = manufacturer; + this.equipid = equipid; + this.model = model; + this.location = location; + this.comments = comments; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getManufacturer() { + return manufacturer; + } + + public void setManufacturer(String manufacturer) { + this.manufacturer = manufacturer; + } + + public String getEquipid() { + return equipid; + } + + public void setEquipid(String equipid) { + this.equipid = equipid; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getComments() { + return comments; + } + + public void setComments(String comments) { + this.comments = comments; + } +} diff --git a/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/User.java b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/User.java new file mode 100644 index 0000000..84dff6a --- /dev/null +++ b/Android/app/src/main/java/com/sminnovations/bookmypcr/pojo/User.java @@ -0,0 +1,57 @@ +package com.sminnovations.bookmypcr.pojo; + +import com.google.firebase.database.IgnoreExtraProperties; + +/** + * Created by Pavan on 20-Mar-18. + */ +@IgnoreExtraProperties +public class User { + + private String name; + private String useruid; + private boolean active; + private boolean admin; + + public User(String name, boolean active, boolean admin, String useruid) { + this.name = name; + this.active = active; + this.admin = admin; + this.useruid=useruid; + } + + public User() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + + public boolean isAdmin() { + return admin; + } + + public void setAdmin(boolean admin) { + this.admin = admin; + } + + public String getUseruid() { + return useruid; + } + + public void setUseruid(String useruid) { + this.useruid = useruid; + } +} diff --git a/Android/app/src/main/res/drawable-hdpi/ic_add_black_24dp.png b/Android/app/src/main/res/drawable-hdpi/ic_add_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..13387e73aaeeb204ad2e029365e9994095d40024 GIT binary patch literal 123 zcmeAS@N?&q;$mQ6;Pv!y2?Ek8Ak4u6B)vHUgn^W^r;B4q1!M97cDI8X1qm4pPVA?6 zvl4#rx9~1z>y>he`sCcqet=E(fIzuIhW*41jnCKu-)+5E;v&!^<?~c literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-hdpi/ic_add_circle_black_24dp.png b/Android/app/src/main/res/drawable-hdpi/ic_add_circle_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..7eb8a626125b2f1530415c0c15b65a63ce4bfa34 GIT binary patch literal 328 zcmV-O0k{5%P)2~ZON009t5L_t(|0p*l2 zs=`1JKp)1Wlkjh3t!QBp@Gc_36Bvx(5kA7dgH6ayB-wZYZAQUr`9s`Y()nJM<}sNG z;TuU#(pP*TC+DKCUAy28QOyC!5!Ef&B;0~R9WfS5Bq$`zu_%K>1r~L1sKUZ1mwGz| zVETSiF4$u6P^M5&rn?Uo8urzOU-lt5w8vr*9GYQ~&;^AIW91eBp$-2?X}o_US0*TA zh^H&iDZMfUfKJ5OIrGa1`cg;7X-0e`qv?%YS>Z^^7X7<2Y?$Ch%$$OXmix<=iaj&N ad>>C!1#W@Pt}NC70000|AW6JjJ;5MgIP4@jp~T8abus zFfDElPN*r+>Iq;y#;k%w!PC{xWt~$( F696h}Qi=co literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-hdpi/ic_close_white_24dp.png b/Android/app/src/main/res/drawable-hdpi/ic_close_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..51d3ffed96b7c3a674253c02413e743a891638aa GIT binary patch literal 220 zcmV<203-j2P)2~ZON005*(L_t(Y$L-Wh z4#OY}MbW^%lEt*mrt(`VH-pj-rC@NPPRg4i9~oJ8*R`~~hXIp)w+toBh+|4qST-D2 zxf=(NqOfcLIH4;HGxy9f^<>EPEK*gBrxstZyb7wB@05!1)anaYjGBokJ@fIMBTPi; znbV+?z7|Ys($6dycz$t;8F>ebne^gRGu2dn8N$UmcGw=2qnCQR6`k74?~Z@VKV=75 W_Kj|-vSFYA00002~ZON00EInL_t(|0p-#$ zYZOrw#ql3I$#!8$qap^u!tWrM%0fs;iWCcq-$4|y3So$ag$h}+0b3D40ycuRY1TAG zzk(o0c4A=>47(uDE-;sU>};L?sfKgrzV{B-MWk(A-=WIbSmn^JHS=a-(YD{x1f3{# zG~}L2%FD5?sT5vI4b)f2qwpd8aORVjp8M!5IQt4&;%(l!4B(Qt!QIPt6N0ZqUW7y! zB8#Eo?^gnM z#3Wd_?+ny&aQ?@vDB9zd@WY&=*Gp!Kn<}r@;wXuK%@5^H^%y2qup6;?NbzPRyY(g} s?r`2{$RU2PXW2~ZON00E3iL_t(|0p-;_ zYg1tu$Kk6ln1Fo|{RoQM(kfLEbkWZsf;fnvkXDc`1$A(Aau7j^Ai5|x2nv3SwiGD} zE-ucBlGscp^>&kohkHn~IQ06B`RBlMa+27qUW=lahW1qyeKDkl9Z}RXZYVRN>WBf& zyI~SA>W-*dF#?!!)2y6vpM`DDoOZ^RNc!NEv!3e;AB{;Z7jO6@vZ_~ZNgVQ1?6U6; zs96<5^jKw1U!-+yTC*+EdS;Y7OlKX7nxLVjoo*f|ne;Zf%)HWEa;Y~a)ZDF(x2V>t zjhyQgN_dr{Rkr*uL`RJ}7b$OGBd(g00MI)glrvw9+}Yu$#fNc-)m$`dg}kJKFW zL+r9|rX_9{lO2(#pL~fbV?GHTt4><5DU#OATkzB`Vaq7F8Q1Iwj93v>%K#=^cg%o} ui>kwhvd>QSQIGxSzieLV|EuSPz3DG|RPuh-D4yH^00009;_I44$rjF6*2Ung9$V7IOdq literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/ic_add_circle_black_24dp.png b/Android/app/src/main/res/drawable-mdpi/ic_add_circle_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..df735719f021050d65b9c5a7fe8512537a56c6c4 GIT binary patch literal 221 zcmeAS@N?&q;$mQ6;Pv!y2?Ej*Ak4u6B)#gs76YlJo-U3d6^wh&Ii6}!kZFG?E?%{N z!H-2Re2fLo$aYx;DVnyg=#AHA{*>+u1DnKd$!N*if-a> z`~8)J>0adomidOAQ!Q3Jc;E1Slj24zA0q>kh~hAVq?cS-D}%}h+qN5Oo>R#b-FxPJmkLdckU25 Vy5^13U7&**JYD@<);T3K0RV_WSE~R3 literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/ic_close_black_24dp.png b/Android/app/src/main/res/drawable-mdpi/ic_close_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba4616493e5265a19eecdf2d78105c3222f040f GIT binary patch literal 163 zcmeAS@N?&q;$mQ6;Pv!y2?Ej*Ak4u6B)#gs76YklPZ!6K3dX0CHVQH;@~~{@3~YJ( z-rmX8W`~^2gu8Rx54Pv*5zla+bIw&gKmdKI;Vst00x*o{{R30 literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/ic_close_white_24dp.png b/Android/app/src/main/res/drawable-mdpi/ic_close_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..f26e9e144c3fcc0c22c998deb523b7ef12289b11 GIT binary patch literal 174 zcmeAS@N?&q;$mQ6;Pv!y2?Ej*Ak4u6B)#gs76Yj=PZ!4!i_=dh@8mt8Ai$Ez)b-(V zJ&P;Dx^$U_oW+lec@$?^`mJ_dxs_jCOgE3WZ?B$(!W6DH?hU1m!d|M66#|^n~3zcq%)lD{f!?(A8Aw!K*_Tb?$Hbv40Pv YZ|Sx&zInT@0$sr1>FVdQ&MBb@05#h}LI3~& literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/ic_delete_white_24dp.png b/Android/app/src/main/res/drawable-mdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..8d48370476b2125f97ca5ce7fd8d4c454696140a GIT binary patch literal 114 zcmeAS@N?&q;$mQ6;Pv!y2?Ej*Ak4u6B)#gs76U0OPZ!4!i_^&o5`P}-KlGpdf8v9K z^{h2s9~oX{C>;O0WS0G^#1LjZ-t`++)i*{r|NlRI#;O0m`99h3GdQbHI`}F*o N22WQ%mvv4FO#mb{D$f7_ literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/ic_help_black_24dp.png b/Android/app/src/main/res/drawable-mdpi/ic_help_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed9f00543e8037c00103d9ff83c6038c4c95729 GIT binary patch literal 297 zcmV+^0oMMBP)m;sACLuY8)4WvIvN}{;$By9_X?x5%;IzzNm28}3}wb25D7JV=?Ogo=< zGxN^(Ft5Fn8Jfv$ZRMs0GBsR#u`6VytCGZnU3H8kO2qk-mWBgooO`&uM zGO@jdwzYQ`IRERH(h!DXZv*S!r#BpmFZ~c^qK>?xDc&a`a z`V`%!PPoO1k7z=uo^*`ILN^a#S`w=MI}TwGbxnF9WLE#4=Td=gc~YTiD=?}R?v+SF vDdkS0l8$A?_O=>QeG>~C8*^hlsXg-p?6VZ7qw;c_00000NkvXXu0mjfs!)44 literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_black_24dp.png b/Android/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ebdca6dc151169a541192a3003068f47fcacd1b1 GIT binary patch literal 124 zcmeAS@N?&q;$mQ6;Pv!y2?Ej*Ak4u6B)#gs76U04PZ!6K3dUpy*2NBt9G*e{7&uZr z1OLr`Xu!7PLJ7(8A5T-G@yGywo{p(B+5 literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_right_black_24dp.png b/Android/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_right_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9be7f6a438be8a0c958a5aa9541facf3585cbd44 GIT binary patch literal 132 zcmeAS@N?&q;$mQ6;Pv!y2?Ej*Ak4u6B)#gs76U0CPZ!6K3dZDyhQI?S4>)!e>9xi3 zSbJPtbm~LbL;K9Ak`os{%?i=owIusu`VZDCn;IjY`tV$CJXLQ{!K3-Ksw6T^Ym4u*p z0#~y71Q~|e2Vq~A&#(K0?J%t%S;cRhRz8gyB@qu?v&a-@6uR8!lu4Gj;hre`c~`pBgA0PxDgM)En<4lEo5$T` TFHL!400000NkvXXu0mjfGUAK1 literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/shanmukha.jpg b/Android/app/src/main/res/drawable-mdpi/shanmukha.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4f61e779a92ad5608f57295c6b2fc74ea7180900 GIT binary patch literal 32680 zcmeFYcU)85wl*3?1uG!EMg;_^iXehOL|#BdM0zJ8(gmcqKomrzMnFJ8h=4RHk&d)T zm)?og(0fU!2`Svgez))5XP@)k@9h2O{oMsKE9;k4=9qJgXFOw!xek9FPJtL6sH&@i zjvYG&8VCMBhhrdR(D7r(j{g6?(VV0?+D@G~L35J!6fNyhqdR@}G#%X;I$GK@XU?2G z2W+&bFVLSqcj4&!(LIi?KDr3_KSxJPcXYV~0&3 zFbH()B+%KT{{DSCcAVzK$x}d&&YT5KC}RM6PeXGY=(93K{(-@vVa%_Q(dn7lx%q{~rR5d;*7nZs-adhNa3t3; z5Y3-r{UzDI$i)cAbsU(26SPNi9Xsv~G#bVeCokVPbx}#1*3y;fisUOg=6f+|MfIoo zZtCDzp1Sp&Vda;a7Qi2g_BYA?cY+1|N0R*|*gxbN1)ZZg2236eBM1VbkkiA3K>vUH z|LPdD;Gs=oY(H=tL((FqHzQx$bVltcB|u*0Wj}IH6lHQL9_-FE(nTn!#%@f+l&JWi z!_m)EZv8CvQ%rV+O`IsHh($g=rA~IW2$%tnW;BnESf1}HPv(N3FXe;m4>&^-L?#*eZ!SCG}B5_cEHTp^P-2KFIeNTLlDL|9`X?tSq29? zCJ`Y{L%Sj=6JILb&oF(93PDb*Fn>vxqBh4&4{z3h0rEB z2{TwlOvRQoJz3o4^dYFX@yj7->K>-0)KF(?l*a+`V-^+=w)_C%uh<*@#Jf-|&HPUs*`vx!GpU%kyR#i(At8liEWy8dhnDoxGe`mknEY@DF#jgSbb| zgDZCqpyXic6&53Lhtdoe1N0pvoF+yk&@+3T4L-ea2nv%ri2803DQSovyj@|(EHC1L2T`Tp>g3I zLok>0rH2M2qyDvDo=g+`KIEUMPT(?_CSEXtBRUu5$oXa?eP&CYZA*|P)FPh#oW*Vt z*aL2G2vTlq@~J^Nu)8EDE@d1bv)GWO5-->85mO~`JzWDfnM{YEB~b@7S*oJ(5OlyT z4><(A3ZqIBQ7YbQjq(Cz1rpzRpVyeRLLV@Yuta3$FuYXl<>trNfj4lNjy7yg6Y_xR z%tSxTJ8gAdCAuWjBBA93n`_&r9nzOwRL293AaN~_=hc$j>3CYQ+`1ny6?#q@&EpTK zS9vA+H3K6lPiU`%lXLs2at>5l2wnt#p~$X-d@IrI3ib7w)g3K@&|=g2@vG4aI>QI@ zmVpz`V~a@}kF&S0RtghzKPtS~+457btj^YA70 zRZQ!3c<(pQf8A;j9J&;_IFP_SEQKv|X*Bgsx`oGt>|d)N%TaB_U7Dh@5Fsl5dSq~Y z=H?7Pk$CuH!M+wXls!2eJ~|5NjzUgOOt|F+pb7 zyJ(81_hGR(JzxCQLc>{>+VKR*u&1&2pIJml>LFSR5CkFTTAXY72>CANS*&8hw~4Zu z;N`Nm$iUkuL6)g?PwIM@R=c(%{t+~0eTwYWSn=F~vDrIv5Pd3xh%DAKoLwYC24=G2 zv$`DZzxdcbj!9&kbnq%zNZTDb+mc%2-mMtgswi*>syD1tggy2>+1hkoO}!%S3#YvH z@=9>8yaPY^7bZRwhmiY3ba=pMzA-_$Xh>S~H$rf2(dp`Bo{5cHZjY}ujjvlp*2Fzb zz?b~&;6w?0m^w2{Rw1dv6mVfK>n=P58I3J`^}63s=^gihJD&`K0=9rDJmBv`1D5=n_wtPbWV1wQNt?`gq|ck)`&b;))y@8D#04L$3jQ^(OomuUk#d2858mbDn2fQtGm^|0(xPLpV_9=3%4-<;t zW(uCve2=XOX}wo)YD6~kxCc4Qh5 z1o1;q3xcLpn-C;%-lu)Y$E&)SB-X~;bL!5wDS?RbT=*4eHrN9J-bMJUX(}+`pbp=ZVxbyfi;<1^-Hd zdQW-}+<=S@yg*n?huaY#O`{TT*Fh&o8`iJdm5dDX{0#U&vks+6da+@h2-zEz4B8mN zP)`)1nRYsn;gX+*pb|~0F2!Dn-QxXFDNj9Z6`$-HW^EPFf7TvjR~YOK+|10ncxr2e zjpt&@zaATpyQf)w`BrT8)k5eDTg&;g)A?Zh^{Vq8syf5qR9o^LdaoZSLBe;EVTVWm zFCVkg8*V7r>Nc9D!H-Czl-|TPB6&S`}&kJ zG=}P_SX_c#^=v84sn9t7J(JvHy^P)3Rk%4ryRM7!$*GZZmNLEhV=H?3mp|HtKnK>f zuyywoSX&qESC=a0E~#dNE}88`wpr16HELl zlpelvyCGcoPRB0~l1-8?t561qXzMFLxJym~Uh2k*m+=LN&|}8@+k)%Nu!`Ab0!DBK z70v`@4b_@(p;wk5m%_6@Qv&0Emask5;@?u=v>0Z)=C+?_Kj(A1b6IU7EpKyR&O>g$ zDMi^xv`FUHG^CM(h#0D(8Ws9}sD8Gk#h<#PZ80x=J*(iP)ncAuuKu>3_Zgw|Qc2+B zQY%cR{RDJ@~HUoEFYzP6)#JidtPD3_r~zf zYkdRWW8|&^t(F`0@fA>MbWPyWA&9fSZpc}hm9i7rNUCKHWU&a}%bB(xAQ;s4Ae*cl zh6$-D3H2(>hDtyG)DfdVSwd(gS#dzIFGsU1nWA^CGY)J?(K`O})=1Dbo6GvD>I!+? zumIBiWnMN3mn_7(WAoJe=l4P<&=FJ`WDZJ*5QDEUAcXKW*5-SRlgs;Lu;6v%%z?*V z;jQv0#RZ+*U&}CCyt@UyLvqqW(zJqH-AJko9rT3Yt~e&8hY#_WOS-wdNDsgE7MLT@ zKQ|Gr243l5MX+PIQaJ74M#hv9?b3&&Xm1`c?HwV{PS@`m2$_8wwU^b%-@~Y+xF(?wy^B zL%h9A9oEC%LcmVerO~1`+K4|k`VzEPp*<-^{nGxmG`baaMOBr>HD#`%G7R^v64snPK@3 z?9$N!=%-MExb0g--ZtCmLr_G_xKG9(?BNP-C&8lz!Jj2j$31y^E_(8RpF!&=vcU{- z*cSB35kf>mRdaN8I#&E?Rau_e1dX3r~RO+|3O#*n9l!)o`UGBEL7NP~Y59gL{5_!cB?zp=!@Br^Fj;{)dsgOzz$ZpYZ634Jao~(^XmkOCJnc=3b2hYy zGj%3}YJ9a0AvaL}V}VrV*!58nSL!x$#--P5zl)H9SJok9pvvY~pTCih@b`r9pIuT= z-|(kgrf$U?1L3YjdPY~3htE^a@UBa=Sk##(V&}9~Saw=}hA?a2 zJ;`hUe@j+(nNCs2{;*-y)cdM?w-Tc>(-k+S^#TTYgK{y0PuvK7X8ps^ z#I!BhH`cyp6+?bh&XpE?Ugn;^;33H3*4E?>NKC|HV#`+ z&sj~se!oHYIbe>($HRp_|G&0cjXgt3k-R5~*Js)jNxM>T?xrNAS`#U0v?2_7W3-Ja z$l!z#4t^ea_P>nWyar3?Hu4&pJ+vs4<2lzn|DpWMQBc{5o zK2$pL$8d#L@rQ+1t)7-W6_xxRD9j;5nsys>Mnt(beU$m17aEmfrOO$I4^x-#?(KKJ~J@8=aOK<5dnPzNw z1(F5!5TolH-hEN0A1nVyYBnXKUJ$o*(i2{~*+Mfb7Eo%+;hwo%_(x=RL|Etv($^hc zqGJ5K^nu#>XLYpTX%8PejyOCq)(c2FaDl zl#Amr?BEvv3WC4E$pA(3;63fd#HK?K&7Au~{{o0DeMq1vpf5W;{J%k5M6hXef6v3> zq1t}8EMy!!YbYI{>5+Fe=DTw^dQ!T%=Z;xt|NXI)ZuMQ1GEK-HBGpu)X=_{5wir2fP7JSt3Wh=4b1iQDa>Cr+SRYaQF8`QT0iQfm3Ix>(-`3;w zs!y1<`2M={v$5CD8xjTU2?)5A?JL&Y6eTrq!`n;NMle^}zlB${3SaToS(>Y5LUg?W zQO&uhy(S`AWy!^t>Q)KB$+MGx1Ct{_`M)&9$r%mxexsDx*jpE(Lme-32hl&h_Wm*L zN-Ozd2ldQSouZS>bVakKk`;!_sT_goCYayfF%oCrNiP2B6L^eBg!hG0t?KJhgD3(& zmdp}Ny{Mc;7AK_T!kb#>%X>Y?K0; z7v^``MJhZ8JhLJWv>L(8DTe1VWRbO{!iu#Sg4oikwcR0V93T@RjB@55gZV!bMV3W) zX=pPIj#Mw^;&^pJORw|#yFj}{0v1P0Gafuz%NX50PTf&v`Mpt<3u!S2a5Rv*2-$rb28X9cz-c{YlEtRx0`bZ3}+>D24Et8 z8je{-GyTOwko9s<_thqh@CHfq=5sh`rOXwW6IKF0w)&^A{ou=L zrT`KP|NQHQ#Lc}pLO4u)Mr$p?{-$+i(Zwft{t0@@_P}aYZRkuz6zxkgy)P{PWIeBb zrNW#u?R* zmLTv$$t-+S)_^)Bu4G0$4Twtk=`Qt_`G+2Y-W3bYOd3G8#_6kCDNooTw>zkzhTDSn z-qIn1?)Ciddd`ON#oiL``zCvW@#m%O7-%sTr;a9E^MIELhRot1ktjaI3@d^b$n8{+ z{3d86=?|V~Y@+b=pWqD8MJ!__{YtlSp*eV>)|O=tx-GF$mzPCyq9{yjh0(KS#4f~A zX8J!NN1^T5ZE?i9m<)E^K`0%~0rC55ERS5~zqH$kQLYx-diYt-(|k@9GCzzPSI#cF zl9_KDyn^x>mIaQaUX@Y2++P~+k}%BVehED3{tEe7_Yf3d7>-%tmI&FqEg(}fK{b`w zCL*Ko39^_@bLmo+I)8Ml*1IFB5Zd-9RnWf6jcq<}MUrWJ!*V+oUxOyl8&HGssGEfu zGj*AJXhyM0h*!UDxXs6|t(MqFgJ2;c5OT(a5fj8~jLJi!9?u+wN;V#AZ_^U30in zskVy0TF*bQM(56Joz53uCDqsO@}4K@5x!vwu><#`(B78dWFhc&-+}E?CqY9yY_aqXf4f>=A#F&PBZ39-kD>IukqxcQA+y)Eqqoi69eq z4A)&k;Ztv*$E5U>+_MSEh9ZL#s~4)Nb&s_MSX_(%>V74#XY`Y)C64+%`xf1VOM%%9 z#Y0eyEq8#(JUHUxmH6)tep@K&10WH%r;UTWHS_(n?B@;~9;l$1@Vwy^D*}+1H)X~&X}rujd8^;@WK>Jg zx>P%Q-SnHW`)ZLHy~)A35=616$NOs-?YL!;R=i(8C-D=uQIW4BeMP_VyNYM94w9(DdT^nb-URa&o+ zbTw-Dfz|_f2w5a^e3f%Di*&i-wbw?c)|qfw(I$}W)sj2|=BX7udliSVK7omn2T~6D zNtx=h4<5A%c#Vw+41H8&$F*e6LK#MujgW4Mjx@rja$-=Yz9(jL_r>1p#q z%p5FdP_uB04VBh4-&3Ez&)a0*NLwIv;1C+M+DC-RcKt8h|Be6u*xz*0(Nb#rOpl-{ zI>N`WY@Tfu&PKK*x$R!n<8Wy~e4%22W5xQ{Rqw=y-qM|$*A%NiAXoJr_d3NStW}vY zBkBP^sXi?Ro<&SwsRJ&XM(iz^QR<{4L)AI^eQm&!6O~FfP3LWS@(gigMfA{WhR###j0gYr%l9M zHkXK+Z~kswdfKNm+7uZBJ8Xj|&N;w@Ct*PyoKaiStdgbeNvnR1^Tx2-)G#80| zj5>@gbr~(|a4GeH)Y~P!$z-CB-O_1NdJZ44F|gqozQyf)3jHEI%rZ)wMW5MHUlqg~ zgyzDFL<>)4QsQ4GijLOIRfPKsjFjaCuoUDC>?2OYk!lr9U)g|Y)@Xt zVMThLtlTEaQ3P4?;FG56eybxH#Kd&88e}RHi&Mqm{@@Hn1Ty^Ua{Z#pIjf5szuPAE zZl!;8->y{`ELv;GHxKQ;*$mg1lUEAv!gVkO$7A&NBi1lGNM)j6*lk;I%*-Sc50_#T zOwt@kCrVeX9C@g9q~f1G#bSiSL~WS7PN`756eXh^lJ6nH23Qw0?eVw98mROGqbn;96@~^snwl$$Zj1H=m#Jk7AV3%IqQvC3+QJ&Vt zVbm9ien@_Wzlc~nKo;&mbpDkf{FmcA)WhKep1JTb<4az&y&=*LC1g`3t!d3i($lH^ z`n0|8r9F0&w7#d<404%H^Fp_RyP%im_DC$BRvFP(FJbn9A<`4u&kQTllOyb)arK`P!8@E~s z!{-B7X$Xu&s%^UsbW@TTcpt$3wc7xe{25Kxlqm40YX;gQ?#*cC<%zK?x#iinpAr(B6W$h*v`!1%q(*xf-iYx5kB^F8yCc#;2*5n&;WeA{x;8{Te0IQooEv zLh_pz#tUbRM4x+1C>8~9QVhE6dKMJJDGY$~X@S?@#7r0LE;b`U%OrV-uf)fh^O6&a z=8^^w{5EIwyK3+U`pQ2RLj!2<>U8syYQY7QXE2=D+~pwx1;Olve~rKcrO?#-$i!Jq52*wlhZ0i5UE?tO)4 zD-%rB;v+4duiJ4wY>|nghLhN5RTYPzlS`KG=Gez)*|=GcbN9pD%*~L0pr=Ht`CbEe z^@Z0}472XYcJ|F&u(>-x9JjtWYD6KYB231)-YLHM1nxenZyylj%3t)quk#f$?WX7}s}$yjuu zq3fJ1b8zgdR-m3aajtqWcWIn6r@c$kn%Az>CxAt4y{M!niIvnRt4!e5)89Xx{S~6% z(EVR{Q$4=ZSHp(7Y)PCYi=-6hwLB&!J=!EL0LY`YYE}?%3M$g4QM5(;;`G*~3W}Km zp6t#0;_tp2WcZOfWDp2%>@dE&aCT1c7qcrFZ}HI#-dZ5Kf<5DDt(_3U>bhR^3PRYh zZ*^5bBrc_gugd;qvVS*S`d$d(lFT{_eNdg0PsH?O+U;n1_A#-IluDfQdLygS2Cf85 zdMdJ8j!uFe_rdBB9A`B}nmEM<6XePxJbBhr8UmIwRnKK(V|sCFEF?UMo{BjTTu;ME zXyH|p`b<~eg_IAMPK`JzuF-!C@RFHS-N+ui4(?GD#f>k`47;fN$BSmp^XDgTIbfw1 z5GxWVZx^P(nA$|ple*QRpG>PYy2a3O<{#Jev{eG-0@sd4|DT)T&`t!D!QRk7W*9eV zY|+$frX)!lZTE}inYBF2rFTjz=L5On^^XrhPfU@&(6el#rEhJLe^^|NS?Iqi>r#X^ zEcK#p*$Qh-K6JbPJaBPXD}qd$PQF`QR)LX9ff!YkR7D@qZC)}?;Fy(-)<1WFLrZzk za2N+?HT+rRoNp*CEAl|5j3hl$NGYsBGPTOHgwDucOq1!*5yz#VoR{}CovTN7AlK1T zAJ90pF!^Uv0L6i_?(B!E-EsCnU3gS&LGUzoPW;;1`xYTVHiE{Zb=SqNd@GBlO+&yT$FjHH8oM(0eoq!ENG*zNb;fV2%`u7ui z;4RaDpQ(gR{U)6Aa7JJR)(%0eX84fgi>Nw3>i2xP%|MA|3+v2+8PtuUu%4p1!0+VM zAQb9{-roBwRH!RnHVSO}HkL>^x|wmq@98%jDhM3Q>f)6&zCerCKETjhyfS-KVY_!; z$LNS7B>p0xL;xN4}FF%tSle;C{r^2$v%kbNN^aHFkHEq?aO5!NygPLap*csp{ zM(HmVrRqxJ9@QpI>W}eX=&RhhG&QI{5!lDe4per%XY>cdt1SoLn_u3Shfw8DlO00} zbE@+`^&5BrjwR>s>Bv7<521`G(GbT?roa|3+j@=mG*Pk7F+bs4D~e4Aygkl#`SNdW@*nO`LKv3b5fbm!3~aD@u)Qml*s+X6xI&qI z5ceu^Eok5D3GuNA*(A38OS62xcFB$#a>V_;9|ZqB%}1CfFFbW)m37~ThnqeIF{BEa z;v23jd5x!bFyOXE{ryne&@?=^OG4Ez{qUgS)I-oTeC`mW+hms>PPs(>%X+d=_8J9C z`>X{B>}61D*C4ouWwzvx;jL2VO!LzQv_&lILyHjR9r`tjr3)W)!XjYJ%N4V|O2m}J z&B)p;D^~lZvU-Ou1m#!RQ6Q+!dEoX3Obf?<)2DARN6R{)4dwuBOkE1Pr`AQ!+pELh ziC=U78N1?8IWMXtC(AM{W8MBXHxG+ISG9?myvu&ZZE2o>d-i!5vq|Ar@ zvTArJ=&6vwE9MwZ4Pq!w9Mcn-`7PvU>FwHpkG}RilrP^NM)2Rf95uLO%?C^>ngMoM z;uXx?H><7sxx|MLhahg-cu3;Pd8Y^F=e~+(i7{)Nvi~zz{2PVy^Ik)efI`^b9YO|e zSdEBx)URm3b$y6)%x(PiVGcTYeO`;NQqc-f?{B59QknN^^wI=uQoDF=%Ui<)d}dzs zyM8hsFp=t6(%rj5DX9UI?8r9}7Pz6FxBzDsY0ay)V21$#NJAsx-PF2kzDJ_@K?K1&Vgudv{K!!}#si<9kLM8L{?KAr8ZfCi`9>RE)d-|s6~6AW zXvamqcUsv8kmZW}gXs&4DbFL}+F?`b~$Q(?J{x@!bOzeAAykD5Z(7YcV|b|4`y z%J$gJ?iFZi!YEpAnx`}G-l6s{v3TP7&sG4J%|uJbb}T`3aE&3$w;;`Pu#Uv`Ow^+2wiyZ*KE zByUZ-0aGawvK)!i1TqA|fgz+P%U)DYJfF!Dgt1_jSWxl2V)%IUvx+v-ulaQO==(ou zT`=+Fj%B&B;oz^PSflZA~kT5^TtMQ`E)?W`wH3!KJ^ieGctvS&uZb= znoT?W>6v-H*^jQhR&&Wq4U$D1m+b+`oLNM~f8!!YEAq`n&ZC#?BCcQdoTA+RcR`C zvd)B(PCZxASnIRGdIP-Xq}2BCg4h@N4?PvG>#Yt42{{BrV|k!xpSToh$-v(<^VbUe zgTmVtdMk@^tt2fPXo@3ShB<~<7#fCr*4z1l+O;f@54ELgp|HIKukaN`QJ8oQ!EnZ= z1nE&;JiqRIqX}3w*L>kM{GLc6YS?Z##KECJ#$yk{&}6ytIA>|dAhz!_kmS;3NDmh} zR@_w5^mB#7j0MQ2aBiWw2%0rFa$#vn!&V=X2PknHB12yb%QBQv_Wh=2;&XwaRjEz> z7-w46rAHLr#S4}}M&Vv04XYNryeevlOsJ<|#mB%+;fWM~M!me1Spoh`9z?_^YmVC; z9)LM$Up`VVz1>;?Pk)74ehckddZ5f+sI7mxvP@`0^S-L9YeMIgP1xu7n8Cbj^|WQT z0H$dNaY1y4z+oBhAd&DWx1pU6&+p}(EjU05L^QO&CR$9e1J1YC?Kft#Q{{2yC`664 zVv5Igey)sn^hs{Owey)b^bD*&tPscvo zz@tlN%yhtMQ*`4}bxBo}O^}b7I`_{;;r7O$FAPfDjL^=q09PQAJRW?p#i(Ob6BghG1Fb74UgKs^DQTu{;w;ldE4+ zt!sy>txbpSujJF8G&=r;;jVPA;r8wW_iVw_SxJ4_8CoTftlYtn`@-)>T^*JSbhW-( zsxa$u{>^><-zu^H!|&{H1}gX$OdU5q>a_I&E2Z;l`v>JCys>hoP6b#7_;QoVO^9{6 zMU|I_OSv7}dX(}p0I}pIvhJ`@Cq%wJK)vSUnZL=bChzO$_)^gaj2Y*hMPp6`uqvl& zoP^lwnz+Cvqz^LYeG)^hKIrb1mge!)U~CU=&OQ(^ZK*puC{HtUx^zMnEN&OA1oqNj zYxfVP`sOE5?xo!C7JlKaWfOQu=hJf6KvIdxQJGu&1HiS9eVjp_Q=W;s-6+^`Wt;oM zJUs#YV5>k^BU!aBc5?cbI!FEfKJU;vOAL@NJgq#F%#;1xn-MXgzPuKYH_(Caj+jF> z5_un4Ckn5of-jP_uBK-VN)b!*+Qc^a?B*k;34P&Ai?vezulEDvK1cGG0SB;RQj`FbD_@c zv&V~@y$l`Afuqz8NEtF1?sy1#gZDu+aK8L#c-r6U7VD*DhwWYXlGD7o)p3J-nS98mNDA-V|zFJBNldHLw= z49)#C+MyW}z8SmX$M6y?@475qWpdxRIDgwltnwf=?o?2?w4w6UdN@v7i;g-*WjyQ9 zw^S$j?d`41w2rIh{v4KqlxKhJbLU>V&T+Et4Qc__DADvJuj71paO7+id^oSf;_bj685mC1r z0K&=An@4%!8)WDd0j6s|dMBrKW3F{603Gien3>h}#iF*h$wrn>J{UXhZ&+%e6;2j# znMu|}k*eReZp_oftOcm}eK=R&4~rwf`F?g54;lMEfU_<5im})l^gBywELK!%#!AdJ z4uT&PKs7k779!riH-m~+01y3m`AGT97T?y~m}jjlhbHEIrh;9mEPZ{Zj|+r#7Q%Yo zHa3*X+W1mfdVL}q!G1Fn0h8Au+EkVvOy6S^XVF5~R%N98Qbz({kOnQkRhu@B>_%Xa z#@{MRZ(=1SR#s>qg224_=yj6!!7eV;AS(QuaQh1-9+9o^VO zP`6Jb{}FXd?PoN`ycMsEtd?+R3(Sj&hc>szw(mLJ+Tx1v{Zdg`;mWVm(rj^y_VW8^ zCE9mt4~Q1R)7-qi%CW`sIdvQbn8c)wx>W_OlBr3VR@|Q8s3lff7WUX5B0XxJM4YgL zYrZ#J1j?IW>RCqmD0B%GOg0(hs~8S64UlMZ|7NsF5;YX-vtBxp0w#PLM=uRK5?vI3 zx_(r>HtiZyvUH&Ct##m-ONnayr17d77s2rgD9%uY>iW&WQ~R1n+@@IpcLa|AL8D=7 ztvfbQ$7grZ{^0$c3}>qt`0(9{k6Kpb)p>9@^o+Dbh~G#>jjmY!Yf9>};oK*j2jwr&BmBg=eK&Z*Yuf_;aT})8SX#pF z-a3&}9zaGW&J)1&edd@J=qn8HIz}1&4eyC%rdyZ4(`+C&&>8+a3e~R~Fw2DJnsPfs zCXbepQ8T#sZ$svs_|nAPeLx3HKTQK#e9Aja{-(=}zl5-58Ro+r&4MzOcW54{;D>I= z%fc)x&AipXo~=2kr(gYsLtRk6%4!>&b@z<|<`h3;(q6T;N6aS_k!$HCu6J0OyQ`@O z24+X~nbcjwrL=}@?6r}8no&0%-*!Qz?d5+x2>0Z>ovShd7SQ>W+t%RF1$091?oqnQ z0Q?qqb1wzMI=i1@OpEtN_>HHR0S;-ti-~j4(m*~=p7P4z5)LTc4I1jB2u_|Xl8qss zJa^zIbgkP~Q}2VHEBf!Jf=BB@>BFLoCR~0IVFnjH1niyqqJUZbJb#1}M@@cnR_4bN z%=hdHr(df}{*~l0_WrmQ&4sq&s&B1 zT^7}<3orgp%7p6OBmgggkXiQNZ=$lv3WPkkKu@TmsgsCBN`!jmg$U-wyt}uL9klk& zyOwOXgyY@ULTQtyE!a4?3K98G4-%E$#-A+HRJj(%Ui5*(cvovWc3og7P{h*)u9@Kd zZiO|*%(R0W_bBN8TvRZBxT^B;+n1u1SOfy^0Ol(Snfh7*Ey>ETodUmQi!&#jns4%w z>A$$;6VOKP`mSL3)sy=f_?Orn?TVqbOI2k_TzRHB!$vk?jjh7h+l#+V1<_rKrbEp; z3r)i;)Wi4Kqn=VZ#J-?as|r&STu3s(gvOIi?2!EF(xm{|fod8&py(ZwMy1+*N zTfg+L=PBhbCmeJmr3(gcjGK;MQ|EJye-YrgfQ*KgWVXJvFxOHy7B7A3Ek{`vrPk$9 zG0xQN1^LD#Mf5fi2VJ@ND zKK|)-mfCpFr32}Cik-k;ON5l+mKSpEaAvB-DwpbYEgWYhj(1JxJ}lZu>O#;@LTrwT zfM=c`#q@G{BIj86E`_f(SP9-UaT?;jJ$~*6BSx(+l~2WU@)qI6s23^kq`lZdjdB8F zc?F_v78Rg!1_#iwn{zkV{odQQX&)K%pUD1rxRia@XM6vu_7<8jbReAD)nL{)9{zsz z_EwiUH_ybU1g28ATm$HEMj=+WKYi%Q$fdb}VIG6;V!G;y>d5E8!hx$7qAaLv9GqW! zRAJpWj|od8$+d3n9_5EeeUCun$YIgm!Lv1DL zu=+zTv~j|+Kw|dC^ADNOU3ZDE$Yr21Fa*3oblS)VqZZrx_?1lvkv2mWfXS!Av$x*9 z*Hu(Xui6ZU(n(M`vCd8yljl)yo%P_e1xwhp^(9%(B^@ojCj%ze|EKo{j-n`$O*DZY zL1tm3o_6qpoTFZXCg7ar>I~v?yAMHIH1P<=YB16JDUgflkaXWyAHxZ-%r1W9WxLg& zK^tMHWjmx8<%?>yP20e2GFnNRdAR<%W}@NQuaR#8B;;wo4uJvP9j!;X9gE2_B@P2}%GL77f>4d2eVy&tZC2TR$C;33AnScI$w>{ZaH48EE*n zR)!+mP-$|(S?#3mt^{Bk5ct zKUdn@U+6_L*q5zXT*pbH!!jhrf4MNbUcC(m%!)U?2BX`*A?4Uo zQ5lsHP_JudciDWO6+0DMO3L?9Qwu)b9^luDP&RHHlsEtg(JZ^P$kzDtg@D@3PqmP7u zoaMQn4SK}Ku4>GuLTUwa_IIIy8R&w5vq~I5V$qaI2`UWu9KmInd{}L!)G%@e6 z^yJ2=^WVHT12~89(&rbHPPoy@&l#>G$rt^pXU>Ax190C6@Fqimfi~3RN`)(uqq+1e z*!8QmDQnZuXfhalE`Z4Q3p=LhTgCkMTnOLO2_22zVA~-n^!`AxtzBy(;ql#FVy%V7F z0$t*=ek_eT0NB0QPC`#nh7X3|J{VT!tL>?fY26kdP z=*ZeaKM|7GdE(SA1T~Kz@C` zyE>+B?j@`c(&NyLvK!o~l#aMsQ5mVuwWmEFVtLzfs4JWw+ zvkR7-b#pt33$Rqnga-(;mJwAIaD5gZ=YFdkdlirp8s7F8CKy*0@4>0H?vJ9l;;oM& zn00fC&1xzy!a%d*?II6XNq}R2gVlG1_T)gdnCK3@Ly)gV;6yjD(sE%`LpDj4IZxuT zgWNuora4%CX5a`OU!6SC=@($Ox>KX%yJ4H6 zf=@Z{o*e#CG*X{5lnw@L1V%McxMFxH&mkZXpqkU6=|D&Mq##uf^XQk4w^_WbunH z$CSOQ%5;XG2U@RKLZ+cAi3{?Fpz1ud8kTx`i0!K>*q0TJ zort_%caG@IMn+0#l}`CKGl8?6-`J}Vb-Vn8>wMy zRiqi9URo-!4dC@}7Cr>!htvWl^5{)@&S$kYECZFt0enF^tE|SnPw^pB4)H2fdnrK8 zCF}eXLrk3*E(#G8=u6!%2xeOviuI9{M{*lqv=|-ljFXAkR}m$@z)}v z&fcXS8u*V_2@v-y2Zl|%*;8mXs1HpGr$KFIr_-(&>z2r>x*EA8LGVH-&YERzam4JV zXkFnMxU-mqU=>`@#vdm0X|TOSPBsKW^ybGVjcP0;tL;>)xTEO;`Hjg>35L_yqeK;c zen#xpc~yaKuhUkBqXC%Pic=UBXba1=_D>VCc~WZ>ZOZn8dPBlg0SP}huEWE@>vewk|TXR zXyJL(?&$xv-_f_XmET#iFgxfxEDB#S?SVWCvl1xYa8g{A9Qo;=?I}p==%v!u21Yf? z4m7E)lws@2129BXGdK?KO`k7S_dV2NE;X;@5F|)|=(z%nDZmvsebhP4Sm~r&YWjfF zr~7#&MFr%GK){$`vhIsxdD8E*qp8|Eij!}?kM32k3hj!>iY;jK>qO;e)xm#^!i!ak9F-3ojlneaCzWjgGW-B`f#Wp1UA2Qm6hLcx$Y) z^SZ^bJdTh!<0b_#zShp)PU56Bp|ye4;&!jiz-Gn-^QS!eTBg6Ns6i(4u`Mk`%~@aE zev^)oh4>n*?*VOxq?aW{&B~~3SFITt%0Rx4t4Sc}*9J?Pw8KLvr>UzRkXP$au}R~O z?1>H+DJSmU?`o>tc{D-iJ#^#ydTx(Bl>?Oe(tj(u0QtxuF0z@+TXfO+a)ea!Mh(YT zGkX{^x&5g)A4F+U60t9`=0Gky1Ook_h8vwryYG^eim62%f%vzfTqnExih# zU^&QuwsFH>89gL1(ya@2qSxoX0LyuL*0JZd1*4|(#nct7c-0O;&N3_ne!!2Qq7~Qv zwKxCm`0GJxo>Tg-HcwyqTf?}h9{zk5J^wh1%XqE5%GQsz(>~inCI`x)efCK3&o(B=s5ZcUc0O@RO7qgNZTjL9UEE&Knc zz3+@_YHQbp?N%&cM5Rf|R#23#^qQ>*hzOAysZkLSB2{`xwxWQv2na}xQUpPW2pFUV zsnVnqdPwL!p@cw+cd@^7zw_O5&$)Np`|JL=Kh|JnjR7NTGUt4s_kEw|nQMNnymm&4 zDOV&Z>XHL$I)5=>gO;U;%Xb}J#K`x&U zAjerN&uHd@e7eBR46|YRl8O~UgC3=gN@Vz8cEcmUyJn_`c~)xc-c|+icYT^l!R4{c zCB_~XOHsEG1TZ{6Vd&g`jlAOO zAET1v;cI%K){LX<-qdqk%?K=LC7>MYP7VtFQILJ33zx+yvBmiQvZwGi!z7j=QJhS! z$C^%BE76Qm4Z&PIR34ETuAL(3Ap zB^;w0Z}hC=7e_;c0YNNz43@@3vOa}^8JZ&s!}9e*#n;v&?^K>&f3z*5ap4z7#R#pP zT*qA+FZDr+_q$$4{+D}hJSxTY#7u~lHAEaIV8_xC3*y`TpUX%x>k2qlefY2`8*<``AbJ{L*B zlOcBzyAuuuQB4nWql#-LJw0J`pa|RfoGcp%RFW$KR%A; z4FIP<);JHe=~w{r=iI?Md@43ezEWlMzVdiqv9U$`0Xg)?$iZvOGOa(bBJXaUMXsaX zhKT**n4u5b`?0T-GaS(8fs(E_-H)Yc_cDzC2u@ozzy>UxcGqG>^T~m9yXNFSF%9+@ ztB`p_Y0`#hk25ZVgQaE;<^APFj7Bp9rs~Fkj%GAcNKB4$q`(E|8+R;Get!{vjs3`x zS`_oS80)G!%q781me&IP!N>ex!-uw^rNGI|Ak$opgv z&u!1uq11^PuDuCh448SW|FVUAIp_6P5I&znHi*z7Kc=fk50$8_bQ)6Dn`wWA58(a9 z;a&}T*S-&PB+GMy&W48pmuF#gFNcw6DM%9@GG1;nJX^QbP|R7u%b4tX^-}kq%p663wA~%9Cis%#~jfTU$-VTm$xSvY z29WM}wGXiysPgJ4(le+b%@Bc|@-VEMqQkAcJ=3re_qLorNT{@R$$cJ}HYd0vh2Ayqcd*ajWR@b|m|BD?la1sB7WsoeWO$`osrJeAc4Ub{cUG^@ zib+w`_?Wwwt8hZnN~pUxyfZDx>)9V)I?`v__T`)4Amd`hSaNAez_e*XU9h2Uxz?m+g>~ZCT^eGK;QQ8svoem3oeWLv1mb%R9@k(5udkCWevb3mo<`G%TUTglg$JejN8FF-)Hky z+eeuo$%#Sb5d?%&%bv6maW}A$akI9fSMI~T3suSfDKf{bMt7f!+`r0kTK`x#%FroD zAC@=}$E|U9-oFNs4y~Lj*^^I%Bt4DYQX?P#()=*9=<=o2q`BuCPB{*qu%U8v2{F<^ zDXC#fGJ+bQ#KWk00d9@Nk~PrY_bg!FY+|Lp52RNID=v8L6zJ!<4fwlGf~{=q+fc3| zlFi@q#=WnHz!@iOTn0ANfVPz9)jRiL&T^(0g}4_fF3OBv=@>8!V2cx@o! zIFT(q+cS2Cef$m=CZ7q3)HbaQdAlFdB#c@#flO2`Ni>g4qf7{yqg9;-k*JuCR%z{>~nK2JSB$E{H4TUug}li0Nn#Q9QJKBE7S;YW1lR zkThIL{2Ltp8!sUQ!aVauKZdqIw}7!DG_TVII0)Nk;D5m>#yskNP{5<-iF<>+hdTbO zmG>`>cZ7{KlxE-$0xkJ4knaBCpv|Mq13?0;q$t$(77)XtfUIthlK}|m{?5n`1e^c7 zEHol=J@c*Gz5SG|Xa|5fmhWzGBH|@IpK)^$fAVHZAC8t%SR0njzvl>9!|Cn&gcUD9 zqfq>Q*jK69&iTH`p9NRP^){Qpy#YE4m+B*>NfY{V1DKkV8vzFpI^|~|_Qdl#wUDjV zuMXI4V(&hx5qw6Ro=`j?7bmQe{BZnIeS+5|WR183)92py496_*Fie~x-c&|MkaS{> z7xHLVeS1B#p@e}zo*kl;R@Y|wy0+H7*9$50x1X%Wn~!(qTipvBEM+Z85S_xF)Ttc5 zTne9&jPMAxrYx9MmRD8bs_(^?31)tLjnzD<5g{a~eKpw7+paa>_;jLf*&z zjjbrI157#2P3q$o7r zwYajqGPw&m+^s0}cJ)pfUqG0qT+~0zwEWY9PG2SzUu`HwH4{&}D;f9Ml9y+_UqUW` zpR%}??2h2b!uV5mL8)ftGwX#U^F?W5<6NZ_qrVR++3l$4W)U_L($54z2T%xO6p5W& z=vpsS#ZQ5UEzKEs3;RwAYF!bJeI4R;^ho^_{ptt9JmwV&^Qp0N%V5e?sJBw-qeR!d zyPJwvXA`@E3G=eZcy$EQ~h&6$4lfntYicgd(VcSs|A>|9TiMr#@m9`Krs1$KwiQ_gU-V(Db` zsM*!*V?Ay)3dlr?Yds+Hm2%_w5oX0!Ky}b$v1CAWB=7@MZIL%)|Pf zE%e$`%KcD5dYzvqLabZT0_^^IThDO|h)0}H{({uthVgf%S1s+tE_~37p}!jsU&jGj znf}x+COV#?+HY>3-HunL;Poap_oXyr-mYDc7ncHvm{0d{vFGga3oqk| zkU$of8%r);%+Edt{evo4PJ%<^3?1?D_`kutFq2gmP(T9HytVyV+p_VE#1@^t_N9Sv;C-WY583EHE zxSuo0GJ+)XCFSb;$@FB{&?>-Yh4!GDGvOl6JD;Ux;$Y{bbNVVr>&7<6KU9PB@Sj!J zuKwaU(L;LOzoQw)zC>A;QN4)n4glTEm;j!mDioPFs!?MbG@o!9nr^9*B^V+56nbgF zs0#U;QM@U7SHvsq&uxs)i!|vLsFc|DgSX}F%RX-Z|~>odzXRi zaOxb-dePscDRP%ngr$43#U+cfFe(}P_Ku_2i+!7Q=%sj`czJbFC6KRHc6|$56Pa=9 zlv~=Xv$gAdx&RtYWgiilacbFfwS?35s;hr#X!)X(2Y1}gwAf!T zBs6Iu)I4UNtZzv*Oouz< zVJdME%rn#G0pz&r?w%$3eZR@=VZ*o|Yb5njp2IG!+oJ|2P zX-{kpfGJZ`m*_PMOJi4(nu590bVaVA^6juJrPsb(jN)fMkGWCo`t$-Gc=>wu(tO38 zSRVV?NJUY&fce-%2|z(3uXhk%4_pcXS;1f401b2}V6~h|4Gqhai!1`L`{>f34U3|hr7CSk|g!EsIC%SWm#pkkiRP5@d)i6MGmUWYLB ztu*|r)|P$DCL*o`&Ih0%&zjAdCoLc$Hgz2#RUgi&H&75zqXWOzER|d$ngSG4VcrXW zcVP}XF;0Oq&8{T*qs!-FUh8z8xaLB~NM$;GoU(~f_I3^Argn-h2FSVq$hBfJ#4XnK$iM8caBjpX^21;;nrO?+V#%Fme`rug1 zi|n0g@Yu|qzS^r!jvrkEIxof^;|THjBJ<4Rvf9I{rGfOHRQy_G7?Rrd{$7k=a+4BH zFi3)9!Gr5KNVgqwo9ZUrgg!aV2ZJSUl)GcA_OEzbIWHDTJ=B=0aQm+QJxBkh?6e-6y(a<3$l@?o`cIzSp)ke><4#Q+Wgz#7 z{fttLz3QAhcA+3`Ha$jv|HYcXe!2MBwhw_=HF`4HSYOu6==7A{S5EsZC-VtRmtz6n zqH;I$4rPPZ8bgaBD2~omEw@jg;Ej0G&itcRb}PnpT0N~>w=6#1Fv%zfiarJIr}6d!+RLw6TSuCHTDIUxvZTBx8RRl zdR1h1h-@sT5I3*d9d?xTNbHk_YCQ<46T&J)3d51zaIpu&N-80mn(e3x-*)pnInc(1 zeQB{Qm1?vN6C>NuQ6WW{*SwwJVL`;$1}S6n_eWS*m9E^#kGj#D8^M|VaTe7jNvNrq zfuW1#jyiIWQ-5)MkzCVK<`KQ)AEP?H3d=F_Jb#{~(=-pY;|P-mYW~yj#I$+LNZ4Ur8|0OK_V+?h zQ^vRY2dg3ItrhF!{WT%|yC%Zm2(q}^pm#P2ejiAr<+VhoA!qHDVX9xH{bt-RT~~s* zJ&^Ej@cRAr2L(Y@Zj)Ob)3M}woze^vSBo)p8rN*B+MI4gUV)~1$7Wt^c8QF`k2?LJ ztqdNgR%J++yq&A`s<=c_sc;=z^F=}djvY9&w`0pqZNgYtO>a59E{S2p=$j0igc3v@ zt;;F2RP7zsP+f9X5#YfS^t*R+?nh@Wpm=$bf?=MO{GP2sUvQmfX_?Sq8Sf%tulKyV zpC)`!HdCzp#u7pL+{vsG@MM{5?EVcSknV&5jCF<iVwaDC4H=zE!GQ|>o$M`h)z znWxMqi^!{QF*Td!_dGmdoKo%sbszTiun~rJ>(#P00be6Ol2fE5y1!@$WlH5+<}G0> zB_{LvlgG-Jx6Q2TKkZe|<=MJ&OO+^?f4kTl68D%WlhEt`+O(5}n`J zgDMc-oX9)F=Y)Bl3R@(7m2O(Dk7M^Br^4&0@~?g?wjKX^kFpM$r14Q6Yntch&* zOdNA|H&K^i>U^=iL6o+yYL11BfSY!-SW>zCw2K|%S+LfPc-}ybF=Iue1gD|A!}f!7 z?p$~VG8|{Vhzv=wO4ko?c7AAdRb65~T_Pdh-`UyOG10L7QieS*`by6g6(DN=L$viT zqsO%jkX?nlDL1AN4G8oFvc zEqeNKXvRvMmRmryzM!$sojKb{-4_6MfPEuSi2}~jqM78YR|8Cp>HDYw|`)1f7E zqbCK9U37kzv6Bj59R7m_TZRtc1oA%`UmSei3!r7w0r#b&uvkb%iR1W(74AoZB6_MY zc-sc(qiAs#VhtXZ%~eT%MUt+QTj99#E&k4yC? zsD8|a1B7!{3>YY`WcpSUoD#ocJXb1PdW{+kvSb1WMx3k*XsH*4o?h&~-jIfT3`mbp zpq?!`7;1qKnr#=}Bwn+8v-3M_$Y})YZqh&L$#!X-e+zkFMWs6sXH|f=|8vVoL%%HG zo!i|hpm}3GIsSF=LxiqK0_Lv4g-XEJ5!Q@3tye{;EYY>Fwc9h&%1_bS`NOw;XT^@i z7yEfT-_-JrdE)4(eXw@-OmxXPk67nHr|O#W9b15gDed@MY59lJ;`@ET0Sy*95mn!K z0iBPqwaHQKxPYOb^rl;5M7LP4iCfwrN0xMdXPL+sn$IZP1+d}`nptzKCJwMU!+~L_ z3SB%X-n<_Xmz$}qj-|LBps#M=3;|iD6RERKWf8f&bbP(-@}y;Cm6~$C9!F>pS@y_G z3>0w)X5U-+x%UAC3HZ zftDzg zFP}1F)XXQs_+_UWK ztD8kw)@M(fJrBj7!>~6)%>}N?onWew-mV+lVAKl)s$I~`ec?udrlUyl*o}UjPb`6( z_xda?qzW52ybjBrg>7=O{wZbtdy4;C4e;QeZx&K1*$ATF_C>9+bY#aOFk*7N28xa9 zJvH)hZ_IUvI)M8~c-CssI2;!of^G3LIO&wy-%6T`ECwo>`gNf2MXUuYk9`9C+X_$d zQXi^0dyoCdwB=J|(JzkbV6;hg+GaHibvU*lI;Yrdlr46LDXGvf^qr6*_5~ow=Q`Z^ z_uQ)r6RmS*3&>I?kxpd4LxrovUV{6r#V_L0mk)Rq)6qnpsN{3e-s)6cEZhtzrzi%mSCgnYf0olZUG;Rz5Dy`DGz$&@S@uBl{ z&l&O3xd+cd!G32O$dy^L6&b^^n{gegg+<9@D;j3Y!x1Wb_CfmF%B>TB4wqN>$PMd0 zmtOP=#3F>X`!=hX!nvAlq!85Wj)M;7se?ZXT%4l(7EXV2tAu_B7(F67f`D54beb#x z?wp9HX$uuDwJuBJbr*2=j!3o8%8RVovs{v`Dt|thg83D_+7xiM@2wRR$yPiK}zrwi~eMSVegZfFO}%3 zn|I$OO~zk?ni*=Z%*xZn1y-eq<=94j>cT4-CPt9nKWQVFZ)f;nX@NT-VaVYI--!Qj z3SJg~9~QHT>~dD72fSmaStq6HU}6u?84VqqVAoTU!lz7ASWnLgTVb6yY8`2?q!4^! z2=FHGbWF+r>V^3HO3o3QZH!yuW~H@D`UPj>suds$Shqd-8P!H<>`R>sS25SzRi;xa ztHd`z>o|t)&I%lE1&^%-JI>%iJs*}&?S0)kIich}`i3SB7!nN|WkL_Z?C&43#E~4KE6nI7y7#74A917n`csZXL^7H* zVsz!Z;<|hsBf$%WSa^}n`CeJ3VS#e(%%ljQ?a8U3s1a^hp-!+%gTBRcJ`@jR8hLJN z`A64b7X`#b2hUBB!iL%=y_cop!tOlEdy`v6-HOeXvzEOJ)a3s`I(DKbU1twOcEuvu zK)o#teS7eLF?-{-sba}(60y7sN=FC>GW%J{{>3Z91^ zsYipN4zxUjdsJ37om*6I{7?9vzx}VC)dS_h=bAuzqJg1> zQ)?l-weW{T3eYQ@@r$c%-&_fJ94H707VMD;R^+JtYdQ$aJoA)&Y~T}n9Da&__pVWv zDv1`S#vUB}bBu6D0olp9AQihiW*JbC;z8G9shl#y_ zRlaet{H!=|Pn)n@qqwm36a4;degtpQFn{){FDqXFC09HIM$fA|h#!KDJ{0%p$=yZ~ z-i`qqC`ju702Y)ks<6+OAwpjMSpKB52{v_rlTpX*=nflCimUk{HE%#bm~LReN-b2s zDlA)-a8o}eRDHMNn+$I=3I9r6V;f|}caoxDWA?u|x~MkNAE};A*4xhqM%SypF2g=0 z0IkT~Qk(khxIjy^lF+6lW#@8dV$J~<@gvZ>0#t9%C@q!hzZ7r$);-}5@S_o?HfF_A zKJ%}#+!Tt%3`^{FMX#Ya50LfJsv?~L!Wvn4 zVcO^;6><7eZ{$KV^!(twY+g6~NjbwR^cug6x9FhbtWGy;U={TnBDrKRX-H6M7)Yed zPyL7a^UqG*zdtv0cfYvS<<%sTWUTo6O+A^PZGUlyBtqQ|h4G4png5%E!9#ist&hsB zG5iT<18S;K_kLQqHZGTA!R#G>bU(ZM((!_t(8@JD1&X3y@P9v}{v;GmjUJmZ>f0>0 zp+8O%om^bzX%}gXWCx)$cSmEvgKLMHXgX*6WPK;E{UksKRv+GzEh)+2Z33M4ii)Z@ zI7eVJq3&cSt!pVKE+-}%XAT!ZNb5|RgQw?|7K9RCDrMTG_@ioIN@*%Fm0sPdV~f97 zk7|NPR0{xnhC{CP!j$0*_q@mHcP^Z;y(e(uTzp>kr{>udi4=)MLy6(Jv#_nT+liT( z^XpS3b>ol%*MXO6Qoj9$(h?PhvWdV(ZjtgI;nRQhnXi#)N?+3yii4wZS$D+%+qE&*EOY9_TTx#YUe(Ij7~OLmmQBqa2TwUpg4BUy z3zQd9zbY=_WO z)8c@9^}r6G$g@R9SLX83EdIr`pK@2NsYe!m-V*XHv``C^2H3GXYmE6J`14K-BZ--26^Y1pm4BF1YT@0!H{{)HH+?y{oX- z?2w#X+qXr}j5o45$%Zm}lyY#Ds7Q?uZ>&?mmHLoq@LRS$f~POX2atx^Z>EKTmoucHK#o`hvTwrxAV1Ggo~Q_C4Q+Rsw7kS|h(W#M#P` zN+9?1hI|Q;clD*~3q4lP682f%>4x0`O+61hKOZ?IdI%v>4FkIpwIxy0CV*`zjCZ1f(eo&Mo2WbhOrx>nPq z0qwi-gEoTWfTey9A`#bJw>qfX8t2Tqd1h{gDZBw{^Fy4g>&l0gk$ho>WXucXc}kFT&4BY`7~A%S)(Ca^_BPYo zZqhA1M5yAw+Br$DgWP^qTT7Ib9O#zMS$d8A9uAr^A|DkQW|}`gqf_`%#@d$XyDyo^7z02_boe zrB}*3t$xH;LIT#&&CCj1+TJV1B>?cUC6Obly`7{rzKUNQAVso$fEmx>Xzs1gGrpf7 zHG&?&$s&Xm@an+^S3wV8h_rYX$$%+u=zXyH;SI77&f^z{OH9Ji-FD=y$?)iXv;KbR z6Zc5ZFOwqpj)`~|TIz{#a7+UyyWD1KzN)>^Rqnf3u=){FE`X>On{+%@Oe{yfh6VSNt87<2!(QobF*ZIr%R2crw zHdBhlXZj{*FK4wqQ(U=I*>64w6NLwQAjc7U>0_GR*K~hz=xlkw+nbPYOQmgCF`nWQ zOJj2tQ!(D0XmE52+j5(SZ{-0!9Bg!J(31e~F>h+7v|7Wh%?$VKkv2%Kjxo$?@eB_{ z$38!QT9ow70ku(5`6`H_*fK0z$%GWD!gpNffs(UtI^%To&J}8eY^Z6>p7MUSvdN)_ z&gsn5Zb&cv11f@jq0+v8QDYD>AnSM;yw3xCucP{vzc~Ip2sE4$z!zrtL@(O8z)CLe zmM2pVizQdO820(>+iYdYE!=DZMGVI{%rxv5 z+|#hke)o>Gf>_*RihN{Arw*c=Hll1CLWxHaaTPARR`Z^$Ly%--qN)90=&dft{M%lr zOL%ziR&gLSxqT|xux&x$7spp36{4`t=B776IVJ+3&7UI{9}P&_u@QGsjaaHG>qPYi zn*(rDZze2@@)5viq{nSe{NnfxHS5*cD5AXG3{*Qf;q%D*W1(QG|GPPNrY!l&TkZt0 z3`O2OS%fRG9M;SO^Gu!w=*DuZ&*n#KA=#9xbi$GzpCVQ9Ec^IXhZ6jzQUOVfCp7RC zfo?>Ji8mRN3ZEo@4(JZzeiU}24Dz-Vtq+VNl%8~V4_m93yHtdVP)=Nm zTnyh)-u2^aGjHx%DmHubU=jO^BVPr7=u7GgJDsc*ee<1U{C2Vc9fPUA4E(-j;Kprd zcSS48da)qmeSYGUE}c&rDDJ?Hm9QHy{JtuhwUWyH3&JI()2WcZLfOgtA;6JrwN^hr z7F*oKe6m69NgGkrsL10K7A)8#A7Xe3zxfzP$0Wgk&I>S5VM^GvX*j>==%LR3`P2eN z5#rL!bWg18rN?s=%qzzP6CwDWENf`hI2`K>D~7gm+t4XgWE^%&%O?BxY54c(^qpAv z9{4qcQmADEnTJsY*e3vSE7@%av${94rmq~Rb%wl@`L%HuZ{b^!QPa`36O)#Sb?S^-rqJja_PhycMkpBBJrrM98aj>048x)PV4v z#nknZ9*mxH}tec0`oZ=*D~n1`p$hqA>RGSf}A5rgRB7=SZt%A8+@e8INx zT!71Mknre|M=M`FL6h&9v3?fFZanWj>NNNqnDGo?iBS1iVy5;ntxqf~n*j0*unK}U z8t#a0xBO!jpftu%tA5m{R&fpll4rAR)X20JQn=QM$*hIhz60#8+1i1Le|`ljxwWQ3 z5^^5zZLjy#e#)gTO7Ct)w-&^vg|o%PP7JlP3m0>zb?#v{yp_QK;d=mbT1ym&61sF2 z`8giZyDiIUn>7|ucEWvS@WvzUI!(eCCeSJm4+zx@T%3}kC*-;=s|Qw;Xc#q4eV=_? zwljuI-p|(ytitjsE_d|4aRqFUfC=w0uM>WFx`*d(z{g{QK%;=j9`6Wsp%k!>+EWY~ z;p4djo5o7os`F1NP+DE2Z5vVdF@y$+=L~WGCXfTA+E@pe36{oB|?IkmT3@ V3f2Dq=l^%6PX8~B8|v5Se*^Dz0%8CF literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/shanmukha_splash.jpg b/Android/app/src/main/res/drawable-mdpi/shanmukha_splash.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a241135f5905241f32e28ab1c60e28a58158e8b0 GIT binary patch literal 5019 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 Dt--(4 literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/splash.png b/Android/app/src/main/res/drawable-mdpi/splash.png new file mode 100644 index 0000000000000000000000000000000000000000..eaf3be8730e963362b5dd4b798e4fe31bdc964a4 GIT binary patch literal 6582 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 OA<|aYSF2Qc7W_X+$6E>j literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/splash3.png b/Android/app/src/main/res/drawable-mdpi/splash3.png new file mode 100644 index 0000000000000000000000000000000000000000..80ea725f6806b26ab50f8ab0a5050988d1854e2b GIT binary patch literal 6533 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 literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/splash4.png b/Android/app/src/main/res/drawable-mdpi/splash4.png new file mode 100644 index 0000000000000000000000000000000000000000..3df58d2d5a4acb2897db29b656c1af0cbf0cfcc4 GIT binary patch literal 6607 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 DzA4B+ literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-mdpi/splash_2.png b/Android/app/src/main/res/drawable-mdpi/splash_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2dce5e7a1a4ca580cc9006f23705f6380818bd5c GIT binary patch literal 4519 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 XzQVJ{f9~F(D?~aP`s(GX&qMzYs8xdt literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-v21/ic_menu_camera.xml b/Android/app/src/main/res/drawable-v21/ic_menu_camera.xml new file mode 100644 index 0000000..0d9ea10 --- /dev/null +++ b/Android/app/src/main/res/drawable-v21/ic_menu_camera.xml @@ -0,0 +1,12 @@ + + + + diff --git a/Android/app/src/main/res/drawable-v21/ic_menu_gallery.xml b/Android/app/src/main/res/drawable-v21/ic_menu_gallery.xml new file mode 100644 index 0000000..f6872c4 --- /dev/null +++ b/Android/app/src/main/res/drawable-v21/ic_menu_gallery.xml @@ -0,0 +1,9 @@ + + + diff --git a/Android/app/src/main/res/drawable-v21/ic_menu_manage.xml b/Android/app/src/main/res/drawable-v21/ic_menu_manage.xml new file mode 100644 index 0000000..c1be60b --- /dev/null +++ b/Android/app/src/main/res/drawable-v21/ic_menu_manage.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/Android/app/src/main/res/drawable-v21/ic_menu_send.xml b/Android/app/src/main/res/drawable-v21/ic_menu_send.xml new file mode 100644 index 0000000..00c668c --- /dev/null +++ b/Android/app/src/main/res/drawable-v21/ic_menu_send.xml @@ -0,0 +1,9 @@ + + + diff --git a/Android/app/src/main/res/drawable-v21/ic_menu_share.xml b/Android/app/src/main/res/drawable-v21/ic_menu_share.xml new file mode 100644 index 0000000..a28fb9e --- /dev/null +++ b/Android/app/src/main/res/drawable-v21/ic_menu_share.xml @@ -0,0 +1,9 @@ + + + diff --git a/Android/app/src/main/res/drawable-v21/ic_menu_slideshow.xml b/Android/app/src/main/res/drawable-v21/ic_menu_slideshow.xml new file mode 100644 index 0000000..209aa64 --- /dev/null +++ b/Android/app/src/main/res/drawable-v21/ic_menu_slideshow.xml @@ -0,0 +1,9 @@ + + + diff --git a/Android/app/src/main/res/drawable-v24/background_splash.xml b/Android/app/src/main/res/drawable-v24/background_splash.xml new file mode 100644 index 0000000..83f68b7 --- /dev/null +++ b/Android/app/src/main/res/drawable-v24/background_splash.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/Android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/Android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/Android/app/src/main/res/drawable-xhdpi/ic_add_black_24dp.png b/Android/app/src/main/res/drawable-xhdpi/ic_add_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e49c67c9d82486a62fa5890327c240e9ab54fe84 GIT binary patch literal 107 zcmeAS@N?&q;$mQ6;Pv!y2?EjvAk4u6B>!?7@&GAgPZ!6K3dXk=7YZ^M2rwP|a{r6_ zl7=&T4s38|)V3(~oVA?;sET3p9eallDL{sX_a#=-n)8M`SezVyTn0~9KbLh*2~7Z= CL>@c< literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xhdpi/ic_add_circle_black_24dp.png b/Android/app/src/main/res/drawable-xhdpi/ic_add_circle_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..f26e05fd4e759eb8b4f7e065b47c4f056e10a01f GIT binary patch literal 407 zcmV;I0cie-P)%Xazr9_;1_kYRap=s2@CM3py7o- zNXq&2$fUprl5rj`DHZvRXlz4~6bj1cvm{&+y(0$mlCM?__e_i`-^PJ6Wg;z**!?51 zn-ifyXeAKv#8p$oN%8M5^E; zhWnyKjGl3zO9Bru*c*vlHi+idIRTQe3o}Y+ z`^kiT%s*#L4Py>11}xcfA|T+zmL+|f!?7@&Kt#o-U3d6^w7EZR9$lAiygBV`AXv z(vzMi+_~g-7R@dWn7tv{zByV)`*>lTPr$`xabSkNT0S6~*{OF}mYLL>R9W)%a_L3qDay?syRqrlZ0Y zpDNt(iNYU$7|R{_MB$IWU2yY=zFtn$H*E>N*Eeku-d5&CcwN(0;qy&fjdxMxJLkM< z-SFp4>x!>Xu?ep0000!?7@&KtgPZ!6Kh{JC$9OP^;U~s8i>_kNl*bIIEt0x@0j(si&)-%Q~loCIHRmHYNZ7 literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xhdpi/ic_help_black_24dp.png b/Android/app/src/main/res/drawable-xhdpi/ic_help_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1101da7c09fba16ebe4c16dd66138979dbbc71c6 GIT binary patch literal 578 zcmV-I0=@l-P)2m5^eVHR`nJ5D?IzMV(b< zNHMTUHuz4csUzMnfwMd85D*&5r^*-(=J`ozSsh9wlHomJ!m5(SQjX7r4z))P3mMJ$ zuaqf}CCfvWIM76-F?uI#{LLc$Jj(nL56WO(9RCc-b1~v&{KY&Kwk)EvBy^uJiq?*J z_Fa$I<&q0NF@@rZ|HU>Mlj5@~_s0L~t)2BEUW-rfE}{)Wp$aIweXAc)ro=rJ1S!oo zCyR2~w|b6pL)>$SN5m|leHj8mrioZf6z~D%vF7&`BI*gopHe`nXgX>{v=WSef^wg8 zO;3}Ej^+3>iYR#wv|Vi?0;};CJVm+9eoUY58nA$Ji!ZT#zS|M))73C^w%z{ZS12!x zolUoE`at|_SYFdri+~Ku4`b&t5i=G6UH^=oMIurh5e})o;URcCw19O)69hvU|Cezz zszV9bL~G3O+)!eBj>!|FG;qKi2GxNAwlGSw=N!;r1PeJa!dwk*Vkzx#pSBnwkrF4? z!;hK6!6@7K7SC#vJkIV>;V|Z#v(7jJOEJv~HJY^X@oCef#xg}bu7GR*0Wc#{v(x4P QiU0rr07*qoM6N<$g7PZ`!?7@&KuHPZ!6K3dXmSZTTD$L|D{S`VN*S z@I72!z@skccSzesF);7rq`7a?R~?l|E}1eTr2a@(Q2kM*g;$Qh*!rv0Yvugl*XpnT ze@(Ws%~}6%NuYiC(y~X*!hSppeBNwX;B8YCyGWV$m_#wN$g1)r#Wk{gKr0zMUHx3v IIVCg!0N6n};s5{u literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_right_black_24dp.png b/Android/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_right_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c0ba00fdac07811ed0430d46dd52a1be40e09187 GIT binary patch literal 162 zcmeAS@N?&q;$mQ6;Pv!y2?EjvAk4u6B>!?7@&KtUPZ!6K3dXl*4F#J6L|8BCPUi5? zsWs=x+TeJyf%gETT;2B<^O*FQAFgY#m6=|AZf|Agcje~39|nRgeJ?niJpV*|J(BcD z>Bx7Uq<`E=-izD=X8-o8JaMo3z4Ti-uF&oNO5cqZ72KXvoX7rFw)}nPx1RGrTNylE L{an^LB{Ts5SF}Ar literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png b/Android/app/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..e563dfb75dcd6b1e4c612ddf15b331edbe7df1aa GIT binary patch literal 556 zcmV+{0@MA8P)JbkM=cMIC}6{UgLe zRVcWLC{`B@xgx=8J6NTC?2rTR@;vt*_FV$`e5bs5j`s-U-lJ`Fyg_2E;877#Dv-iH z(m3o|?QC!){i@qE4XR8M%5j%XL}`;d3=*28%6F!5$nv>)`FrNbafJqA$2TrB#C1M2 zKYt=iq8pLReOf3!toy2dz)sl?-@LVxV;7ZZ=530ho2 z605VoC_TH4ag)F?eF4QX;;9#?j(a+Awi(0l81c{}OnH7Hdu*Lyu$3aizYsfPYK}w) zSZxlzPG=l8p5L$B-Tqh+QeUD`vf#YcaApz0000Xn=_}}cn{Bq60=l31C8T7f07P^)kD+FovboFyt=akR{ E03|#f9smFU literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xxhdpi/ic_add_circle_black_24dp.png b/Android/app/src/main/res/drawable-xxhdpi/ic_add_circle_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..f26f33fe90d5ff529f66673801252762370ac354 GIT binary patch literal 576 zcmV-G0>AxQ$m?1sdwAf$)MK$*5;2{B< za>p*Oux^!09+8NfaX|xX*0@I!tiuY%E%6gcu~QZ?=sgce%1vlu#52AkhIUAalwRT@ z26x2^QgHZ#7+xPI@voCSCnTwo?CiLRrCn1Zwl9dqeTx60i{-r|h9w@X2TiCE*$+fv z--u`piM9VptTl+_UM=XB2v!lbAfZmEOVyxrLezLv4VvK)Xb({h5_SmGQ4hKyKp9Ux z=r8m5+CGO?aB#vz8L^`I?c`fN4lBe9jZvX=9UITEPQx03Ul zG6^~KE#y>5p~AJ{hgBw}5{JfeJ}`$7O#|PhFz9DJ_Drwc)B=-R4~51Va<2QK*054_{^iK ziHj9Ie(LmvxIJj9FFkH_boaZ%6X$rGIbr#HPVqZ=>#Pu=mkT^&Wzxg1tzog4y{W9U za1M`0>*V)K>^eRxF#0L-I?bIDe{K8MDV&D=_k@8uF>H&F7DwYO&m| zv)H1u_|+tf_Q?Y6lkMsXf*;MP5PIG+*+PBVl?k68R{-sNxH6L#t*R{1=Zo;y*)pGgYM|VIzSyvT)L^h(MCfVaJFdP^>UHx3vIVCg!0HgkX A>;M1& literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png b/Android/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0dd120193478486f53ef6a29a5d47f806fd6de GIT binary patch literal 346 zcmV-g0j2(lP)qg1 z$;r7S>2rdlJRC16AE!7_VYjTXhq|!W{`9Ln(~bk&oSJqVVCT?JDD0dpr0YL={Bb~( zqe{BJ-%%mOZNJ1x@w-7$QrhM;d>l~ch>>VpcL5S!w4de)X{3Q#=8@h;9(9C~g% sbJ(6~EWB|}s!JN2Tb5;6mSu7F26%sAsWUrJ0000007*qoM6N<$f;^#`#Q*>R literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png b/Android/app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..57c9b63e89cc4141d74a84be3d25878c20b19a18 GIT binary patch literal 192 zcmeAS@N?&q;$mQ6;Pv!y2?Ej{Ak4u6B>z9DJ_DpWJzX3_GVZ;-be7k_fx+dW?L}sB zu2Q|ufJUt&xg`oI?LR8lH|bC2Z0zWeS$S#A-n3BvM|Zrfj_mAO!p+3OAyB*E_+EAa z1&0O(Mi3W?@t$d|*!f4yU&R8xG)8f+_|{nDdvcCr9xL&5&V3%FiIZqF9?;&d=r1IFY=v^2u z^9#cC6GIqXj(vLsZez&WEJp8t7wywu7(K|*IjokEcYkAaBS#OhsM1E>tzjHPj&?arqEje9 zQyA|fXD3NCgS^`y!nlc?T_Vvu^6Uu%7_agiIlE4xRpiyL3}PH&3E^&qM4QN?-xwn9 z3QARjL`{^tr@TVk$0%i6B=K1KKRHI+EJ|G~{6Kq*5%(eTAIRsGeMQ`Pl&P)IA9b4{ zj8XnUnQDYy`6lR#)8Ln_`ZgHH# z)i}pPT8^vxB2)BJqQjiz64zOw!4@rAY|&taYh2_Fdgz9DJ_DrYdAc};R4~51wwL#i0fWm!=>x_M z?oad;TP|iqupCk==#^elGR>m%dtRe|pQ`&6TO}o>MXy{7d3s+UZCyts77wFzn- zbMF~@B+F$sTzPt5>XNf+=a(yPj5DVk$z0+Z%^G@E5onLnujzL6ncRPVyz9DJ_DrYd%8G=R4~3hXD!6&DA9Ux_RBNV z_VgZ43a$Jqw8rg(&y`8`3s03CTe@#^lQK~GpZ=**l98)}UkBe>5gb^knY%bSNa~f8 z-s;*H3*XLp z`K83K{hmO_XfLro${NjVOhH9$(7EalAI;y%YoK4u&-s}xgsJW6#(Qg Nc)I$ztaD0e0st8aS114g literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png b/Android/app/src/main/res/drawable-xxhdpi/ic_settings_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c3393240c5972482e509c5acff55386bc888a646 GIT binary patch literal 826 zcmV-A1I7G_P)3 zf+j?_$3jh_3u%fZAxMpB7c29UmWp354h+NIYkhm8i-G3%e;!!OthM%g0r- zVVrdas3+Sw9_J^-Qi=}Fk?l6#;x|SpAh34ixUXsFJZUYY5M@8|0BIL^jBk+RS_$Yn zenm3cMj%_e1|w{p0ijzjX3NHEDG5`9QHexFnSXS*by@fk|4n#vm7A-dliElI7IZZO&4Wk zij!mq(Z>NXd=&-S`aY!;FL5RjbvsWa?t67lR=Lg{orpq&26^pkoPt@)Fj)HQtXyX@m=RQN9Y zMXCv?#kkKV(daSm_06b7>9aneQ0p2M;tVcS|$G?r`#SlqQ^@< z`;LTY+y2kR?pl69GTNYz8e)8a1Z<4U)Y8viS&xkK;osGNPAgZF*32@ZY>9hGyM{Kt z2>+fR3K(XEerm}US?R5K9gJ^9wxK%B?F- zm_ZDEiF2cfp?7fZMa0l^ICl%n9C~)Z5|!lT<>jdV07?PLWBhJeKL7v#07*qoM6N<$ Eg8UMHd;kCd literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xxxhdpi/ic_add_black_24dp.png b/Android/app/src/main/res/drawable-xxxhdpi/ic_add_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1b1dded588710fdb14b4086141be4321bced8205 GIT binary patch literal 118 zcmeAS@N?&q;$mQ6;Pv!y2?EjyAk4@NByWU0tp-wT0X`wFKpF^^rtdrtq!>$r{DK)A zp4~_Ta^yW-978G?lN*`>5BzUTIj7P7-(I3-fns}2dtZ?oBSS_(`pg9u0+k^Bp00i_ I>zopr0DXBN-T(jq literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xxxhdpi/ic_add_circle_black_24dp.png b/Android/app/src/main/res/drawable-xxxhdpi/ic_add_circle_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9394cc18e04f7ad0256fb203c0757edfda4dd6 GIT binary patch literal 765 zcmVIv>P#2q|)nXqXZE|Tm%%n0TGF<^7cB!8V|G}g1GJ?o_3{zTOlnH z4OUU2Z8b(*D8IVyX8w~o{f2iw&lP-O4*!865{X125f}B6XNfJ2sZi&Y_m5twQ{jkB zmdMkCN@*rpr-~SKPKgOpC=nyi9xsT^n(Q)4j6ii#q=q=?k_9>lM2a8z2XUbXmPz8X zX|53$yP|+^1~^1Ks7yaTn5BVu)Fab)D#0&^$E_2`BfXp=KJ+^oJTOEJ@u@0b;j(YI zMSSdrVO%uCE#h-G4C0b6sUZPWC4&nRoFV~rLLA3_MgnXDhh~w0o56tr8c4uBk)>sa zh=R(rXc|#cffl439+>~n*rQgdE29R1Vm|P?{H&1D;7@WD-$1Kp4l!y4nG&7^$iq@COEZ5w!z^ZY@%RSd2?`1FE!P!-Bd2bJ)_sgQ@{_QrNVtYCsX&l3b}7P$NML3W$=XXi*ta z(66+tpGPF%{-qBfy#GrSaA*Swu%B=&&IuAwztN5hGE|WOI;RVl4040`+%;KTH0<+) zzxW!L4RYb*#goMYJ)HP->vrLhIGc#atP$J1VtNe)=RAGfN5~!46ghfgm vaK;@?-acw_#~J&qQ6xtPcZJ#&-u zcCWo1Q|wW~6jd?nml@;QIli^i7fk=h_dn_FCU`i+?+Y}@s8!qc6d0rop00i_>zopr E00D}xPXGV_ literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png b/Android/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff9b471ae152550ff550d362af96ed7fdb1a3c0 GIT binary patch literal 435 zcmV;k0ZjghP)L}ratNJ61LVpHY2f9D4~9D&gC$wYye%NJ%K*U|r9=oJgb+dqA%u`3aKnUN z<(CJH_|ez@1@M$lz9*ca!f&NqFJtv=FsxO~lt}mO=L|-nUnSM6m9zs8*lyI*}Xs%zE;6nd;f*bv7 z39j_B2}20|RjM$-rG9yWTm7;G*ZQ9m-0SBPLg;6%^DBscCLxM`ae`m{q6FXi9~1oR zXA@%RhYtvT3k83OgTF?D|B)Sj^DH_uRV)2oXQpbVuQO9M)pwsz_Py^mq5QbwGU425 ztA3{1RKI?v+FajN!u6xNi-fvKL-U0CLCLw9syqF2GgX)R%@Sm%Y~~5_LqgL8of)TL z0!E#))xm`sS~=r z_<$xcEYNLOV%0ARV&Vr26b~qu{-49YV>#2Zngf=i7oIcsZCr9T{!zfEZbM#!DN;x6 z)@gp$->AJ*EHUQiglQ71&erd34Zf4~@9*Ot&0kvE^*twT**P!iDZ@&O*+~{4%RF8E KT-G@yGywphZB&5( literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xxxhdpi/ic_help_black_24dp.png b/Android/app/src/main/res/drawable-xxxhdpi/ic_help_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..09888ee2f020e8716248008f21211e4be95c8379 GIT binary patch literal 1121 zcmV-n1fKheP)X+D)OKCP)Z`ki~$Z5}~^^B%?L7i~a#!l{T41 zV`xhv4OwSlY;02+DlMgpiXR8Xf{j~*SjLVHO(q8uY>M6(+>^&(H{GEUzhnw`VIPJ`p216339)HY~D^&X?OM=w3(;;5stIJ9Mo}dZ?fTJF&N8B18LCxen^sUggJ`!z z94#ji&ss&b3o+<8T6z)B8b!4iF(`wU9O7A@p?V!LXdDf-h-ah+#bxG=zB2_at!YLW~=vpfSXHKTwWS zD{F{xBNQ};SnfwEaC(Df#5`sxXa%v_FqJsHMjk1uJO!;I78~VRoL*%SDY7+x2Uy}o zoSK<{40C-go}jV}K&nD_G$kFpch^UNTwn)P#yzKbftJ;Y@r6m%D{(mYXAXAsxj zp`bp*N?)UjFp0SCihsvkJE}Jk3#I)#r<+iHf>@}9f@%;eJ?F{WszyT=vCvLbQ;6%v z(b9uh$SIGw?h;x~crw5S;<{sKNsvbZ*dj4B-9!S|b+jEt0@yofi!g-*tQNE?8N6nMM2Xzb}9(0?1_$Fof*q-7PK8y1Kj}QyZktRk- zlylDIa?Np;1SJ)rg?^S0!xp*D+w349;v6T#1ftOxmpDd@KuU6iPI?$*gjw>eZI)-2 n5$G%ZwPO(+x!g+l)UL9I~&n|WM)z4*}Q$iB}@Pkh$ literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_right_black_24dp.png b/Android/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_right_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..1aa2900fb768c5f23135b22bd440caef185f3fd3 GIT binary patch literal 217 zcmeAS@N?&q;$mQ6;Pv!y2?EjyAk4u6Bt0hX-wdP{db&7QZH$YRSBK&biOSou2=kdZD6D^-qEw$i_Vk3rz1#_vBt)1mbzR`njxg HN@xNA$J$`E literal 0 HcmV?d00001 diff --git a/Android/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png b/Android/app/src/main/res/drawable-xxxhdpi/ic_settings_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..3211218b9c6f5a4403a927dcd59be3f3a2692746 GIT binary patch literal 1072 zcmV-01kd}4P)ynP(W)q&Ufr$3Ax?Q=ZHZ^X(P8A*vV-| zXuus;Fos+#O&=SHlWiSCh($x(Lbf;?Imj$>vC~|Mv!}CeJI?b|lTpokh(r5Gkx|Wa zjAwnl14k*Q5VD)$0Byu*=U2qBU$~nXZ5&``&Iz{~CvPG-`w=nD{7T(8SWO!F-)q29 zz!AiQJ|n=&X2g@WV4}Dx*siBKm#Gz4Ch7jw%p_c!$ zl3~QUqo~wz7P0CB<`brjUc{=itVAhEzty*2f=0sXC452>10}p_{P4_2tDF(Us8=Y# zSUb}OLw5xxRv8TEDelG6a!w$sc4KOfdgi$i2Mg#?&HGC+wT!fC0dW1bsxe) z=tMEgQv~G2V92euVq<&ARX-(f&V<~m5gW}RR~;i?LT97O%d#E(8+juk&BI1%=opAz zK*m(at*ZQdg!F^B2^%dTS3Lz#m}ztyHg*(d8jaBz`Zx0woI&Q27F}ZiH1KKb%p-x+ACzBM!~7hh;e? z&b^KsTVJ8_DB@U}ezwz0lF|z$X<-Kgqzm;Ks>4gV`YpZ9^`Op<$lDI?!ijHVZ?*_v38ROhdpMg#lag$&fJe8Xs*EwEHTg#x~%D$D{7V{z}7^0Q}dJr+_ zzG6Rmyt>#Ae_w-#en*u3jE77%0|txzBPiX){vn`Fyz~&F>;b&gf+$;4>>ov3h^Ho$ qdz{|dpx72Z$9f`>NF)-;lYapm!`M>^@<#pu0000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Android/app/src/main/res/drawable/side_nav_bar.xml b/Android/app/src/main/res/drawable/side_nav_bar.xml new file mode 100644 index 0000000..6d81870 --- /dev/null +++ b/Android/app/src/main/res/drawable/side_nav_bar.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/Android/app/src/main/res/layout/activity_about_us.xml b/Android/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..54b16de --- /dev/null +++ b/Android/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Android/app/src/main/res/layout/activity_add_pcr.xml b/Android/app/src/main/res/layout/activity_add_pcr.xml new file mode 100644 index 0000000..e61b283 --- /dev/null +++ b/Android/app/src/main/res/layout/activity_add_pcr.xml @@ -0,0 +1,93 @@ + + + + + + + + +