From eab717ad694b61a211068eae5ab982b0cb87672e Mon Sep 17 00:00:00 2001 From: Odweta Date: Tue, 22 Oct 2024 18:18:13 +0200 Subject: [PATCH] made solon 2.0 --- .gitignore | 18 +- .idea/vcs.xml | 8 + mobile/.gitignore | 15 - mobile/.idea/.gitignore | 3 + mobile/.idea/.name | 2 +- mobile/.idea/assetWizardSettings.xml | 297 +++++++ mobile/.idea/codeStyles/Project.xml | 123 --- mobile/.idea/codeStyles/codeStyleConfig.xml | 5 - mobile/.idea/deploymentTargetDropDown.xml | 10 - mobile/.idea/deploymentTargetSelector.xml | 7 +- .../inspectionProfiles/Project_Default.xml | 47 ++ mobile/.idea/kotlinc.xml | 12 +- mobile/.idea/material_theme_project_new.xml | 12 + mobile/.idea/misc.xml | 4 +- mobile/.idea/vcs.xml | 3 +- mobile/app/build.gradle.kts | 46 +- .../release/baselineProfiles/0/app-release.dm | Bin 0 -> 7884 bytes .../release/baselineProfiles/1/app-release.dm | Bin 0 -> 7796 bytes mobile/app/release/output-metadata.json | 37 + mobile/app/src/main/AndroidManifest.xml | 18 +- mobile/app/src/main/gitlab_logo-playstore.png | Bin 16215 -> 0 bytes mobile/app/src/main/grade-playstore.png | Bin 32511 -> 0 bytes mobile/app/src/main/grade2-playstore.png | Bin 17078 -> 0 bytes mobile/app/src/main/ic_launcher-playstore.png | Bin 21419 -> 0 bytes .../src/main/java/com/odweta/solon/About.kt | 129 +++ .../java/com/odweta/solon/AboutFragment.kt | 145 ---- .../src/main/java/com/odweta/solon/Account.kt | 12 +- .../java/com/odweta/solon/CalWeekFragment.kt | 751 ------------------ .../src/main/java/com/odweta/solon/Dialogs.kt | 48 -- .../src/main/java/com/odweta/solon/Launch.kt | 294 +++++++ .../java/com/odweta/solon/MainActivity.kt | 378 ++------- .../java/com/odweta/solon/MainFragment.kt | 202 ----- .../com/odweta/solon/MarkDetailsFragment.kt | 307 ------- .../src/main/java/com/odweta/solon/Marks.kt | 497 ++++++++++++ .../java/com/odweta/solon/MarksFragment.kt | 313 -------- .../odweta/solon/MarksOneSubjectFragment.kt | 310 -------- .../src/main/java/com/odweta/solon/Menu.kt | 164 ++++ .../java/com/odweta/solon/MenuFragment.kt | 82 -- .../src/main/java/com/odweta/solon/Navbar.kt | 98 +++ .../src/main/java/com/odweta/solon/Network.kt | 77 +- .../src/main/java/com/odweta/solon/Parsing.kt | 17 +- .../java/com/odweta/solon/SettingsFragment.kt | 94 --- .../src/main/java/com/odweta/solon/SignIn.kt | 217 +++++ .../java/com/odweta/solon/SignInFragment.kt | 140 ---- .../com/odweta/solon/SignInMainFragment.kt | 53 -- .../src/main/java/com/odweta/solon/Splash.kt | 57 ++ .../java/com/odweta/solon/SplashFragment.kt | 32 - .../main/java/com/odweta/solon/Timetable.kt | 281 +++++++ .../src/main/java/com/odweta/solon/Toolbar.kt | 15 + .../src/main/java/com/odweta/solon/Util.kt | 34 +- .../src/main/java/com/odweta/solon/Vars.kt | 55 -- .../java/com/odweta/solon/ui/theme/Color.kt | 40 + .../java/com/odweta/solon/ui/theme/Global.kt | 191 +++++ .../java/com/odweta/solon/ui/theme/Theme.kt | 58 ++ .../java/com/odweta/solon/ui/theme/Type.kt | 34 + mobile/app/src/main/launcher-playstore.png | Bin 0 -> 22262 bytes mobile/app/src/main/left_arrow-playstore.png | Bin 25351 -> 0 bytes mobile/app/src/main/menu-playstore.png | Bin 1813 -> 0 bytes mobile/app/src/main/res/anim/slide_down.xml | 7 - mobile/app/src/main/res/anim/slide_up.xml | 8 - .../res/drawable/alert_dialog_background.xml | 9 - .../main/res/drawable/button_background.xml | 8 - .../drawable/button_background_selector.xml | 5 - .../drawable/button_clicked_background.xml | 8 - mobile/app/src/main/res/drawable/cursor.xml | 6 - mobile/app/src/main/res/drawable/hide.png | Bin 5001 -> 0 bytes .../res/drawable/ic_launcher_background.xml | 7 + .../res/drawable/ic_launcher_foreground.xml | 30 + .../main/res/drawable/launcher_background.xml | 53 ++ .../drawable/{loading3.gif => loading.gif} | Bin .../marks.webp} | Bin mobile/app/src/main/res/drawable/menu_240.png | Bin 983 -> 0 bytes .../res/drawable/pastel_yellow_no_stroke.xml | 5 - mobile/app/src/main/res/drawable/show.png | Bin 4816 -> 0 bytes ..._100_yellow_transparent_one_color_edge.png | Bin 3355 -> 0 bytes .../squiggly_line_yellow.png} | Bin .../main/res/drawable/toolbar_background.xml | 9 - mobile/app/src/main/res/font/roboto.xml | 7 - mobile/app/src/main/res/font/roboto_src.ttf | Bin 107800 -> 0 bytes mobile/app/src/main/res/gitlab-logo-200.png | Bin 11442 -> 0 bytes .../src/main/res/layout/activity_about.xml | 108 --- .../src/main/res/layout/activity_cal_week.xml | 13 - .../main/res/layout/activity_container.xml | 5 - .../app/src/main/res/layout/activity_main.xml | 59 -- .../main/res/layout/activity_mark_details.xml | 29 - .../src/main/res/layout/activity_marks.xml | 28 - .../res/layout/activity_marks_one_subject.xml | 27 - .../app/src/main/res/layout/activity_menu.xml | 64 -- .../src/main/res/layout/activity_no_marks.xml | 13 - .../src/main/res/layout/activity_settings.xml | 84 -- .../src/main/res/layout/activity_sign_in.xml | 104 --- .../res/layout/activity_splash_screen.xml | 35 - .../main/res/layout/alert_dialog_sign_out.xml | 17 - .../app/src/main/res/layout/fragment_day.xml | 15 - .../main/res/layout/radio_group_language.xml | 28 - mobile/app/src/main/res/loading2.gif | Bin 127794 -> 0 bytes mobile/app/src/main/res/menu/menu_navbar.xml | 22 - .../main/res/mipmap-anydpi-v26/launcher.xml | 5 + .../res/mipmap-anydpi-v26/launcher_round.xml | 5 + .../main/res/mipmap-anydpi/ic_launcher.xml | 9 +- .../res/mipmap-anydpi/ic_launcher_round.xml | 9 +- .../mipmap-hdpi/gitlab_logo_foreground.webp | Bin 1660 -> 0 bytes .../res/mipmap-hdpi/grade2_foreground.webp | Bin 5308 -> 0 bytes .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1328 -> 1404 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 1736 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2388 -> 2898 bytes .../src/main/res/mipmap-hdpi/launcher.webp | Bin 0 -> 1488 bytes .../res/mipmap-hdpi/launcher_foreground.webp | Bin 0 -> 1840 bytes .../main/res/mipmap-hdpi/launcher_round.webp | Bin 0 -> 2602 bytes .../mipmap-mdpi/gitlab_logo_foreground.webp | Bin 1040 -> 0 bytes .../res/mipmap-mdpi/grade2_foreground.webp | Bin 2916 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 810 -> 982 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 1200 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1610 -> 1772 bytes .../src/main/res/mipmap-mdpi/launcher.webp | Bin 0 -> 912 bytes .../res/mipmap-mdpi/launcher_foreground.webp | Bin 0 -> 1214 bytes .../main/res/mipmap-mdpi/launcher_round.webp | Bin 0 -> 1794 bytes .../mipmap-xhdpi/gitlab_logo_foreground.webp | Bin 2168 -> 0 bytes .../res/mipmap-xhdpi/grade2_foreground.webp | Bin 7354 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1792 -> 1900 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 2362 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3384 -> 3918 bytes .../src/main/res/mipmap-xhdpi/launcher.webp | Bin 0 -> 1908 bytes .../res/mipmap-xhdpi/launcher_foreground.webp | Bin 0 -> 2436 bytes .../main/res/mipmap-xhdpi/launcher_round.webp | Bin 0 -> 3448 bytes .../mipmap-xxhdpi/gitlab_logo_foreground.webp | Bin 3402 -> 0 bytes .../res/mipmap-xxhdpi/grade2_foreground.webp | Bin 8546 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2672 -> 2884 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 3646 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5158 -> 5914 bytes .../src/main/res/mipmap-xxhdpi/launcher.webp | Bin 0 -> 2814 bytes .../mipmap-xxhdpi/launcher_foreground.webp | Bin 0 -> 3870 bytes .../res/mipmap-xxhdpi/launcher_round.webp | Bin 0 -> 5244 bytes .../gitlab_logo_foreground.webp | Bin 4088 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3762 -> 3844 bytes .../ic_launcher_foreground.webp | Bin 5016 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 6962 -> 7778 bytes .../src/main/res/mipmap-xxxhdpi/launcher.webp | Bin 0 -> 3576 bytes .../mipmap-xxxhdpi/launcher_foreground.webp | Bin 0 -> 5408 bytes .../res/mipmap-xxxhdpi/launcher_round.webp | Bin 0 -> 7294 bytes mobile/app/src/main/res/values/colors.xml | 37 +- mobile/app/src/main/res/values/dimens.xml | 16 - .../res/values/ic_launcher_background.xml | 4 - .../src/main/res/values/preloaded_fonts.xml | 6 - mobile/app/src/main/res/values/strings.xml | 25 - mobile/app/src/main/res/values/themes.xml | 64 +- .../main/res/xml/data_extraction_rules.xml | 2 +- mobile/build.gradle.kts | 5 +- mobile/gradle.properties | 4 +- mobile/gradle/libs.versions.toml | 42 + .../gradle/wrapper/gradle-wrapper.properties | 2 +- mobile/settings.gradle.kts | 14 +- release/solon.apk | Bin 12958095 -> 41701300 bytes 153 files changed, 2863 insertions(+), 3991 deletions(-) mode change 100755 => 100644 .gitignore create mode 100644 .idea/vcs.xml delete mode 100644 mobile/.gitignore create mode 100644 mobile/.idea/.gitignore create mode 100644 mobile/.idea/assetWizardSettings.xml delete mode 100644 mobile/.idea/codeStyles/Project.xml delete mode 100644 mobile/.idea/codeStyles/codeStyleConfig.xml delete mode 100644 mobile/.idea/deploymentTargetDropDown.xml create mode 100644 mobile/.idea/inspectionProfiles/Project_Default.xml create mode 100644 mobile/.idea/material_theme_project_new.xml create mode 100644 mobile/app/release/baselineProfiles/0/app-release.dm create mode 100644 mobile/app/release/baselineProfiles/1/app-release.dm create mode 100644 mobile/app/release/output-metadata.json delete mode 100644 mobile/app/src/main/gitlab_logo-playstore.png delete mode 100644 mobile/app/src/main/grade-playstore.png delete mode 100644 mobile/app/src/main/grade2-playstore.png delete mode 100644 mobile/app/src/main/ic_launcher-playstore.png create mode 100644 mobile/app/src/main/java/com/odweta/solon/About.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/AboutFragment.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/CalWeekFragment.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/Dialogs.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/Launch.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/MainFragment.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/MarkDetailsFragment.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/Marks.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/MarksFragment.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/MarksOneSubjectFragment.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/Menu.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/MenuFragment.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/Navbar.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/SettingsFragment.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/SignIn.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/SignInFragment.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/SignInMainFragment.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/Splash.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/SplashFragment.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/Timetable.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/Toolbar.kt delete mode 100644 mobile/app/src/main/java/com/odweta/solon/Vars.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/ui/theme/Color.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/ui/theme/Global.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/ui/theme/Theme.kt create mode 100644 mobile/app/src/main/java/com/odweta/solon/ui/theme/Type.kt create mode 100644 mobile/app/src/main/launcher-playstore.png delete mode 100644 mobile/app/src/main/left_arrow-playstore.png delete mode 100644 mobile/app/src/main/menu-playstore.png delete mode 100644 mobile/app/src/main/res/anim/slide_down.xml delete mode 100644 mobile/app/src/main/res/anim/slide_up.xml delete mode 100644 mobile/app/src/main/res/drawable/alert_dialog_background.xml delete mode 100644 mobile/app/src/main/res/drawable/button_background.xml delete mode 100644 mobile/app/src/main/res/drawable/button_background_selector.xml delete mode 100644 mobile/app/src/main/res/drawable/button_clicked_background.xml delete mode 100644 mobile/app/src/main/res/drawable/cursor.xml delete mode 100644 mobile/app/src/main/res/drawable/hide.png create mode 100644 mobile/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 mobile/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 mobile/app/src/main/res/drawable/launcher_background.xml rename mobile/app/src/main/res/drawable/{loading3.gif => loading.gif} (100%) rename mobile/app/src/main/res/{mipmap-xxxhdpi/grade2_foreground.webp => drawable/marks.webp} (100%) delete mode 100644 mobile/app/src/main/res/drawable/menu_240.png delete mode 100644 mobile/app/src/main/res/drawable/pastel_yellow_no_stroke.xml delete mode 100644 mobile/app/src/main/res/drawable/show.png delete mode 100644 mobile/app/src/main/res/drawable/squiggly_line_100_yellow_transparent_one_color_edge.png rename mobile/app/src/main/res/{squiggly_line_yellow_transparent_one_color.png => drawable/squiggly_line_yellow.png} (100%) delete mode 100644 mobile/app/src/main/res/drawable/toolbar_background.xml delete mode 100644 mobile/app/src/main/res/font/roboto.xml delete mode 100644 mobile/app/src/main/res/font/roboto_src.ttf delete mode 100644 mobile/app/src/main/res/gitlab-logo-200.png delete mode 100644 mobile/app/src/main/res/layout/activity_about.xml delete mode 100644 mobile/app/src/main/res/layout/activity_cal_week.xml delete mode 100644 mobile/app/src/main/res/layout/activity_container.xml delete mode 100644 mobile/app/src/main/res/layout/activity_main.xml delete mode 100644 mobile/app/src/main/res/layout/activity_mark_details.xml delete mode 100644 mobile/app/src/main/res/layout/activity_marks.xml delete mode 100644 mobile/app/src/main/res/layout/activity_marks_one_subject.xml delete mode 100644 mobile/app/src/main/res/layout/activity_menu.xml delete mode 100644 mobile/app/src/main/res/layout/activity_no_marks.xml delete mode 100644 mobile/app/src/main/res/layout/activity_settings.xml delete mode 100644 mobile/app/src/main/res/layout/activity_sign_in.xml delete mode 100644 mobile/app/src/main/res/layout/activity_splash_screen.xml delete mode 100644 mobile/app/src/main/res/layout/alert_dialog_sign_out.xml delete mode 100644 mobile/app/src/main/res/layout/fragment_day.xml delete mode 100644 mobile/app/src/main/res/layout/radio_group_language.xml delete mode 100644 mobile/app/src/main/res/loading2.gif delete mode 100644 mobile/app/src/main/res/menu/menu_navbar.xml create mode 100644 mobile/app/src/main/res/mipmap-anydpi-v26/launcher.xml create mode 100644 mobile/app/src/main/res/mipmap-anydpi-v26/launcher_round.xml delete mode 100644 mobile/app/src/main/res/mipmap-hdpi/gitlab_logo_foreground.webp delete mode 100644 mobile/app/src/main/res/mipmap-hdpi/grade2_foreground.webp mode change 100755 => 100644 mobile/app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 mobile/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 mobile/app/src/main/res/mipmap-hdpi/launcher.webp create mode 100644 mobile/app/src/main/res/mipmap-hdpi/launcher_foreground.webp create mode 100644 mobile/app/src/main/res/mipmap-hdpi/launcher_round.webp delete mode 100644 mobile/app/src/main/res/mipmap-mdpi/gitlab_logo_foreground.webp delete mode 100644 mobile/app/src/main/res/mipmap-mdpi/grade2_foreground.webp delete mode 100644 mobile/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 mobile/app/src/main/res/mipmap-mdpi/launcher.webp create mode 100644 mobile/app/src/main/res/mipmap-mdpi/launcher_foreground.webp create mode 100644 mobile/app/src/main/res/mipmap-mdpi/launcher_round.webp delete mode 100644 mobile/app/src/main/res/mipmap-xhdpi/gitlab_logo_foreground.webp delete mode 100644 mobile/app/src/main/res/mipmap-xhdpi/grade2_foreground.webp delete mode 100644 mobile/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 mobile/app/src/main/res/mipmap-xhdpi/launcher.webp create mode 100644 mobile/app/src/main/res/mipmap-xhdpi/launcher_foreground.webp create mode 100644 mobile/app/src/main/res/mipmap-xhdpi/launcher_round.webp delete mode 100644 mobile/app/src/main/res/mipmap-xxhdpi/gitlab_logo_foreground.webp delete mode 100644 mobile/app/src/main/res/mipmap-xxhdpi/grade2_foreground.webp delete mode 100644 mobile/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 mobile/app/src/main/res/mipmap-xxhdpi/launcher.webp create mode 100644 mobile/app/src/main/res/mipmap-xxhdpi/launcher_foreground.webp create mode 100644 mobile/app/src/main/res/mipmap-xxhdpi/launcher_round.webp delete mode 100644 mobile/app/src/main/res/mipmap-xxxhdpi/gitlab_logo_foreground.webp delete mode 100644 mobile/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 mobile/app/src/main/res/mipmap-xxxhdpi/launcher.webp create mode 100644 mobile/app/src/main/res/mipmap-xxxhdpi/launcher_foreground.webp create mode 100644 mobile/app/src/main/res/mipmap-xxxhdpi/launcher_round.webp delete mode 100644 mobile/app/src/main/res/values/dimens.xml delete mode 100644 mobile/app/src/main/res/values/ic_launcher_background.xml delete mode 100644 mobile/app/src/main/res/values/preloaded_fonts.xml create mode 100644 mobile/gradle/libs.versions.toml diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index ea7022d..aa724b7 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,15 @@ -*.swp -TODO.md -./.idea/ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..43452ec --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/mobile/.gitignore b/mobile/.gitignore deleted file mode 100644 index aa724b7..0000000 --- a/mobile/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/caches -/.idea/libraries -/.idea/modules.xml -/.idea/workspace.xml -/.idea/navEditor.xml -/.idea/assetWizardSettings.xml -.DS_Store -/build -/captures -.externalNativeBuild -.cxx -local.properties diff --git a/mobile/.idea/.gitignore b/mobile/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/mobile/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/mobile/.idea/.name b/mobile/.idea/.name index 99e1610..990c379 100644 --- a/mobile/.idea/.name +++ b/mobile/.idea/.name @@ -1 +1 @@ -Solon \ No newline at end of file +solon \ No newline at end of file diff --git a/mobile/.idea/assetWizardSettings.xml b/mobile/.idea/assetWizardSettings.xml new file mode 100644 index 0000000..ac10bc1 --- /dev/null +++ b/mobile/.idea/assetWizardSettings.xml @@ -0,0 +1,297 @@ + + + + + + \ No newline at end of file diff --git a/mobile/.idea/codeStyles/Project.xml b/mobile/.idea/codeStyles/Project.xml deleted file mode 100644 index 7643783..0000000 --- a/mobile/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/mobile/.idea/codeStyles/codeStyleConfig.xml b/mobile/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123..0000000 --- a/mobile/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/mobile/.idea/deploymentTargetDropDown.xml b/mobile/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 0c0c338..0000000 --- a/mobile/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/mobile/.idea/deploymentTargetSelector.xml b/mobile/.idea/deploymentTargetSelector.xml index 5a312d0..bec964a 100644 --- a/mobile/.idea/deploymentTargetSelector.xml +++ b/mobile/.idea/deploymentTargetSelector.xml @@ -4,15 +4,18 @@ + + \ No newline at end of file diff --git a/mobile/.idea/inspectionProfiles/Project_Default.xml b/mobile/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..005afb3 --- /dev/null +++ b/mobile/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,47 @@ + + + + \ No newline at end of file diff --git a/mobile/.idea/kotlinc.xml b/mobile/.idea/kotlinc.xml index 8d81632..031f228 100644 --- a/mobile/.idea/kotlinc.xml +++ b/mobile/.idea/kotlinc.xml @@ -1,6 +1,16 @@ + + + + + + - \ No newline at end of file diff --git a/mobile/.idea/material_theme_project_new.xml b/mobile/.idea/material_theme_project_new.xml new file mode 100644 index 0000000..9d92b58 --- /dev/null +++ b/mobile/.idea/material_theme_project_new.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/mobile/.idea/misc.xml b/mobile/.idea/misc.xml index 02a7102..b2c751a 100644 --- a/mobile/.idea/misc.xml +++ b/mobile/.idea/misc.xml @@ -1,7 +1,9 @@ - + + \ No newline at end of file diff --git a/mobile/.idea/vcs.xml b/mobile/.idea/vcs.xml index 6c0b863..8a1c0ed 100644 --- a/mobile/.idea/vcs.xml +++ b/mobile/.idea/vcs.xml @@ -1,6 +1,7 @@ - + + \ No newline at end of file diff --git a/mobile/app/build.gradle.kts b/mobile/app/build.gradle.kts index 8054883..bfb5f44 100644 --- a/mobile/app/build.gradle.kts +++ b/mobile/app/build.gradle.kts @@ -1,6 +1,7 @@ plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) } android { @@ -12,39 +13,42 @@ android { minSdk = 28 targetSdk = 34 versionCode = 1 - versionName = "1.0.9" + versionName = "2.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { isMinifyEnabled = false - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } kotlinOptions { - jvmTarget = "1.8" + jvmTarget = "11" } buildFeatures { - viewBinding = true + compose = true } } dependencies { - implementation("androidx.core:core-ktx:1.12.0") - implementation("androidx.appcompat:appcompat:1.6.1") - implementation("com.google.android.material:material:1.11.0") - implementation("androidx.constraintlayout:constraintlayout:2.1.4") - implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0") - implementation("androidx.navigation:navigation-fragment-ktx:2.7.7") - implementation("androidx.navigation:navigation-ui-ktx:2.7.7") - implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0") - implementation("com.squareup.okhttp3:okhttp:4.12.0") - implementation("androidx.viewpager2:viewpager2:1.0.0") - implementation("com.github.bumptech.glide:glide:4.16.0") - implementation("com.google.android.material:material:1.11.0") + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + implementation(libs.okhttp) + implementation(libs.glide) + implementation(libs.androidx.material.icons.extended) } \ No newline at end of file diff --git a/mobile/app/release/baselineProfiles/0/app-release.dm b/mobile/app/release/baselineProfiles/0/app-release.dm new file mode 100644 index 0000000000000000000000000000000000000000..68e52a985e5c86b76c42d82adb923d24c7f88b4f GIT binary patch literal 7884 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 I_?Ps*0Np$GO#lD@ literal 0 HcmV?d00001 diff --git a/mobile/app/release/baselineProfiles/1/app-release.dm b/mobile/app/release/baselineProfiles/1/app-release.dm new file mode 100644 index 0000000000000000000000000000000000000000..11e8fa4ac3d705958aa4c65d4cbb6d52b9b67cd3 GIT binary patch literal 7796 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 e`Y-wLCz*e@bk + tools:targetApi="31"> + android:label="@string/app_name" + android:theme="@style/Theme.Solon"> - \ No newline at end of file diff --git a/mobile/app/src/main/gitlab_logo-playstore.png b/mobile/app/src/main/gitlab_logo-playstore.png deleted file mode 100644 index 51220e5c16c829c834cf57007ab4fc358894d65f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16215 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 diff --git a/mobile/app/src/main/grade-playstore.png b/mobile/app/src/main/grade-playstore.png deleted file mode 100644 index 52a120ace327949cd011a698dfe10211c5d95320..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32511 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

O=seaI^`ZG2 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 diff --git a/mobile/app/src/main/grade2-playstore.png b/mobile/app/src/main/grade2-playstore.png deleted file mode 100644 index 4142987ce864f56ce9a62368896b1398904e4f6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17078 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 - view.performClick() - handleTouchEvent(event) - } - - val link = view.findViewById(R.id.link) - val underlinedText = SpannableString(link.text) - underlinedText.setSpan(UnderlineSpan(), 8, link.text.length, 0) - - link.text = underlinedText - makeTextViewClickable(link, "https://gitlab.com/Odweta", 8) - - - val srcLink = view.findViewById(R.id.sourceCode) - val underlinedText2 = SpannableString(srcLink.text) - underlinedText2.setSpan(UnderlineSpan(), 1, srcLink.text.length, 0) - - srcLink.text = underlinedText2 - makeTextViewClickable(srcLink, "https://gitlab.com/Odweta/solon") - - return view - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - dialog = super.onCreateDialog(savedInstanceState) - dialog.window?.attributes?.windowAnimations = R.style.Theme_Solon_DialogAnimation - dialog.window?.requestFeature(Window.FEATURE_NO_TITLE) - dialog.setCancelable(true) - - return dialog - } - - private fun makeTextViewClickable(link: TextView, url: String, offset: Int = 0) { - val clickableSpan = object : ClickableSpan() { - override fun onClick(widget: View) { - if (Vars.internetAvail) { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) - startActivity(intent) - } else { - Toast.makeText( - requireContext(), - "Bez připojení k internetu.", - Toast.LENGTH_SHORT - ).show() - } - } - } - - val spannable = Spannable.Factory.getInstance().newSpannable(link.text) - spannable.setSpan(clickableSpan, offset, link.text.length, Spannable.SPAN_COMPOSING) - - link.text = spannable - link.movementMethod = LinkMovementMethod.getInstance() - } - - inner class SwipeGestureListener : GestureDetector.SimpleOnGestureListener() { - override fun onDown(e: MotionEvent): Boolean { - return true - } - - override fun onFling( - e1: MotionEvent?, - e2: MotionEvent, - velocityX: Float, - velocityY: Float - ): Boolean { - val diffY = e1?.let { e2.y.minus(it.y) } ?: 0f - if (diffY > swipeThreshold && abs(velocityY) > swipeVelocityThreshold) { - // Swiped down - dismiss() - return true - } - return false - } - } - - @Suppress("SameReturnValue", "SameReturnValue", "SameReturnValue") - private fun handleTouchEvent(event: MotionEvent): Boolean { - when (event.action) { - MotionEvent.ACTION_DOWN -> { - initialTouchY = event.rawY - } - MotionEvent.ACTION_MOVE -> { - val deltaY = event.rawY - initialTouchY - dialog?.window?.attributes?.y = deltaY.toInt() - dialog?.window?.attributes?.windowAnimations = 0 - dialog?.show() - - // Check if the dialog has been dragged beyond a threshold and dismiss if necessary - if (deltaY > 200) { - dismiss() - } - } - MotionEvent.ACTION_UP -> { - initialTouchY = 0f - } - } - return true - } -} \ No newline at end of file diff --git a/mobile/app/src/main/java/com/odweta/solon/Account.kt b/mobile/app/src/main/java/com/odweta/solon/Account.kt index c2b1746..14db999 100644 --- a/mobile/app/src/main/java/com/odweta/solon/Account.kt +++ b/mobile/app/src/main/java/com/odweta/solon/Account.kt @@ -27,7 +27,7 @@ class Account(val username: String, val password: String, private val error: Int */ // check if file exists - val file = File(Vars.fileDir, Vars.accountDataFilePath) + val file = File(fileDir, accountDataFilePath) return if (!file.exists()) { // it does not exist @@ -36,15 +36,15 @@ class Account(val username: String, val password: String, private val error: Int } else { // it exists, so it shall be parsed val acc: Account = parseAccountDataFile(file) - Vars.username = acc.username - Vars.password = acc.password + username = acc.username + password = acc.password acc.error == 0 } } fun save(acc: Account): Boolean { return try { - val file = File(Vars.fileDir, Vars.accountDataFilePath) + val file = File(fileDir, accountDataFilePath) file.writeText("${acc.username}\n${acc.password}\n", Charset.forName("UTF-8")) true @@ -55,8 +55,8 @@ class Account(val username: String, val password: String, private val error: Int suspend fun isValid(acc: Account): Boolean { return withContext(Dispatchers.IO) { - Vars.username = acc.username - Vars.password = acc.password + username = acc.username + password = acc.password val token = Network.getToken() !JSONObject(token).has("error") diff --git a/mobile/app/src/main/java/com/odweta/solon/CalWeekFragment.kt b/mobile/app/src/main/java/com/odweta/solon/CalWeekFragment.kt deleted file mode 100644 index cc1b6b6..0000000 --- a/mobile/app/src/main/java/com/odweta/solon/CalWeekFragment.kt +++ /dev/null @@ -1,751 +0,0 @@ -package com.odweta.solon - -import android.annotation.SuppressLint -import android.content.res.Resources -import android.graphics.Typeface -import android.graphics.drawable.GradientDrawable -import android.os.Bundle -import android.os.Handler -import android.os.Looper -import android.util.Log -import android.view.Gravity -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import android.view.ViewTreeObserver -import android.widget.FrameLayout -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.ScrollView -import android.widget.Space -import android.widget.TextView -import androidx.core.content.ContextCompat -import androidx.core.content.res.ResourcesCompat -import androidx.core.view.marginLeft -import androidx.core.view.setMargins -import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.lifecycle.Lifecycle -import androidx.viewpager2.adapter.FragmentStateAdapter -import androidx.viewpager2.widget.ViewPager2 -import java.time.LocalDate -import java.time.LocalTime -class CalWeekFragment : Fragment() { - private lateinit var viewPager: ViewPager2 - private lateinit var adapter: DayPagerAdapter - - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val view = inflater.inflate(R.layout.activity_cal_week, container, false) - - viewPager = view.findViewById(R.id.dayPager) - - adapter = DayPagerAdapter(childFragmentManager, viewLifecycleOwner.lifecycle) - - Vars.dayCounter = 0 - for (i in 0 until Vars.days.size) { - adapter.addFragment(DayFragment()) - } - - viewPager.viewTreeObserver.addOnPreDrawListener { - viewPager.currentItem = Vars.selectedDay - true - } - - viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - super.onPageSelected(position) - if (viewPager.isLaidOut) { - Vars.selectedDay = position - } - } - }) - - viewPager.adapter = adapter - viewPager.offscreenPageLimit = adapter.itemCount - - return view - } -} - -class DayPagerAdapter(fragmentManager: FragmentManager, lifecycle: Lifecycle) : - FragmentStateAdapter(fragmentManager, lifecycle) { - - private val fragmentList = mutableListOf() - - fun addFragment(fragment: Fragment) { - fragmentList.add(fragment) - } - - override fun getItemCount(): Int { - return fragmentList.size - } - - override fun createFragment(position: Int): Fragment { - return fragmentList[position] - } -} - -class DayFragment : Fragment() { - private val handler = Handler(Looper.getMainLooper()) - - @SuppressLint("ClickableViewAccessibility") - override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - val view = inflater.inflate(R.layout.fragment_day, container, false) - - val dayLayout: LinearLayout = view.findViewById(R.id.layoutDayMain) - createDayView(Vars.dayList[Vars.dayCounter], dayLayout, resources) - Vars.dayCounter += 1 - - return view - } - - private fun highlightCurrent( - subj: Subject, - day: Day, - subjectDrawable: GradientDrawable, - subjectStroke: Int, - i: Int - ) { - handler.postDelayed(object : Runnable { - override fun run() { - subjectDrawable.setStroke(0, 0) - - val now = LocalTime.now() - val nowD = LocalDate.now().dayOfMonth - val nowH = now.hour - val nowM = now.minute - val nowT = LocalTime.of(nowH, nowM) - - lateinit var subjST: LocalTime - lateinit var subjET: LocalTime - val subjD = day.date.split(".")[0].toInt() - - if ("T" !in subj.start && "T" !in subj.end) { - val subjSH = subj.start.split(":")[0].toInt() - val subjSM = subj.start.split(":")[1].toInt() - - val subjEH = subj.end.split(":")[0].toInt() - val subjEM = subj.end.split(":")[1].toInt() - - subjST = LocalTime.of(subjSH, subjSM) - subjET = LocalTime.of(subjEH, subjEM) - } else { - val subjSH = subj.start - .split("T")[1] - .split(":")[0] - .toInt() - val subjSM = subj.start - .split("T")[1] - .split(":")[1] - .toInt() - - val subjEH = subj.end - .split("T")[1] - .split(":")[0] - .toInt() - val subjEM = subj.end - .split("T")[1] - .split(":")[1] - .toInt() - - subjST = LocalTime.of(subjSH, subjSM) - subjET = LocalTime.of(subjEH, subjEM) - } - - if ( - nowT in subjST..subjET && - nowD == subjD - ) { - if (i < day.subjects.size - 1 && !day.subjects[i + 1].free && !subj.free) { - subjectDrawable.setStroke( - 10, - ContextCompat.getColor( - requireContext(), - subjectStroke - ) - ) - } else if (i < day.subjects.size - 1 && day.subjects[i + 1].free && nowT != subjET) { - subjectDrawable.setStroke( - 10, - ContextCompat.getColor( - requireContext(), - subjectStroke - ) - ) - } else if (i < day.subjects.size - 1 && subj.free && !day.subjects[i + 1].free && nowT != subjET) { - subjectDrawable.setStroke( - 10, - ContextCompat.getColor( - requireContext(), - subjectStroke - ) - ) - } else if (i == day.subjects.size - 1) { - subjectDrawable.setStroke( - 10, - ContextCompat.getColor( - requireContext(), - subjectStroke - ) - ) - } - } else if ( - nowD == subjD && - i > 0 - ) { - lateinit var prevET: LocalTime - - val prev = day.subjects[i - 1] - if ("T" !in prev.start && "T" !in prev.end) { - val prevEH = prev.end - .split(":")[0] - .toInt() - val prevEM = prev.end - .split(":")[1] - .toInt() - - prevET = LocalTime.of(prevEH, prevEM) - } else { - val prevEH = prev.end - .split("T")[1] - .split(":")[0] - .toInt() - val prevEM = prev.end - .split("T")[1] - .split(":")[1] - .toInt() - - prevET = LocalTime.of(prevEH, prevEM) - } - - if ( - nowT < subjST && - nowT > prevET - ) { - subjectDrawable.setStroke( - 10, - ContextCompat.getColor( - requireContext(), - subjectStroke - ) - ) - } - } - - requireView().postInvalidate() - // repeat every second - handler.postDelayed(this, 1000L) - } - }, 0L) - } - - override fun onDestroyView() { - super.onDestroyView() - // Stop updating UI when the view is destroyed - handler.removeCallbacksAndMessages(null) - } - - @SuppressLint("UseCompatLoadingForDrawables") - private fun createDayView(day: Day, rootLayout: LinearLayout, resources: Resources) { - val customFont = context?.let { ResourcesCompat.getFont(it, R.font.roboto) } - - val scrollView = ScrollView(requireContext()) - scrollView.scrollBarStyle = R.style.Theme_Solon_Scrollbar - - val dayLayout = LinearLayout(requireContext()) - dayLayout.orientation = LinearLayout.VERTICAL - - val nameDateTextView = TextView(requireContext()) - nameDateTextView.text = String.format("%s %s", day.name, day.date) - nameDateTextView.setTypeface(customFont, Typeface.BOLD_ITALIC) - //nameDateTextView.textSize = 28f - nameDateTextView.setTextColor( - ContextCompat.getColor( - requireContext(), - R.color.white - ) - ) - nameDateTextView.setPadding(10, 0, 10, 40) - nameDateTextView.gravity = Gravity.CENTER_HORIZONTAL - - rootLayout.addView(nameDateTextView) - - var prevSubj = Subject() - prevSubj.name = "" - prevSubj.place = "" - prevSubj.substitute = "" - prevSubj.teacher = "" - prevSubj.number = "" - prevSubj.start = "" - prevSubj.end = "" - prevSubj.free = false - - for ((i, subj) in day.subjects.withIndex()) { - val subjectBackground = when (subj.substitute) { - "0" -> if (subj.place != "Volno") { - R.color.primary_transparent_bg - } else { - R.color.cal_week_free_transparent_bg - } - "1" -> if (subj.place != "Volno") { - R.color.cal_week_substitute_transparent_bg - } else { - R.color.cal_week_free_transparent_bg - } - "2" -> if (subj.place != "Volno") { - R.color.cal_week_event_transparent_bg - } else { - R.color.cal_week_free_transparent_bg - } - else -> R.color.primary_transparent_bg - } - - val subjectStroke = when (subj.substitute) { - "0" -> if (subj.place != "Volno") { - R.color.primary - } else { - R.color.cal_week_free - } - "1" -> if (subj.place != "Volno") { - R.color.cal_week_substitute - } else { - R.color.cal_week_free - } - "2" -> if (subj.place != "Volno") { - R.color.cal_week_event - } else { - R.color.cal_week_free - } - else -> R.color.primary - } - - val subjectDrawable = GradientDrawable() - subjectDrawable.shape = GradientDrawable.RECTANGLE - subjectDrawable.cornerRadius = - resources.getDimension(R.dimen.corner_radius) // Specify corner radius in resources - subjectDrawable.setColor( - ContextCompat.getColor( - requireContext(), - subjectBackground - ) - ) - - // launch a periodic check for highlighting the current lecture - highlightCurrent(subj, day, subjectDrawable, subjectStroke, i) - - - val subjectLayout = LinearLayout(requireContext()) - subjectLayout.orientation = LinearLayout.HORIZONTAL - subjectLayout.gravity = Gravity.CENTER_VERTICAL - subjectLayout.background = subjectDrawable - - // height specifier - val heightSpecifier = View(requireContext()) - heightSpecifier.layoutParams = LinearLayout.LayoutParams( - 0, - 160 - ) - - subjectLayout.addView(heightSpecifier) - - val subjectNumberDrawable = GradientDrawable() - subjectNumberDrawable.shape = GradientDrawable.RECTANGLE - subjectNumberDrawable.cornerRadius = resources.getDimension(R.dimen.corner_radius) - subjectNumberDrawable.setColor( - ContextCompat.getColor( - requireContext(), - subjectBackground - ) - ) - - val subjectNumberTextView = TextView(requireContext()) - subjectNumberTextView.typeface = customFont - subjectNumberTextView.text = subj.number - //subjectNumberTextView.textSize = 33f - subjectNumberTextView.setPadding(20, 20, 20, 20) - subjectNumberTextView.gravity = Gravity.CENTER // Center text vertically - subjectNumberTextView.setTextColor( - ContextCompat.getColor( - requireContext(), - R.color.white - ) - ) - subjectNumberTextView.background = subjectNumberDrawable - - val frameLayout = FrameLayout(requireContext()) - val layoutParams = LinearLayout.LayoutParams( - 120, - FrameLayout.LayoutParams.MATCH_PARENT, - ) - frameLayout.foregroundGravity = Gravity.CENTER - frameLayout.layoutParams = layoutParams - - frameLayout.addView(subjectNumberTextView) - - if (subj.substitute != "2") { - subjectLayout.addView(frameLayout) - } - - val namePlaceLL = LinearLayout(requireContext()) - namePlaceLL.orientation = LinearLayout.VERTICAL - - val subjectNameTextView = TextView(requireContext()) - if (subj.name != "Volno") { - subjectNameTextView.text = subj.name.uppercase() - } - subjectNameTextView.setTypeface(customFont, Typeface.BOLD) - //subjectNameTextView.textSize = 29f - subjectNameTextView.setPadding(0, 0, 0, 0) - subjectNameTextView.gravity = Gravity.CENTER_VERTICAL - subjectNameTextView.setTextColor( - ContextCompat.getColor( - requireContext(), - R.color.white - ) - ) - - if (!subj.free) { - namePlaceLL.addView(subjectNameTextView) - } - - val subjectPlaceTextView = TextView(requireContext()) - subjectPlaceTextView.typeface = customFont - subjectPlaceTextView.text = subj.place - subjectPlaceTextView.setPadding(0, 0, 0, 0) - if (subj.free) { - // italic - subjectPlaceTextView.setTypeface(customFont, Typeface.ITALIC) - subjectPlaceTextView.text = "Volno " - } - //subjectPlaceTextView.textSize = 22f - subjectPlaceTextView.gravity = Gravity.CENTER_VERTICAL - subjectPlaceTextView.setTextColor( - ContextCompat.getColor( - requireContext(), - R.color.white - ) - ) - - if (subj.substitute != "2") { - namePlaceLL.addView(subjectPlaceTextView) - } - - namePlaceLL.setPadding(30, 15, 20, 15) - - subjectLayout.addView(namePlaceLL) - - if (subj.teacher == "Jindřich Svoboda") { - val img = ImageView(requireContext()) - img.setImageDrawable(resources.getDrawable(R.drawable.spock)) - val frameLayout2 = FrameLayout(requireContext()) - val layoutParams2 = LinearLayout.LayoutParams( - 100, - 120, - ) - frameLayout2.foregroundGravity = Gravity.CENTER - frameLayout2.layoutParams = layoutParams2 - - frameLayout2.addView(img) - subjectLayout.addView(frameLayout2) - } - - val params = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.MATCH_PARENT - ) - params.gravity = Gravity.END - - val timeTeacherLayout = LinearLayout(requireContext()) - timeTeacherLayout.orientation = LinearLayout.VERTICAL - timeTeacherLayout.layoutParams = params - timeTeacherLayout.gravity = Gravity.CENTER_VERTICAL - - val subjectTimeTextView = TextView(requireContext()) - val subjectTimeString = subj.start + "–" + subj.end - subjectTimeTextView.typeface = customFont - subjectTimeTextView.text = subjectTimeString - //subjectTimeTextView.textSize = 20f - subjectTimeTextView.setPadding(10, 0, 20, 0) - subjectTimeTextView.gravity = Gravity.END - subjectTimeTextView.isSingleLine = true - subjectTimeTextView.textAlignment = View.TEXT_ALIGNMENT_TEXT_END - subjectTimeTextView.setTextColor( - ContextCompat.getColor( - requireContext(), - R.color.white - ) - ) - - val subjectTeacherTextView = TextView(requireContext()) - subjectTeacherTextView.text = subj.teacher - subjectTeacherTextView.typeface = customFont - //subjectTeacherTextView.textSize = 15f - subjectTeacherTextView.setPadding(0, 10, 20, 10) - subjectTeacherTextView.textAlignment = View.TEXT_ALIGNMENT_TEXT_END - subjectTeacherTextView.setTextColor( - ContextCompat.getColor( - requireContext(), - R.color.white - ) - ) - - timeTeacherLayout.addView(subjectTimeTextView) - if (subj.name != "Volno") { - subjectTimeTextView.setPadding(0, 10, 20, 0) - timeTeacherLayout.addView(subjectTeacherTextView) - } - timeTeacherLayout.setPadding(0, 0, 10, 0) - - if (subj.substitute != "2") { - subjectLayout.addView(timeTeacherLayout) - } - - // drawables - val substituteDrawable = GradientDrawable() - substituteDrawable.shape = GradientDrawable.RECTANGLE - substituteDrawable.cornerRadius = resources.getDimension(R.dimen.corner_radius) - substituteDrawable.setColor( - ContextCompat.getColor( - requireContext(), - R.color.cal_week_substitute - ) - ) - - val eventDrawable = GradientDrawable() - eventDrawable.shape = GradientDrawable.RECTANGLE - eventDrawable.cornerRadius = resources.getDimension(R.dimen.corner_radius) - eventDrawable.setColor( - ContextCompat.getColor( - requireContext(), - R.color.cal_week_event - ) - ) - - // Attach an OnPreDrawListener to the rootLayout's ViewTreeObserver - rootLayout.viewTreeObserver.addOnPreDrawListener(object : - ViewTreeObserver.OnPreDrawListener { - override fun onPreDraw(): Boolean { - // Remove the listener to avoid multiple callbacks - rootLayout.viewTreeObserver.removeOnPreDrawListener(this) - - // Call your function or perform an action here - if (subj.free) { - subjectPlaceTextView.text = "Volno " - } - - nameDateTextView.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ) - - if (subj.substitute == "2") { - namePlaceLL.textAlignment = View.TEXT_ALIGNMENT_CENTER - namePlaceLL.setPadding(0, 0, 0, 0) - subjectNameTextView.layoutParams = LinearLayout.LayoutParams( - subjectLayout.width, - LinearLayout.LayoutParams.MATCH_PARENT - ) - subjectNameTextView.textAlignment = View.TEXT_ALIGNMENT_CENTER - subjectNameTextView.gravity = Gravity.CENTER_VERTICAL - } - - // Return true to continue with the drawing, or false to cancel - return true - } - }) - - val subjectLayoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ) - subjectLayoutParams.setMargins( - resources.getDimensionPixelSize(R.dimen.cal_week_separator_height)/4, - 0, - resources.getDimensionPixelSize(R.dimen.cal_week_separator_height)/4, - 0 - ) - subjectLayout.layoutParams = subjectLayoutParams - - if (prevSubj.name != subj.name && i != 0) { - val subjectSeparator = Space(requireContext()) - subjectSeparator.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - resources.getDimensionPixelSize(R.dimen.cal_week_separator_height) // Specify separator height in resources - ) - - dayLayout.addView(subjectSeparator) - } else if (i != 0) { - val subjectSeparator = ImageView(requireContext()) - subjectSeparator.setImageResource(R.drawable.squiggly_line_100_yellow_transparent_one_color_edge) - subjectSeparator.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - resources.getDimensionPixelSize(R.dimen.cal_week_separator_height) - ) - - dayLayout.addView(subjectSeparator) - } - - subjectNumberTextView.textSize = resources.getDimension(R.dimen.text_size_subject_number) / resources.displayMetrics.scaledDensity - subjectNameTextView.textSize = resources.getDimension(R.dimen.text_size_subject_name) / resources.displayMetrics.scaledDensity - if (subj.free) { - subjectPlaceTextView.textSize = - resources.getDimension(R.dimen.text_size_subject_place_free) / resources.displayMetrics.scaledDensity - } else { - subjectPlaceTextView.textSize = - resources.getDimension(R.dimen.text_size_subject_place) / resources.displayMetrics.scaledDensity - } - subjectTimeTextView.textSize = resources.getDimension(R.dimen.text_size_subject_time) / resources.displayMetrics.scaledDensity - subjectTeacherTextView.textSize = resources.getDimension(R.dimen.text_size_subject_teacher) / resources.displayMetrics.scaledDensity - - dayLayout.addView(subjectLayout) - - prevSubj = subj - } - - val subjectSeparator = Space(requireContext()) - subjectSeparator.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - resources.getDimensionPixelSize(R.dimen.cal_week_separator_height) // Specify separator height in resources - ) - - dayLayout.addView(subjectSeparator) - - val dayEndTextView = TextView(requireContext()) - val endTime = day.subjects[day.subjects.size - 1].end - Vars.dayEndString = "Den končí v $endTime" - dayEndTextView.text = Vars.dayEndString - dayEndTextView.typeface = customFont - //dayEndTextView.setAutoSizeTextTypeUniformWithConfiguration(55, 85, 1, 0) - dayEndTextView.setPadding(0, 25, 0, 25) - dayEndTextView.textAlignment = View.TEXT_ALIGNMENT_CENTER - dayEndTextView.gravity = Gravity.CENTER - dayEndTextView.setTextColor( - ContextCompat.getColor( - requireContext(), - R.color.white - ) - ) - - val dayEndDrawable = GradientDrawable() - dayEndDrawable.shape = GradientDrawable.RECTANGLE - dayEndDrawable.cornerRadius = resources.getDimension((R.dimen.corner_radius)) - dayEndDrawable.setColor( - ContextCompat.getColor( - requireContext(), - R.color.primary_transparent_bg - ) - ) - dayEndDrawable.setStroke( - 10, - ContextCompat.getColor( - requireContext(), - R.color.primary - ) - ) - dayEndTextView.background = dayEndDrawable - - val dayEndSeparator = Space(requireContext()) - dayEndSeparator.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - resources.getDimensionPixelSize(R.dimen.cal_week_separator_height) // Specify separator height in resources - ) - val dayEndSeparator2 = Space(requireContext()) - dayEndSeparator2.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - resources.getDimensionPixelSize(R.dimen.cal_week_separator_height) // Specify separator height in resources - ) - - val endParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - 130 - ) - endParams.setMargins( - resources.getDimensionPixelSize(R.dimen.cal_week_separator_height)/4, - 0, - resources.getDimensionPixelSize(R.dimen.cal_week_separator_height)/4, - 0 - ) - dayEndTextView.layoutParams = endParams - - dayLayout.addView(dayEndSeparator) - dayLayout.addView(dayEndTextView) - dayLayout.addView(dayEndSeparator2) - - scrollView.addView(dayLayout) - - rootLayout.addView(scrollView) - - // fill in the rest with empty space - val sepr = Space(requireContext()) - sepr.layoutParams = LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, - Vars.height - rootLayout.height - ) - - rootLayout.addView(sepr) - - nameDateTextView.textSize = resources.getDimension(R.dimen.text_size_name_date) / resources.displayMetrics.scaledDensity - dayEndTextView.textSize = resources.getDimension(R.dimen.text_size_day_end) / resources.displayMetrics.scaledDensity - } -} - -class Subject { - lateinit var name: String - lateinit var place: String - lateinit var teacher: String - lateinit var substitute: String - lateinit var number: String - lateinit var start: String - lateinit var end: String - var free: Boolean = false - - companion object { - fun freeSubject(number: String, start: String, end: String): Subject { - val s = Subject() - - s.name = "Volno" - s.place = "Volno" - s.teacher = "Volno" - s.substitute = "0" - s.number = number - s.start = start - s.end = end - s.free = true - - return s - } - - fun empty(): Subject { - val s = Subject() - - s.name = "err" - s.place = "error" - s.teacher = "error" - s.substitute = "0" - s.number = "0" - s.start = "00:00" - s.end = "00:00" - s.free = false - - return s - } - } - - override fun toString(): String { - return "subject ${this.name} at ${this.place} from ${this.start} to ${this.end}; free? ${this.free}" - } -} - -class Day { - var name: String = "" - var date: String = "" - var subjects: List = mutableListOf() -} \ No newline at end of file diff --git a/mobile/app/src/main/java/com/odweta/solon/Dialogs.kt b/mobile/app/src/main/java/com/odweta/solon/Dialogs.kt deleted file mode 100644 index 5bcda77..0000000 --- a/mobile/app/src/main/java/com/odweta/solon/Dialogs.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.odweta.solon - -import android.annotation.SuppressLint -import android.app.AlertDialog -import android.content.Context -import android.view.LayoutInflater -import androidx.core.content.ContextCompat - -class Dialogs { - @SuppressLint("InflateParams") - class LanguageChange(context: Context) : AlertDialog(context) { - init { - // Initialize your dialog properties - setTitle("Změnit jazyk") - setCancelable(true) - // Inflate the layout for the dialog - val view = LayoutInflater.from(context).inflate(R.layout.radio_group_language, null) - window?.setBackgroundDrawableResource(R.drawable.alert_dialog_background) - setView(view) - - // Set positive button (e.g., "OK" button) - setButton( - BUTTON_POSITIVE, - "OK" - ) { _, _ -> - // functionality here - dismiss() - } - - // Set negative button (e.g., "Cancel" button) - setButton( - BUTTON_NEGATIVE, - "Zrušit" - ) { _, _ -> - dismiss() - } - } - - override fun onStart() { - super.onStart() - - val okButton = getButton(BUTTON_POSITIVE) - okButton?.setTextColor(ContextCompat.getColor(context, R.color.white)) - val cancelButton = getButton(BUTTON_NEGATIVE) - cancelButton?.setTextColor(ContextCompat.getColor(context, R.color.white)) - } - } -} \ No newline at end of file diff --git a/mobile/app/src/main/java/com/odweta/solon/Launch.kt b/mobile/app/src/main/java/com/odweta/solon/Launch.kt new file mode 100644 index 0000000..810520a --- /dev/null +++ b/mobile/app/src/main/java/com/odweta/solon/Launch.kt @@ -0,0 +1,294 @@ +package com.odweta.solon + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.widget.Toast +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.delay +import org.json.JSONObject +import kotlin.math.cos + +private var week: List = mutableListOf() +private var toastShowing: Boolean = false +private var toastShown: Boolean = false +private var toast2Shown: Boolean = false + +private lateinit var coscope_: CoroutineScope + +private fun setOnInternetAvailListener(ctx: Context, coscope: CoroutineScope) { + coscope.launch { + while (true) { + if (Util.internetAvail(ctx) && !internetAvail) { + internetAvail = Util.internetAvail(ctx) + coscope.launch { + fetchNewData(ctx, coscope) + } + } else if (!internetAvail) { + internetAvail = Util.internetAvail(ctx) + toolbarText.value = "Bez připojení k internetu." + } else { + internetAvail = Util.internetAvail(ctx) + } + delay(1000) // Check for internet availability every second + } + } +} + +private fun fetchNewData(ctx: Context, coscope: CoroutineScope) { + coscope.launch { + done = false + + // variables for the loading animation + val loadingArray: Array = arrayOf( + "Načítání nových dat", + "Načítání nových dat.", + "Načítání nových dat..", + "Načítání nových dat..." + ) + val delayTime: Long = 300 // delay in ms + + // show a loading animation + while (!done && Util.internetAvail(ctx)) { + for (text in loadingArray) { + toolbarText.value = text + delay(delayTime) + } + + for (text in loadingArray.reversedArray().slice(1.. = mutableListOf() - private var toastShowing: Boolean = false - private var toastShown: Boolean = false - private var toast2Shown: Boolean = false - - // @section COMPANION - companion object { - private var intfc: MainActivityListener? = null - - fun setListener(context: Context) { - if (context is MainActivityListener) { - intfc = context - } - } - - fun callOnSignIn(view: View, wantDelete: Boolean, dialog: Dialog?) { - intfc?.onSignIn(view, wantDelete, dialog) - } - - fun callLaunchPhase1() { - intfc?.launchPhase1() - } - } - - - // @section LISTENERS +class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - // set variables - Vars.fileDir = applicationContext.filesDir - Vars.width = Util.getDisplayWidth(this) - Vars.height = Util.getDisplayHeight(this) + makeStatusBarBlack(window) - // start the app (coroutine because splashscreen) - lifecycleScope.launch { - launch() - } - } - - - - - // @section SIGN_IN - override fun onSignIn(view: View, wantDelete: Boolean, dialog: Dialog?) { - val acc = Account( - view.findViewById(R.id.usernameField).text.toString(), - view.findViewById(R.id.passwordField).text.toString(), - 0 - ) - - var checked = false - lifecycleScope.launch { - val btn = view.findViewById