From affd89a5f62dbcc754cb5534e2186be5b4ee42be Mon Sep 17 00:00:00 2001 From: hlwdy Date: Tue, 26 Nov 2024 18:29:24 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E4=B8=AA=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 20 + .idea/.gitignore | 3 + .idea/compiler.xml | 6 + .idea/deploymentTargetSelector.xml | 10 + .idea/gradle.xml | 19 + .idea/kotlinc.xml | 6 + .idea/migrations.xml | 10 + .idea/misc.xml | 10 + .idea/vcs.xml | 6 + Beijing_University_of_Technology.svg | 281 ++++++++++++ README.md | 33 ++ app/.gitignore | 1 + app/build.gradle.kts | 89 ++++ app/proguard-rules.pro | 31 ++ .../com/hlwdy/bjut/ExampleInstrumentedTest.kt | 24 + app/src/main/AndroidManifest.xml | 54 +++ app/src/main/ic_launcher-playstore.png | Bin 0 -> 19384 bytes app/src/main/java/com/hlwdy/bjut/ApkUpdate.kt | 10 + app/src/main/java/com/hlwdy/bjut/BjutAPI.kt | 160 +++++++ .../main/java/com/hlwdy/bjut/LogDbHelper.kt | 98 ++++ .../main/java/com/hlwdy/bjut/MainActivity.kt | 275 ++++++++++++ .../main/java/com/hlwdy/bjut/NativeEncrypt.kt | 10 + .../java/com/hlwdy/bjut/RouterActivity.kt | 40 ++ .../com/hlwdy/bjut/account_session_util.kt | 72 +++ .../main/java/com/hlwdy/bjut/basefragment.kt | 62 +++ app/src/main/java/com/hlwdy/bjut/encrypt.kt | 82 ++++ .../main/java/com/hlwdy/bjut/request_util.kt | 64 +++ .../java/com/hlwdy/bjut/ui/AboutActivity.kt | 24 + .../java/com/hlwdy/bjut/ui/LogViewActivity.kt | 96 ++++ .../java/com/hlwdy/bjut/ui/LoginActivity.kt | 228 ++++++++++ .../com/hlwdy/bjut/ui/card/CardFragment.kt | 252 +++++++++++ .../com/hlwdy/bjut/ui/card/CardViewModel.kt | 11 + .../com/hlwdy/bjut/ui/home/HomeFragment.kt | 70 +++ .../com/hlwdy/bjut/ui/home/WebVpnEntry.kt | 155 +++++++ .../hlwdy/bjut/ui/library/LibraryFragment.kt | 42 ++ .../hlwdy/bjut/ui/library/LibraryViewModel.kt | 13 + .../main/java/com/hlwdy/bjut/ui/loading.kt | 41 ++ .../com/hlwdy/bjut/ui/news/NewsAdapter.kt | 36 ++ .../hlwdy/bjut/ui/news/NewsDetailActivity.kt | 81 ++++ .../com/hlwdy/bjut/ui/news/NewsFragment.kt | 200 +++++++++ .../java/com/hlwdy/bjut/ui/news/NewsItem.kt | 8 + .../com/hlwdy/bjut/ui/news/NewsViewModel.kt | 16 + .../java/com/hlwdy/bjut/ui/otp/OtpFragment.kt | 379 ++++++++++++++++ .../bjut/ui/schedule/ScheduleFragment.kt | 424 ++++++++++++++++++ .../bjut/ui/schedule/ScheduleViewModel.kt | 30 ++ app/src/main/java/com/hlwdy/bjut/vpnOTP.kt | 54 +++ .../res/drawable/baseline_arrow_back_24.xml | 5 + .../res/drawable/baseline_credit_card_24.xml | 5 + .../main/res/drawable/baseline_home_24.xml | 5 + .../res/drawable/baseline_menu_book_24.xml | 11 + .../res/drawable/baseline_newspaper_24.xml | 5 + .../res/drawable/baseline_password_24.xml | 5 + .../main/res/drawable/baseline_person_24.xml | 5 + .../main/res/drawable/baseline_qr_code_24.xml | 25 ++ .../res/drawable/baseline_restore_page_24.xml | 5 + .../res/drawable/baseline_table_chart_24.xml | 5 + .../res/drawable/baseline_vpn_lock_24.xml | 5 + app/src/main/res/drawable/bjut.webp | Bin 0 -> 105146 bytes app/src/main/res/drawable/bjut_all.webp | Bin 0 -> 103030 bytes .../res/drawable/ic_launcher_background.xml | 170 +++++++ .../res/drawable/ic_launcher_foreground.xml | 31 ++ .../res/drawable/ic_launcher_foreground1.xml | 30 ++ app/src/main/res/drawable/side_nav_bar.xml | 9 + app/src/main/res/layout/activity_about.xml | 84 ++++ app/src/main/res/layout/activity_log_view.xml | 12 + app/src/main/res/layout/activity_main.xml | 25 ++ app/src/main/res/layout/activity_router.xml | 11 + app/src/main/res/layout/app_bar_main.xml | 26 ++ app/src/main/res/layout/content_main.xml | 20 + app/src/main/res/layout/dialog_loading.xml | 17 + app/src/main/res/layout/fragment_card.xml | 13 + app/src/main/res/layout/fragment_home.xml | 89 ++++ app/src/main/res/layout/fragment_library.xml | 21 + app/src/main/res/layout/fragment_news.xml | 24 + app/src/main/res/layout/fragment_otp.xml | 89 ++++ app/src/main/res/layout/fragment_schedule.xml | 43 ++ app/src/main/res/layout/item_log.xml | 45 ++ app/src/main/res/layout/login_page.xml | 76 ++++ app/src/main/res/layout/nav_header_main.xml | 35 ++ app/src/main/res/layout/news_detail.xml | 26 ++ app/src/main/res/layout/news_item_layout.xml | 23 + app/src/main/res/layout/webvpn_view.xml | 61 +++ .../main/res/menu/activity_main_drawer.xml | 33 ++ app/src/main/res/menu/main.xml | 24 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 2268 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 3552 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1930 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 2454 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 2602 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 4798 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 3714 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 7366 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 5600 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 10664 bytes .../main/res/navigation/mobile_navigation.xml | 43 ++ app/src/main/res/values-land/dimens.xml | 3 + app/src/main/res/values-night/themes.xml | 22 + app/src/main/res/values-w1240dp/dimens.xml | 3 + app/src/main/res/values-w600dp/dimens.xml | 3 + app/src/main/res/values/attrs.xml | 6 + app/src/main/res/values/colors.xml | 14 + app/src/main/res/values/dimens.xml | 8 + app/src/main/res/values/strings.xml | 23 + app/src/main/res/values/themes.xml | 55 +++ app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + app/src/main/res/xml/shortcuts.xml | 36 ++ .../java/com/hlwdy/bjut/ExampleUnitTest.kt | 17 + bjut.svg | 1 + bjuticon.svg | 10 + build.gradle.kts | 5 + gradle.properties | 23 + gradle/libs.versions.toml | 34 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++ gradlew.bat | 89 ++++ img/1.jpg | Bin 0 -> 154625 bytes img/2.jpg | Bin 0 -> 232612 bytes img/3.jpg | Bin 0 -> 533831 bytes img/4.jpg | Bin 0 -> 282961 bytes img/5.jpg | Bin 0 -> 240873 bytes settings.gradle.kts | 24 + 125 files changed, 5406 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/deploymentTargetSelector.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 Beijing_University_of_Technology.svg create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle.kts create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/hlwdy/bjut/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/ic_launcher-playstore.png create mode 100644 app/src/main/java/com/hlwdy/bjut/ApkUpdate.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/BjutAPI.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/LogDbHelper.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/MainActivity.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/NativeEncrypt.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/RouterActivity.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/account_session_util.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/basefragment.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/encrypt.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/request_util.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/AboutActivity.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/LogViewActivity.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/LoginActivity.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/card/CardFragment.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/card/CardViewModel.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/home/HomeFragment.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/home/WebVpnEntry.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/library/LibraryFragment.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/library/LibraryViewModel.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/loading.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/news/NewsAdapter.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/news/NewsDetailActivity.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/news/NewsFragment.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/news/NewsItem.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/news/NewsViewModel.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/otp/OtpFragment.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/schedule/ScheduleFragment.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/ui/schedule/ScheduleViewModel.kt create mode 100644 app/src/main/java/com/hlwdy/bjut/vpnOTP.kt create mode 100644 app/src/main/res/drawable/baseline_arrow_back_24.xml create mode 100644 app/src/main/res/drawable/baseline_credit_card_24.xml create mode 100644 app/src/main/res/drawable/baseline_home_24.xml create mode 100644 app/src/main/res/drawable/baseline_menu_book_24.xml create mode 100644 app/src/main/res/drawable/baseline_newspaper_24.xml create mode 100644 app/src/main/res/drawable/baseline_password_24.xml create mode 100644 app/src/main/res/drawable/baseline_person_24.xml create mode 100644 app/src/main/res/drawable/baseline_qr_code_24.xml create mode 100644 app/src/main/res/drawable/baseline_restore_page_24.xml create mode 100644 app/src/main/res/drawable/baseline_table_chart_24.xml create mode 100644 app/src/main/res/drawable/baseline_vpn_lock_24.xml create mode 100644 app/src/main/res/drawable/bjut.webp create mode 100644 app/src/main/res/drawable/bjut_all.webp create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground1.xml create mode 100644 app/src/main/res/drawable/side_nav_bar.xml create mode 100644 app/src/main/res/layout/activity_about.xml create mode 100644 app/src/main/res/layout/activity_log_view.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_router.xml create mode 100644 app/src/main/res/layout/app_bar_main.xml create mode 100644 app/src/main/res/layout/content_main.xml create mode 100644 app/src/main/res/layout/dialog_loading.xml create mode 100644 app/src/main/res/layout/fragment_card.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/fragment_library.xml create mode 100644 app/src/main/res/layout/fragment_news.xml create mode 100644 app/src/main/res/layout/fragment_otp.xml create mode 100644 app/src/main/res/layout/fragment_schedule.xml create mode 100644 app/src/main/res/layout/item_log.xml create mode 100644 app/src/main/res/layout/login_page.xml create mode 100644 app/src/main/res/layout/nav_header_main.xml create mode 100644 app/src/main/res/layout/news_detail.xml create mode 100644 app/src/main/res/layout/news_item_layout.xml create mode 100644 app/src/main/res/layout/webvpn_view.xml create mode 100644 app/src/main/res/menu/activity_main_drawer.xml create mode 100644 app/src/main/res/menu/main.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/navigation/mobile_navigation.xml create mode 100644 app/src/main/res/values-land/dimens.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values-w1240dp/dimens.xml create mode 100644 app/src/main/res/values-w600dp/dimens.xml create mode 100644 app/src/main/res/values/attrs.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml create mode 100644 app/src/main/res/xml/shortcuts.xml create mode 100644 app/src/test/java/com/hlwdy/bjut/ExampleUnitTest.kt create mode 100644 bjut.svg create mode 100644 bjuticon.svg create mode 100644 build.gradle.kts create mode 100644 gradle.properties create mode 100644 gradle/libs.versions.toml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 img/1.jpg create mode 100644 img/2.jpg create mode 100644 img/3.jpg create mode 100644 img/4.jpg create mode 100644 img/5.jpg create mode 100644 settings.gradle.kts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0353834 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +*.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 +/app/build +/app/.cxx +/app/release +/app/src/main/cpp +/app/src/main/jniLibs \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..359bb53 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..0897082 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..fdf8d99 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0ad17cb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Beijing_University_of_Technology.svg b/Beijing_University_of_Technology.svg new file mode 100644 index 0000000..c91a101 --- /dev/null +++ b/Beijing_University_of_Technology.svg @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..32d230b --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# bjut app + +日新工大第三方安卓版本,本APP是非官方的,免费开源的,功能实现完全依赖官方接口,个人数据仅保存在本地。初衷是集成北京工业大学 (BJUT) 所有有用的线上功能,本应用后续不定期更新。 +本APP无意冒充官方日新工大,请认真辨别,禁止用于非法用途。 + +## 计划支持的功能 + +* [x] 课程表查看 +* [x] 校园一卡通服务 +* [x] 新闻查看 +* [x] WEBVPN集成 +* [x] 集成校内VPN动态otp验证码 (特色) +* [x] 桌面APP长按快捷菜单 +* [ ] 图书馆相关功能 +* [ ] 校内邮箱浏览 +* [ ] 办事大厅 +* [ ] 重要消息提示 + +## 应用编写说明 + +本代码使用Android Studio kotlin编写,由于版权和安全因素,部分静态链接库未在此处发布。相当于官版日新工大,此应用优化了一些数据的缓存逻辑,整体界面使用类Google Material风格设计,且适配了系统的暗色主题,部分页面依赖于系统WebView。 + +## 应用兼容性说明 + +本app支持armeabi-v7a和arm64-v8a两种安卓架构,理论上支持Android 7.0+版本。 + +## 应用内部分截图 + +![image](./img/1.jpg) +![image](./img/2.jpg) +![image](./img/3.jpg) +![image](./img/4.jpg) +![image](./img/5.jpg) \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..2ba7535 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,89 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) +} + +android { + namespace = "com.hlwdy.bjut" + compileSdk = 34 + + defaultConfig { + applicationId = "com.hlwdy.bjut" + minSdk = 24 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" + ndk { + abiFilters += listOf("armeabi-v7a", "arm64-v8a") + } + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + cppFlags("-std=c++14") + //arguments("-DANDROID_STL=c++_shared") + arguments("-DANDROID_STL=none") + } + } + } + + splits { + abi { + isEnable = true + reset() + include("armeabi-v7a", "arm64-v8a") + isUniversalApk=true + } + } + + sourceSets { + getByName("main") { + jniLibs.srcDirs("src/main/jniLibs") + } + } + + buildTypes { + release { + isMinifyEnabled = true + isShrinkResources = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = "1.8" + } + buildFeatures { + viewBinding = true + } + + externalNativeBuild { + cmake { + path("src/main/cpp/CMakeLists.txt") + } + } +} + +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.material) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.lifecycle.livedata.ktx) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.navigation.fragment.ktx) + implementation(libs.androidx.navigation.ui.ktx) + implementation(libs.androidx.gridlayout) + testImplementation(libs.junit) + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + + implementation("com.squareup.okhttp3:okhttp:4.10.0") + implementation("androidx.core:core-splashscreen:1.0.1") +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f4b5930 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,31 @@ +# 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 + +-dontwarn org.bouncycastle.jsse.BCSSLParameters +-dontwarn org.bouncycastle.jsse.BCSSLSocket +-dontwarn org.bouncycastle.jsse.provider.BouncyCastleJsseProvider +-dontwarn org.conscrypt.Conscrypt$Version +-dontwarn org.conscrypt.Conscrypt +-dontwarn org.conscrypt.ConscryptHostnameVerifier +-dontwarn org.openjsse.javax.net.ssl.SSLParameters +-dontwarn org.openjsse.javax.net.ssl.SSLSocket +-dontwarn org.openjsse.net.ssl.OpenJSSE \ No newline at end of file diff --git a/app/src/androidTest/java/com/hlwdy/bjut/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/hlwdy/bjut/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..64e8c9b --- /dev/null +++ b/app/src/androidTest/java/com/hlwdy/bjut/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.hlwdy.bjut + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.hlwdy.bjut", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..68247bc --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..d562689f0cc714dbd4462580560c542836455461 GIT binary patch literal 19384 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%0DRUCuS+aWjTdugGIr`1O?+G8HZh+)o@aRy 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%0AHy5lxgK%0 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.currentTimeMillis() / 1000L)){ + //showToast("use tk cache") + appLogger.e("Info", "Use WebVPNTK cache:$time_str") + return + } + } + //refresh webvpn tk + BjutAPI().getWebVpnCookie(account_session_util(this).getUserDetails()[account_session_util.KEY_SESS].toString(),object : + Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) { + var tk=getCookieValue(response.request.headers.get("Cookie").toString(),"wengine_vpn_ticketwebvpn_bjut_edu_cn") + updateVPNTK(tk.toString()) + appLogger.e("Info", "New WebVPN tk $tk") + //showToast("new webvpn tk $tk") + //prelogin to my + BjutAPI().WebVpnLoginMy(tk.toString() + ,object : + Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) {} + }) + } + }) + } + + private lateinit var appBarConfiguration: AppBarConfiguration + private lateinit var binding: ActivityMainBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + appLogger.init(this) + + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + + //webvpn + refreshWebVpn() + + setSupportActionBar(binding.appBarMain.toolbar) + + val drawerLayout: DrawerLayout = binding.drawerLayout + val navView: NavigationView = binding.navView + val navController = findNavController(R.id.nav_host_fragment_content_main) + // Passing each menu ID as a set of Ids because each + // menu should be considered as top level destinations. + appBarConfiguration = AppBarConfiguration( + setOf( + R.id.nav_home,R.id.nav_news, R.id.nav_card, R.id.nav_library,R.id.nav_schedule,R.id.nav_otp + ), drawerLayout + ) + setupActionBarWithNavController(navController, appBarConfiguration) + navView.setupWithNavController(navController) + + window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) + + val navheader=binding.navView.getHeaderView(0) + var user_info=account_session_util(this).getUserDetails() + navheader.findViewById(R.id.name_text).setText(user_info[account_session_util.KEY_NAME]) + navheader.findViewById(R.id.userid).setText(user_info[account_session_util.KEY_USERNAME]) + + appLogger.e("Info", "User配置读取完成-"+user_info[account_session_util.KEY_USERNAME]) + } + + fun clearAppWebView() { + try { + // 获取应用的 app_webview 目录 + val webviewDir = File(this.applicationInfo.dataDir, "app_webview") + if (webviewDir.exists()) { + webviewDir.deleteRecursively() + } + showToast("Cleared successfully") + + } catch (e: Exception) { + showToast("Error clearing webview data: ${e.message}") + e.printStackTrace() + } + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + // Inflate the menu; this adds items to the action bar if it is present. + menuInflater.inflate(R.menu.main, menu) + return true + } + + fun logout(){ + Toast.makeText(this, "logout", Toast.LENGTH_SHORT).show() + account_session_util(this).logoutUser() + val intent = Intent(this, LoginActivity::class.java) + startActivity(intent) + finish() + } + + fun ShowUpdate(res: JSONObject) { + val Curversion = packageManager.getPackageInfo(packageName, 0).versionName + if (Curversion != res.getString("tag_name")) { + val tmp = res.getJSONArray("assets") + android.os.Handler(this.mainLooper).post { + val container = LinearLayout(this).apply { + orientation = LinearLayout.VERTICAL + layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) + setPadding(32, 16, 32, 16) + } + + // 版本信息 + TextView(this).apply { + text = """ + 当前版本:$Curversion + 新版本发布日期:${res.getString("published_at")} + + 更新内容: + ${res.getString("body")} + + 可用下载: + """.trimIndent() + container.addView(this) + } + + // 为每个下载项创建按钮 + for (i in 0 until tmp.length()) { + val classObject = tmp.getJSONObject(i) + val name = classObject.getString("name") + val url = classObject.getString("browser_download_url") +/* + TextView(this).apply { + text = name + setPadding(0, 16, 0, 4) + container.addView(this) + } +*/ + MaterialButton(this).apply { + text = "$name" + setOnClickListener { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(intent) + } + isAllCaps = false + container.addView(this) + } + } + + MaterialAlertDialogBuilder(this) + .setTitle("发现新版本:" + res.getString("tag_name")) + .setView(container) + .setNegativeButton("稍后再说") { dialog, _ -> + dialog.dismiss() + } + .setCancelable(false) + .show() + } + }else{ + showToast("已是最新版本") + } + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + return when (item.itemId) { + R.id.action_clearCache->{ + clearAppWebView() + true + } + //logout + R.id.action_logout -> { + if(account_session_util(this).getUserDetails()[account_session_util.KEY_OTPDATA]==null){ + logout() + }else{ + MaterialAlertDialogBuilder(this) + .setTitle("退出前请备份好OTPdata,否则无法找回,是否确认退出?") + .setPositiveButton("继续退出") { _, _ -> + logout() + } + .setNegativeButton("取消", null) + .show() + } + true + } + R.id.action_loglook->{ + startActivity(Intent(this, LogViewActivity::class.java)) + true + } + R.id.action_about->{ + startActivity(Intent(this, AboutActivity::class.java)) + true + } + R.id.action_checkUpdate->{ + ApkUpdate().getLatest(object : Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) { + val res_text=response.body?.string().toString() + try{ + val res=JSONObject(res_text) + ShowUpdate(res) + }catch (e: JSONException){ + showToast("error") + appLogger.e("Error", "Try CheckUpdate error",e) + } + } + }) + true + } + else -> super.onOptionsItemSelected(item) + } + } + + override fun onSupportNavigateUp(): Boolean { + val navController = findNavController(R.id.nav_host_fragment_content_main) + return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/NativeEncrypt.kt b/app/src/main/java/com/hlwdy/bjut/NativeEncrypt.kt new file mode 100644 index 0000000..df13d90 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/NativeEncrypt.kt @@ -0,0 +1,10 @@ +package com.hlwdy.bjut + +class NativeEncrypthlwdyck { + init { + System.loadLibrary("encrypt") + } + + external fun keypr(): String + external fun keypu(): String +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/RouterActivity.kt b/app/src/main/java/com/hlwdy/bjut/RouterActivity.kt new file mode 100644 index 0000000..8cf6dc0 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/RouterActivity.kt @@ -0,0 +1,40 @@ +package com.hlwdy.bjut + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen +import com.hlwdy.bjut.ui.card.CardFragment +import com.hlwdy.bjut.ui.otp.OtpFragment +import com.hlwdy.bjut.ui.schedule.ScheduleFragment + +class RouterActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + val splashScreen = installSplashScreen() + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_router) + + appLogger.init(this) + + if (intent?.action == "openCardCode") { + val fragment = CardFragment().apply { + arguments = Bundle().apply { + putBoolean("jump_code", true) + } + } + + supportFragmentManager.beginTransaction() + .replace(R.id.container, fragment) + .commit() + }else if (intent?.action == "openSchedule") { + val fragment = ScheduleFragment() + supportFragmentManager.beginTransaction() + .replace(R.id.container, fragment) + .commit() + }else if (intent?.action == "openOTP") { + val fragment = OtpFragment() + supportFragmentManager.beginTransaction() + .replace(R.id.container, fragment) + .commit() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/account_session_util.kt b/app/src/main/java/com/hlwdy/bjut/account_session_util.kt new file mode 100644 index 0000000..ecd0621 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/account_session_util.kt @@ -0,0 +1,72 @@ +package com.hlwdy.bjut + +import android.content.Context +import android.content.SharedPreferences + +class account_session_util(context: Context) { + private var prefs: SharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE) + private var editor: SharedPreferences.Editor = prefs.edit() + + companion object { + const val PREF_NAME = "AppPrefs" + const val IS_LOGIN = "IsLogin" + const val KEY_USERNAME = "usname" + const val KEY_NAME = "name" + const val KEY_TK = "ticket" + const val KEY_SESS = "ses" + const val KEY_LGTIME = "lgtime" + const val KEY_WEBVPNTK="webvpn" + const val KEY_WEBVPNTKTIME="webvpntktime" + const val KEY_CARDID="cardid" + const val KEY_OTPDATA="otpdata" + } + + fun createLoginSession(usname: String,name: String,tk: String,ses: String) { + editor.putBoolean(IS_LOGIN, true) + editor.putString(KEY_USERNAME, usname) + editor.putString(KEY_NAME, name) + editor.putString(KEY_SESS, ses) + editor.putString(KEY_TK, tk) + editor.putString(KEY_LGTIME, System.currentTimeMillis().toString()) + editor.commit() + } + + fun isLoggedIn(): Boolean { + return prefs.getBoolean(IS_LOGIN, false) + } + + fun getUserDetails(): HashMap { + val user = HashMap() + user[KEY_USERNAME] = prefs.getString(KEY_USERNAME, null) + user[KEY_NAME] = prefs.getString(KEY_NAME, null) + user[KEY_SESS] = prefs.getString(KEY_SESS, null) + user[KEY_TK] = prefs.getString(KEY_TK, null) + user[KEY_LGTIME] = prefs.getString(KEY_LGTIME, null) + user[KEY_WEBVPNTK] = prefs.getString(KEY_WEBVPNTK, null) + user[KEY_WEBVPNTKTIME] = prefs.getString(KEY_WEBVPNTKTIME, "0") + user[KEY_CARDID] = prefs.getString(KEY_CARDID, null) + user[KEY_OTPDATA] = prefs.getString(KEY_OTPDATA, null) + return user + } + + fun logoutUser() { + editor.clear() + editor.commit() + } + + fun editWebVpnTK(tk: String,time:String) { + editor.putString(KEY_WEBVPNTK, tk) + editor.putString(KEY_WEBVPNTKTIME, time) + editor.commit() + } + + fun editCardID(id: String) { + editor.putString(KEY_CARDID, id) + editor.commit() + } + + fun editOTPData(data: String) { + editor.putString(KEY_OTPDATA, data) + editor.commit() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/basefragment.kt b/app/src/main/java/com/hlwdy/bjut/basefragment.kt new file mode 100644 index 0000000..aa488b3 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/basefragment.kt @@ -0,0 +1,62 @@ +package com.hlwdy.bjut + +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import androidx.fragment.app.Fragment +import com.hlwdy.bjut.ui.LoadingDialog + +abstract class BaseFragment : Fragment() { + private var loadingView: View? = null + + protected fun showLoading() { + if (loadingView == null) { + // 获取Fragment的根视图 + val rootView = view as? ViewGroup ?: return + + // 创建加载视图 + loadingView = layoutInflater.inflate(R.layout.dialog_loading, null) + + // 创建与父容器相同大小的LayoutParams + val params = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + + // 找到Fragment内容的实际位置 + val location = IntArray(2) + rootView.getLocationInWindow(location) + + // 设置loadingView的位置和大小 + loadingView?.layoutParams = params + + // 添加到根视图 + rootView.addView(loadingView) + + // 确保loadingView在最上层 + loadingView?.bringToFront() + } + loadingView?.visibility = View.VISIBLE + } + + fun hideLoading() { + loadingView?.visibility = View.GONE + } + + override fun onDestroyView() { + super.onDestroyView() + (loadingView?.parent as? ViewGroup)?.removeView(loadingView) + loadingView = null + } + + // 协程扩展函数 + protected suspend fun withLoading(block: suspend () -> T): T { + try { + showLoading() + return block() + } finally { + hideLoading() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/encrypt.kt b/app/src/main/java/com/hlwdy/bjut/encrypt.kt new file mode 100644 index 0000000..10726ec --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/encrypt.kt @@ -0,0 +1,82 @@ +package com.hlwdy.bjut + +import java.security.spec.PKCS8EncodedKeySpec +import java.security.spec.X509EncodedKeySpec +import java.security.KeyFactory +import java.security.PrivateKey +import java.security.PublicKey +import android.util.Base64 +import javax.crypto.Cipher + +object RSAUtils { + private const val RSA = "RSA" + private const val RSA_PADDING = "RSA/ECB/PKCS1Padding" + private const val MAX_ENCRYPT_BLOCK = 117 // RSA_KEY_SIZE / 8 - 11 for PKCS1Padding + private const val MAX_DECRYPT_BLOCK = 128 // RSA_KEY_SIZE / 8 + + fun encrypt(data: String, publicKey: String): String { + val keySpec = X509EncodedKeySpec(Base64.decode(publicKey, Base64.NO_WRAP)) + val keyFactory = KeyFactory.getInstance(RSA) + val key: PublicKey = keyFactory.generatePublic(keySpec) + val cipher = Cipher.getInstance(RSA_PADDING) + cipher.init(Cipher.ENCRYPT_MODE, key) + + val dataBytes = data.toByteArray() + val inputLen = dataBytes.size + var offset = 0 + val output = mutableListOf() + + while (inputLen - offset > 0) { + val curBlock = if (inputLen - offset > MAX_ENCRYPT_BLOCK) MAX_ENCRYPT_BLOCK else inputLen - offset + val encryptedBlock = cipher.doFinal(dataBytes, offset, curBlock) + output.addAll(encryptedBlock.toList()) + offset += curBlock + } + + return Base64.encodeToString(output.toByteArray(), Base64.NO_WRAP) + } + + fun decrypt(data: String, privateKey: String): String { + val keySpec = PKCS8EncodedKeySpec(Base64.decode(privateKey, Base64.NO_WRAP)) + val keyFactory = KeyFactory.getInstance(RSA) + val key: PrivateKey = keyFactory.generatePrivate(keySpec) + val cipher = Cipher.getInstance(RSA_PADDING) + cipher.init(Cipher.DECRYPT_MODE, key) + + val encryptedData = Base64.decode(data, Base64.NO_WRAP) + val inputLen = encryptedData.size + var offset = 0 + val output = mutableListOf() + + while (inputLen - offset > 0) { + val curBlock = if (inputLen - offset > MAX_DECRYPT_BLOCK) MAX_DECRYPT_BLOCK else inputLen - offset + val decryptedBlock = cipher.doFinal(encryptedData, offset, curBlock) + output.addAll(decryptedBlock.toList()) + offset += curBlock + } + + return String(output.toByteArray()) + } +} + +object BjutHttpRsa{ + private val PRIVATE_KEY = NativeEncrypthlwdyck().keypr() + private val PUBLIC_KEY = NativeEncrypthlwdyck().keypu() + fun requestDecrypt(paramString: String): String { + return try { + RSAUtils.decrypt(paramString, PRIVATE_KEY) + } catch (exception: Exception) { + exception.printStackTrace() + "" + } + } + + fun requestEncrypt(paramString: String): String { + return try { + RSAUtils.encrypt(paramString, PUBLIC_KEY) + } catch (exception: Exception) { + exception.printStackTrace() + "" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/request_util.kt b/app/src/main/java/com/hlwdy/bjut/request_util.kt new file mode 100644 index 0000000..ebd56f4 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/request_util.kt @@ -0,0 +1,64 @@ +package com.hlwdy.bjut + +import okhttp3.* +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody.Companion.toRequestBody + +class HttpUtils { + private var params = mutableMapOf() + private var headers = mutableMapOf() + + fun get(url: String,is_redirect:Boolean,callBack: Callback) { + val okHttpClient = OkHttpClient().newBuilder().followRedirects(is_redirect).build() + val request: Request = Request.Builder().apply { + headers.forEach { + addHeader(it.key, it.value) + } + url(url) + get() + }.build() + okHttpClient.newCall(request).enqueue(callBack) + } + + fun post(url: String, callBack: Callback) { + val okHttpClient = OkHttpClient() + val formBody: FormBody.Builder = FormBody.Builder() + params.forEach(formBody::add) + val request: Request = Request.Builder() + .apply { + headers.forEach { + addHeader(it.key, it.value) + } + url(url) + post(formBody.build()) + }.build() + okHttpClient.newCall(request).enqueue(callBack) + } + + fun postJson(url: String, jsonString: String, callBack: Callback) { + val okHttpClient = OkHttpClient() + val stringBody = jsonString.toRequestBody("application/json;charset=utf-8".toMediaType()) + val request: Request = Request.Builder().apply { + headers.forEach { + addHeader(it.key, it.value) + } + url(url) + post(stringBody) + }.build() + + okHttpClient.newCall(request).enqueue(callBack) + + } + + fun addParam(key: String, value: String): HttpUtils { + params[key] = value + return this + } + + fun addHeader(key: String, value: String): HttpUtils { + headers[key] = value + return this + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/AboutActivity.kt b/app/src/main/java/com/hlwdy/bjut/ui/AboutActivity.kt new file mode 100644 index 0000000..b6f2176 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/AboutActivity.kt @@ -0,0 +1,24 @@ +package com.hlwdy.bjut.ui + +import android.os.Bundle +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import com.hlwdy.bjut.R + +class AboutActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_about) + + val versionName = try { + packageManager.getPackageInfo(packageName, 0).versionName + } catch (e: Exception) { + "unknown" + } + + // 设置版本号文本 + findViewById(R.id.tvVersion).text = "Version $versionName" + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/LogViewActivity.kt b/app/src/main/java/com/hlwdy/bjut/ui/LogViewActivity.kt new file mode 100644 index 0000000..e52d2ff --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/LogViewActivity.kt @@ -0,0 +1,96 @@ +package com.hlwdy.bjut.ui + +import android.database.Cursor +import android.graphics.Color +import android.icu.text.SimpleDateFormat +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.hlwdy.bjut.LogDbHelper +import com.hlwdy.bjut.appLogger +import com.hlwdy.bjut.R +import java.util.Date +import java.util.Locale + +class LogAdapter : RecyclerView.Adapter() { + private var cursor: Cursor? = null + private val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) + + fun swapCursor(newCursor: Cursor?) { + cursor?.close() + cursor = newCursor + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_log, parent, false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + cursor?.let { cursor -> + if (cursor.moveToPosition(position)) { + val timestamp = cursor.getLong(cursor.getColumnIndexOrThrow(LogDbHelper.COLUMN_TIMESTAMP)) + val tag = cursor.getString(cursor.getColumnIndexOrThrow(LogDbHelper.COLUMN_TAG)) + val message = cursor.getString(cursor.getColumnIndexOrThrow(LogDbHelper.COLUMN_MESSAGE)) + val stackTrace = cursor.getString(cursor.getColumnIndexOrThrow(LogDbHelper.COLUMN_STACK_TRACE)) + + holder.bind(timestamp, tag, message, stackTrace) + } + } + } + + override fun getItemCount(): Int = cursor?.count ?: 0 + + inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + private val tvTimestamp: TextView = view.findViewById(R.id.tvTimestamp) + private val tvTag: TextView = view.findViewById(R.id.tvTag) + private val tvMessage: TextView = view.findViewById(R.id.tvMessage) + private val tvStackTrace: TextView = view.findViewById(R.id.tvStackTrace) + + fun bind(timestamp: Long, tag: String, message: String, stackTrace: String?) { + tvTimestamp.text = dateFormat.format(Date(timestamp)) + tvTag.text = tag + if(tag=="Error")tvTag.setTextColor(Color.RED) + tvMessage.text = message + + if (stackTrace != null) { + tvStackTrace.visibility = View.VISIBLE + tvStackTrace.text = stackTrace + } else { + tvStackTrace.visibility = View.GONE + } + } + } +} + +class LogViewActivity : AppCompatActivity() { + private lateinit var recyclerView: RecyclerView + private lateinit var adapter: LogAdapter + private var cursor: Cursor? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_log_view) + + recyclerView = findViewById(R.id.recyclerView) + recyclerView.layoutManager = LinearLayoutManager(this) + + adapter = LogAdapter() + recyclerView.adapter = adapter + + cursor = appLogger.getLogs() + adapter.swapCursor(cursor) + } + + override fun onDestroy() { + cursor?.close() + super.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/LoginActivity.kt b/app/src/main/java/com/hlwdy/bjut/ui/LoginActivity.kt new file mode 100644 index 0000000..0c64eb1 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/LoginActivity.kt @@ -0,0 +1,228 @@ +package com.hlwdy.bjut.ui + +import android.content.Context +import android.content.Intent +import android.content.SharedPreferences +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Canvas +import android.graphics.Matrix +import android.os.Bundle +import android.text.method.HideReturnsTransformationMethod +import android.text.method.PasswordTransformationMethod +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +import android.widget.Button +import android.widget.CheckBox +import android.widget.EditText +import android.widget.FrameLayout +import android.widget.ImageButton +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen +import com.hlwdy.bjut.BjutAPI +import com.hlwdy.bjut.BjutHttpRsa +import com.hlwdy.bjut.MainActivity +import com.hlwdy.bjut.R +import com.hlwdy.bjut.account_session_util +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import okhttp3.* +import java.io.IOException +import org.json.JSONObject + +class LoginActivity : AppCompatActivity() { + private val scope = CoroutineScope(Dispatchers.Main + Job()) + + private lateinit var usernameEditText: EditText + private lateinit var passwordEditText: EditText + private lateinit var loginButton: Button + private lateinit var togglePasswordVisibility: ImageButton + private lateinit var rememberPasswordCheckBox: CheckBox + + private lateinit var overlayView: View + + private lateinit var sharedPreferences: SharedPreferences + + fun showToast(message: String) { + android.os.Handler(this.mainLooper).post { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + } + } + fun finishLogin(usname: String,name: String,tk: String,ses: String) { + android.os.Handler(this.mainLooper).post { + account_session_util(this).createLoginSession(usname, name, tk, ses) + } + } + + fun jumpToMain(){ + // 登录成功,跳转到主界面 + val intent = Intent(this, MainActivity::class.java) + //intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION) + startActivity(intent) + finish() // 结束登录Activity,防止用户返回 + } + + class OverlayView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 + ) : androidx.appcompat.widget.AppCompatImageView(context, attrs, defStyleAttr) { + + init { + setBackgroundColor(ContextCompat.getColor(context, R.color.bjut_blue)) + + // 创建主图片的 Bitmap + val mainOptions = BitmapFactory.Options().apply { + inSampleSize = 7 // 缩小 + } + val mainBitmap = BitmapFactory.decodeResource(resources, R.drawable.bjut, mainOptions) + + // 创建底部横幅的 Bitmap + val bannerOptions = BitmapFactory.Options().apply { + inSampleSize = 1 + } + val bannerBitmap = BitmapFactory.decodeResource(resources, R.drawable.bjut_all, bannerOptions) + + // 创建一个新的 Bitmap 来组合两张图片 + val combinedBitmap = Bitmap.createBitmap( + mainBitmap.width, + mainBitmap.height, + Bitmap.Config.ARGB_8888 + ) + + val canvas = Canvas(combinedBitmap) + + // 绘制主图片 + canvas.drawBitmap(mainBitmap, 0f, 0f, null) + + // 计算横幅的位置(底部) + val bannerMatrix = Matrix() + val scale = mainBitmap.width.toFloat() / bannerBitmap.width.toFloat() + bannerMatrix.setScale(scale, scale) + bannerMatrix.postTranslate( + 0f, + mainBitmap.height - (bannerBitmap.height * scale) + ) + + // 绘制横幅 + canvas.drawBitmap(bannerBitmap, bannerMatrix, null) + + // 设置组合后的图片 + setImageBitmap(combinedBitmap) + scaleType = ScaleType.CENTER + + // 回收不需要的 Bitmap + mainBitmap.recycle() + bannerBitmap.recycle() + } + + override fun onTouchEvent(event: MotionEvent?): Boolean { + return true + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + val splashScreen = installSplashScreen() + super.onCreate(savedInstanceState) + //splashScreen.setKeepOnScreenCondition { true } + //setContentView(R.layout.login_page) + + overlayView = OverlayView(this).apply { + layoutParams = FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.MATCH_PARENT + ) + visibility = View.VISIBLE + } + val rootLayout = findViewById(android.R.id.content) + rootLayout.addView(overlayView) + + val context=this + scope.launch { + if(account_session_util(context).isLoggedIn())jumpToMain() + else { + rootLayout.removeView(overlayView) + setContentView(R.layout.login_page) + usernameEditText = findViewById(R.id.usernameEditText) + passwordEditText = findViewById(R.id.passwordEditText) + loginButton = findViewById(R.id.loginButton) + togglePasswordVisibility = findViewById(R.id.togglePasswordVisibility) + rememberPasswordCheckBox = findViewById(R.id.rememberPasswordCheckBox) + + var passwordVisible = false + togglePasswordVisibility.setOnClickListener { + passwordVisible = !passwordVisible + if (passwordVisible) { + passwordEditText.transformationMethod = HideReturnsTransformationMethod.getInstance() + togglePasswordVisibility.setImageResource(android.R.drawable.ic_menu_view) // 使用"隐藏"图标 + } else { + passwordEditText.transformationMethod = PasswordTransformationMethod.getInstance() + togglePasswordVisibility.setImageResource(android.R.drawable.ic_menu_view) // 使用"显示"图标 + } + passwordEditText.setSelection(passwordEditText.text.length) + } + + sharedPreferences = getSharedPreferences("LoginPrefs", Context.MODE_PRIVATE) + if (sharedPreferences.getBoolean("remember_password", false)) { + usernameEditText.setText(sharedPreferences.getString("username", "")) + passwordEditText.setText(sharedPreferences.getString("password", "")) + rememberPasswordCheckBox.isChecked = true + } + + loginButton.setOnClickListener { + val usname = usernameEditText.text.toString() + val password = passwordEditText.text.toString() + + if (rememberPasswordCheckBox.isChecked) { + with(sharedPreferences.edit()) { + putString("username", usname) + putString("password", password) + putBoolean("remember_password", true) + apply() + } + } else { + with(sharedPreferences.edit()) { + remove("username") + remove("password") + putBoolean("remember_password", false) + apply() + } + } + + BjutAPI().login(usname,password,object : Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) { + //showToast(BjutHttpRsa.requestDecrypt(response.body?.string().toString())) + val res = JSONObject( + BjutHttpRsa.requestDecrypt( + response.body?.string().toString() + ) + ) + val ses= Cookie.parseAll(response.request.url,response.headers).find { it.name == "eai-sess" }?.value.toString() + if (res.get("e")==0) { + finishLogin(usname,res.getJSONObject("d").get("name").toString(),res.getJSONObject("d").get("login_ticket").toString(),ses) + jumpToMain() + } else { + showToast(res.get("m").toString()) + } + } + }) + } + } + } + + } + + override fun onDestroy() { + super.onDestroy() + scope.cancel() + } +} diff --git a/app/src/main/java/com/hlwdy/bjut/ui/card/CardFragment.kt b/app/src/main/java/com/hlwdy/bjut/ui/card/CardFragment.kt new file mode 100644 index 0000000..47111a9 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/card/CardFragment.kt @@ -0,0 +1,252 @@ +package com.hlwdy.bjut.ui.card + +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebViewClient +import android.widget.Toast +import androidx.activity.OnBackPressedCallback +import androidx.fragment.app.Fragment +import com.hlwdy.bjut.BjutAPI +import com.hlwdy.bjut.account_session_util +import com.hlwdy.bjut.databinding.FragmentCardBinding +import okhttp3.Call +import okhttp3.Callback +import okhttp3.Response +import java.io.IOException +import androidx.fragment.app.viewModels +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.File +import java.net.URL +import android.webkit.WebView +import androidx.core.content.ContextCompat.startActivity +import com.hlwdy.bjut.BaseFragment +import com.hlwdy.bjut.appLogger +import java.net.HttpURLConnection +import java.util.concurrent.TimeUnit + +private var isJumpCode:Boolean=false + +class EnhancedCachingWebViewClient(private val context: Context,private val frag:BaseFragment) : WebViewClient() { + + private val cacheDir = File(context.cacheDir, "web_cache") + private val cssPattern = Regex("\\.css$") + private val vendorPattern = Regex("chunk-vendors.*\\.js$") + private val picPattern = Regex("\\.png$") + + // 缓存有效期(毫秒) + private val CSS_CACHE_DURATION = TimeUnit.DAYS.toMillis(5) // 1天 + private val VENDOR_CACHE_DURATION = TimeUnit.DAYS.toMillis(7) // 7天 + private val PIC_CACHE_DURATION = TimeUnit.DAYS.toMillis(15) + + init { + cacheDir.mkdirs() + } + + override fun shouldInterceptRequest( + view: WebView, + request: WebResourceRequest + ): WebResourceResponse? { + val url = request.url.toString() + + when { + cssPattern.containsMatchIn(url) -> return handleCacheableResource(url, "text/css", CSS_CACHE_DURATION) + vendorPattern.containsMatchIn(url) -> return handleCacheableResource(url, "application/javascript", VENDOR_CACHE_DURATION) + picPattern.containsMatchIn(url) -> return handleCacheableResource(url, "image/png", PIC_CACHE_DURATION) + } + + // 对于其他文件,使用默认处理 + return super.shouldInterceptRequest(view, request) + } + + private fun handleCacheableResource(url: String, mimeType: String, cacheDuration: Long): WebResourceResponse? { + val cachedFile = File(cacheDir, url.hashCode().toString()) + + // 如果缓存文件存在且未过期,直接从缓存加载 + if (cachedFile.exists() && (System.currentTimeMillis() - cachedFile.lastModified() < cacheDuration)) { + return WebResourceResponse(mimeType, "UTF-8", FileInputStream(cachedFile)) + } + + // 如果缓存不存在或已过期,下载并缓存 + try { + val connection = URL(url).openConnection() as HttpURLConnection + connection.connect() + val inputStream = connection.inputStream + + // 保存到缓存 + FileOutputStream(cachedFile).use { output -> + inputStream.copyTo(output) + } + + // 返回下载的内容 + return WebResourceResponse(mimeType, "UTF-8", FileInputStream(cachedFile)) + } catch (e: Exception) { + e.printStackTrace() + } + + return null + } + + + override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { + return try { + if (url!!.startsWith("http:") || url.startsWith("https:")) { + false + } else { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + startActivity(context,intent,null) + true + } + } catch (e: Exception) { + false + } + } + + override fun onPageFinished(view: WebView, url: String) { + frag.hideLoading() + account_session_util(context).editCardID(url.takeLast(32)) + // 注入CSS + val css = "@media (prefers-color-scheme: dark) { body,uni-page-body,.bdbg1,.code-bg,.news-w-bg,.bdbg,.ticket-nav,.tap2{ background: #121212 !important; }uni-navigator,.menu-list,.news-w,.payment-method,.condition, .condition-checkbox,.amtbutton,.v-tabs__container,.v-tabs__container-item,.tr,.nowcode,.tap-box,.uni-picker-select,.uni-picker-header,.newsCol,.text-w,.txt,.itemArea_li,#popup_content{background:#313131 !important;color:white !important;}uni-text{color:white !important}.code-w{box-shadow:none !important;}.news-w,.newsli{border-bottom:none !important;}.bdbg1,uni-view{color:white !important}.bdt{border-top: 1px solid #555555 !important;}.per-details,.bor-bottom{border-bottom: 1px solid #555555 !important;}}" + view.evaluateJavascript( + """ + (function() { + var style = document.createElement('style'); + style.type = 'text/css'; + style.innerHTML = '$css'; + document.head.appendChild(style); + })(); + """, + null + ) + // 显示WebView + view.visibility = View.VISIBLE + if(isJumpCode){ + view.loadUrl("https://ydapp.bjut.edu.cn/#/pages_other/qrcode/qrcode/qrcode?openid="+url.takeLast(32)) + isJumpCode=false + } + } + +} + +class CardFragment : BaseFragment() { + + private var _binding: FragmentCardBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + private val viewModel: CardViewModel by viewModels() + + fun showToast(message: String) { + activity?.let { fragmentActivity -> + Handler(Looper.getMainLooper()).post { + if (isAdded) { + Toast.makeText(fragmentActivity, message, Toast.LENGTH_SHORT).show() + } + } + } + } + + @SuppressLint("SetJavaScriptEnabled") + fun loadUrl(url: String) { + activity?.let { + Handler(Looper.getMainLooper()).post { + if (isAdded) { + viewModel.webView?.settings?.javaScriptEnabled=true + viewModel.webView?.webViewClient=EnhancedCachingWebViewClient(requireContext(),this) + viewModel.webView?.loadUrl(url) + viewModel.isWebViewInitialized=true + //hideLoading() + } + } + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + + _binding = FragmentCardBinding.inflate(inflater, container, false) + val root: View = binding.root + + if (viewModel.webView == null) { + viewModel.webView = binding.cardView + } else { + // 如果WebView已存在,从旧的父视图中移除 + (viewModel.webView?.parent as? ViewGroup)?.removeView(viewModel.webView) + // 将已存在的WebView添加到新的布局中 + (binding.root as? ViewGroup)?.addView(viewModel.webView) + } + + return root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + isJumpCode = arguments?.getBoolean("jump_code", false) ?: false + + showLoading() + + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + if (viewModel.webView?.canGoBack() == true) { + viewModel.webView?.goBack() + } else { + isEnabled = false + requireActivity().onBackPressedDispatcher.onBackPressed() + } + } + }) + + if(!viewModel.isWebViewInitialized){ + BjutAPI().getCardUrl(account_session_util(requireContext()).getUserDetails()[account_session_util.KEY_SESS].toString(),object : Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) { + if(response.code==302){ + val cardUrl= response.headers["Location"].toString() + //showToast(cardUrl) + appLogger.e("Info", "CardUrl ok:$cardUrl") + loadUrl(cardUrl) + } + } + }) + }else{ + viewModel.webViewState?.let { viewModel.webView?.restoreState(it) } + hideLoading() + } + + } + override fun onPause() { + super.onPause() + // 保存WebView状态 + viewModel.webView?.let { webView -> + val state = Bundle() + webView.saveState(state) + viewModel.webViewState = state + } + } + + override fun onDestroyView() { + super.onDestroyView() + (viewModel.webView?.parent as? ViewGroup)?.removeView(viewModel.webView) + _binding = null + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/card/CardViewModel.kt b/app/src/main/java/com/hlwdy/bjut/ui/card/CardViewModel.kt new file mode 100644 index 0000000..be10e28 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/card/CardViewModel.kt @@ -0,0 +1,11 @@ +package com.hlwdy.bjut.ui.card + +import android.os.Bundle +import android.webkit.WebView +import androidx.lifecycle.ViewModel + +class CardViewModel : ViewModel() { + var webView: WebView? = null + var webViewState: Bundle? = null + var isWebViewInitialized = false +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/home/HomeFragment.kt b/app/src/main/java/com/hlwdy/bjut/ui/home/HomeFragment.kt new file mode 100644 index 0000000..015b14d --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/home/HomeFragment.kt @@ -0,0 +1,70 @@ +package com.hlwdy.bjut.ui.home + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.webkit.CookieManager +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import com.hlwdy.bjut.R +import com.hlwdy.bjut.account_session_util +import com.hlwdy.bjut.databinding.FragmentHomeBinding + +class HomeFragment : Fragment() { + + private var _binding: FragmentHomeBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + fun showToast(message: String) { + activity?.let { fragmentActivity -> + Handler(Looper.getMainLooper()).post { + if (isAdded) { + Toast.makeText(fragmentActivity, message, Toast.LENGTH_SHORT).show() + } + } + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + + _binding = FragmentHomeBinding.inflate(inflater, container, false) + val root: View = binding.root + + binding.btnWebVpn.setOnClickListener { + val cookieManager = CookieManager.getInstance() + cookieManager.setAcceptCookie(true) + cookieManager.setCookie(".webvpn.bjut.edu.cn", "wengine_vpn_ticketwebvpn_bjut_edu_cn="+ + account_session_util(requireContext()).getUserDetails()[account_session_util.KEY_WEBVPNTK].toString()+"; path=/") + cookieManager.flush() + val intent = Intent(requireContext(), WebVpnViewActivity::class.java) + startActivity(intent) + } + + binding.btnCardCode.setOnClickListener { + val bundle = Bundle().apply { + putBoolean("jump_code", true) + } + findNavController().navigate(R.id.nav_card,bundle) + } + + return root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/home/WebVpnEntry.kt b/app/src/main/java/com/hlwdy/bjut/ui/home/WebVpnEntry.kt new file mode 100644 index 0000000..17488d5 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/home/WebVpnEntry.kt @@ -0,0 +1,155 @@ +package com.hlwdy.bjut.ui.home + +import android.content.Context +import android.graphics.Bitmap +import android.os.Bundle +import android.view.View +import android.webkit.WebChromeClient +import android.webkit.WebResourceRequest +import android.webkit.WebSettings +import android.webkit.WebView +import android.webkit.WebViewClient +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import com.google.android.material.button.MaterialButton +import com.google.android.material.chip.Chip +import com.google.android.material.chip.ChipGroup +import com.google.android.material.progressindicator.LinearProgressIndicator +import com.hlwdy.bjut.R + +class WebVpnViewActivity : AppCompatActivity() { + private lateinit var webView: WebView + private lateinit var chipGroup: ChipGroup + private lateinit var progressBar: LinearProgressIndicator + + data class Website( + val name: String, + val url: String + ) + + private val websites = listOf( + //Website("教务管理系统", "https://webvpn.bjut.edu.cn/https/77726476706e69737468656265737421fae046903f242652741d9de29d51367becd8/"), + Website("教务管理系统", "https://webvpn.bjut.edu.cn/https/77726476706e69737468656265737421fae046903f242652741d9de29d51367becd8/sso/ddlogin"), + //https://jwglxt.bjut.edu.cn/ + Website("网络计费系统", "https://webvpn.bjut.edu.cn/https/77726476706e69737468656265737421faf152992b362652741d9de29d51367b6c5c/"), + //https://jfself.bjut.edu.cn/ + Website("EduOJ", "https://webvpn.bjut.edu.cn/http/77726476706e69737468656265737421a1a013d2756126012946d8fccc/"), + //http://172.21.17.104/ + ) + private fun setTitle(text:String){ + android.os.Handler(this.mainLooper).post { + findViewById(R.id.webTitle).text = text + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.webvpn_view) + + webView = findViewById(R.id.webvpn_webview) + chipGroup = findViewById(R.id.chipGroup) + findViewById(R.id.btnBack).setOnClickListener { + finish() + } + progressBar = findViewById(R.id.progressBar) + setupWebView() + createChips() + } + + private fun setupWebView() { + webView.apply { + settings.javaScriptEnabled = true + webViewClient = object : WebViewClient() { + override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean { + if (url != null&&url.contains("http")) { + view?.loadUrl(url) + return true + } + return false + } + + // 对于Android API 24及以上版本 + override fun shouldOverrideUrlLoading( + view: WebView?, + request: WebResourceRequest? + ): Boolean { + if (url != null&&url.toString().contains("http")) { + request?.url?.let { uri -> + view?.loadUrl(uri.toString()) + return true + } + } + return false + } + + // 可选:添加页面加载状态回调 + override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { + super.onPageStarted(view, url, favicon) + // 显示加载进度条或提示 + } + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + // 隐藏加载进度条或提示 + } + } + + webChromeClient=object:WebChromeClient() { + override fun onProgressChanged(view: WebView?, newProgress: Int) { + if (newProgress < 100) { + progressBar.visibility = View.VISIBLE + progressBar.progress = newProgress + } else { + progressBar.visibility = View.GONE + } + } + } + + settings.apply { + // 支持缩放 + setSupportZoom(true) + builtInZoomControls = true + displayZoomControls = false + + // 自适应屏幕 + useWideViewPort = true + loadWithOverviewMode = true + + // 允许混合内容(HTTP和HTTPS) + mixedContentMode = WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE + } + } + } + + private fun createChips() { + chipGroup.isSelectionRequired=true + websites.forEachIndexed { index, (name, url) -> + val chip = Chip(this).apply { + text = name + isCheckable = true + + setOnClickListener { + if (isChecked) { + webView.loadUrl(url) + } + } + + if (index == 0) { + isChecked = true + webView.loadUrl(url) + } + } + chipGroup.addView(chip) + } + } + + // 处理返回按钮 + override fun onBackPressed() { + if (webView.canGoBack()) { + webView.goBack() + } else { + super.onBackPressed() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/library/LibraryFragment.kt b/app/src/main/java/com/hlwdy/bjut/ui/library/LibraryFragment.kt new file mode 100644 index 0000000..8d41a26 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/library/LibraryFragment.kt @@ -0,0 +1,42 @@ +package com.hlwdy.bjut.ui.library + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.hlwdy.bjut.databinding.FragmentLibraryBinding + +class LibraryFragment : Fragment() { + + private var _binding: FragmentLibraryBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + val slideshowViewModel = + ViewModelProvider(this).get(LibraryViewModel::class.java) + + _binding = FragmentLibraryBinding.inflate(inflater, container, false) + val root: View = binding.root + + val textView: TextView = binding.textLibrary + slideshowViewModel.text.observe(viewLifecycleOwner) { + textView.text = it + } + return root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/library/LibraryViewModel.kt b/app/src/main/java/com/hlwdy/bjut/ui/library/LibraryViewModel.kt new file mode 100644 index 0000000..d33e0cd --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/library/LibraryViewModel.kt @@ -0,0 +1,13 @@ +package com.hlwdy.bjut.ui.library + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class LibraryViewModel : ViewModel() { + + private val _text = MutableLiveData().apply { + value = "Library, coming soon" + } + val text: LiveData = _text +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/loading.kt b/app/src/main/java/com/hlwdy/bjut/ui/loading.kt new file mode 100644 index 0000000..6e34516 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/loading.kt @@ -0,0 +1,41 @@ +package com.hlwdy.bjut.ui + +import android.app.Dialog +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import com.hlwdy.bjut.R + +class LoadingDialog private constructor(context: Context) { + private val dialog: Dialog = Dialog(context, R.style.TransparentDialog) + + init { + dialog.setContentView(R.layout.dialog_loading) + dialog.setCancelable(false) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + } + + companion object { + private var instance: LoadingDialog? = null + + @Synchronized + fun getInstance(context: Context): LoadingDialog { + if (instance == null) { + instance = LoadingDialog(context) + } + return instance!! + } + } + + fun show() { + if (!dialog.isShowing) { + dialog.show() + } + } + + fun dismiss() { + if (dialog.isShowing) { + dialog.dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/news/NewsAdapter.kt b/app/src/main/java/com/hlwdy/bjut/ui/news/NewsAdapter.kt new file mode 100644 index 0000000..5700a40 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/news/NewsAdapter.kt @@ -0,0 +1,36 @@ +package com.hlwdy.bjut.ui.news + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.hlwdy.bjut.R + +class NewsAdapter( + private val items: List, + private val onItemClick: (NewsItem) -> Unit +) : RecyclerView.Adapter() { + + class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + val TitleText: TextView = view.findViewById(R.id.newsItemText) + val DateText: TextView = view.findViewById(R.id.newsItemDate) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.news_item_layout, parent, false) + return ViewHolder(view) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val newsItem = items[position] + holder.TitleText.text = newsItem.title + holder.DateText.text = newsItem.date + holder.itemView.setOnClickListener { + onItemClick(newsItem) + } + } + + override fun getItemCount() = items.size +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/news/NewsDetailActivity.kt b/app/src/main/java/com/hlwdy/bjut/ui/news/NewsDetailActivity.kt new file mode 100644 index 0000000..3b07345 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/news/NewsDetailActivity.kt @@ -0,0 +1,81 @@ +package com.hlwdy.bjut.ui.news + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.webkit.WebView +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import com.hlwdy.bjut.BjutAPI +import com.hlwdy.bjut.R +import com.hlwdy.bjut.account_session_util +import com.hlwdy.bjut.ui.schedule.Course +import okhttp3.Call +import okhttp3.Callback +import okhttp3.Response +import org.json.JSONObject +import java.io.IOException + +class NewsDetailActivity : AppCompatActivity() { + fun showToast(message: String) { + android.os.Handler(this.mainLooper).post { + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() + } + } + private fun showContent(content:String){ + android.os.Handler(this.mainLooper).post { + var webview=findViewById(R.id.news_webview) + webview.settings.javaScriptEnabled=true + webview.loadDataWithBaseURL(null, + "$content " + +"", + "text/html", "UTF-8", null) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.news_detail) + + val title = intent.getStringExtra(EXTRA_TITLE) + val id = intent.getStringExtra(EXTRA_ID) + + BjutAPI().getNewsDetail(account_session_util(this).getUserDetails()[account_session_util.KEY_WEBVPNTK].toString(),id.toString(),object : + Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) { + try{ + val res=JSONObject(response.body?.string().toString()) + showContent(res.toString()) + if(res.getString("e")=="0"){ + showContent(res.getJSONObject("d").getString("content")) + }else{ + showToast("error") + } + }catch (e:Exception){ + showToast("error") + } + } + }) + + findViewById(R.id.news_title).text = title + } + + companion object { + private const val EXTRA_TITLE = "extra_title" + private const val EXTRA_ID = "extra_id" + + fun start(context: Context, newsItem: NewsItem) { + val intent = Intent(context, NewsDetailActivity::class.java).apply { + putExtra(EXTRA_TITLE, newsItem.title) + putExtra(EXTRA_ID, newsItem.id) + } + context.startActivity(intent) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/news/NewsFragment.kt b/app/src/main/java/com/hlwdy/bjut/ui/news/NewsFragment.kt new file mode 100644 index 0000000..f495d06 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/news/NewsFragment.kt @@ -0,0 +1,200 @@ +package com.hlwdy.bjut.ui.news + +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.fragment.app.viewModels +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.android.material.tabs.TabLayout +import com.hlwdy.bjut.BaseFragment +import com.hlwdy.bjut.BjutAPI +import com.hlwdy.bjut.BjutHttpRsa +import com.hlwdy.bjut.account_session_util +import com.hlwdy.bjut.appLogger +import com.hlwdy.bjut.databinding.FragmentNewsBinding +import okhttp3.Call +import okhttp3.Callback +import okhttp3.Response +import org.json.JSONObject +import java.io.IOException + +class NewsFragment : BaseFragment() { + private var _binding: FragmentNewsBinding? = null + private val binding get() = _binding!! + + private lateinit var adapter: NewsAdapter + private val newsList = mutableListOf() + + private val viewModel: NewsViewModel by viewModels() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentNewsBinding.inflate(inflater, container, false) + return binding.root + } + + fun showToast(message: String) { + activity?.let { fragmentActivity -> + Handler(Looper.getMainLooper()).post { + if (isAdded) { + Toast.makeText(fragmentActivity, message, Toast.LENGTH_SHORT).show() + } + } + } + } + + private fun refreshNewsList(cid:String,page:Int=1){ + isLoading=true + showLoading() + BjutAPI().getNewsList(account_session_util(requireContext()).getUserDetails()[account_session_util.KEY_SESS].toString(),cid,page.toString() + ,object : + Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) { + val res = JSONObject( + BjutHttpRsa.requestDecrypt( + response.body?.string().toString() + ) + ) + if(res.getString("e")=="0"){ + val tmp=res.getJSONObject("d").getJSONObject("list").getJSONArray("data") + val l=mutableListOf() + for (i in 0 until tmp.length()) { + val classObject = tmp.getJSONObject(i) + l.add(NewsItem(classObject.getString("id"),classObject.getString("title"), + classObject.getString("summary"), classObject.getString("createdate"))) + } + activity?.let { + Handler(Looper.getMainLooper()).post { + if (isAdded) { + if(page==1){//first + updateNewsList(l) + }else{ + addNewsItems(l) + } + Curpage=page + Curcid=cid + hideLoading() + } + } + } + isLoading=false + }else{ + showToast("error") + appLogger.e("Error", "Try NewsList $cid-$page error") + } + } + }) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setupRecyclerView() + + BjutAPI().WebVpnLoginMy(account_session_util(requireContext()).getUserDetails()[account_session_util.KEY_WEBVPNTK].toString() + ,object : + Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) {} + }) + + val tabLayout = binding.tabLayout + val tabTitles = listOf("校发通知", "会议通知", "公示公告", "教学通告","学校工作信息","院部处通知","院部处工作信息","学术海报") + tabTitles.forEach { title -> + tabLayout.addTab(tabLayout.newTab().apply { + text = title + contentDescription = title + }) + } + viewModel.selectedTabPosition.observe(viewLifecycleOwner) { position -> + tabLayout.selectTab(tabLayout.getTabAt(position)) + } + + tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + viewModel.setSelectedTab(tab?.position ?: 0) + refreshNewsList((tab?.position?.plus(1)).toString()) + } + + override fun onTabUnselected(tab: TabLayout.Tab?) {} + override fun onTabReselected(tab: TabLayout.Tab?) {} + }) + if (viewModel.isFirstLoad||viewModel.selectedTabPosition.value==0) { + refreshNewsList("1") + viewModel.isFirstLoad = false + } + } + + private var isLoading = false + private var Curpage=0 + private var Curcid="" + + private fun setupRecyclerView() { + adapter = NewsAdapter(newsList) { newsItem -> + openNewsDetail(newsItem) + } + binding.NewsListView.apply { + layoutManager = LinearLayoutManager(context) + adapter = this@NewsFragment.adapter + } + binding.NewsListView.layoutManager = LinearLayoutManager(requireContext()) + binding.NewsListView.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + val layoutManager = recyclerView.layoutManager as LinearLayoutManager + val lastVisibleItem = layoutManager.findLastVisibleItemPosition() + val totalItemCount = layoutManager.itemCount + if (!isLoading&&lastVisibleItem >= totalItemCount - 1) { + refreshNewsList(Curcid,Curpage+1) + //showToast("next") + } + } + }) + } + + // 添加新闻项的方法 + private fun addNewsItem(id:String,title: String, content: String, date:String) { + newsList.add(NewsItem(id,title, content,date)) + adapter.notifyItemInserted(newsList.size - 1) + } + + private fun addNewsItems(newItems: List) { + val cnt=newsList.size + newsList.addAll(newItems) + adapter.notifyItemRangeInserted(cnt, newItems.size) + } + + private fun updateNewsList(newItems: List) { + clearNewsList() + newsList.addAll(newItems) + adapter.notifyItemRangeInserted(0, newItems.size) + } + + private fun clearNewsList() { + val size = newsList.size + newsList.clear() + adapter.notifyItemRangeRemoved(0, size) + } + + private fun openNewsDetail(newsItem: NewsItem) { + NewsDetailActivity.start(requireContext(), newsItem) + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/news/NewsItem.kt b/app/src/main/java/com/hlwdy/bjut/ui/news/NewsItem.kt new file mode 100644 index 0000000..ce9c1a4 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/news/NewsItem.kt @@ -0,0 +1,8 @@ +package com.hlwdy.bjut.ui.news + +data class NewsItem( + val id:String, + val title: String, + val content: String, + val date:String +) \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/news/NewsViewModel.kt b/app/src/main/java/com/hlwdy/bjut/ui/news/NewsViewModel.kt new file mode 100644 index 0000000..b8f3512 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/news/NewsViewModel.kt @@ -0,0 +1,16 @@ +package com.hlwdy.bjut.ui.news + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel + +class NewsViewModel: ViewModel() { + private val _selectedTabPosition = MutableLiveData(0) + val selectedTabPosition: LiveData = _selectedTabPosition + + fun setSelectedTab(position: Int) { + _selectedTabPosition.value = position + } + + var isFirstLoad = true +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/otp/OtpFragment.kt b/app/src/main/java/com/hlwdy/bjut/ui/otp/OtpFragment.kt new file mode 100644 index 0000000..19cf43d --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/otp/OtpFragment.kt @@ -0,0 +1,379 @@ +package com.hlwdy.bjut.ui.otp + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.content.Intent +import android.database.sqlite.SQLiteDatabase +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.text.InputType +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText +import android.widget.LinearLayout +import android.widget.TextView +import android.widget.Toast +import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.textfield.TextInputEditText +import com.google.android.material.textfield.TextInputLayout +import com.hlwdy.bjut.account_session_util +import com.hlwdy.bjut.databinding.FragmentOtpBinding +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.launch +import net.arraynetworks.vpn.OTPManager +import okhttp3.Call +import okhttp3.Callback +import okhttp3.Response +import java.io.IOException +import java.security.SecureRandom +import java.util.UUID + +/* +import javax.crypto.Cipher +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec + + +fun readOtpData(context:Context): ByteArray? { + var otpData: ByteArray?=null + var database: SQLiteDatabase? = null + try { + val dbPath = context.getDatabasePath("otp.db").path + database = SQLiteDatabase.openDatabase( + dbPath, + null, + SQLiteDatabase.OPEN_READONLY + ) + database.query( + "servers", // 表名 + null, // 所有列 + null, // 无条件 + null, + null, + null, + null + )?.use { cursor -> + if (cursor.moveToFirst()) { + otpData = cursor.getBlob(cursor.getColumnIndexOrThrow("data")) + } + } + } catch (e: Exception) { + + } finally { + database?.close() + } + return otpData +} + +class AESCrypto { + // IV (Initialization Vector) + private val initVector: ByteArray = byteArrayOf( + 97, 114, 114, 97, 121, 100, 101, 118, 73, 86, + 99, 108, 105, 99, 107, 49 + ) + + private val ivSpec: IvParameterSpec = IvParameterSpec(initVector) + + // Encryption Key + private val secretKey: ByteArray = byteArrayOf( + 97, 114, 114, 97, 121, 110, 101, 116, 119, 111, + 114, 107, 115, 57, 50, 48, 106, 83, 100, 56, + 102, 42, 35, 57, 42, 100, 45, 35, 106, 48, + 46, 72 + ) + + private val keySpec: SecretKeySpec = SecretKeySpec(secretKey, "AES") + + private var cipher: Cipher? = null + + init { + cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") + } + + /** + * 解密数据 + * @param encryptedData 加密的数据 + * @return 解密后的数据 + * @throws Exception 如果解密失败 + */ + @Throws(Exception::class) + fun decrypt(encryptedData: ByteArray): ByteArray { + try { + cipher?.init(Cipher.DECRYPT_MODE, keySpec, ivSpec) + return cipher?.doFinal(encryptedData) ?: throw Exception("Cipher not initialized") + } catch (e: Exception) { + val message = "[decrypt] ${e.message}" + throw Exception(message) + } + } + + /** + * 加密数据 + * @param plainData 原始数据 + * @return 加密后的数据 + * @throws Exception 如果加密失败 + */ + @Throws(Exception::class) + fun encrypt(plainData: ByteArray): ByteArray { + try { + cipher?.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec) + return cipher?.doFinal(plainData) ?: throw Exception("Cipher not initialized") + } catch (e: Exception) { + val message = "[encrypt] ${e.message}" + throw Exception(message) + } + } + + companion object { + /** + * 静态解密方法 + * @param data 要解密的数据 + * @return 解密后的数据,如果解密失败返回null + */ + @JvmStatic + fun decryptStatic(data: ByteArray?): ByteArray? { + if (data != null && data.isNotEmpty()) { + try { + return AESCrypto().decrypt(data) + } catch (e: Exception) { + e.printStackTrace() + } + } + return null + } + } +}*/ + +fun generateSM():ByteArray{ + val uuid = UUID.randomUUID().toString() + val secureRandom = SecureRandom.getInstance("SHA1PRNG") + secureRandom.setSeed(uuid.toByteArray()) + val randomBytes = ByteArray(10) + secureRandom.nextBytes(randomBytes) + return randomBytes +} + +class OtpFragment : Fragment() { + + private var _binding: FragmentOtpBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + fun showToast(message: String) { + activity?.let { fragmentActivity -> + Handler(Looper.getMainLooper()).post { + if (isAdded) { + Toast.makeText(fragmentActivity, message, Toast.LENGTH_SHORT).show() + } + } + } + } + + private var otpD:String?=null + fun refreshOtp(){ + if(otpD!=null){ + val otpManager = OTPManager() + val secret = otpD.toString().chunked(2).map { it.toInt(16).toByte() }.toByteArray() + val otp = otpManager.generateOTP(secret) + binding.textOtp.text=String.format("%06d",otp) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + + _binding = FragmentOtpBinding.inflate(inflater, container, false) + val root: View = binding.root + + otpD=account_session_util(requireContext()).getUserDetails()[account_session_util.KEY_OTPDATA] + refreshOtp() + /*var otpData=readOtpData(requireContext()) + if(otpData!=null){ + val otpManager = OTPManager() + val secret = AESCrypto().decrypt(otpData) + showToast(String(net.arraynetworks.vpn.NativeLib().encodeOptData(secret))) + val otp = otpManager.generateOTP(secret) + textView.text=String.format("%06d",otp) + }*/ + + binding.btnLook.setOnClickListener { + val editText = EditText(context).apply { + setText(otpD.toString()) + isFocusable = false + isFocusableInTouchMode = false + isLongClickable = true + keyListener=null + setTextIsSelectable(true) // 允许选择文本 + setPadding(32, 32, 32, 32) + } + + MaterialAlertDialogBuilder(requireContext()) + .setTitle("OTP data") + .setView(editText) + .setPositiveButton("复制") { _, _ -> + // 复制文本到剪贴板 + val clipboard = requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText("text", otpD.toString()) + clipboard.setPrimaryClip(clip) + showToast("已复制") + } + .setNegativeButton("取消", null) + .show() + } + + binding.btnRegister.setOnClickListener { + val builder = MaterialAlertDialogBuilder(requireContext()) + builder.setTitle("登录到校园VPN") + val layout = LinearLayout(context).apply { + orientation = LinearLayout.VERTICAL + setPadding(32, 32, 32, 32) + } + val usernameLayout = TextInputLayout(requireContext()).apply { + layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) + hint = "账号" + boxBackgroundMode = TextInputLayout.BOX_BACKGROUND_OUTLINE // 设置外边框样式 + } + val username = TextInputEditText(requireContext()).apply { setText(account_session_util(requireContext()).getUserDetails()[account_session_util.KEY_USERNAME]) } + usernameLayout.addView(username) + + val passwordLayout = TextInputLayout(requireContext()).apply { + layoutParams = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) + hint = "密码" + boxBackgroundMode = TextInputLayout.BOX_BACKGROUND_OUTLINE + // 添加密码可见性开关 + endIconMode = TextInputLayout.END_ICON_PASSWORD_TOGGLE + } + val password = TextInputEditText(requireContext()).apply { + inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD + } + passwordLayout.addView(password) + + layout.addView(usernameLayout) + layout.addView(passwordLayout) + builder.setView(layout) + builder.setPositiveButton("设备注册") { dialog, which -> + val userAccount = username.text.toString() + val userPassword = password.text.toString() + val data=generateSM() + showToast("请稍后") + OTPManager().registerOTP(userAccount,userPassword,String(net.arraynetworks.vpn.NativeLib().encodeOptData(data)), + object : + Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) { + val res=response.body?.string().toString() + activity?.let { fragmentActivity -> + Handler(Looper.getMainLooper()).post { + if (isAdded) { + if(res.contains("登录失败")){ + showToast("登录失败,请检查账号密码") + }else if(res.contains("重复绑定")){ + showToast("已经绑定过,无法重复绑定") + }else { + showToast("绑定完成") + otpD=data.joinToString("") { "%02x".format(it) } + account_session_util(requireContext()).editOTPData(otpD.toString()) + refreshOtp() + } + } + } + } + }}) + } + + builder.setNegativeButton("取消") { dialog, which -> + dialog.cancel() + } + + val dialog = builder.create() + dialog.show() + } + + binding.btnAdd.setOnClickListener { + val editText = EditText(context).apply { + setTextIsSelectable(true) // 允许选择文本 + setPadding(32, 32, 32, 32) + } + + MaterialAlertDialogBuilder(requireContext()) + .setTitle("导入OTP data") + .setView(editText) + .setPositiveButton("导入") { _, _ -> + if(!editText.text.toString().matches(Regex("^[a-zA-Z0-9]*$")) ||editText.text.toString().length!=20){//20位 + showToast("数据格式无效") + return@setPositiveButton + } + if(otpD!=null){ + MaterialAlertDialogBuilder(requireContext()) + .setTitle("这将覆盖当前data,是否确认操作?") + .setPositiveButton("确认") { _, _ -> + otpD=editText.text.toString() + account_session_util(requireContext()).editOTPData(otpD.toString()) + refreshOtp() + } + .setNegativeButton("取消", null) + .show() + }else{ + otpD=editText.text.toString() + account_session_util(requireContext()).editOTPData(otpD.toString()) + refreshOtp() + } + } + .setNegativeButton("取消", null) + .show() + } + + return root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + viewLifecycleOwner.lifecycleScope.launch { + // 当Fragment处于STARTED状态(可见)时才会执行 + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + refreshOtp() + flow { + while (true) { + // 每次都基于当前系统时间计算,所以恢复时会显示正确的时间 + val remainingSeconds = 60 - (System.currentTimeMillis() / 1000).toInt() % 60 + emit(remainingSeconds) + delay(1000) + } + }.collect { remainingSeconds -> + binding.textOtptime.text = "$remainingSeconds 秒后更新" + if (remainingSeconds == 60) { + // 处理刷新逻辑 + refreshOtp() + } + } + } + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/schedule/ScheduleFragment.kt b/app/src/main/java/com/hlwdy/bjut/ui/schedule/ScheduleFragment.kt new file mode 100644 index 0000000..c8ed9a9 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/schedule/ScheduleFragment.kt @@ -0,0 +1,424 @@ +package com.hlwdy.bjut.ui.schedule + +import android.content.Context +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.text.TextUtils +import android.util.TypedValue +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ArrayAdapter +import android.widget.Space +import android.widget.TableRow +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.hlwdy.bjut.BaseFragment +import com.hlwdy.bjut.BjutAPI +import com.hlwdy.bjut.R +import com.hlwdy.bjut.account_session_util +import com.hlwdy.bjut.appLogger +import com.hlwdy.bjut.databinding.FragmentScheduleBinding +import okhttp3.Call +import okhttp3.Callback +import okhttp3.Response +import org.json.JSONException +import org.json.JSONObject +import java.io.File +import java.io.IOException +import java.util.concurrent.TimeUnit +import kotlin.math.abs + +class ScheduleCacheManager(private val context: Context) { + private val cacheDir = File(context.cacheDir, "schedule_cache") + private val cacheFile = File(cacheDir, "schedule.json") + private val cacheDuration = TimeUnit.HOURS.toMillis(8) // 缓存时间 + private val maxCacheEntries = 50 // 最大缓存条目数 + + init { + cacheDir.mkdirs() + if (!cacheFile.exists()) { + try { + cacheFile.createNewFile() + cacheFile.writeText("{}") + } catch (e: IOException) { + e.printStackTrace() + } + } + } + + fun getCachedData(key: String): String? { + if (!cacheFile.exists() || cacheFile.length() == 0L) return null + + try { + val jsonObject = JSONObject(cacheFile.readText()) + if (!jsonObject.has(key)) return null + + val entry = jsonObject.getJSONObject(key) + val timestamp = entry.getLong("timestamp") + val data = entry.getString("data") + + // 检查缓存是否过期 + if (System.currentTimeMillis() - timestamp > cacheDuration) { + return null + } + + return data + } catch (e: Exception) { + e.printStackTrace() + return null + } + } + + fun cacheData(key: String, data: String) { + try { + val jsonObject = if (cacheFile.exists() && cacheFile.length() > 0) { + JSONObject(cacheFile.readText()) + } else { + JSONObject() + } + + val entry = JSONObject().apply { + put("data", data) + put("timestamp", System.currentTimeMillis()) + } + + jsonObject.put(key, entry) + + // 清理旧的缓存条目 + cleanupOldEntries(jsonObject) + + cacheFile.writeText(jsonObject.toString()) + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun cleanupOldEntries(jsonObject: JSONObject) { + if (jsonObject.length() <= maxCacheEntries) return + + val entries = jsonObject.keys().asSequence().toList() + val sortedEntries = entries.sortedBy { key -> + jsonObject.getJSONObject(key).getLong("timestamp") + } + + val entriesToRemove = sortedEntries.take(sortedEntries.size - maxCacheEntries) + entriesToRemove.forEach { key -> + jsonObject.remove(key) + } + } +} + +class ScheduleFragment : BaseFragment() { + + private var _binding: FragmentScheduleBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + private lateinit var viewModel: ScheduleViewModel + + private fun generateColorIntForId(id: String): Int { + val hue = (id.hashCode() and 0xFFFFFF) % 360 + val lightness = 0.3f + (id.hashCode() and 0xFF) / 255f * 0.15f + return hslToColorInt(hue, lightness) + } + + private fun hslToColorInt(hue: Int, lightness: Float): Int { + val c = (1 - abs(2 * lightness - 1)) * 0.7f + val x = c * (1 - abs((hue / 60f % 2) - 1)) + val m = lightness - c / 2 + + val (r, g, b) = when (hue) { + in 0..59 -> Triple(c, x, 0f) + in 60..119 -> Triple(x, c, 0f) + in 120..179 -> Triple(0f, c, x) + in 180..239 -> Triple(0f, x, c) + in 240..299 -> Triple(x, 0f, c) + else -> Triple(c, 0f, x) + } + + val red = ((r + m) * 255).toInt() + val green = ((g + m) * 255).toInt() + val blue = ((b + m) * 255).toInt() + + return Color.rgb(red, green, blue) + } + + + private fun createSchedule(courses: List) { + val table = binding.scheduleTable + + // Add header row + val headerRow = TableRow(context) + headerRow.addView(createTextView("时间", isHeader = true)) + viewModel.days.forEach { day -> + headerRow.addView(createTextView(day, isHeader = true)) + } + table.addView(headerRow) + + // Create a 2D array to represent the schedule + val scheduleGrid = Array(viewModel.timeSlots.size) { Array(viewModel.days.size) { null } } + + // Fill the scheduleGrid with courses + courses.forEach { course -> + val dayIndex = viewModel.days.indexOf(course.day) + val startSlot = course.timeCode.substring(0, 2).toInt() - 1 + val endSlot = course.timeCode.substring(course.timeCode.length-2, course.timeCode.length).toInt() - 1 + for (i in startSlot..endSlot) { + scheduleGrid[i][dayIndex] = course + } + } + + // Add time slots and courses + viewModel.timeSlots.forEachIndexed { rowIndex, timeSlot -> + val row = TableRow(context) + row.addView(createTextView(timeSlot)) + + viewModel.days.forEachIndexed { dayIndex, _ -> + val course = scheduleGrid[rowIndex][dayIndex] + if (course != null) { + if(rowIndex>=1&&scheduleGrid[rowIndex-1][dayIndex]==scheduleGrid[rowIndex][dayIndex]){ + if(rowIndex>=2&&scheduleGrid[rowIndex-2][dayIndex]==scheduleGrid[rowIndex-1][dayIndex])row.addView(createTextView("", + isCourse = true, colorInt = generateColorIntForId(course.id), + moreInfo = "${course.name} (${course.id})\n地点: ${course.location}\n教师: ${course.teacher}\n节次: ${course.timeCode}\n周次: ${course.weeks}")) + else row.addView(createTextView(course.location, + isCourse = true, colorInt = generateColorIntForId(course.id), + moreInfo = "${course.name} (${course.id})\n地点: ${course.location}\n教师: ${course.teacher}\n节次: ${course.timeCode}\n周次: ${course.weeks}")) + }else{ + row.addView(createTextView(course.name, + isCourse = true, colorInt = generateColorIntForId(course.id), + moreInfo = "${course.name} (${course.id})\n地点: ${course.location}\n教师: ${course.teacher}\n节次: ${course.timeCode}\n周次: ${course.weeks}")) + } + } else{ + //row.addView(createTextView("")) + row.addView(Space(context).apply { + layoutParams = TableRow.LayoutParams(1, TableRow.LayoutParams.MATCH_PARENT, 1f) + }) + } + } + table.addView(row) + } + } + + fun Context.getCustomColor(attr: Int): Int { + val typedValue = TypedValue() + theme.resolveAttribute(attr, typedValue, true) + return typedValue.data + } + + private fun createTextView(text: String, isHeader: Boolean = false, isCourse: Boolean = false,colorInt: Int=0,moreInfo:String=""): TextView { + return TextView(context).apply { + this.text = text + textSize = 13f + setTextColor(context.getCustomColor(R.attr.textColor)) + gravity = Gravity.CENTER + setPadding(8, 18, 8, 18) + ellipsize = TextUtils.TruncateAt.END + if (isHeader) { + setBackgroundColor(context.getCustomColor(R.attr.header_background)) + setTypeface(null, android.graphics.Typeface.BOLD) + } else if (isCourse) { + setBackgroundColor(colorInt) + setTextColor(Color.WHITE) + } else { + setBackgroundColor(context.getCustomColor(R.attr.cell_background)) + } + if(moreInfo!="")setOnClickListener { + AlertDialog.Builder(context).apply { + setTitle("课程信息") + setMessage(moreInfo) + setPositiveButton("确定") { dialog, _ -> + dialog.dismiss() + } + create() + show() + } + } + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentScheduleBinding.inflate(inflater, container, false) + val root: View = binding.root + return root + } + + fun showToast(message: String) { + activity?.let { fragmentActivity -> + Handler(Looper.getMainLooper()).post { + if (isAdded) { + Toast.makeText(fragmentActivity, message, Toast.LENGTH_SHORT).show() + } + } + } + } + + fun processScheduleData(d:String){ + val res = JSONObject(d) + val courses = mutableListOf() + val ar=res.getJSONObject("d").getJSONArray("classes") + for (i in 0 until ar.length()) { + val classObject = ar.getJSONObject(i) + courses.add(Course(classObject.getString("course_name"), viewModel.mp[classObject.getString("weekday")].toString(), + classObject.getString("lessons"), classObject.getString("location"), + classObject.getString("teacher"),classObject.getString("course_id"),classObject.getString("week"))) + } + activity?.let { + Handler(Looper.getMainLooper()).post { + if (isAdded) { + hideLoading() + binding.weekChoice.visibility=View.VISIBLE + createSchedule(courses) + } + } + } + } + + fun runSchedule(year:String,term:String,week:String){ + showLoading() + binding.scheduleTable.removeAllViews() + val cacheKey="$year-$term-$week" + //showToast(cacheKey) + val cacheManager=ScheduleCacheManager(requireContext()) + val cachedData = cacheManager.getCachedData(cacheKey) + if(cachedData!=null){ + processScheduleData(cachedData) + }else{ + BjutAPI().getSchedule(account_session_util(requireContext()).getUserDetails()[account_session_util.KEY_SESS].toString() + ,year,term,week,object : + Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) { + val res=response.body?.string().toString() + //showToast(res) + try { + processScheduleData(res) + appLogger.e("Info", "Refresh ScheduleData:$cacheKey") + cacheManager.cacheData(cacheKey,res) + }catch (e: JSONException){ + showToast("error") + appLogger.e("Error", "Try ScheduleInfo error",e) + } + } + }) + } + } + + private var selectedWeek = 1 + + private fun createWeeks(weekCount: Int, currentWeek: Int) { + val dropdown = binding.weekDropdown + val weeks = (1..weekCount).map { "第${it}周" } + val adapter = ArrayAdapter( + requireContext(), + android.R.layout.simple_spinner_dropdown_item, + weeks + ) + dropdown.post { + dropdown.setAdapter(adapter) + dropdown.setText(weeks[currentWeek - 1], false) + } + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + viewModel = ViewModelProvider(this)[ScheduleViewModel::class.java] + + showLoading() + /* + val year="2024-2025" + val term="1" + val week="11"*/ + + selectedWeek = savedInstanceState?.getInt("selected_week", 0) ?: 0 + + val cacheManager=ScheduleCacheManager(requireContext()) + val cachedTermData = cacheManager.getCachedData("term-info") + + var year="" + var term="" + + binding.weekDropdown.apply { + setOnClickListener { + showDropDown() + } + setOnItemClickListener { _, _, position, _ -> + val week = position + 1 + viewModel.selectedWeek = week + runSchedule(year, term, viewModel.selectedWeek.toString()) + //showToast(week.toString()) + } + } + if (viewModel.selectedWeek == null) { + if(cachedTermData!=null){ + val tmp=JSONObject(cachedTermData).getJSONObject("d").getJSONObject("params") + year=tmp.getString("year") + term=tmp.getString("term") + runSchedule(year,term,tmp.getString("week")) + createWeeks(tmp.getString("countweek").toInt(),tmp.getString("week").toInt()) + binding.weekChoice.hint="$year 第 $term 学期:选择周数" + }else{ + BjutAPI().getTermWeek(account_session_util(requireContext()).getUserDetails()[account_session_util.KEY_SESS].toString() + ,object : + Callback { + override fun onFailure(call: Call, e: IOException) { + showToast("network error") + } + override fun onResponse(call: Call, response: Response) { + val res_text=response.body?.string().toString() + try{ + val res=JSONObject(res_text) + //if(res.get("e")==0) + val tmp=res.getJSONObject("d").getJSONObject("params") + year=tmp.getString("year") + term=tmp.getString("term") + viewModel.selectedWeek = tmp.getString("week").toInt() + activity?.let { + Handler(Looper.getMainLooper()).post { + if (isAdded) { + runSchedule(year,term, tmp.getString("week")) + createWeeks(tmp.getString("countweek").toInt(),tmp.getString("week").toInt()) + binding.weekChoice.hint="$year 第 $term 学期:选择周数" + } + } + } + cacheManager.cacheData("term-info",res_text) + }catch (e: JSONException){ + showToast("error") + appLogger.e("Error", "Try TermInfo error",e) + } + } + }) + } + } else { + //如果已经选择过周数,使用保存的选择,此时一定有term缓存 + val tmp=JSONObject(cachedTermData).getJSONObject("d").getJSONObject("params") + year=tmp.getString("year") + term=tmp.getString("term") + runSchedule(year,term, viewModel.selectedWeek.toString()) + createWeeks(tmp.getString("countweek").toInt(), viewModel.selectedWeek!!) + binding.weekChoice.hint="$year 第 $term 学期:选择周数" + } + + + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hlwdy/bjut/ui/schedule/ScheduleViewModel.kt b/app/src/main/java/com/hlwdy/bjut/ui/schedule/ScheduleViewModel.kt new file mode 100644 index 0000000..4b16b6b --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/ui/schedule/ScheduleViewModel.kt @@ -0,0 +1,30 @@ +package com.hlwdy.bjut.ui.schedule + +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel + +class ScheduleViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() { + val days = listOf("周一", "周二", "周三", "周四", "周五","周六","周日") + val timeSlots = listOf( + "8:00-8:45", "8:50-9:35", "9:55-10:40", "10:45-11:30", + "13:30-14:15", "14:20-15:05", "15:25-16:10", "16:15-17:00", + "18:00-18:45", "18:50-19:35", "19:55-20:40", "20:45-21:30" + ) + var mp=mapOf("1" to "周一", "2" to "周二","3" to "周三","4" to "周四","5" to "周五","6" to "周六","7" to "周日") + + var selectedWeek: Int? + get() = savedStateHandle.get("selected_week") + set(value) { + savedStateHandle["selected_week"] = value + } +} + +data class Course( + val name: String, + val day: String, + val timeCode: String, // 例如 "0102" 表示第1-2节课 + val location: String, + var teacher: String, + var id: String, + var weeks: String +) diff --git a/app/src/main/java/com/hlwdy/bjut/vpnOTP.kt b/app/src/main/java/com/hlwdy/bjut/vpnOTP.kt new file mode 100644 index 0000000..44edbd2 --- /dev/null +++ b/app/src/main/java/com/hlwdy/bjut/vpnOTP.kt @@ -0,0 +1,54 @@ +package net.arraynetworks.vpn + +import android.os.Handler +import android.os.Looper +import com.hlwdy.bjut.BjutHttpRsa +import com.hlwdy.bjut.HttpUtils +import okhttp3.Call +import okhttp3.Callback +import okhttp3.Response +import org.json.JSONObject +import java.io.IOException + +class NativeLib { + init { + System.loadLibrary("vpn") // 加载libvpn.so + } + + // 声明native方法 + external fun getOptValue(timestamp: Int, secret: ByteArray, interval: Int): Int + external fun encodeOptData(data: ByteArray): ByteArray +} +class OTPManager { + private var timeOffset: Long = 0 // 时间偏移量(毫秒) + + // 获取校准后的时间戳(秒) + private fun getAdjustedTimestamp(): Int { + return ((System.currentTimeMillis() + timeOffset) / 1000L).toInt() + } + + // 生成OTP + fun generateOTP(secret: ByteArray, interval: Int = 60): Int { + val timestamp = getAdjustedTimestamp() + return try { + NativeLib().getOptValue(timestamp, secret, interval) + } catch (e: Exception) { + -1 + } + } + + // 设置时间偏移 + fun setTimeOffset(offset: Long) { + timeOffset = offset + } + + fun registerOTP(usname:String,pwd:String,sm:String,callback: Callback){ + HttpUtils().addHeader("User-Agent","BjutApp") + .addHeader("Cookie","ANStandalone=true;;ANStandalone=true") + .addParam("method","otp") + .addParam("uname",usname) + .addParam("pwd",pwd) + .addParam("sm",sm) + .post("https://vpn.bjut.edu.cn/prx/000/http/localhost/register",callback) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_arrow_back_24.xml b/app/src/main/res/drawable/baseline_arrow_back_24.xml new file mode 100644 index 0000000..075e95d --- /dev/null +++ b/app/src/main/res/drawable/baseline_arrow_back_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_credit_card_24.xml b/app/src/main/res/drawable/baseline_credit_card_24.xml new file mode 100644 index 0000000..cfb6c96 --- /dev/null +++ b/app/src/main/res/drawable/baseline_credit_card_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_home_24.xml b/app/src/main/res/drawable/baseline_home_24.xml new file mode 100644 index 0000000..20cb4d6 --- /dev/null +++ b/app/src/main/res/drawable/baseline_home_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_menu_book_24.xml b/app/src/main/res/drawable/baseline_menu_book_24.xml new file mode 100644 index 0000000..10d9f76 --- /dev/null +++ b/app/src/main/res/drawable/baseline_menu_book_24.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/baseline_newspaper_24.xml b/app/src/main/res/drawable/baseline_newspaper_24.xml new file mode 100644 index 0000000..a1f1836 --- /dev/null +++ b/app/src/main/res/drawable/baseline_newspaper_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_password_24.xml b/app/src/main/res/drawable/baseline_password_24.xml new file mode 100644 index 0000000..322ade7 --- /dev/null +++ b/app/src/main/res/drawable/baseline_password_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_person_24.xml b/app/src/main/res/drawable/baseline_person_24.xml new file mode 100644 index 0000000..506e0ff --- /dev/null +++ b/app/src/main/res/drawable/baseline_person_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_qr_code_24.xml b/app/src/main/res/drawable/baseline_qr_code_24.xml new file mode 100644 index 0000000..b03f9ae --- /dev/null +++ b/app/src/main/res/drawable/baseline_qr_code_24.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/baseline_restore_page_24.xml b/app/src/main/res/drawable/baseline_restore_page_24.xml new file mode 100644 index 0000000..fdcbec2 --- /dev/null +++ b/app/src/main/res/drawable/baseline_restore_page_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_table_chart_24.xml b/app/src/main/res/drawable/baseline_table_chart_24.xml new file mode 100644 index 0000000..418f387 --- /dev/null +++ b/app/src/main/res/drawable/baseline_table_chart_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_vpn_lock_24.xml b/app/src/main/res/drawable/baseline_vpn_lock_24.xml new file mode 100644 index 0000000..fa4aab0 --- /dev/null +++ b/app/src/main/res/drawable/baseline_vpn_lock_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/bjut.webp b/app/src/main/res/drawable/bjut.webp new file mode 100644 index 0000000000000000000000000000000000000000..457c85adfeae6d61eb294597f0b448429b66fa18 GIT binary patch literal 105146 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 BS;qhX literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bjut_all.webp b/app/src/main/res/drawable/bjut_all.webp new file mode 100644 index 0000000000000000000000000000000000000000..214d9575c665f33d445c4ea08598c2c77bc81a1c GIT binary patch literal 103030 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..b757c5a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..ab065a6 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,31 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground1.xml b/app/src/main/res/drawable/ic_launcher_foreground1.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground1.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml new file mode 100644 index 0000000..18adf03 --- /dev/null +++ b/app/src/main/res/drawable/side_nav_bar.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000..e98aa35 --- /dev/null +++ b/app/src/main/res/layout/activity_about.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_log_view.xml b/app/src/main/res/layout/activity_log_view.xml new file mode 100644 index 0000000..8c5ff66 --- /dev/null +++ b/app/src/main/res/layout/activity_log_view.xml @@ -0,0 +1,12 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..6c7dd7c --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,25 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_router.xml b/app/src/main/res/layout/activity_router.xml new file mode 100644 index 0000000..3413146 --- /dev/null +++ b/app/src/main/res/layout/activity_router.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml new file mode 100644 index 0000000..b2e0166 --- /dev/null +++ b/app/src/main/res/layout/app_bar_main.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml new file mode 100644 index 0000000..6e0ea39 --- /dev/null +++ b/app/src/main/res/layout/content_main.xml @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_loading.xml b/app/src/main/res/layout/dialog_loading.xml new file mode 100644 index 0000000..d82aafe --- /dev/null +++ b/app/src/main/res/layout/dialog_loading.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_card.xml b/app/src/main/res/layout/fragment_card.xml new file mode 100644 index 0000000..fa7c04e --- /dev/null +++ b/app/src/main/res/layout/fragment_card.xml @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml new file mode 100644 index 0000000..36ab683 --- /dev/null +++ b/app/src/main/res/layout/fragment_home.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml new file mode 100644 index 0000000..7784fc8 --- /dev/null +++ b/app/src/main/res/layout/fragment_library.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_news.xml b/app/src/main/res/layout/fragment_news.xml new file mode 100644 index 0000000..49ebc44 --- /dev/null +++ b/app/src/main/res/layout/fragment_news.xml @@ -0,0 +1,24 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_otp.xml b/app/src/main/res/layout/fragment_otp.xml new file mode 100644 index 0000000..30997a3 --- /dev/null +++ b/app/src/main/res/layout/fragment_otp.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_schedule.xml b/app/src/main/res/layout/fragment_schedule.xml new file mode 100644 index 0000000..5d70247 --- /dev/null +++ b/app/src/main/res/layout/fragment_schedule.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_log.xml b/app/src/main/res/layout/item_log.xml new file mode 100644 index 0000000..998a598 --- /dev/null +++ b/app/src/main/res/layout/item_log.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/login_page.xml b/app/src/main/res/layout/login_page.xml new file mode 100644 index 0000000..cca5fc9 --- /dev/null +++ b/app/src/main/res/layout/login_page.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + +