From 0eb1adba17407064420f74fb3acb67b2a8199f06 Mon Sep 17 00:00:00 2001 From: YJL321432yjl Date: Tue, 19 Sep 2023 08:16:44 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E6=8B=89=E5=8F=96?= =?UTF-8?q?=E5=92=8C=E8=BF=90=E8=A1=8C=E8=B0=83=E8=AF=95=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 3 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/poem.iml | 9 + .idea/vcs.xml | 6 + src/MyApplication/.gitignore | 15 + src/MyApplication/.idea/.gitignore | 3 + src/MyApplication/.idea/.name | 1 + src/MyApplication/.idea/compiler.xml | 6 + src/MyApplication/.idea/gradle.xml | 20 + src/MyApplication/.idea/misc.xml | 10 + src/MyApplication/.idea/vcs.xml | 6 + src/MyApplication/app/.gitignore | 1 + src/MyApplication/app/build.gradle | 71 ++++ src/MyApplication/app/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.java | 26 ++ .../app/src/main/AndroidManifest.xml | 93 ++++ .../Activity/AdviceActivity.java | 36 ++ .../myapplication/Activity/ChatActivity.java | 244 +++++++++++ .../Activity/DetailActivity.java | 260 ++++++++++++ .../myapplication/Activity/LoginActivity.java | 195 +++++++++ .../myapplication/Activity/MainActivity.java | 155 +++++++ .../Activity/PoetryListActivity.java | 311 ++++++++++++++ .../Activity/RegisterActivity.java | 196 +++++++++ .../myapplication/Activity/TestActivity.java | 398 ++++++++++++++++++ .../myapplication/Adapter/MsgAdapter.java | 151 +++++++ .../Adapter/PoemListAdapter.java | 75 ++++ .../myapplication/Adapter/RoomAdapter.java | 67 +++ .../com/example/myapplication/Api/Api.java | 53 +++ .../example/myapplication/Api/ToTrans.java | 22 + .../myapplication/Constant/constant.java | 6 + .../Fragment/AiPoetry/AiPoetryFragment.java | 243 +++++++++++ .../myapplication/Fragment/My/MyFragment.java | 32 ++ .../Fragment/Search/SearchFragment.java | 222 ++++++++++ .../association/AssociationFragment.java | 231 ++++++++++ .../Fragment/home/HomeFragment.java | 238 +++++++++++ .../Modal/ClientMessageBean.java | 60 +++ .../com/example/myapplication/Modal/Data.java | 36 ++ .../myapplication/Modal/EmotionResBean.java | 32 ++ .../example/myapplication/Modal/Poetry.java | 66 +++ .../myapplication/Modal/PoetryDetail.java | 121 ++++++ .../myapplication/Modal/PoetryUtil.java | 274 ++++++++++++ .../myapplication/Modal/PrivateInfo.java | 12 + .../example/myapplication/Modal/RoomBean.java | 40 ++ .../Modal/SystemMessageBean.java | 40 ++ .../example/myapplication/Util/FileUtils.java | 67 +++ .../com/example/myapplication/Util/Spilt.java | 29 ++ .../myapplication/Util/WebSocketUtil.java | 110 +++++ .../com/example/myapplication/XUIInit.java | 16 + ...selector_round_button_main_theme_color.xml | 24 ++ .../drawable-v24/ic_launcher_foreground.xml | 30 ++ .../app/src/main/res/drawable/advice.png | Bin 0 -> 3650 bytes .../app/src/main/res/drawable/app.jpg | Bin 0 -> 16304 bytes .../main/res/drawable/bg_rect_round_blue.xml | 23 + .../app/src/main/res/drawable/border.xml | 12 + .../src/main/res/drawable/chatroom_temp.png | Bin 0 -> 115265 bytes .../app/src/main/res/drawable/create_room.png | Bin 0 -> 4458 bytes .../main/res/drawable/dynasty_label_style.xml | 9 + .../app/src/main/res/drawable/editstyle.xml | 17 + .../app/src/main/res/drawable/ic_back.png | Bin 0 -> 373 bytes .../res/drawable/ic_dashboard_black_24dp.xml | 9 + .../src/main/res/drawable/ic_default_head.xml | 26 ++ .../main/res/drawable/ic_home_black_24dp.xml | 9 + .../res/drawable/ic_launcher_background.xml | 170 ++++++++ .../src/main/res/drawable/ic_navigate1.png | Bin 0 -> 648 bytes .../drawable/ic_notifications_black_24dp.xml | 9 + .../app/src/main/res/drawable/ic_password.xml | 18 + .../app/src/main/res/drawable/ic_phone.xml | 4 + .../app/src/main/res/drawable/ic_search.png | Bin 0 -> 797 bytes .../app/src/main/res/drawable/ic_setting.png | Bin 0 -> 616 bytes .../res/drawable/icon_arrow_right_grey.xml | 29 ++ .../src/main/res/drawable/icon_collect1.png | Bin 0 -> 653 bytes .../app/src/main/res/drawable/img.png | Bin 0 -> 506 bytes .../app/src/main/res/drawable/img_1.png | Bin 0 -> 506 bytes .../app/src/main/res/drawable/img_2.png | Bin 0 -> 506 bytes .../app/src/main/res/drawable/label_style.xml | 9 + .../main/res/drawable/message_center.9.png | Bin 0 -> 4533 bytes .../src/main/res/drawable/message_left.9.png | Bin 0 -> 588 bytes .../src/main/res/drawable/message_right.9.png | Bin 0 -> 573 bytes .../src/main/res/drawable/round_editstyle.xml | 17 + .../app/src/main/res/drawable/search.png | Bin 0 -> 3818 bytes .../main/res/drawable/type_label_style.xml | 9 + .../app/src/main/res/drawable/voice.png | Bin 0 -> 5115 bytes .../src/main/res/layout/activity_advice.xml | 33 ++ .../src/main/res/layout/activity_detail.xml | 384 +++++++++++++++++ .../src/main/res/layout/activity_login.xml | 193 +++++++++ .../app/src/main/res/layout/activity_main.xml | 50 +++ .../main/res/layout/activity_poetry_list.xml | 51 +++ .../src/main/res/layout/activity_register.xml | 142 +++++++ .../app/src/main/res/layout/activity_test.xml | 108 +++++ .../src/main/res/layout/adapter_item_tag.xml | 17 + .../app/src/main/res/layout/bottom.xml | 63 +++ .../app/src/main/res/layout/chat_view.xml | 16 + .../app/src/main/res/layout/create_room.xml | 72 ++++ .../main/res/layout/fragment_ai_poetry.xml | 182 ++++++++ .../main/res/layout/fragment_association.xml | 91 ++++ .../app/src/main/res/layout/fragment_home.xml | 301 +++++++++++++ .../app/src/main/res/layout/fragment_my.xml | 107 +++++ .../src/main/res/layout/fragment_search.xml | 183 ++++++++ .../app/src/main/res/layout/message_view.xml | 85 ++++ .../app/src/main/res/layout/poem_item.xml | 73 ++++ .../app/src/main/res/layout/room_view.xml | 32 ++ .../app/src/main/res/menu/bottom_nav_menu.xml | 24 ++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes .../main/res/navigation/mobile_navigation.xml | 32 ++ .../app/src/main/res/values-night/themes.xml | 16 + .../app/src/main/res/values/colors.xml | 35 ++ .../app/src/main/res/values/dimens.xml | 6 + .../app/src/main/res/values/strings.xml | 73 ++++ .../app/src/main/res/values/style.xml | 55 +++ .../app/src/main/res/values/themes.xml | 15 + .../app/src/main/res/xml/backup_rules.xml | 13 + .../main/res/xml/data_extraction_rules.xml | 19 + .../myapplication/ExampleUnitTest.java | 17 + src/MyApplication/build.gradle | 5 + src/MyApplication/gradle.properties | 22 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + src/MyApplication/gradlew | 185 ++++++++ src/MyApplication/gradlew.bat | 89 ++++ src/MyApplication/settings.gradle | 23 + 132 files changed, 7595 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/poem.iml create mode 100644 .idea/vcs.xml create mode 100644 src/MyApplication/.gitignore create mode 100644 src/MyApplication/.idea/.gitignore create mode 100644 src/MyApplication/.idea/.name create mode 100644 src/MyApplication/.idea/compiler.xml create mode 100644 src/MyApplication/.idea/gradle.xml create mode 100644 src/MyApplication/.idea/misc.xml create mode 100644 src/MyApplication/.idea/vcs.xml create mode 100644 src/MyApplication/app/.gitignore create mode 100644 src/MyApplication/app/build.gradle create mode 100644 src/MyApplication/app/proguard-rules.pro create mode 100644 src/MyApplication/app/src/androidTest/java/com/example/myapplication/ExampleInstrumentedTest.java create mode 100644 src/MyApplication/app/src/main/AndroidManifest.xml create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Activity/AdviceActivity.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Activity/ChatActivity.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Activity/DetailActivity.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Activity/LoginActivity.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Activity/MainActivity.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Activity/PoetryListActivity.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Activity/RegisterActivity.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Activity/TestActivity.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/MsgAdapter.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/PoemListAdapter.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/RoomAdapter.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Api/Api.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Api/ToTrans.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Constant/constant.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/AiPoetry/AiPoetryFragment.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/My/MyFragment.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/Search/SearchFragment.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/association/AssociationFragment.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/home/HomeFragment.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Modal/ClientMessageBean.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Modal/Data.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Modal/EmotionResBean.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Modal/Poetry.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PoetryDetail.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PoetryUtil.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PrivateInfo.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Modal/RoomBean.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Modal/SystemMessageBean.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Util/FileUtils.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Util/Spilt.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/Util/WebSocketUtil.java create mode 100644 src/MyApplication/app/src/main/java/com/example/myapplication/XUIInit.java create mode 100644 src/MyApplication/app/src/main/res/color/selector_round_button_main_theme_color.xml create mode 100644 src/MyApplication/app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/advice.png create mode 100644 src/MyApplication/app/src/main/res/drawable/app.jpg create mode 100644 src/MyApplication/app/src/main/res/drawable/bg_rect_round_blue.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/border.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/chatroom_temp.png create mode 100644 src/MyApplication/app/src/main/res/drawable/create_room.png create mode 100644 src/MyApplication/app/src/main/res/drawable/dynasty_label_style.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/editstyle.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_back.png create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_dashboard_black_24dp.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_default_head.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_home_black_24dp.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_navigate1.png create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_notifications_black_24dp.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_password.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_phone.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_search.png create mode 100644 src/MyApplication/app/src/main/res/drawable/ic_setting.png create mode 100644 src/MyApplication/app/src/main/res/drawable/icon_arrow_right_grey.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/icon_collect1.png create mode 100644 src/MyApplication/app/src/main/res/drawable/img.png create mode 100644 src/MyApplication/app/src/main/res/drawable/img_1.png create mode 100644 src/MyApplication/app/src/main/res/drawable/img_2.png create mode 100644 src/MyApplication/app/src/main/res/drawable/label_style.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/message_center.9.png create mode 100644 src/MyApplication/app/src/main/res/drawable/message_left.9.png create mode 100644 src/MyApplication/app/src/main/res/drawable/message_right.9.png create mode 100644 src/MyApplication/app/src/main/res/drawable/round_editstyle.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/search.png create mode 100644 src/MyApplication/app/src/main/res/drawable/type_label_style.xml create mode 100644 src/MyApplication/app/src/main/res/drawable/voice.png create mode 100644 src/MyApplication/app/src/main/res/layout/activity_advice.xml create mode 100644 src/MyApplication/app/src/main/res/layout/activity_detail.xml create mode 100644 src/MyApplication/app/src/main/res/layout/activity_login.xml create mode 100644 src/MyApplication/app/src/main/res/layout/activity_main.xml create mode 100644 src/MyApplication/app/src/main/res/layout/activity_poetry_list.xml create mode 100644 src/MyApplication/app/src/main/res/layout/activity_register.xml create mode 100644 src/MyApplication/app/src/main/res/layout/activity_test.xml create mode 100644 src/MyApplication/app/src/main/res/layout/adapter_item_tag.xml create mode 100644 src/MyApplication/app/src/main/res/layout/bottom.xml create mode 100644 src/MyApplication/app/src/main/res/layout/chat_view.xml create mode 100644 src/MyApplication/app/src/main/res/layout/create_room.xml create mode 100644 src/MyApplication/app/src/main/res/layout/fragment_ai_poetry.xml create mode 100644 src/MyApplication/app/src/main/res/layout/fragment_association.xml create mode 100644 src/MyApplication/app/src/main/res/layout/fragment_home.xml create mode 100644 src/MyApplication/app/src/main/res/layout/fragment_my.xml create mode 100644 src/MyApplication/app/src/main/res/layout/fragment_search.xml create mode 100644 src/MyApplication/app/src/main/res/layout/message_view.xml create mode 100644 src/MyApplication/app/src/main/res/layout/poem_item.xml create mode 100644 src/MyApplication/app/src/main/res/layout/room_view.xml create mode 100644 src/MyApplication/app/src/main/res/menu/bottom_nav_menu.xml create mode 100644 src/MyApplication/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 src/MyApplication/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 src/MyApplication/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 src/MyApplication/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 src/MyApplication/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 src/MyApplication/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 src/MyApplication/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 src/MyApplication/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 src/MyApplication/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 src/MyApplication/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 src/MyApplication/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 src/MyApplication/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 src/MyApplication/app/src/main/res/navigation/mobile_navigation.xml create mode 100644 src/MyApplication/app/src/main/res/values-night/themes.xml create mode 100644 src/MyApplication/app/src/main/res/values/colors.xml create mode 100644 src/MyApplication/app/src/main/res/values/dimens.xml create mode 100644 src/MyApplication/app/src/main/res/values/strings.xml create mode 100644 src/MyApplication/app/src/main/res/values/style.xml create mode 100644 src/MyApplication/app/src/main/res/values/themes.xml create mode 100644 src/MyApplication/app/src/main/res/xml/backup_rules.xml create mode 100644 src/MyApplication/app/src/main/res/xml/data_extraction_rules.xml create mode 100644 src/MyApplication/app/src/test/java/com/example/myapplication/ExampleUnitTest.java create mode 100644 src/MyApplication/build.gradle create mode 100644 src/MyApplication/gradle.properties create mode 100644 src/MyApplication/gradle/wrapper/gradle-wrapper.jar create mode 100644 src/MyApplication/gradle/wrapper/gradle-wrapper.properties create mode 100644 src/MyApplication/gradlew create mode 100644 src/MyApplication/gradlew.bat create mode 100644 src/MyApplication/settings.gradle diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..639900d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..7252431 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/poem.iml b/.idea/poem.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/poem.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/MyApplication/.gitignore b/src/MyApplication/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/src/MyApplication/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/src/MyApplication/.idea/.gitignore b/src/MyApplication/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/src/MyApplication/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/src/MyApplication/.idea/.name b/src/MyApplication/.idea/.name new file mode 100644 index 0000000..b3405b3 --- /dev/null +++ b/src/MyApplication/.idea/.name @@ -0,0 +1 @@ +My Application \ No newline at end of file diff --git a/src/MyApplication/.idea/compiler.xml b/src/MyApplication/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/src/MyApplication/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/MyApplication/.idea/gradle.xml b/src/MyApplication/.idea/gradle.xml new file mode 100644 index 0000000..7b46144 --- /dev/null +++ b/src/MyApplication/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/.idea/misc.xml b/src/MyApplication/.idea/misc.xml new file mode 100644 index 0000000..bdd9278 --- /dev/null +++ b/src/MyApplication/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/.idea/vcs.xml b/src/MyApplication/.idea/vcs.xml new file mode 100644 index 0000000..b2bdec2 --- /dev/null +++ b/src/MyApplication/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/.gitignore b/src/MyApplication/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/src/MyApplication/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/src/MyApplication/app/build.gradle b/src/MyApplication/app/build.gradle new file mode 100644 index 0000000..95d090a --- /dev/null +++ b/src/MyApplication/app/build.gradle @@ -0,0 +1,71 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'com.example.myapplication' + compileSdk 32 + + defaultConfig { + applicationId "com.example.myapplication" + minSdk 26 + targetSdk 32 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + buildFeatures { + viewBinding true + } +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'com.google.android.material:material:1.5.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + implementation 'androidx.navigation:navigation-fragment:2.4.1' + implementation 'androidx.navigation:navigation-ui:2.4.1' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + + implementation 'com.github.xuexiangjys:XUI:1.2.1' + implementation 'androidx.recyclerview:recyclerview:1.2.1' + implementation 'com.github.bumptech.glide:glide:4.15.1' + + /*步骤二:添加retrofit依赖库*/ + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' + + implementation 'org.sufficientlysecure:html-textview:4.0' + + // 下拉刷新,上拉加载 + implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.3' + // 没有使用特殊Header,可以不加这一依赖 + implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.3' + //tag + implementation 'com.hyman:flowlayout-lib:1.1.2' + + //图表 + // Charts + implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0' + + //腾讯接口 + implementation 'com.tencent.edu:TAISDK:1.2.3.92' +} \ No newline at end of file diff --git a/src/MyApplication/app/proguard-rules.pro b/src/MyApplication/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/src/MyApplication/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/src/MyApplication/app/src/androidTest/java/com/example/myapplication/ExampleInstrumentedTest.java b/src/MyApplication/app/src/androidTest/java/com/example/myapplication/ExampleInstrumentedTest.java new file mode 100644 index 0000000..982ba51 --- /dev/null +++ b/src/MyApplication/app/src/androidTest/java/com/example/myapplication/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.myapplication; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.myapplication", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/AndroidManifest.xml b/src/MyApplication/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..99713ef --- /dev/null +++ b/src/MyApplication/app/src/main/AndroidManifest.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/AdviceActivity.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/AdviceActivity.java new file mode 100644 index 0000000..9566797 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/AdviceActivity.java @@ -0,0 +1,36 @@ +package com.example.myapplication.Activity; + +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Intent; +import android.os.Bundle; +import android.widget.TextView; + +import com.example.myapplication.R; +import com.xuexiang.xui.widget.edittext.MultiLineEditText; + +public class AdviceActivity extends AppCompatActivity { + + private TextView poetryTitle; + private MultiLineEditText advice; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_advice); + + Intent intent = getIntent(); + String poetryId = intent.getStringExtra("poemId"); + String Title = intent.getStringExtra("poemTitle"); + String username = intent.getStringExtra("username"); + + initView(); + + poetryTitle.setText(Title); + } + + private void initView() { + poetryTitle = findViewById(R.id.poetryTitle); + advice = findViewById(R.id.advice); + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/ChatActivity.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/ChatActivity.java new file mode 100644 index 0000000..d534fff --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/ChatActivity.java @@ -0,0 +1,244 @@ +package com.example.myapplication.Activity; + +import static android.widget.Toast.LENGTH_SHORT; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import android.content.Intent; +import android.graphics.Color; +import android.media.MediaPlayer; +import android.media.MediaRecorder; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.OnTouchListener; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.Toast; + +import com.example.myapplication.Adapter.MsgAdapter; +import com.example.myapplication.Modal.ClientMessageBean; +import com.example.myapplication.Modal.SystemMessageBean; +import com.example.myapplication.R; +import com.example.myapplication.Util.FileUtils; +import com.example.myapplication.Util.WebSocketUtil; +import com.google.gson.Gson; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +public class ChatActivity extends AppCompatActivity { + private List msgList = new ArrayList<>(); + private String username; + private int rid; + static int numOfCaches= 1; + //此处待修改 + private String url = "ws://101.33.242.218:8081/chat/"; + private EditText inputText; + private Button send; + private Button sendVoiceButton; + private ImageButton changeToVoice; + private ImageButton changeToText; + private RecyclerView msgRecyclerView; + private MsgAdapter adapter; + LinearLayout sendVoice; + LinearLayout sendText; + private LinearLayoutManager layoutManager; + private WebSocketUtil webSocketUtil; + //语音操作对象 + private MediaPlayer mPlayer = null; + private MediaRecorder mRecorder = null; + //语音文件保存路径 + private String FileName = null; + //接受消息,更新界面 + private Handler handler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message message) { + SystemMessageBean systemMessageBean = (SystemMessageBean) message.obj; + Gson gson = new Gson(); + ClientMessageBean messageBean ; + if(systemMessageBean.getFrom() == null){ + messageBean = new ClientMessageBean(0,null,systemMessageBean.getMessage(),null); + }else if (!systemMessageBean.getFrom().equals(username)){ + messageBean = gson.fromJson(systemMessageBean.getMessage(),ClientMessageBean.class); + messageBean.setType(messageBean.getType()+1); + }else{ + messageBean = gson.fromJson(systemMessageBean.getMessage(),ClientMessageBean.class); + } + if(messageBean.getRecord()!=null){ + try { + byte[] bytes = messageBean.getRecord(); + FileUtils.getFileByBytes(bytes, getCacheDir().getPath()+"/",numOfCaches+".amr"); + messageBean.setMessage(getCacheDir().getPath()+"/"+numOfCaches+".amr"); + numOfCaches++; + }catch (Exception e){ + e.printStackTrace(); + } + } + msgList.add(messageBean); + //当有新消息,刷新RecyclerVeiw的显示 + adapter.notifyItemInserted(msgList.size() - 1); + //将RecyclerView定位到最后一行 + msgRecyclerView.scrollToPosition(msgList.size() - 1); + //清空输入框内容 + inputText.setText(""); + return false; + } + }); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.chat_view); + mPlayer = new MediaPlayer(); + FileName = getCacheDir() + "/amrsend.amr"; + //初始化控件 + initView(); + createConnection(); + send.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + //点击发送后新建信息,发送给服务器 + String content = inputText.getText().toString(); + ClientMessageBean messageBean = new ClientMessageBean( + 1, + username, + content, + null + ); + Gson gson = new Gson(); + webSocketUtil.send(gson.toJson(messageBean)); + } + }); + + //切换发送语音和文本 + changeToVoice.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + sendText.setVisibility(View.GONE); + sendVoice.setVisibility(View.VISIBLE); + } + }); + changeToText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + sendVoice.setVisibility(View.GONE); + sendText.setVisibility(View.VISIBLE); + } + }); + //设置发送语音监听 + sendVoiceButton.setOnTouchListener(sendVoiceListener); + + } + + public void initView(){ + sendText = findViewById(R.id.text_bottom); + sendVoice = findViewById(R.id.voice_bottom); + + inputText = (EditText)findViewById(R.id.input_txet); + send = (Button) findViewById(R.id.send); + sendVoiceButton = findViewById(R.id.record_voice); + changeToVoice = findViewById(R.id.change_to_voice); + changeToText = findViewById(R.id.back_to_text); + + //首先隐藏发送语音模块 + sendVoice.setVisibility(View.GONE); + + msgRecyclerView = (RecyclerView)findViewById(R.id.msg_recycle_view); + layoutManager = new LinearLayoutManager(this); + msgRecyclerView.setLayoutManager(layoutManager); + adapter = new MsgAdapter(msgList,mPlayer); + msgRecyclerView.setAdapter(adapter); + } + + void createConnection(){ + //获取进入房间号和用户名 + Intent intent = getIntent(); + username = intent.getStringExtra("username"); + rid = intent.getIntExtra("rid",0); + + webSocketUtil = new WebSocketUtil(); + webSocketUtil.connect(url,rid,username,handler); + } + + + //这里记得断开连接 + @Override + protected void onDestroy() { + super.onDestroy(); + webSocketUtil.disconnect(); + } + private OnTouchListener sendVoiceListener = new OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + float beginX,beginY=0,finalX,finalY; + switch (motionEvent.getAction()) { + case MotionEvent.ACTION_DOWN: + sendVoiceButton.setText("正在录音"); + sendVoiceButton.setBackgroundColor(Color.RED); + beginX = motionEvent.getX(); + beginY = motionEvent.getY(); + Log.e("MainActivity", "beginX:" + beginX); + Log.e("MainActivity", "beginY:" + beginY); + Log.e("MainActivity", "ACTION_DOWN"); + mRecorder = new MediaRecorder(); + mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); + mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); + mRecorder.setOutputFile(FileName); + mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); + try { + mRecorder.prepare(); + } catch (IOException e) { + Log.e("MainActivity", "prepare() failed" + e); + } + mRecorder.start(); + break; + case MotionEvent.ACTION_UP: + sendVoiceButton.setText("按住说话"); + sendVoiceButton.setBackgroundColor(getColor(R.color.colorPrimaryDark)); + finalX = motionEvent.getX(); + finalY = motionEvent.getY(); + Log.e("MainActivity", "finalX:" + finalX); + Log.e("MainActivity", "finalY:" + finalY); + Log.e("MainActivity", "ACTION_UP"); + mRecorder.stop(); + mRecorder.release(); + mRecorder = null; + if ((beginY - finalY) > 50) { + Log.e("MainActivity", "执行删除"); + new File(FileName).delete(); + Toast.makeText( ChatActivity.this,"取消发送", LENGTH_SHORT).show(); + Log.e("MainActivity", "执行删除后文件是否还存在:" + new File(FileName).exists()); + } + if(new File(FileName).exists()){ + ClientMessageBean messageBean = new ClientMessageBean( + 3, + username, + null, + FileUtils.getBytesByFile(new File(FileName)) + ); + Gson gson = new Gson(); + webSocketUtil.send(gson.toJson(messageBean)); + } + break; + default: + break; + } + return true; + } + }; +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/DetailActivity.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/DetailActivity.java new file mode 100644 index 0000000..49e3c90 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/DetailActivity.java @@ -0,0 +1,260 @@ +package com.example.myapplication.Activity; + +import static com.xuexiang.xui.XUI.getContext; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.os.StrictMode; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TextView; +import android.widget.Toast; + +import com.example.myapplication.Api.Api; +import com.example.myapplication.Constant.constant; +import com.example.myapplication.Modal.PoetryDetail; +import com.example.myapplication.R; +import com.example.myapplication.Util.Spilt; +import com.google.gson.Gson; + +import org.json.JSONException; +import org.json.JSONObject; +import org.sufficientlysecure.htmltextview.HtmlTextView; + +import java.io.IOException; +import java.util.List; + +import okhttp3.ResponseBody; +import retrofit2.Callback; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class DetailActivity extends AppCompatActivity { + + + private static final String TAG = "test"; + + private Retrofit PoetryDetailRetrofit; + private Context context; + + private Toolbar toolbar; + private TextView titleText; + private String toolbarTitle; + + private HtmlTextView htmlAnnotation; + private TextView translation; + private TextView appreciation; + private LinearLayout linearLayout; + private Button test_button; + private TextView menu_line; + private TextView poem_title; + private TextView poem_author; + private TextView poem_content; + private ImageView poem_menu_advice; + +// 标签 +// private TagFlowLayout tag_flow; + + private ScrollView scrollView; + private ImageView author_img; + private ImageView icon_collect; + private TextView author_content; + private JSONObject responseObject; + private PoetryDetail poetryDetail; + private final int COMPLETED = 1; + private final int COLLECT = 2; + private final int STORAGE = 3; + private final int TO_WEBVIEW = 4; + private List tags; + + private Handler handler = new Handler() { + @Override + public void handleMessage(Message message) { + if (message.what == COMPLETED) { + try { + poem_title.setText(poetryDetail.getTitle()); //诗词名 + String author = poetryDetail.getDesty() + "." + poetryDetail.getAuthor(); + poem_author.setText(author); //作者+朝代 + String contentText = poetryDetail.getContent(); + contentText = Spilt.spiltContentText(contentText); + poem_content.setText(contentText); //原文 + +// 图片 +// Bitmap bitmap = getURLImage(poetryDetail.getImg()); //诗人图片 +// author_img.setImageBitmap(bitmap); + +// author_content.setText(poetryDetail.getAuthorDetail()); //诗人信息 + String annotation = poetryDetail.getAnnotation(); + htmlAnnotation.setHtml(annotation); //注释 + appreciation.setText(poetryDetail.getAppreciation()); //赏析 + translation.setText(poetryDetail.getTransContent()); //译文 +// tags = spiltBySpace(poetryDetail.getTag()); //标签 + +// 标签 +// initTagFlowLayout(); + } catch (Exception e) { + e.printStackTrace(); + } + }else { + Toast.makeText(DetailActivity.this, "显示失败", Toast.LENGTH_SHORT).show(); + } + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_detail); + + context = getContext(); + + //在主线程访问网络连接 + if (android.os.Build.VERSION.SDK_INT > 9) { + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); + StrictMode.setThreadPolicy(policy); + } + + initView(); + + setSupportActionBar(toolbar);//设置toolbar + getSupportActionBar().setDisplayShowTitleEnabled(false);//屏蔽toolbar默认标题显示 + + toolbarTitle = getIntent().getStringExtra("toolbarTitle"); + String content = getIntent().getStringExtra("content"); + + titleText.setText(toolbarTitle); + +// 获取诗词详情 + getPoetryDetailByContent(content); + +// 监听器 + //背诵 + test_button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent; + intent = new Intent(getContext(), TestActivity.class); + intent.putExtra("title", poetryDetail.getTitle()); + intent.putExtra("desty", poetryDetail.getDesty()); + intent.putExtra("author", poetryDetail.getAuthor()); + intent.putExtra("content", poetryDetail.getContent()); + startActivity(intent); + } + }); + + //意见反馈 + poem_menu_advice.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(getContext(), AdviceActivity.class); + String poemId = String.valueOf(poetryDetail.getId()); + + intent.putExtra("poemId", poemId); + intent.putExtra("poemTitle", poetryDetail.getTitle()); + startActivity(intent); + } + }); + } + + private void initView() { + toolbar = findViewById(R.id.poem_titleBar); + titleText = findViewById(R.id.poem_titleText); + menu_line = findViewById(R.id.menu_line); + htmlAnnotation = findViewById(R.id.annotation_text); + translation = findViewById(R.id.translation_text); + appreciation = findViewById(R.id.appreciation_text); + test_button = findViewById(R.id.poem_test_button); + poem_title = findViewById(R.id.detail_poem_title); + poem_author = findViewById(R.id.detail_poem_author); + poem_content = findViewById(R.id.detail_poem_content); + poem_menu_advice = findViewById(R.id.poem_menu_advice); + + author_img = findViewById(R.id.author_img); + author_content = findViewById(R.id.author_detail); + scrollView = findViewById(R.id.detail_scroll); + linearLayout = findViewById(R.id.poem_linnear); + icon_collect = findViewById(R.id.poem_menu_icon); + + } + + //根据首句获取诗词详情 + public void getPoetryDetailByContent(String content) { + String poetry_detail_url = constant.poetry_IP; + + //步骤五:构建Retrofit实例 + PoetryDetailRetrofit = new Retrofit.Builder() + //设置网络请求BaseUrl地址 + .baseUrl(poetry_detail_url) + //设置数据解析器 + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + //步骤六:创建网络请求接口对象实例 + Api poetryDetailApi = PoetryDetailRetrofit.create(Api.class); + + //步骤七:对发送请求进行封装,传入接口参数 + retrofit2.Call poetryDetailDataCall = poetryDetailApi.getPoetryDetail(content); + + //步骤八:发送网络请求(同步) + Log.e(TAG, "get == url:" + poetryDetailDataCall.request().url()); + new Thread(new Runnable() { //Android主线程不能操作网络请求,所以new一个线程来操作 + @Override + public void run() { + poetryDetailDataCall.enqueue(new Callback() { + @Override + public void onResponse(retrofit2.Call call, retrofit2.Response response) { + try { + String responseData = response.body().string(); + parseJSONWithGSON(responseData); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void onFailure(retrofit2.Call call, Throwable t) { + Toast.makeText(DetailActivity.this, "获取诗词详情失败", Toast.LENGTH_SHORT).show(); + } + }); + } + }).start(); + } + + //解析返回数据 + private void parseJSONWithGSON(String jsonData) { + Gson gson = new Gson(); + JSONObject jsonObject = null; + try { + responseObject = new JSONObject(jsonData); + if (responseObject != null) { + jsonObject = responseObject; + } + } catch (JSONException e) { + e.printStackTrace(); + } + PoetryDetail detail = null; + if (jsonObject != null) {//成功获取数据 + detail = gson.fromJson(jsonObject.toString(), PoetryDetail.class); + poetryDetail = detail; + Message message = new Message(); + message.what = COMPLETED; + handler.sendMessage(message); + } else//没有数据 + { + Message message = new Message(); + message.what = TO_WEBVIEW; + handler.sendMessage(message); + } + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/LoginActivity.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/LoginActivity.java new file mode 100644 index 0000000..fe6e9d9 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/LoginActivity.java @@ -0,0 +1,195 @@ +package com.example.myapplication.Activity; + +import androidx.appcompat.app.AppCompatActivity; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.os.StrictMode; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.example.myapplication.Api.Api; +import com.example.myapplication.Constant.constant; +import com.example.myapplication.R; + +import java.io.IOException; + +import okhttp3.ResponseBody; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class LoginActivity extends AppCompatActivity { + + private static final String TAG = "test"; + public static final int MSG_LOGIN_ERR = 1; //登录错误 + public static final int MSG_CONNET_ERR = 2; //网络链接错误 + + private Context context; + private Retrofit LoginRetrofit; + + private EditText et_number; + private EditText et_password; + private Button bt_login; + private Button bt_register; + + private LoginHandler login_handler; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_login); + + context = this; + InitView(); + login_handler = new LoginHandler(); + Init(); + +// StrictMode是指严格模式 + if (Build.VERSION.SDK_INT > 9){ + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); + StrictMode.setThreadPolicy(policy);//这两句设置禁止所有检查 + } + } + + private void InitView() { + et_number = (EditText)findViewById(R.id.et_number); + et_password = (EditText)findViewById(R.id.et_password); + bt_login = (Button)findViewById(R.id.bt_login); + bt_register = (Button) findViewById(R.id.bt_register); + } + + private void Init() { + //设置提示的颜色 + et_number.setHintTextColor(getResources().getColor(R.color.white)); + et_password.setHintTextColor(getResources().getColor(R.color.white)); + + + //登录 + bt_login.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (judge()) { + loginInfo(); + } + } + }); + + //注册 + bt_register.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Toast.makeText(context, "注册", Toast.LENGTH_SHORT).show(); + startActivity(new Intent(LoginActivity.this, RegisterActivity.class)); + } + }); + + } + + /**登录*/ + private void loginInfo() { + String username = et_number.getText().toString(); + String password = et_password.getText().toString(); + + String login_url = constant.poetry_IP; + + //步骤五:构建Retrofit实例 + LoginRetrofit = new Retrofit.Builder() + //设置网络请求BaseUrl地址 + .baseUrl(login_url) + //设置数据解析器 + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + //步骤六:创建网络请求接口对象实例 + Api loginApi = LoginRetrofit.create(Api.class); + + //步骤七:对发送请求进行封装,传入接口参数 + Call loginDataCall = loginApi.getData(username, password); + + //步骤八:发送网络请求(同步) + Log.e(TAG, "post == url:" + loginDataCall.request().url()); + new Thread(new Runnable() { //Android主线程不能操作网络请求,所以new一个线程来操作 + @Override + public void run() { + loginDataCall.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + try { + String date = new String(response.body().bytes()); + if(date.equals("success")){ + Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_SHORT).show(); + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + }else{ + Toast.makeText(LoginActivity.this, "登录失败,请检查你的用户名和密码", Toast.LENGTH_SHORT).show(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(LoginActivity.this, "get回调失败", Toast.LENGTH_SHORT).show(); + } + }); + } + }).start(); + + } + + /**判断登录信息是否合法*/ + private boolean judge() { + if (TextUtils.isEmpty(et_number.getText().toString()) ) { + Toast.makeText(context, "用户名不能为空",Toast.LENGTH_SHORT).show(); + return false; + } else if (TextUtils.isEmpty(et_password.getText().toString())) { + Toast.makeText(context, "用户ID不能为空",Toast.LENGTH_SHORT).show(); + return false; + } + return true; + } + + /**事件捕获*/ + class LoginHandler extends Handler { + @Override + public void dispatchMessage(Message msg) { + super.dispatchMessage(msg); + switch (msg.what) { + case MSG_LOGIN_ERR: + et_number.setText(""); + et_password.setText(""); + et_number.requestFocus(); + + new AlertDialog.Builder(LoginActivity.this) + .setTitle("注意") + .setMessage("用户名或密码输入不正确,请重新输入") + .setPositiveButton("确定",null) + .create() + .show(); + bt_login.setEnabled(true); + break; + case MSG_CONNET_ERR: + new AlertDialog.Builder(LoginActivity.this) + .setTitle("注意") + .setMessage("网络连接错误,请检查网络") + .setPositiveButton("确定",null) + .create() + .show(); + break; + } + } + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/MainActivity.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/MainActivity.java new file mode 100644 index 0000000..e67de41 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/MainActivity.java @@ -0,0 +1,155 @@ +package com.example.myapplication.Activity; + +import android.Manifest; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.view.MenuItem; +import android.view.View; + +import com.example.myapplication.Fragment.AiPoetry.AiPoetryFragment; +import com.example.myapplication.Fragment.My.MyFragment; +import com.example.myapplication.Fragment.Search.SearchFragment; +import com.example.myapplication.Fragment.association.AssociationFragment; +import com.example.myapplication.Fragment.home.HomeFragment; +import com.example.myapplication.R; +import com.google.android.material.bottomnavigation.BottomNavigationView; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.fragment.app.FragmentTransaction; +import androidx.navigation.NavController; +import androidx.navigation.Navigation; +import androidx.navigation.ui.AppBarConfiguration; +import androidx.navigation.ui.NavigationUI; +import androidx.viewpager.widget.ViewPager; + +import com.example.myapplication.databinding.ActivityMainBinding; + +public class MainActivity extends AppCompatActivity { + + BottomNavigationView navView; + ViewPager viewPager; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + //状态栏文字自适应 + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); + + initViewPage(); + initBottomNav(); + + FragmentManager manager = this.getSupportFragmentManager(); + FragmentTransaction fTransaction = manager.beginTransaction(); + fTransaction.replace(R.id.fragment_search,new SearchFragment()); + fTransaction.commit(); + + } + + /** + * viewPage初始化 + * 获取viewPager,并为其设置适配器 + */ + private void initViewPage() { + viewPager = findViewById(R.id.view_pager); + viewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) { + @NonNull + @Override + public Fragment getItem(int position) { + Fragment fragment = null; + /** + *页面选中判断,当到达指定position时,返回position对应的页面 + */ + switch ( position ){ + case 0: + fragment = new HomeFragment(); + break; + case 1: + fragment = new AiPoetryFragment(); + break; + case 2: + requestPermission(); + fragment = new AssociationFragment(); + break; + case 3: + fragment = new MyFragment(); + break; + } + assert fragment != null; + return fragment; + } + + /** + *这里需要填写总的页面数量 + */ + @Override + public int getCount() { + return 4; + } + }); + + //viewPager滑动事件监听 + viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int position) { + navView.getMenu().getItem(position).setChecked(true); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + } + + /** + * 底部导航栏初始化 + */ + private void initBottomNav() { + navView = findViewById(R.id.nav_view); + navView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + /** + *当点击到菜单中的item时,调用viewPage中的setCurrentItem方法切换到对应界面 + */ + switch ( item.getItemId() ){ + case R.id.navigation_home: + viewPager.setCurrentItem(0); + break; + case R.id.navigation_ai_poetry: + viewPager.setCurrentItem(1); + break; + case R.id.navigation_association: + viewPager.setCurrentItem(2); + break; + case R.id.navigation_my: + viewPager.setCurrentItem(3); + break; + } + return false; + } + }); + } + + private void requestPermission() { + if (ContextCompat.checkSelfPermission(this, + Manifest.permission.RECORD_AUDIO) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.RECORD_AUDIO}, + 1234); + } + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/PoetryListActivity.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/PoetryListActivity.java new file mode 100644 index 0000000..a4bc5d4 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/PoetryListActivity.java @@ -0,0 +1,311 @@ +package com.example.myapplication.Activity; + +import static com.xuexiang.xui.XUI.getContext; + +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import com.example.myapplication.Adapter.PoemListAdapter; +import com.example.myapplication.Api.Api; +import com.example.myapplication.Constant.constant; +import com.example.myapplication.Modal.Poetry; +import com.example.myapplication.R; +import com.example.myapplication.Util.Spilt; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; + +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import okhttp3.ResponseBody; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class PoetryListActivity extends AppCompatActivity { + + private Retrofit SearchRetrofit; + private Retrofit SearchByTagRetrofit; + private static final String TAG = "test"; + + private PoemListAdapter poemListAdapter; + private ListView poemListView; + private Toolbar toolbar; + private TextView titleText; + private String toolbarTitle; + private final int COMPLETED = 1; + private final int TO_WEBVIEW = 2; + private RefreshLayout refreshLayout; + // 每次20首 + private Integer size = 20; + private Integer page = 0; + private List poetryList = new ArrayList<>(); + private boolean isLoad = false; + private JSONObject responseObject; + private String from; + + private Handler handler = new Handler() { + @Override + public void handleMessage(Message message) { + if (message.what == COMPLETED) { //绑定数据 + try { + poemListAdapter = new PoemListAdapter(poetryList, getContext()); + poemListView.setAdapter(poemListAdapter); + refreshLayout.finishRefresh();//结束刷新 + refreshLayout.finishLoadMore(2000);//结束加载 + isLoad = true; + } catch (Exception e) { + e.printStackTrace(); + } + } + if (message.what == TO_WEBVIEW)//跳转至网站 + { + Toast.makeText(getContext(), "暂时没有数据哦,请重新选择标签", Toast.LENGTH_LONG).show(); + } + } + + }; + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + isLoad = false; + poetryList.clear(); + break; + } + return true; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_poetry_list); + + // 哪种搜索类型(搜索框/标签) + from = getIntent().getStringExtra("from"); + + toolbar = findViewById(R.id.titleBar); + poemListView = findViewById(R.id.poemList); + titleText = findViewById(R.id.titleText); + setSupportActionBar(findViewById(R.id.titleBar));//设置toolbar + + refreshLayout = findViewById(R.id.refreshLayout); + refreshLayout.setEnableScrollContentWhenLoaded(true); + + + poemListAdapter = new PoemListAdapter(poetryList, getContext()); + poemListView.setAdapter(poemListAdapter); +// poemListView.setEmptyView(findViewById(R.id.empty_imageview_iv)); + + getSupportActionBar().setDisplayShowTitleEnabled(false);//屏蔽toolbar默认标题显示 + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeAsUpIndicator(R.drawable.ic_back); + }//设置返回图标显示 + + toolbarTitle = getIntent().getStringExtra("toolBarTitle"); + titleText.setText(toolbarTitle); + refreshLayout.autoRefresh(); + + refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(RefreshLayout refreshlayout) { + if (from.equals("collect")) { + String temp = getIntent().getStringExtra("collect"); + Log.d("TEMPPPPPPPPP", temp); + Gson gson = new Gson(); + List poetries = gson.fromJson(temp, new TypeToken>() { + }.getType()); + poetryList = poetries; + poemListAdapter = new PoemListAdapter(poetryList, getContext()); + poemListView.setAdapter(poemListAdapter); + refreshlayout.finishRefresh(); + } else if (from.equals("filter")) { + String tag = getIntent().getStringExtra("tag"); + String dynasty = getIntent().getStringExtra("dynasty"); + getPoemListByTag(tag, dynasty, page, size); + } else if (from.equals("search")) { + String key = getIntent().getStringExtra("key"); + getPoemListBySearch(key, page, size); + } else if (from.equals("detail")) { + String tag = getIntent().getStringExtra("tag"); + getPoemListByTag(tag, "null", page, size); + } + } + }); + + refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { + @Override + public void onLoadMore(RefreshLayout refreshlayout) { + if (from.equals("collect")) { + String temp = getIntent().getStringExtra("collect"); + Log.d("TEMPPPPPPPPP", temp); + Gson gson = new Gson(); + List poetries = gson.fromJson(temp, new TypeToken>() { + }.getType()); + poetryList = poetries; + poemListAdapter = new PoemListAdapter(poetryList, getContext()); + poemListView.setAdapter(poemListAdapter); + refreshlayout.finishRefresh(); + refreshlayout.finishLoadMore(2000); + } else if (from.equals("filter")) { + page++; + String tag = getIntent().getStringExtra("tag"); + String dynasty = getIntent().getStringExtra("dynasty"); + getPoemListByTag(tag, dynasty, page, size); + } else if (from.equals("search")) { + page++; + String key = getIntent().getStringExtra("key"); + getPoemListBySearch(key, page, size); + } else if (from.equals("detail")) { + page++; + String tag = getIntent().getStringExtra("tag"); + getPoemListByTag(tag, "null", page, size); + } + + } + }); + + poemListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Intent intent = new Intent(PoetryListActivity.this, DetailActivity.class); + + String poemText = poetryList.get(position).getContent(); + String sentence = Spilt.spiltPoemTextByEnter(poemText)[0]; + intent.putExtra("content", sentence); + intent.putExtra("toolbarTitle", poetryList.get(position).getName()); + startActivity(intent); + } + }); + } + + //根据标签获取诗词 + private void getPoemListByTag(String tag, String dynasty, Integer page, Integer size) { + String searchByTag_url = constant.poetry_IP; + + //步骤五:构建Retrofit实例 + SearchByTagRetrofit = new Retrofit.Builder() + //设置网络请求BaseUrl地址 + .baseUrl(searchByTag_url) + //设置数据解析器 + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + //步骤六:创建网络请求接口对象实例 + Api poetryApi = SearchByTagRetrofit.create(Api.class); + + //步骤七:对发送请求进行封装,传入接口参数 + retrofit2.Call poetryDataCall = poetryApi.getPoetrysByTag(dynasty, tag, page, size); + + //步骤八:发送网络请求(同步) + Log.e(TAG, "post == url:" + poetryDataCall.request().url()); + new Thread(new Runnable() { //Android主线程不能操作网络请求,所以new一个线程来操作 + @Override + public void run() { + poetryDataCall.enqueue(new Callback() { + @Override + public void onResponse(retrofit2.Call call, Response response) { + String responseData = null; + try { + responseData = response.body().string(); + } catch (IOException e) { + e.printStackTrace(); + } + parseJSONWithGSON(responseData); + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(PoetryListActivity.this, "get回调失败", Toast.LENGTH_SHORT).show(); + } + }); + } + }).start(); + } + + //根据搜索关键字获取诗词 + private void getPoemListBySearch(String key, Integer page, Integer size) { + String search_url = constant.poetry_IP; + + //步骤五:构建Retrofit实例 + SearchRetrofit = new Retrofit.Builder() + //设置网络请求BaseUrl地址 + .baseUrl(search_url) + //设置数据解析器 + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + //步骤六:创建网络请求接口对象实例 + Api poetryApi = SearchRetrofit.create(Api.class); + + //步骤七:对发送请求进行封装,传入接口参数 + retrofit2.Call poetryDataCall = poetryApi.getPoetrys(key, page, size); + + //步骤八:发送网络请求(同步) + Log.e(TAG, "post == url:" + poetryDataCall.request().url()); + new Thread(new Runnable() { //Android主线程不能操作网络请求,所以new一个线程来操作 + @Override + public void run() { + poetryDataCall.enqueue(new Callback() { + @Override + public void onResponse(retrofit2.Call call, Response response) { + String responseData = null; + try { + responseData = response.body().string(); + } catch (IOException e) { + e.printStackTrace(); + } + parseJSONWithGSON(responseData); + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(PoetryListActivity.this, "get回调失败", Toast.LENGTH_SHORT).show(); + } + }); + } + }).start(); + } + + private void parseJSONWithGSON(String jsonData) { + Gson gson = new Gson(); + List list = gson.fromJson(jsonData, new TypeToken>(){}.getType()); + if (list.size() != 0)//数据获取成功 + { + poetryList.addAll(list); + Message message = new Message(); + message.what = COMPLETED; + handler.sendMessage(message); + } else//没有数据 + { + Message message = new Message(); + message.what = TO_WEBVIEW; + handler.sendMessage(message); + } + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/RegisterActivity.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/RegisterActivity.java new file mode 100644 index 0000000..11d26fe --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/RegisterActivity.java @@ -0,0 +1,196 @@ +package com.example.myapplication.Activity; + +import androidx.appcompat.app.AppCompatActivity; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.os.StrictMode; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Toast; + +import com.example.myapplication.Api.Api; +import com.example.myapplication.Constant.constant; +import com.example.myapplication.R; + +import java.io.IOException; + +import okhttp3.FormBody; +import okhttp3.ResponseBody; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class RegisterActivity extends AppCompatActivity { + + private static final String TAG = "test"; + public static final int MSG_LOGIN_ERR = 1; //登录错误 + public static final int MSG_CONNET_ERR = 2; //网络链接错误 + + private Context context; + private Retrofit RegisterRetrofit; + + private EditText r_number; + private EditText r_password; + private Button bt_register; + + private RegisterHandler register_handler; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_register); + + context = this; + InitView(); + register_handler = new RegisterHandler(); + Init(); + +// StrictMode是指严格模式 + if (Build.VERSION.SDK_INT > 9){ + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); + StrictMode.setThreadPolicy(policy);//这两句设置禁止所有检查 + } + } + + private void InitView() { + r_number = (EditText)findViewById(R.id.r_number); + r_password = (EditText)findViewById(R.id.r_password); + bt_register = (Button)findViewById(R.id.bt_register); + } + + private void Init() { + //设置提示的颜色 + r_number.setHintTextColor(getResources().getColor(R.color.white)); + r_password.setHintTextColor(getResources().getColor(R.color.white)); + + + //注册 + bt_register.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (judge()) { +// postData(); + registerInfo(); + } + } + }); + } + + /**注册*/ + private void registerInfo(){ + String username = r_number.getText().toString(); + String password = r_password.getText().toString(); + + String register_url = constant.poetry_IP; + + //步骤五:创建Retrofit对象 + RegisterRetrofit = new Retrofit.Builder() + .baseUrl(register_url) // 设置网络请求baseUrl + .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析 + .build(); + + // 步骤六:创建网络请求接口的实例 + Api registerApi = RegisterRetrofit.create(Api.class); + + //步骤七:对发送请求进行封装:传入参数 + Call registerCall = registerApi.getRegisterData(username, password); + + //步骤八:发送网络请求(异步) + Log.e(TAG, "post == url:" + registerCall.request().url()); + //请求参数 + StringBuilder sb = new StringBuilder(); + if (registerCall.request().body() instanceof FormBody) { + FormBody body = (FormBody) registerCall.request().body(); + for (int i = 0; i < body.size(); i++) { + sb.append(body.encodedName(i)) + .append(" = ") + .append(body.encodedValue(i)) + .append(","); + } + sb.delete(sb.length() - 1, sb.length()); + Log.e(TAG, "RequestParams:{" + sb.toString() + "}"); + } + + registerCall.enqueue(new Callback() { + //请求成功时回调 + @Override + public void onResponse(Call call, Response response) { + //步骤九:请求处理,输出结果 + String date = null; + try { + date = response.body().string(); + } catch (IOException e) { + e.printStackTrace(); + } + if(date.equals("success")){ + Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show(); + startActivity(new Intent(RegisterActivity.this, LoginActivity.class)); + }else { + Toast.makeText(RegisterActivity.this, "注册失败,该用户名已被使用", Toast.LENGTH_SHORT).show(); + } + + } + + //请求失败时回调 + @Override + public void onFailure(Call call, Throwable throwable) { + Log.e(TAG, "post回调失败:" + throwable.getMessage() + "," + throwable.toString()); + Toast.makeText(RegisterActivity.this, "post回调失败", Toast.LENGTH_SHORT).show(); + } + }); + } + + //判断登录信息是否合法 + private boolean judge() { + if (TextUtils.isEmpty(r_number.getText().toString()) ) { + Toast.makeText(context, "用户名不能为空",Toast.LENGTH_SHORT).show(); + return false; + } else if (TextUtils.isEmpty(r_password.getText().toString())) { + Toast.makeText(context, "用户ID不能为空",Toast.LENGTH_SHORT).show(); + return false; + } + return true; + } + + /**事件捕获*/ + class RegisterHandler extends Handler { + @Override + public void dispatchMessage(Message msg) { + super.dispatchMessage(msg); + switch (msg.what) { + case MSG_LOGIN_ERR: + r_number.setText(""); + r_password.setText(""); + r_number.requestFocus(); + + new AlertDialog.Builder(RegisterActivity.this) + .setTitle("注意") + .setMessage("用户名或密码输入不正确,请重新输入") + .setPositiveButton("确定",null) + .create() + .show(); + bt_register.setEnabled(true); + break; + case MSG_CONNET_ERR: + new AlertDialog.Builder(RegisterActivity.this) + .setTitle("注意") + .setMessage("网络连接错误,请检查网络") + .setPositiveButton("确定",null) + .create() + .show(); + break; + } + } + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/TestActivity.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/TestActivity.java new file mode 100644 index 0000000..275c76d --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Activity/TestActivity.java @@ -0,0 +1,398 @@ +package com.example.myapplication.Activity; + + +import android.Manifest; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Color; +import android.os.Bundle; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.style.ForegroundColorSpan; +import android.view.View; +import android.widget.Button; +import android.widget.TextView; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + +import com.example.myapplication.Api.ToTrans; +import com.example.myapplication.Modal.EmotionResBean; +import com.example.myapplication.Modal.PrivateInfo; +import com.example.myapplication.R; +import com.example.myapplication.Util.Spilt; +import com.github.mikephil.charting.charts.HorizontalBarChart; +import com.github.mikephil.charting.components.XAxis; +import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.BarData; +import com.github.mikephil.charting.data.BarDataSet; +import com.github.mikephil.charting.data.BarEntry; +import com.github.mikephil.charting.formatter.IndexAxisValueFormatter; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.tencent.taisdk.TAIError; +import com.tencent.taisdk.TAIOralEvaluation; +import com.tencent.taisdk.TAIOralEvaluationData; +import com.tencent.taisdk.TAIOralEvaluationEvalMode; +import com.tencent.taisdk.TAIOralEvaluationFileType; +import com.tencent.taisdk.TAIOralEvaluationListener; +import com.tencent.taisdk.TAIOralEvaluationParam; +import com.tencent.taisdk.TAIOralEvaluationRet; +import com.tencent.taisdk.TAIOralEvaluationServerType; +import com.tencent.taisdk.TAIOralEvaluationStorageMode; +import com.tencent.taisdk.TAIOralEvaluationTextMode; +import com.tencent.taisdk.TAIOralEvaluationWord; +import com.tencent.taisdk.TAIOralEvaluationWorkMode; +import com.tencent.taisdk.TAIRecorderParam; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class TestActivity extends AppCompatActivity { + + TAIOralEvaluation oralEvaluation ; + TextView content; + TextView author; + TextView title; + TextView oralResult; + Button viewAns ; + TAIOralEvaluationParam param; + String[] criterion = {"评分标准","发音标准","流利度","发音完整度"}; + HorizontalBarChart ratings ; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_test); + + requestPermission(); + initView(); + settingsOfChat(); + setPoem(); + ratings.setVisibility(View.INVISIBLE); + //点击查看答案,显示诗句内容 + viewAns.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + content.setVisibility(View.VISIBLE); + } + }); + } + + + public void onRecord(View view){ + Button button = (Button) view; + oralResult.setText(""); + if(oralEvaluation == null){ + oralEvaluation = new TAIOralEvaluation(); + } + if (oralEvaluation.isRecording()){ + button.setText("开始测试"); + oralEvaluation.stopRecordAndEvaluation(); + }else { + button.setText("停止录制"); + oralEvaluation.setListener(new TAIOralEvaluationListener() { + @Override + public void onEvaluationData(TAIOralEvaluationData data, TAIOralEvaluationRet result) { + /** + * 中间结果 + * 解析result中的评估结果 + */ + System.out.println("middle"); + } + + @Override + public void onEvaluationError(TAIOralEvaluationData data, TAIError error) { + //调用接口失败,提升信号不好或账号已欠费 + System.out.println("error"); + runOnUiThread(new Runnable() { + @Override + public void run() { + Gson gson = new Gson(); + String retString = gson.toJson(error); + String errorStr = "onEvaluationE rror: " + retString + " seqId: " + data.seqId; + } + }); + } + + @Override + public void onFinalEvaluationData(TAIOralEvaluationData data, TAIOralEvaluationRet result) { + //提交服务端,情感分析 + submitMp3(param.audioPath); + /** + * 最终结果 + * 处理每个字是否有念或读音正确 + */ + List list = result.words; + String text = String.valueOf(content.getText()); + //部分文字改变颜色 + //这里注意一定要先给textview赋值 + SpannableStringBuilder builder = new SpannableStringBuilder(text); + int curr = 0,size = text.length(); + for (TAIOralEvaluationWord word : list) { + /** + * 处理没有读 -1 + * 处理念错字 <0.5 || 0.7 + */ + ForegroundColorSpan miss = new ForegroundColorSpan(getResources().getColor(R.color.toast_error_color)); + ForegroundColorSpan worry = new ForegroundColorSpan(getResources().getColor(R.color.toast_error_color)); + ForegroundColorSpan right = new ForegroundColorSpan(getResources().getColor(R.color.black)); + if(word.pronAccuracy <= -1){ + builder.setSpan(miss,curr,curr+1, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); + }else if(word.pronAccuracy <= 0.5){ + builder.setSpan(worry,curr,curr+1, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); + }else { + builder.setSpan(right,curr,curr+1, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); + } + curr++; + while(curr < text.length() && isChinesePunctuation(text.charAt(curr))){ + curr++; + } + } + /** + * 解析口语分数 + */ + Gson gson = new Gson(); + String retString = gson.toJson(result); + String ans = ""; + JsonParser parser = new JsonParser(); + JsonElement JsonTree = parser.parse(retString); + double SuggestedScore,PronAccuracy = 0,PronFluency = 0,PronCompletion = 0; + if(JsonTree.isJsonObject()){ + JsonObject jsonObject = JsonTree.getAsJsonObject(); + SuggestedScore = jsonObject.get("SuggestedScore").getAsDouble(); + ans += "评分: "+SuggestedScore+"\n"; + PronAccuracy = jsonObject.get("PronAccuracy").getAsDouble(); +// ans += "PronAccuracy: "+PronAccuracy+"\n"; + PronFluency = jsonObject.get("PronFluency").getAsDouble(); +// ans += "PronFluency: "+PronFluency+"\n"; + PronCompletion = jsonObject.get("PronCompletion").getAsDouble(); +// ans += "PronCompletion: "+PronCompletion+"\n"; + } + + String finalAns = ans; + int finalPronAccuracy = (int) (PronAccuracy); + int finalPronFluency = (int) (PronFluency*100); + int finalPronCompletion = (int) (PronCompletion*100); + runOnUiThread(new Runnable() { + @Override + public void run() { + //图表设置 + Listlist=new ArrayList<>(); + list.add(new BarEntry(1, finalPronAccuracy)); + list.add(new BarEntry(2, finalPronFluency)); + list.add(new BarEntry(3, finalPronCompletion)); + + BarDataSet barDataSet=new BarDataSet(list,"口语分析"); + BarData barData=new BarData(barDataSet); + barData.setDrawValues(true); + ratings.setVisibility(View.VISIBLE); + ratings.setData(barData); + ratings.animateY(3000); + + content.setText(builder); + content.setVisibility(View.VISIBLE); + oralResult.append(finalAns); +// oralResult.append(retString); + } + }); + } + + @Override + public void onEndOfSpeech(boolean isSpeak) { + runOnUiThread(new Runnable() { + @Override + public void run() { + onRecord(null); + } + }); + } + + @Override + public void onVolumeChanged(int volume) { + ; + } + }); + param = new TAIOralEvaluationParam(); + param.context = this; + param.sessionId = UUID.randomUUID().toString(); + param.appId = PrivateInfo.appId; + param.soeAppId = PrivateInfo.soeAppId; + param.secretId = PrivateInfo.secretId; + param.secretKey = PrivateInfo.secretKey; + param.token = PrivateInfo.token; + + int evalMode = TAIOralEvaluationEvalMode.PARAGRAPH; + param.workMode = TAIOralEvaluationWorkMode.ONCE ; + param.evalMode = evalMode; + param.storageMode = TAIOralEvaluationStorageMode.DISABLE; + param.fileType = TAIOralEvaluationFileType.MP3; + param.serverType = TAIOralEvaluationServerType.CHINESE ; + param.textMode = TAIOralEvaluationTextMode.NORMAL ; + param.scoreCoeff = 2.0; + param.refText = content.getText().toString(); + param.audioPath = this.getFilesDir() + "/" + param.sessionId + ".mp3"; + if (param.workMode == TAIOralEvaluationWorkMode.STREAM) { + param.timeout = 5; + param.retryTimes = 5; + } else { + param.timeout = 30; + param.retryTimes = 0; + } + TAIRecorderParam recordParam = new TAIRecorderParam(); + recordParam.fragSize = (int) (1.0 * 1024); + recordParam.fragEnable = false; + recordParam.vadEnable = true; + recordParam.vadInterval = Integer.parseInt("5000"); + oralEvaluation.setRecorderParam(recordParam); + oralEvaluation.startRecordAndEvaluation(param); + } + } + + private void requestPermission() { + if (ContextCompat.checkSelfPermission(this, + Manifest.permission.RECORD_AUDIO) + != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.RECORD_AUDIO}, + 1234); + } + } + + public boolean isChinesePunctuation(char c) { + Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); + if (ub == Character.UnicodeBlock.GENERAL_PUNCTUATION + || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION + || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS + || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_FORMS + || ub == Character.UnicodeBlock.VERTICAL_FORMS) { + return true; + } else { + return false; + } + } + + void submitMp3(String filePath){ + File file = new File(filePath); + Retrofit retrofit = new Retrofit.Builder() + .baseUrl("http://101.33.242.218:8081") + .addConverterFactory(GsonConverterFactory.create()) + .build(); + ToTrans request = retrofit.create(ToTrans.class); + //请求体 + MultipartBody.Builder builder = new MultipartBody.Builder() + .setType(MultipartBody.FORM); + RequestBody requestBody = RequestBody.create(MediaType.parse("audio/mpeg"),file); + builder.addFormDataPart("file", file.getName(), requestBody); + List parts = builder.build().parts(); + //对 发送请求 进行封装 + Call call = request.getCall(parts); + call.enqueue(new Callback() { + //请求成功时回调 + @Override + public void onResponse(Call call, Response response) { + //请求处理,输出结果 + System.out.println(response.body()); + Gson gson = new Gson(); + EmotionResBean resBean = response.body(); + String emotion = resBean.getEmotion(); + if(emotion.equals("neutral")||emotion.equals("calm")) { + oralResult.append("看看赏析,再体会诗中的情感"); + }else { + oralResult.append("声情并茂呢"); + } + } + //请求失败时候的回调 + @Override + public void onFailure(Call call, Throwable throwable) { + System.out.println((call.request().body())); + System.out.println("连接失败"); + } + }); + } + + void initView(){ + content = findViewById(R.id.content); + oralResult = findViewById(R.id.result); + ratings = findViewById(R.id.ratings); + viewAns = findViewById(R.id.viewAns); + title = findViewById(R.id.title); + author = findViewById(R.id.author); + //设置内容不可见 + content.setVisibility(View.INVISIBLE); + } + + void settingsOfChat(){ + //X轴 + XAxis xAxis=ratings.getXAxis(); + xAxis.setDrawGridLines(false); //是否绘制X轴上的网格线(背景里面的竖线) + xAxis.setAxisLineColor(Color.BLACK); //X轴颜色 + xAxis.setAxisLineWidth(2); //X轴粗细 + xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); //X轴所在位置 默认为上面 + xAxis.setValueFormatter(new IndexAxisValueFormatter(criterion)); + xAxis.setAxisMaximum(4); //X轴最大数值 + xAxis.setAxisMinimum(0); //X轴最小数值 + //X轴坐标的个数 第二个参数一般填false true表示强制设置标签数 可能会导致X轴坐标显示不全等问题 + xAxis.setLabelCount(4,false); + xAxis.setAvoidFirstLastClipping(true); + + //Y轴 + YAxis AxisLeft=ratings.getAxisRight(); + AxisLeft.setDrawGridLines(false); //是否绘制Y轴上的网格线(背景里面的横线) + AxisLeft.setAxisLineColor(Color.BLACK); //Y轴颜色 + AxisLeft.setAxisLineWidth(2); //Y轴粗细 +// AxisLeft.setValueFormatter(new DefaultAxisValueFormatter(100)); + AxisLeft.setAxisMaximum(105f); //Y轴最大数值 + AxisLeft.setAxisMinimum(0f); //Y轴最小数值 + //Y轴坐标的个数 第二个参数一般填false true表示强制设置标签数 可能会导致X轴坐标显示不全等问题 + AxisLeft.setLabelCount(5,false); + + AxisLeft=ratings.getAxisLeft(); + AxisLeft.setDrawGridLines(false); //是否绘制Y轴上的网格线(背景里面的横线) + AxisLeft.setAxisLineColor(Color.BLACK); //Y轴颜色 + AxisLeft.setAxisLineWidth(2); //Y轴粗细 +// AxisLeft.setValueFormatter(new DefaultAxisValueFormatter(100)); + AxisLeft.setAxisMaximum(105f); //Y轴最大数值 + AxisLeft.setAxisMinimum(0f); //Y轴最小数值 + //Y轴坐标的个数 第二个参数一般填false true表示强制设置标签数 可能会导致X轴坐标显示不全等问题 + AxisLeft.setLabelCount(5,false); + + + + //是否隐藏右边的Y轴(不设置的话有两条Y轴 同理可以隐藏左边的Y轴) + ratings.getDescription().setEnabled(false);//隐藏右下角英文 + ratings.getXAxis().setPosition(XAxis.XAxisPosition.BOTTOM);//X轴的位置 默认为右边 + ratings.getAxisLeft().setEnabled(false);//隐藏上侧Y轴 默认是上下两侧都有Y轴 + ratings.setTouchEnabled(false);//不可调整大小 + } + + void setPoem(){ + //获取活动跳转传过来的诗,并显示在界面(诗内容不显示) + Intent intent = getIntent(); + title.setText(intent.getStringExtra("title")); + + String dynasty_author = intent.getStringExtra("desty") + " . " + + intent.getStringExtra("author"); + author.setText(dynasty_author); + + String contentText = intent.getStringExtra("content"); + + contentText = Spilt.spiltContentText(contentText); + content.setText(contentText); + } + +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/MsgAdapter.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/MsgAdapter.java new file mode 100644 index 0000000..7596301 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/MsgAdapter.java @@ -0,0 +1,151 @@ +package com.example.myapplication.Adapter; + +import android.media.MediaPlayer; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.myapplication.Modal.ClientMessageBean; +import com.example.myapplication.Modal.SystemMessageBean; +import com.example.myapplication.R; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +public class MsgAdapter extends RecyclerView.Adapter { + private List mMsgList; + private MediaPlayer mPlayer; + static class ViewHolder extends RecyclerView.ViewHolder{ + + LinearLayout leftLayout; + LinearLayout rightLayout; + LinearLayout centerLayout; + LinearLayout voiceRightLayout; + LinearLayout voiceLeftLayout; + TextView leftMsg; + TextView rightMsg; + TextView centerMsg; + ImageButton broadcastRight; + ImageButton broadcastLeft; + public ViewHolder(View view){ + super(view); + leftLayout = view.findViewById(R.id.left_layout); + rightLayout = view.findViewById(R.id.right_layout); + centerLayout = view.findViewById(R.id.center_layout); + leftMsg = view.findViewById(R.id.left_msg); + rightMsg = view.findViewById(R.id.right_msg); + centerMsg = view.findViewById(R.id.center_msg); + voiceLeftLayout = view.findViewById(R.id.voice_order); + voiceRightLayout = view.findViewById(R.id.voice_self); + broadcastLeft = view.findViewById(R.id.record_order); + broadcastRight = view.findViewById(R.id.record_self); + } + } + + public MsgAdapter(List msgList, MediaPlayer mPlayer){ + mMsgList = msgList; + this.mPlayer = mPlayer; + } + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.message_view,parent,false); + return new ViewHolder(view); + } + @Override + public void onBindViewHolder(ViewHolder holder,int position){ + ClientMessageBean msg = mMsgList.get(position); + if (msg.getType() == 2){ + //如果收到消息,则显示在左边,将右边,中间布局隐藏 + holder.leftLayout.setVisibility(View.VISIBLE); + holder.centerLayout.setVisibility(View.GONE); + holder.rightLayout.setVisibility(View.GONE); + //语音隐藏 + holder.voiceRightLayout.setVisibility(View.GONE); + holder.voiceLeftLayout.setVisibility(View.GONE); + holder.leftMsg.setText(msg.getMessage()); + }else if(msg.getType() == 1){ + //将左,中布局隐藏 + holder.rightLayout.setVisibility(View.VISIBLE); + holder.centerLayout.setVisibility(View.GONE); + holder.leftLayout.setVisibility(View.GONE); + holder.voiceRightLayout.setVisibility(View.GONE); + holder.voiceLeftLayout.setVisibility(View.GONE); + holder.rightMsg.setText(msg.getMessage()); + }else if(msg.getType() == 0){ + //隐藏左右布局 + holder.centerLayout.setVisibility(View.VISIBLE); + holder.leftLayout.setVisibility(View.GONE); + holder.rightLayout.setVisibility(View.GONE); + holder.voiceRightLayout.setVisibility(View.GONE); + holder.voiceLeftLayout.setVisibility(View.GONE); + holder.centerMsg.setText(msg.getMessage()); + } else if (msg.getType() == 3) { + holder.leftLayout.setVisibility(View.GONE); + holder.rightLayout.setVisibility(View.GONE); + holder.centerLayout.setVisibility(View.GONE); + holder.voiceRightLayout.setVisibility(View.VISIBLE); + holder.voiceLeftLayout.setVisibility(View.GONE); + try { + holder.broadcastRight.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(new Runnable() { + @Override + public void run() { + try { + mPlayer.reset(); + mPlayer.setDataSource(msg.getMessage()); + mPlayer.prepare(); + } catch (IOException e) { + throw new RuntimeException(e); + } + mPlayer.start(); + } + }).start(); + } + }); + } catch (Exception e) { + throw new RuntimeException(e); + } + } else if (msg.getType() == 4) { + holder.leftLayout.setVisibility(View.GONE); + holder.rightLayout.setVisibility(View.GONE); + holder.centerLayout.setVisibility(View.GONE); + holder.voiceRightLayout.setVisibility(View.GONE); + holder.voiceLeftLayout.setVisibility(View.VISIBLE); + try { + holder.broadcastRight.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + new Thread(new Runnable() { + @Override + public void run() { + try { + mPlayer.reset(); + mPlayer.setDataSource(msg.getMessage()); + mPlayer.prepare(); + } catch (IOException e) { + throw new RuntimeException(e); + } + mPlayer.start(); + } + }).start(); + } + }); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + @Override + public int getItemCount(){ + return mMsgList.size(); + } + +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/PoemListAdapter.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/PoemListAdapter.java new file mode 100644 index 0000000..3d19281 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/PoemListAdapter.java @@ -0,0 +1,75 @@ +package com.example.myapplication.Adapter; + +import android.content.Context; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.example.myapplication.R; +import com.example.myapplication.Modal.Poetry; +import com.example.myapplication.Util.Spilt; + +import java.util.ArrayList; +import java.util.List; + +public class PoemListAdapter extends BaseAdapter { + private List poetryList = new ArrayList(); + private Context context; + + public PoemListAdapter(List poetryList, Context context) { + + this.poetryList = poetryList; + this.context = context; + } + + @Override + public int getCount() { + return poetryList.size(); + } + + @Override + public Object getItem(int position) { + return poetryList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder viewHolder = null; + Log.d("ListViewLoading", "--------------------------------------------"); + if (convertView == null) { + viewHolder = new ViewHolder(); + convertView = View.inflate(context, R.layout.poem_item, null); + viewHolder.author = convertView.findViewById(R.id.poem_author); + viewHolder.title = convertView.findViewById(R.id.poem_title); + viewHolder.contentView = convertView.findViewById(R.id.poem_content); + viewHolder.spiltLine = convertView.findViewById(R.id.spilt_line); + convertView.setTag(viewHolder); + } else + viewHolder = (ViewHolder) convertView.getTag(); + + viewHolder.title.setText(poetryList.get(position).getName()); + String author = poetryList.get(position).getDynasty() + "." + poetryList.get(position).getAuthor(); + viewHolder.author.setText(author); + + String content = poetryList.get(position).getContent(); + content = Spilt.spiltContentText(content); + viewHolder.contentView.setText(content); + + return convertView; + } + + public class ViewHolder { + public TextView title; + public TextView author; + public TextView contentView; + public TextView spiltLine; + } + +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/RoomAdapter.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/RoomAdapter.java new file mode 100644 index 0000000..c02d960 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Adapter/RoomAdapter.java @@ -0,0 +1,67 @@ +package com.example.myapplication.Adapter; + +import android.content.Context; +import android.content.Intent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.myapplication.Activity.ChatActivity; +import com.example.myapplication.Modal.RoomBean; +import com.example.myapplication.R; + +import java.util.List; + +public class RoomAdapter extends RecyclerView.Adapter{ + List mRoomList ; + Context mContext; + static class ViewHolder extends RecyclerView.ViewHolder{ + TextView rname; + TextView description; + public ViewHolder(View view){ + super(view); + rname = view.findViewById(R.id.rname); + description = view.findViewById(R.id.description); + } + } + public RoomAdapter(List list,Context context){ + this.mRoomList = list; + this.mContext = context; + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.room_view,parent,false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + RoomBean roomBean = mRoomList.get(position); + holder.rname.setText(roomBean.getRname()); + holder.description.setText(roomBean.getDescription()); + View.OnClickListener listener = new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(mContext, ChatActivity.class); + //用户名还需要调整 + intent.putExtra("username", String.valueOf(Math.random())); + intent.putExtra("rid", roomBean.getRid()); + mContext.startActivity(intent); + } + }; + holder.description.setOnClickListener(listener); + holder.rname.setOnClickListener(listener); + } + + @Override + public int getItemCount() { + return mRoomList.size(); + } +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Api/Api.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Api/Api.java new file mode 100644 index 0000000..84856c8 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Api/Api.java @@ -0,0 +1,53 @@ +package com.example.myapplication.Api; + +import okhttp3.ResponseBody; +import retrofit2.Call; +import retrofit2.http.Field; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * @创建者 晏嘉琳 + * @创建时间 2023/5/31 17:44 + * @类描述 ${TODO}步骤四:创建网络接口类(封装Url地址和网络数据请求) + */ +public interface Api { + //这里特别说明Url的组成,retrofit把网络请求的Url分成两部分设置:第一部分在创建Retrofit实例时通过.baseUrl()设置, + //第二部分在网络接口注解中设置,如下面的"/user",网络请求的完整地址Url = Retrofit实例.baseUrl()+网络请求接口注解() + + @GET("user/loginIn") + Call getData(@Query("username") String username, @Query("password") String password); + + @GET("user/register") + Call getRegisterData(@Query("username") String username, @Query("password") String password); + + @GET("poetry/getOnePoem") + Call getPoetry(); + + @GET("poetry/getByContentDetail") + Call getPoetryDetail(@Query("content") String content); + + @GET("poetry/getBySearch") + Call getPoetrys(@Query("key") String key, @Query("page") Integer page, @Query("size") Integer size); + + @GET("poetry/getAllDynasty") + Call getDynastyList(); + + @GET("poetry/getByTag") + Call getPoetrysByTag(@Query("dynasty") String dynasty, @Query("tag") String tag, @Query("page") Integer page, @Query("size") Integer size); + + @GET("poetry/generate") + Call createPoetry(@Query("form") String form, @Query("head") String head); + + //post请求 + @FormUrlEncoded + @POST("api/comments.163") + Call postDataCall(@Field("format") String format); + + @FormUrlEncoded + @POST("user/register") + Call registerCall(@Field("username") String username, @Field("password") String password); + +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Api/ToTrans.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Api/ToTrans.java new file mode 100644 index 0000000..28406b5 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Api/ToTrans.java @@ -0,0 +1,22 @@ +package com.example.myapplication.Api; + +import com.example.myapplication.Modal.EmotionResBean; + +import java.util.List; + +import okhttp3.MultipartBody; +import retrofit2.Call; +import retrofit2.http.Multipart; +import retrofit2.http.POST; +import retrofit2.http.Part; + + +public interface ToTrans { + @Multipart + @POST("/poetry/emotion") + Call getCall(@Part List partList); + // @GET注解的作用:采用Get方法发送网络请求 + // getCall() = 接收网络请求数据的方法 + // 其中返回类型为Call<*>,*是接收数据的类(即上面定义的TranslationBean类),返回这个类的对象 +} + diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Constant/constant.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Constant/constant.java new file mode 100644 index 0000000..62fe725 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Constant/constant.java @@ -0,0 +1,6 @@ +package com.example.myapplication.Constant; + +public class constant { + public static final String poetry_IP = "http://101.33.242.218:8081/"; + +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/AiPoetry/AiPoetryFragment.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/AiPoetry/AiPoetryFragment.java new file mode 100644 index 0000000..bd9b401 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/AiPoetry/AiPoetryFragment.java @@ -0,0 +1,243 @@ +package com.example.myapplication.Fragment.AiPoetry; + +import android.graphics.Color; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; +import android.widget.Toast; + +import com.example.myapplication.Api.Api; +import com.example.myapplication.Constant.constant; +import com.example.myapplication.Modal.PoetryUtil; +import com.example.myapplication.R; +import com.example.myapplication.databinding.FragmentAiPoetryBinding; +import com.example.myapplication.Util.Spilt; + +import com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditText; +import com.zhy.view.flowlayout.FlowLayout; +import com.zhy.view.flowlayout.TagAdapter; +import com.zhy.view.flowlayout.TagFlowLayout; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; + +import okhttp3.ResponseBody; +import retrofit2.Callback; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class AiPoetryFragment extends Fragment { + + private FragmentAiPoetryBinding binding; + + private static final String TAG = "test"; + + private Retrofit CreateRetrofit; + + private Button startButton; + private MaterialEditText inputText; + private TextView createdText; + + private TagFlowLayout poem_tag_flow; + private List poem_tags; + private TagFlowLayout poem_style_flow; + + private HashMap poem_type; + private HashMap poem_style; + private HashMap selectedTag = new HashMap<>(); + + private List styles; + + private String createdPoem = ""; + + private final int GET_POEM_FAIL = 0; + private final int GET_POEM_SUCCESS = 1; + + private Handler handler = new Handler() { + @Override + public void handleMessage(Message message) { + if (message.what == GET_POEM_SUCCESS) { + String contentText = Spilt.spiltContentText(createdPoem); + createdText.setText(contentText); + } + if (message.what == GET_POEM_FAIL) { + createdText.setText(" "); + Toast.makeText(getContext(), "服务错误,请重试", Toast.LENGTH_LONG).show(); + } + } + + }; + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding = FragmentAiPoetryBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + + initView();//初始化视图 + + startButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + createdText.setText("加载中..."); + + String form = selectedTag.get("yan") + selectedTag.get("type"); + String head = inputText.getEditValue(); + + String create_url = constant.poetry_IP; + + //步骤五:构建Retrofit实例 + CreateRetrofit = new Retrofit.Builder() + //设置网络请求BaseUrl地址 + .baseUrl(create_url) + //设置数据解析器 + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + //步骤六:创建网络请求接口对象实例 + Api createApi = CreateRetrofit.create(Api.class); + + //步骤七:对发送请求进行封装,传入接口参数 + retrofit2.Call createDataCall = createApi.createPoetry(form,head); + + //步骤八:发送网络请求(同步) + Log.e(TAG, "get == url:" + createDataCall.request().url()); + new Thread(new Runnable() { //Android主线程不能操作网络请求,所以new一个线程来操作 + @Override + public void run() { + createDataCall.enqueue(new Callback() { + @Override + public void onResponse(retrofit2.Call call, retrofit2.Response response) { + String responseData = null; + try { + responseData = response.body().string(); + } catch (IOException e) { + e.printStackTrace(); + } + + createdPoem = responseData; + + Message message = new Message(); + message.what = GET_POEM_SUCCESS; + handler.sendMessage(message); + } + + @Override + public void onFailure(retrofit2.Call call, Throwable t) { + t.printStackTrace(); + Message message = new Message(); + message.what = GET_POEM_FAIL; + handler.sendMessage(message); + } + }); + } + }).start(); + } + }); + + return root; + } + + private void initView() { + poem_tags = PoetryUtil.getPoemTags(); + poem_type = PoetryUtil.getPoemType(); + + poem_style = PoetryUtil.getPoemStyle(); + styles = PoetryUtil.getStyles(); + + poem_tag_flow = binding.aiPoemTagFlow; + poem_style_flow = binding.aiStyleTagFlow; + + inputText = binding.inputKeyword; + startButton = binding.creatingButton; + + createdText = binding.createdContent; + + final LayoutInflater mInflater = getLayoutInflater(); + + poem_tag_flow.setAdapter(new TagAdapter(poem_tags) { + @Override + public View getView(FlowLayout parent, int position, String s) { + + TextView tv = (TextView) mInflater.inflate(R.layout.adapter_item_tag, + poem_tag_flow, false); + tv.setText(s); + return tv; + } + + @Override + public void onSelected(int position, View view) { + super.onSelected(position, view); + selectedTag.put("type", poem_type.get(poem_tags.get(position))); + + TextView textView = (TextView) view; + textView.setTextColor(Color.WHITE); + } + + @Override + public void unSelected(int position, View view) { + super.unSelected(position, view); + TextView textView = (TextView) view; + selectedTag.remove("type"); + + showSelected(selectedTag); + textView.setTextColor(getResources().getColor(R.color.colorPrimary)); + } + }); + + poem_style_flow.setAdapter(new TagAdapter(styles) { + @Override + public View getView(FlowLayout parent, int position, String s) { + + TextView tv = (TextView) mInflater.inflate(R.layout.adapter_item_tag, + poem_style_flow, false); + tv.setText(s); + return tv; + } + + @Override + public void onSelected(int position, View view) { + super.onSelected(position, view); + selectedTag.put("yan", poem_style.get(styles.get(position)).toString()); + + TextView textView = (TextView) view; + textView.setTextColor(Color.WHITE); + } + + @Override + public void unSelected(int position, View view) { + super.unSelected(position, view); + TextView textView = (TextView) view; + selectedTag.remove("yan"); + + textView.setTextColor(getResources().getColor(R.color.colorPrimary)); + } + }); + } + + private void showSelected(HashMap temp) { + if (temp.size() > 0) { + for (String tempString : temp.keySet()) + System.out.println(tempString + ": " + temp.get(tempString)); + } else + System.out.println("没有选择"); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/My/MyFragment.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/My/MyFragment.java new file mode 100644 index 0000000..4cc437b --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/My/MyFragment.java @@ -0,0 +1,32 @@ +package com.example.myapplication.Fragment.My; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.example.myapplication.databinding.FragmentMyBinding; +import com.xuexiang.xui.widget.textview.supertextview.SuperTextView; + +public class MyFragment extends Fragment { + + private FragmentMyBinding binding; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + binding = FragmentMyBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + + + return root; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/Search/SearchFragment.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/Search/SearchFragment.java new file mode 100644 index 0000000..d0cb45b --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/Search/SearchFragment.java @@ -0,0 +1,222 @@ +package com.example.myapplication.Fragment.Search; + +import android.content.Intent; +import android.graphics.Color; +import android.os.Bundle; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +import com.example.myapplication.Activity.PoetryListActivity; +import com.example.myapplication.Modal.PoetryUtil; +import com.example.myapplication.R; +import com.example.myapplication.databinding.FragmentAssociationBinding; +import com.example.myapplication.databinding.FragmentSearchBinding; +import com.zhy.view.flowlayout.FlowLayout; +import com.zhy.view.flowlayout.TagAdapter; +import com.zhy.view.flowlayout.TagFlowLayout; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class SearchFragment extends Fragment { + + private FragmentSearchBinding binding; + + private static final String TAG = "test"; + + private Button sureButton; + + private final int COMPLETED = 1; + private final int RESPONSE_SUCCESS = 2; + private final int RESPONSE_FAIL = 0; + private final int TO_WEBVIEW = 3; + private JSONObject poetryObject; + private JSONArray collectObject; + + private TagFlowLayout typeTagLayout; + private TagFlowLayout dynastyTagLayout; + private TagFlowLayout styleTagLayout; + + private String[] typeList = null; + private String[] dynastyList = null; + private String[] styleList = null; + + private List selectedType = new ArrayList(); + private List selectedStyle = new ArrayList(); + private List selectedDynasty = new ArrayList(); + + public SearchFragment() {} + + @Override + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + binding = FragmentSearchBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + + + initView();//初始化视图 + + //将标签数据传递给下一页面 + sureButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent; + intent = new Intent(getContext(), PoetryListActivity.class); + String tag = ""; + String dynasty = ""; + String toolBarTitle = ""; + if (selectedDynasty.size() > 0) + toolBarTitle += selectedDynasty.get(0) + "."; + if (selectedType.size() > 0) + toolBarTitle += selectedType.get(0) + "."; + if (selectedStyle.size() > 0) + toolBarTitle += selectedStyle.get(0); + if (selectedType.size() == 0 && selectedStyle.size() == 0) + toolBarTitle = selectedDynasty.get(0); + + for (String temp : selectedType) + tag += temp + ","; + for (String temp1 : selectedStyle) + tag += temp1 + ","; + for (String temp2 : selectedDynasty) + dynasty += temp2 + ","; + + intent.putExtra("from", "filter"); + intent.putExtra("tag", tag); + intent.putExtra("dynasty", dynasty); + intent.putExtra("toolBarTitle", toolBarTitle); + startActivity(intent); + } + }); + + return root; + } + + + private void initView() { + sureButton = binding.sureButton; + + initTagFlowLayout(); + } + + // 分类检索的标签初始化 + private void initTagFlowLayout() { + typeTagLayout = binding.typeFloat; + dynastyTagLayout = binding.dynastyFloat; + styleTagLayout = binding.styleFloat; + + typeList = PoetryUtil.getType();//获取诗词类型标签 + dynastyList = PoetryUtil.getDynasty();//获取诗词朝代标签 + styleList = PoetryUtil.getStyle();//获取诗词风格标签 + + final LayoutInflater mInflater = getLayoutInflater(); + +// 适配器 + typeTagLayout.setAdapter(new TagAdapter(typeList) { + @Override + public View getView(FlowLayout parent, int position, String s) { + + TextView tv = (TextView) mInflater.inflate(R.layout.adapter_item_tag, + typeTagLayout, false); + tv.setText(s); + return tv; + } + + @Override + public void onSelected(int position, View view) { + super.onSelected(position, view); + selectedType.add(typeList[position]); + showSelected(selectedType); + TextView textView = (TextView) view; + textView.setTextColor(Color.WHITE); + } + + @Override + public void unSelected(int position, View view) { + super.unSelected(position, view); + TextView textView = (TextView) view; + selectedType.remove(textView.getText()); + showSelected(selectedType); + textView.setTextColor(getResources().getColor(R.color.colorPrimary)); + } + }); + + dynastyTagLayout.setAdapter(new TagAdapter(dynastyList) { + @Override + public View getView(FlowLayout parent, int position, String s) { + + TextView tv = (TextView) mInflater.inflate(R.layout.adapter_item_tag, + dynastyTagLayout, false); + tv.setText(s); + return tv; + } + + @Override + public void onSelected(int position, View view) { + super.onSelected(position, view); + selectedDynasty.add(dynastyList[position]); + TextView textView = (TextView) view; + textView.setTextColor(Color.WHITE); + } + + @Override + public void unSelected(int position, View view) { + super.unSelected(position, view); + TextView textView = (TextView) view; + selectedDynasty.remove(textView.getText()); + textView.setTextColor(getResources().getColor(R.color.colorPrimary)); + } + }); + + styleTagLayout.setAdapter(new TagAdapter(styleList) { + @Override + public View getView(FlowLayout parent, int position, String s) { + + TextView tv = (TextView) mInflater.inflate(R.layout.adapter_item_tag, + styleTagLayout, false); + tv.setText(s); + return tv; + } + + @Override + public void onSelected(int position, View view) { + super.onSelected(position, view); + selectedStyle.add(styleList[position]); + TextView textView = (TextView) view; + textView.setTextColor(Color.WHITE); + } + + @Override + public void unSelected(int position, View view) { + super.unSelected(position, view); + TextView textView = (TextView) view; + selectedStyle.remove(textView.getText()); + textView.setTextColor(getResources().getColor(R.color.colorPrimary)); + } + }); + } + + private void showSelected(List temp) { + if (temp.size() > 0) { + for (String tempString : temp) + System.out.println("selectedTag:" + tempString); + } else + System.out.println("没有选择"); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/association/AssociationFragment.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/association/AssociationFragment.java new file mode 100644 index 0000000..913d1cf --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/association/AssociationFragment.java @@ -0,0 +1,231 @@ +package com.example.myapplication.Fragment.association; + +import static com.xuexiang.xui.XUI.getContext; + +import android.app.AlertDialog; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageButton; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.myapplication.Adapter.RoomAdapter; +import com.example.myapplication.Modal.RoomBean; +import com.example.myapplication.R; +import com.example.myapplication.databinding.FragmentAssociationBinding; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class AssociationFragment extends Fragment { + + private FragmentAssociationBinding binding; + + RecyclerView recyclerView; + List roomList = new ArrayList<>(); + RoomAdapter adapter; + + AlertDialog.Builder createRoomBuilder ; + View createView; + ImageButton createRoomButton; + ImageButton searchButton; + AlertDialog dialog; + Handler handler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(@NonNull Message message) { + if(message.what == 1){ + System.out.println("room fresh"); + //更新聊天室列表 + adapter.notifyDataSetChanged(); + } + return false; + } + }); + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + binding = FragmentAssociationBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + + initView(); + //设置适配器 + adapter = new RoomAdapter(roomList,getContext()); + LinearLayoutManager manager = new LinearLayoutManager(getContext()); + recyclerView.setLayoutManager(manager); + recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL)); + recyclerView.setAdapter(adapter); + getRoomList(0,100); + + //添加监听 + createRoomButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + createRoomBuilder = new AlertDialog.Builder(getContext()); + createView = View.inflate(getContext(),R.layout.create_room,null); + Button button = createView.findViewById(R.id.button); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + EditText newRname = createView.findViewById(R.id.rname); + EditText newDescription = createView.findViewById(R.id.description); + String rname = String.valueOf(newRname.getText()); + String description = String.valueOf(newDescription.getText()); + createRoom(rname,description); + dialog.dismiss(); + } + }); + createRoomBuilder.setView(createView); + dialog = createRoomBuilder.create(); + dialog.show(); + } + }); + + searchButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + EditText input = binding.key; + String key = String.valueOf(input.getText()); + //发请求查找 + OkHttpClient client = new OkHttpClient(); + HttpUrl url = new HttpUrl.Builder() + .scheme("http") + .host("101.33.242.218") + .port(8081) + .addPathSegment("chatController") + .addPathSegment("getBySearch") + .addQueryParameter("key",key) + .addQueryParameter("page","0") + .addQueryParameter("size","100") + .build(); + Request request = new Request.Builder() + .url(url) + .build(); + Call call = client.newCall(request); + call.enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + System.out.println("search failure"); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + System.out.println("onResponse"); + String res = response.body().string(); + Gson gson = new Gson(); + List list = gson.fromJson(res, new TypeToken>() { + }.getType()); + roomList.clear(); + roomList.addAll(list); + Message message = new Message(); + message.what = 1; + handler.sendMessage(message); + } + }); + } + }); + + return root; + } + + void initView(){ + recyclerView = binding.roomList; + createRoomButton = binding.createRoomButton; + searchButton = binding.searchButton; + } + + void getRoomList(Integer page, Integer size){ + OkHttpClient client = new OkHttpClient(); + //这一部分还可调整页数刷新 + HttpUrl url = new HttpUrl.Builder() + .scheme("http") + .host("101.33.242.218") +// .host("192.168.18.163") + .port(8081) + .addPathSegment("chatController") + .addPathSegment("getAllRoom") + .addQueryParameter("page", String.valueOf(page)) + .addQueryParameter("size", String.valueOf(size)) + .build(); + Request request = new Request.Builder() + .url(url) + .build(); + Call call = client.newCall(request); + call.enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + Log.e("http","getAllRoom Failure"); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + System.out.println("onResponse"); + String res = response.body().string(); + Gson gson = new Gson(); + List list = gson.fromJson(res, new TypeToken>() { + }.getType()); + roomList.clear(); + roomList.addAll(list); + Message message = new Message(); + message.what = 1; + handler.sendMessage(message); + } + }); + } + + void createRoom(String rname, String description){ + OkHttpClient client = new OkHttpClient(); + HttpUrl url = new HttpUrl.Builder() + .scheme("http") + .host("101.33.242.218") + .port(8081) + .addPathSegment("chatController") + .addPathSegment("createRoom") + .addQueryParameter("rname",rname) + .addQueryParameter("description",description) + .build(); + Request request = new Request.Builder() + .url(url) + .build(); + Call call = client.newCall(request); + call.enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + System.out.println("create failure"); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + //刷新聊天室列表 + //这里可以让服务器返回单个房间优化一下 + getRoomList(0,100); + } + }); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/home/HomeFragment.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/home/HomeFragment.java new file mode 100644 index 0000000..2656c96 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Fragment/home/HomeFragment.java @@ -0,0 +1,238 @@ +package com.example.myapplication.Fragment.home; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; + +import com.example.myapplication.Activity.DetailActivity; +import com.example.myapplication.Activity.PoetryListActivity; +import com.example.myapplication.Activity.TestActivity; +import com.example.myapplication.Api.Api; +import com.example.myapplication.Constant.constant; +import com.example.myapplication.Util.Spilt; +import com.example.myapplication.databinding.FragmentHomeBinding; +import com.scwang.smartrefresh.layout.SmartRefreshLayout; +import com.scwang.smartrefresh.layout.api.RefreshLayout; +import com.scwang.smartrefresh.layout.listener.OnRefreshListener; +import com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditText; +import com.xuexiang.xui.widget.textview.label.LabelButtonView; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +import okhttp3.ResponseBody; +import retrofit2.Callback; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class HomeFragment extends Fragment { + + private FragmentHomeBinding binding; + + private static final String TAG = "test"; + + // 获取诗词 + private final int COMPLETED = 1; + + private Retrofit SearchRetrofit; + + private JSONObject poetryObject; + + private SmartRefreshLayout refreshLayout; + + private TextView title; + private TextView author; + private TextView content; + + private TextView sentence; + private TextView tag1; + private TextView tag2; + + private LabelButtonView detail; + private ImageView ic_menu; + private TextView menu_line; + + private MaterialEditText searchText; + private ImageView search; + + private Button testButton; + + private Handler handler = new Handler() { + @Override + public void handleMessage(Message message) { +// 获取每日诗词 + if (message.what == COMPLETED) { //获取每日诗词成功 + try { + + title.setText(poetryObject.get("title").toString()); + + String dynasty_author = poetryObject.get("desty").toString() + " . " + + poetryObject.get("author").toString(); + author.setText(dynasty_author); + + String contentText = poetryObject.get("content").toString(); + contentText = Spilt.spiltContentText(contentText); + content.setText(contentText); + } catch (JSONException e) { + e.printStackTrace(); + } + }else { + Log.e(TAG,"设置诗词失败"); + } + } + + }; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + binding = FragmentHomeBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + + initView();//初始化视图 + + getOnePoetry();//获取每日诗词 + +// 设置监听 + //刷新 + refreshLayout.setOnRefreshListener(new OnRefreshListener() { + @Override + public void onRefresh(RefreshLayout refreshlayout) { + getOnePoetry(); + refreshLayout.finishRefresh();//结束刷新 + refreshLayout.finishLoadMore(2000);//结束加载 + } + }); + + //将数据传递给背诵页面 + testButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent; + intent = new Intent(getContext(), TestActivity.class); + try { + intent.putExtra("title", poetryObject.get("title").toString()); + intent.putExtra("desty", poetryObject.get("desty").toString()); + intent.putExtra("author", poetryObject.get("author").toString()); + intent.putExtra("content", poetryObject.get("content").toString()); + } catch (JSONException e) { + e.printStackTrace(); + } + startActivity(intent); + } + }); + + //搜索 + search.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(getContext(), PoetryListActivity.class); + intent.putExtra("from", "search"); + intent.putExtra("toolBarTitle", searchText.getEditValue()); + intent.putExtra("key", searchText.getEditValue()); + startActivity(intent); + } + }); + + //查看详情 + detail.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(getContext(), DetailActivity.class); + + String poemText = content.getText().toString(); + String sentence = Spilt.spiltPoemTextByEnter(poemText)[0]; + intent.putExtra("content", sentence); + intent.putExtra("toolbarTitle", title.getText().toString()); + startActivity(intent); + } + }); + return root; + } + + private void initView() { + refreshLayout = binding.refreshLayout; + refreshLayout.setEnableScrollContentWhenLoaded(true); + + title = binding.title; + author = binding.author; + content = binding.content; + + sentence = binding.sentence; + tag1 = binding.tag1; + tag2 = binding.tag2; + + testButton = binding.testButton; + + ic_menu = binding.menuIcon; + menu_line = binding.menuLine; + + search = binding.searchButton; + searchText = binding.search; + detail = binding.detail; + } + + //随机获取一首古诗 + private void getOnePoetry() { + String search_url = constant.poetry_IP; + + //步骤五:构建Retrofit实例 + SearchRetrofit = new Retrofit.Builder() + //设置网络请求BaseUrl地址 + .baseUrl(search_url) + //设置数据解析器 + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + //步骤六:创建网络请求接口对象实例 + Api searchApi = SearchRetrofit.create(Api.class); + + //步骤七:对发送请求进行封装,传入接口参数 + retrofit2.Call searchDataCall = searchApi.getPoetry(); + + //步骤八:发送网络请求(同步) + Log.e(TAG, "get == url:" + searchDataCall.request().url()); + new Thread(new Runnable() { //Android主线程不能操作网络请求,所以new一个线程来操作 + @Override + public void run() { + searchDataCall.enqueue(new Callback() { + @Override + public void onResponse(retrofit2.Call call, retrofit2.Response response) { + try { + String responseData = response.body().string(); + poetryObject = new JSONObject(responseData); + } catch (JSONException | IOException e) { + e.printStackTrace(); + } + Message message = new Message(); + message.what = COMPLETED; + handler.sendMessage(message); + } + + @Override + public void onFailure(retrofit2.Call call, Throwable t) { + Toast.makeText(getContext(), "获取每日诗词失败", Toast.LENGTH_SHORT).show(); + } + }); + } + }).start(); + } + @Override + public void onDestroyView() { + super.onDestroyView(); + binding = null; + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/ClientMessageBean.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/ClientMessageBean.java new file mode 100644 index 0000000..7fb5b3b --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/ClientMessageBean.java @@ -0,0 +1,60 @@ +package com.example.myapplication.Modal; + +import java.io.File; + +public class ClientMessageBean { + /** + * type对应 + * 0 系统消息 + * 1 自己发送的文本消息 + * 2 其他人发送的文本消息 + * 3 自己发送的语音消息 + * 4 其他人发送的语音消息 + */ + private int type; + private String from; + private String message; + private byte[] record; + + public ClientMessageBean() { + } + + public ClientMessageBean(int type, String from, String message, byte[] record) { + this.type = type; + this.from = from; + this.message = message; + this.record = record; + } + + public byte[] getRecord() { + return record; + } + + public void setRecord(byte[] record) { + this.record = record; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/Data.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/Data.java new file mode 100644 index 0000000..f271b6c --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/Data.java @@ -0,0 +1,36 @@ +package com.example.myapplication.Modal; + +/** + * @创建者 晏嘉琳 + * @创建时间 2023/5/31 18:16 + * @类描述 ${TODO}步骤三:回调数据统一封装类 + */ +public class Data { + private int code; + private String message; + private T data; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/EmotionResBean.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/EmotionResBean.java new file mode 100644 index 0000000..f2fb322 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/EmotionResBean.java @@ -0,0 +1,32 @@ +package com.example.myapplication.Modal; + +import java.util.List; + +public class EmotionResBean { + private String emotion ; + private List prob; + + public EmotionResBean() { + } + + public EmotionResBean(String emotion, List prob) { + this.emotion = emotion; + this.prob = prob; + } + + public String getEmotion() { + return emotion; + } + + public void setEmotion(String emotion) { + this.emotion = emotion; + } + + public List getList() { + return prob; + } + + public void setList(List list) { + this.prob = list; + } +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/Poetry.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/Poetry.java new file mode 100644 index 0000000..0a09f2d --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/Poetry.java @@ -0,0 +1,66 @@ +package com.example.myapplication.Modal; + +/** + * @创建者 晏嘉琳 + * @创建时间 2023/5/31 17:58 + * @类描述 ${TODO}实体类 + */ + +public class Poetry { + private String title; + private String desty; + private String author; + private String content; + private String tag; + + public Poetry() { + } + + public Poetry(String title, String desty, String author, String content, String tag) { + this.title = title; + this.desty = desty; + this.author = author; + this.content = content; + this.tag = tag; + } + + public String getName() { + return title; + } + + public void setName(String title) { + this.title = title; + } + + public String getDynasty() { + return desty; + } + + public void setDynasty(String desty) { + this.desty = desty; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PoetryDetail.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PoetryDetail.java new file mode 100644 index 0000000..2e80ef3 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PoetryDetail.java @@ -0,0 +1,121 @@ +package com.example.myapplication.Modal; + +/** + * @创建者 晏嘉琳 + * @创建时间 2023/5/31 17:58 + * @类描述 ${TODO}实体类 + */ + +public class PoetryDetail { + private Integer id; + private String title; + private String desty; + private String author; + private String content; + private String tag; + private String trans_content; + private String zhu; + private String reference; + private String appear; + private String img; + private String authorDetail; + + public PoetryDetail() { + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDesty() { + return desty; + } + + public void setDesty(String desty) { + this.desty = desty; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } + + public String getTransContent() { + return trans_content; + } + + public void setTransContent(String trans_content) { + this.trans_content = trans_content; + } + + public String getAnnotation() { + return zhu; + } + + public void setAnnotation(String zhu) { + this.zhu = zhu; + } + + public String getReference() { + return reference; + } + + public void setReference(String reference) { + this.reference = reference; + } + + public String getAppreciation() { + return appear; + } + + public void setAppreciation(String appear) { + this.appear = appear; + } + + public String getImg() { + return img; + } + + public void setImg(String img) { + this.img = img; + } + + public String getAuthorDetail() { + return authorDetail; + } + + public void setAuthorDetail(String authorDetail) { + this.authorDetail = authorDetail; + } +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PoetryUtil.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PoetryUtil.java new file mode 100644 index 0000000..b6ba344 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PoetryUtil.java @@ -0,0 +1,274 @@ +package com.example.myapplication.Modal; + +import android.util.Log; + +import com.example.myapplication.Api.Api; +import com.example.myapplication.Constant.constant; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +import okhttp3.ResponseBody; +import retrofit2.Callback; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class PoetryUtil { + + private static final String TAG = "test"; + + static Retrofit GetDynastyRetrofit; + + static List styles = Arrays.asList("五言", "七言"); + static List poem_tags = Arrays.asList("绝句", "律诗"); + + static HashMap poem_type = new HashMap(); + + static { + poem_type.put("绝句", "绝句"); + poem_type.put("律诗", "律诗"); + } + + static HashMap poemStyle = new HashMap(); + + static { + poemStyle.put("五言", "五言"); + poemStyle.put("七言", "七言"); + } + + static List ci_pai = Arrays.asList("归字谣", "如梦令", "梧桐影", "渔歌子", "捣练子", "忆江南", "忆王孙", "河满子"); + + static String[] type = + { + "诗", + "词", + "曲", + "文言文" + }; + + static String[] dynasty = { + "两汉", + "五代", + "元代", + "先秦", + "南北朝", + "唐代", + "宋代", + "当代", + "明代", + "未知", + "清代", + "现代", + "近代", + "金朝", + "隋代", + "魏晋" + }; + + static String[] style = { + "写景", + "咏物", + "春天", + "夏天", + "秋天", + "冬天", + "写雨", + "写雪", + "写风", + "写花", + "梅花", + "荷花", + "菊花", + "柳树", + "月亮", + "山水", + "写山", + "写水", + "长江", + "黄河", + "儿童", + "写鸟", + "写马", + "田园", + "边塞", + "地名", + "抒情", + "爱国", + "离别", + "送别", + "思乡", + "思念", + "爱情", + "励志", + "哲理", + "闺怨", + "悼亡", + "写人", + "老师", + "母亲", + "友情", + "战争", + "读书", + "惜时", + "婉约", + "豪放", + "诗经", + "民谣", + "节日", + "春节", + "元宵节", + "寒食节", + "清明节", + "端午节", + "七夕节", + "中秋节", + "重阳节", + "忧国忧民", + "咏史怀古", + "宋词精选", + "小学古诗", + "初中古诗", + "高中古诗", + "小学文言文", + "初中文言文", + "高中文言文", + "古诗十九首", + "唐诗三百首", + "古诗三百首", + "宋词三百首" + }; + + + public static List getTypeList() { + List typeTagList = new ArrayList(); + typeTagList.add("诗"); + typeTagList.add("词"); + typeTagList.add("曲"); + typeTagList.add("文言文"); + return typeTagList; + } + + public static String[] getDynastyList() { + + List dynastyList = new ArrayList(); + + String search_url = constant.poetry_IP; + + //步骤五:构建Retrofit实例 + GetDynastyRetrofit = new Retrofit.Builder() + //设置网络请求BaseUrl地址 + .baseUrl(search_url) + //设置数据解析器 + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + //步骤六:创建网络请求接口对象实例 + Api getDynastyApi = GetDynastyRetrofit.create(Api.class); + + //步骤七:对发送请求进行封装,传入接口参数 + retrofit2.Call getDynastyListCall = getDynastyApi.getDynastyList(); + + //步骤八:发送网络请求(同步) + Log.e(TAG, "get == url:" + getDynastyListCall.request().url()); + Thread thread_dynasty = null; + thread_dynasty = new Thread(new Runnable() { //Android主线程不能操作网络请求,所以new一个线程来操作 + @Override + public void run() { + getDynastyListCall.enqueue(new Callback() { + @Override + public void onResponse(retrofit2.Call call, retrofit2.Response response) { + String responseData = null; + try { + responseData = response.body().string(); + } catch (IOException e) { + e.printStackTrace(); + } + Gson gson = new Gson(); + List list = gson.fromJson(responseData, new TypeToken(){}.getType()); + dynastyList.addAll(list); + } + + @Override + public void onFailure(retrofit2.Call call, Throwable t) { + t.printStackTrace(); + } + }); + } + }); + thread_dynasty.start(); + return dynastyList.toArray(new String[dynastyList.size()]); + } + + public static List getStyleList() { + + List styleList = new ArrayList(); + +// HttpUtil.sendOkHttpRequest(SysConstant.YA_FENG_SERVER+"/yafeng-1.0/poetry/getAllPoemStyle", new okhttp3.Callback() { +// @Override +// public void onFailure(Call call, IOException e) { +// e.printStackTrace(); +// } +// +// @Override +// public void onResponse(Call call, Response response) throws IOException { +// String responseData = response.body().string(); +// try { +// resultObject = new JSONObject(responseData); +// try { +// JSONArray jsonArray; +// jsonArray = new JSONArray(resultObject.getString("data")); +// String array = jsonArray.get(0).toString(); +// for (int i = 0; i < jsonArray.length(); i++) { +// styleList.add(jsonArray.get(i).toString()); +// } +// } catch (JSONException e) { +// e.printStackTrace(); +// } +// } catch (JSONException e) { +// e.printStackTrace(); +// } +// } +// }); + + return styleList; + } + + + public static String[] getDynasty() { + return dynasty; + } + + public static String[] getStyle() { + return style; + } + + public static String[] getType() { + return type; + } + + public static List getStyles() { + return styles; + } + + public static List getPoemTags() { + return poem_tags; + } + + public static List getCiPai() { + return ci_pai; + } + + public static HashMap getPoemType() { + return poem_type; + } + + public static HashMap getPoemStyle() { + return poemStyle; + } + +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PrivateInfo.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PrivateInfo.java new file mode 100644 index 0000000..b2d21fd --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/PrivateInfo.java @@ -0,0 +1,12 @@ +package com.example.myapplication.Modal; + +public class PrivateInfo { + // 自行传入appId, secretId, secretKey等参数 + public static final String appId = ""; + public static final String soeAppId = ""; + public static final String hcmAppId = ""; + public static final String secretId = "AKIDkLhOw5atyqUuthOs8xazylNo36Ugfvyn"; + public static final String secretKey = "f5XpulV2MS4SdaImHclfKm26wb3A2f6K"; + public static final String token = ""; + +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/RoomBean.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/RoomBean.java new file mode 100644 index 0000000..875fd4d --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/RoomBean.java @@ -0,0 +1,40 @@ +package com.example.myapplication.Modal; + +public class RoomBean { + private int rid; + private String rname; + private String description; + + public int getRid() { + return rid; + } + + public void setRid(int rid) { + this.rid = rid; + } + + public String getRname() { + return rname; + } + + public void setRname(String rname) { + this.rname = rname; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public RoomBean(int rid, String rname, String description) { + this.rid = rid; + this.rname = rname; + this.description = description; + } + + public RoomBean() { + } +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/SystemMessageBean.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/SystemMessageBean.java new file mode 100644 index 0000000..4da4415 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Modal/SystemMessageBean.java @@ -0,0 +1,40 @@ +package com.example.myapplication.Modal; + +public class SystemMessageBean { + private boolean isSystem; + private String from; + private String message; + + public SystemMessageBean() { + } + + public SystemMessageBean(boolean isSystem, String from, String message) { + this.isSystem = isSystem; + this.from = from; + this.message = message; + } + + public boolean isSystem() { + return isSystem; + } + + public void setSystem(boolean system) { + isSystem = system; + } + + public String getFrom() { + return from; + } + + public void setFrom(String from) { + this.from = from; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Util/FileUtils.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Util/FileUtils.java new file mode 100644 index 0000000..3a0605b --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Util/FileUtils.java @@ -0,0 +1,67 @@ +package com.example.myapplication.Util; + +import java.io.*; + +public class FileUtils { + + /** + * 将文件转换成Byte数组 + * + * @return + */ + public static byte[] getBytesByFile(File file) { + try { + FileInputStream fis = new FileInputStream(file); + ByteArrayOutputStream bos = new ByteArrayOutputStream(1024); + byte[] b = new byte[1024]; + int n; + while ((n = fis.read(b)) != -1) { + bos.write(b, 0, n); + } + fis.close(); + byte[] data = bos.toByteArray(); + bos.close(); + return data; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + /** + * 将Byte数组转换成文件 + * + * @param bytes + * @param filePath + * @param fileName + */ + public static void getFileByBytes(byte[] bytes, String filePath, String fileName) { + BufferedOutputStream bos = null; + FileOutputStream fos = null; + File file = null; + try { + file = new File(filePath + fileName); + fos = new FileOutputStream(file); + bos = new BufferedOutputStream(fos); + bos.write(bytes); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (bos != null) { + try { + bos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Util/Spilt.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Util/Spilt.java new file mode 100644 index 0000000..97aecf0 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Util/Spilt.java @@ -0,0 +1,29 @@ +package com.example.myapplication.Util; + +public class Spilt { + + public Spilt() { + } + + public static String spiltContentText(String contentText) { + String result = ""; + String split[]; + + String regex = "\\(.*\\)"; + contentText = contentText.replaceAll(regex,""); + + split = contentText.split("。"); + for(int i = 0; i < split.length; i++){ + result = result + split[i] + "。" + "\n"; + } + return result; + } + + //按换行分割字符串 + public static String[] spiltPoemTextByEnter(String poemText) { + String result[]; + result = poemText.split("\n"); + return result; + } + +} diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/Util/WebSocketUtil.java b/src/MyApplication/app/src/main/java/com/example/myapplication/Util/WebSocketUtil.java new file mode 100644 index 0000000..79a1a3b --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/Util/WebSocketUtil.java @@ -0,0 +1,110 @@ +package com.example.myapplication.Util; + +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.example.myapplication.Modal.ClientMessageBean; +import com.example.myapplication.Modal.SystemMessageBean; +import com.google.gson.Gson; + +import java.io.File; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.logging.LogRecord; + +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; +import okio.ByteString; + +public class WebSocketUtil { + private static final int NORMAL_CLOSURE_STATUS = 1000; + private final OkHttpClient client = new OkHttpClient.Builder() + .pingInterval(10, TimeUnit.SECONDS) + .build(); + private WebSocket socket; + private WebSocketListener listener; + private Map webSockets = new ConcurrentHashMap<>(); + + private Handler handler; + + public void connect(String url, Integer rid,String username, Handler handler) { + this.handler = handler; + url = url + rid+"/"+username; + Request request = new Request.Builder() + .url(url) + .build(); + listener = new WebSocketListener() { + @Override + public void onOpen(WebSocket webSocket, Response response) { + System.out.println("open"); + socket = webSocket; + } + @Override + public void onMessage(WebSocket webSocket, String text) { + // 接收到服务端发来的消息 + Log.d("WebSocket", "onMessage: " + text); + Message message = new Message(); + Gson gson = new Gson(); + SystemMessageBean messageBean = gson.fromJson(text,SystemMessageBean.class); + message.obj = messageBean; + handler.sendMessage(message); + } + + @Override + public void onMessage(WebSocket webSocket, ByteString bytes) { + // 接收到服务端发来的消息 + Log.d("WebSocket", "onMessage: " + bytes.toString()); + } + + @Override + public void onClosing(WebSocket webSocket, int code, String reason) { + webSocket.close(NORMAL_CLOSURE_STATUS, null); + } + + @Override + public void onFailure(WebSocket webSocket, Throwable t, Response response) { + Log.e("WebSocket", "onFailure", t); + } + }; + socket = client.newWebSocket(request, listener); + System.out.println("connect"); + } + + public void send(String message) { + // 在房间内发送消息 + socket.send(message); + } + + public void send(ByteString message) { + // 在房间内发送消息 + socket.send(message); + } + + + public void disconnect() { + if (socket != null) { + socket.close(NORMAL_CLOSURE_STATUS, null); + } + client.dispatcher().executorService().shutdown(); + } + + public void addWebSocket(String clientId, WebSocket webSocket) { + webSockets.put(clientId, webSocket); + } + + public void removeWebSocket(String clientId) { + webSockets.remove(clientId); + } +} + diff --git a/src/MyApplication/app/src/main/java/com/example/myapplication/XUIInit.java b/src/MyApplication/app/src/main/java/com/example/myapplication/XUIInit.java new file mode 100644 index 0000000..cfc7890 --- /dev/null +++ b/src/MyApplication/app/src/main/java/com/example/myapplication/XUIInit.java @@ -0,0 +1,16 @@ +package com.example.myapplication; + +import android.app.Application; + +import com.example.myapplication.Fragment.AiPoetry.AiPoetryFragment; +import com.xuexiang.xui.XUI; + +public class XUIInit extends Application { + + @Override + public void onCreate() { + super.onCreate(); + XUI.init(this); + XUI.debug(true); + } +} \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/color/selector_round_button_main_theme_color.xml b/src/MyApplication/app/src/main/res/color/selector_round_button_main_theme_color.xml new file mode 100644 index 0000000..16fd2c7 --- /dev/null +++ b/src/MyApplication/app/src/main/res/color/selector_round_button_main_theme_color.xml @@ -0,0 +1,24 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/src/MyApplication/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/drawable/advice.png b/src/MyApplication/app/src/main/res/drawable/advice.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3808294556e66654901bb4b91eeeae52e25544 GIT binary patch literal 3650 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 KpX-REefd8-Hv>rk literal 0 HcmV?d00001 diff --git a/src/MyApplication/app/src/main/res/drawable/bg_rect_round_blue.xml b/src/MyApplication/app/src/main/res/drawable/bg_rect_round_blue.xml new file mode 100644 index 0000000..24ee461 --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable/bg_rect_round_blue.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/drawable/border.xml b/src/MyApplication/app/src/main/res/drawable/border.xml new file mode 100644 index 0000000..9922a6e --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable/border.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/drawable/chatroom_temp.png b/src/MyApplication/app/src/main/res/drawable/chatroom_temp.png new file mode 100644 index 0000000000000000000000000000000000000000..e99a7d99ba577c0a514036ef28660948dcf204ac GIT binary patch literal 115265 zcmY(qWmKD8&^8(*Kydfs4#8c66^Gyuq!f3GODXOYin|0YZpBJ*cb6iixYObVO5x=B z-uHa#oFB{~N}F;Mm&mQp-!#wZn{0{OK&SebnldRn+r&C9 zV2Q%Z&!>X|2~XSet`+l_uH`z`lquWmhd|9F&CkcFs%1K-A&xC4f2FxkZad6pwT{}D zLQ9iTJCs>c3l68IrsjIG)ys{z=B3JXDxqw%QaAdNG@tQ4$bL0t(eArJ^+x;gy7;JV zl*5cnJiNOsB1!OH!#Kt`3EVUX($4U$tThmdT8ltjd<~BfZ%|Tdcy)Y>|AUk-Agi=5bI*uf(`!Pb5eGZIrJb z!#}103~LkFH+?ivYyK3wa*--sAplq|=48}%@w){G0<8;CJ^!LnPNB@8Ag!7}m`uo4 z%dvu0fmDJ_m+Bfme?c;*FqMu^f4)FlssZ0vVD-}F%|#yV2Yy5$yV2~?z*JTiq|7fU zhVuK%T|`96QtQA!NPO&d}Y5P3yOQm zX7>R<@E0253>tAhmKdl+l!TiI$KW-gWWLw zoI1fa4kuQ}nRFF(3WYgBxN&e6Q%({8h_mXF$t2!@nwkVdIR-ia3J>w0>+wQrZ3Z^Q zW94S(0Up6+=%6%?C2@jJqbeuzmN!dhXJ>nROzs{t1yVQQd$&U#)OPwI?@Hi1aR6pm zcZKMvCx)K8qq&N!beIPi`t}&@O3X|4Mdw&9=ZhvhEJ>3Pn@|y%UN|euLb|!ssS0-- zn}We?i|Fxudmy?}hb{fz-#@w}(2fe@0mL}^wnBWZe_J(-Lr7i6$rUJitVXRiH21oSh;XCW zK}~@@iMp{8fM)nqzUOP+A)&1h3Jfa9ZIS3ro%S%_ ztpU-G{)cezHl#X^A$svWE3|cvj>E*1{b zWrO87IBdIVJ$$OVD|wSpUCl^Nfr>nH!Ka;qu>|`-dp0&Bjc~6DKQo_Xj1?B9tjEE? z^e}dL>E4mbMJS_0dRpXOqoF3)$XgQPLtLd0ZNdT$hSmW{%DtluWTq3V!BF)hf|vQf z0`|9+2hC0Nv-?H^svI$z%{BZ2EjkwXdOl5fkD1)c=ihvPmuC=Q-jptcHUU5&|DzAj z&3Zp{Hv1hw-rGNH+>WIgyZV|J_e?9pG~p84&dy5?-fhTt5X=YO#-e)iU!-S?7RA8}d@xt1*R( zWknZbyS(CK`MW6}RU#I^D< zwRY4zp|e*hT|Pv_X(PsWPm*mV>}O&I!j?-Dg^O9-X<@^X;f^?7Y}d0aIxFJEI}nnF z6X9m2{)lFC`er?WvJLr;@d$#2!$I{9W%m)DzI?vDn&~K#VwS~#1P9QVGD8Io(oIb1 zp}g98xNMPvnqR*rM2HQXJS)IkpQ@;~$lZ)uuvjXJstPpwu*0+%mi(ptM&jMuT)%!y z%Uq8Q?5xbNAi_y^^xhNAxV8wky-uPXbu}TF{n&43H=+29I#eb4J2W~03oDI}8P4n@ z181e4uY8clC3($vci`2ZgsbP;yo@xq9tFy6K3aVM6ep2Wg6wh5n;C1%Rl^tXv{QLB z_)k#wKF%rMM=?$LIp4d?CNb^t05*!76*b zsF4q9@8Bd;*)o{tjAHx>mHL~cAlKY#Y#hr|19`#_76oIim>wMT@sur1#r%;tr}>bU zVwTAfsq3P$D$cPWA$Ivqm!bzeNC|d&)E|og(plCO7USI3){r|ktHI#X6yo+8hUQNd z>_#N&$N>Xx;gJqV*mW#Jp%JanREQ=ty=6AQ0gD5-)IqjCos`VY*oqcTfm^=vv1yX0 z_asa%Hx#?H6fcG;j1b6NAW`|{giVIM0O}=H7?Ic<@zXxCESm+s$j@Hpp0Z`VLh3C3Vj+aS1r zT2|(i5c!{*ExNCrZ(1fKW*00XDz#~lL}p5ee+13)vl+r4@V5LMR8-3=@GxaP=%o_Z z#!75NHS;oLW5de(jYN%`u@SNoeYSxX18(_8Dy~HRO&=fLHaj;I0W)lK;0OD0iTy&r z$ep&eY6YTs(wte)JmRq-^(U_ICImu+r$w*w1KtpQj?AFnQ@OG(=Ls@BuUSO;KiV;(kv(Uc`@gzBra43f=@jk`HPU^Y z$HNYN)jm>eqx+T%vHt(>N!vo4H#S3PioeHfN+;zUA<;y{=;Y+biR|G=Dm|To%=zW- z5PF!J&M^S{=B;8Vr@`qszMRRdR$S8%Qe_CaegS`_5e1v)ArVW;A()q3WBRJ&Z)>j< zDmfo^+kCb#8&IcckBy`~6K;xys}=dV-4Ie%J_%VF0e%X9Xs-F{PL96`N@K8X=v7~I zLTC+>2}bip6u^b_kGh69ToZvxAYI<((HhI}dMl1@1ibGO4Zo$r4y{F?!)rfs_or-)H~DjqL*mXZ87ty*Pd`%sZlAjPB|WNj z&FyGf>KAOABl5ichHhZpJiap(pOh%giGBuB$4qIP0JgmQ`v z=eYMWl>7*HM7&?_;;Xqe7Zq+JD&VB$WvVH?3OSjf zNqgsmiK1(|2dNXXoHN9%!Se_w8J zEso4F0_KfTqkl&P-|w$E;ht&0XY?02zf;A8mD8_hhHusS(sH&v2BQtiCmT%wITf}j zm6Mml0A6OcMdaeIY>c);Uieg%$}Zc%k8Qn)R2@+mNvQvcwA^v_|Jxup?GdttPCGm5?Zc_?r9OgL5Ak$hsraqk{lsfW6!wKC1xQ_|tff<*c zR4HZ|EVlpC`SIBFOOVYFuw5H+P(-vJTUD{V!P*a8s%*VVyip842ECKd5P2(0$-oFt z&xZNh6r6`dynFB)aRF`?3FRvD|0`=|6nfekGPSg7GLJ`KIVj(T+MW`}=(@_S&B@WUQ^W0o zzoBLVe+_&4LcNS_70$O##ye4Uwy2LHpMbtV#FQmK@hgAH7#w4${hJqT4PbLuNSK#x zf_a(UEi% zjlgYdgpt1~^70p(yA^1o@cji}zpiPDp2#UF7_fwycQEa9{6T}- zs%T1g?R}|)RwPmCZ4(tCq@eU59a}dLtZEZV274p@2WhUW>WY_!i?mkX1pY|fDDJ0* z!K&c6G07+e20SYNx|}7{F61eCbrpBoTH%R>S|S@>RO~Fg^HUVv88?@V1P~yLgjhiZ z;RfJOG1$fgZqMcrWfaiy9cZ-K*BNxuVE!uimkkuQQ1L!N@W(mYh6RRPp zRbB$JS2P`_N`|)Y<&Y@;HKkSF&#EPBl6B}aL5qZi)InA5+xnvc|9RfU@uL}f3Vnbc z`8_Ig)zvJsWT^oMM>Y5Y99JR^iZ(Ef!V8oo#5lQmqoG~@N|>*(Gys+5!qM+jD z8koRa*{`I6DEI!#MF5lcs%l$$#Ws1-)ZU{?IBnqOf+yY74DqPYFu2df`4>60fgxK+ zQ+eWhO)*$MpIkR<5I=pqNUG$XE(r`RQdnL9@IW7ltlA*;7quk0mxWDU1KVn6o?!#uWAwh`cYy6P%cBm9# z1FL<6LqnHSgB|DR4H#V^u~jpKU>66_HWS+R1z1{U-#**os3pVDq4Mie$1l_=z+N;l zCZt$X0I`31Wj2a5*ZBYM)*)YH|EKcj@mWG$mK^c_=2AErhbIKT&Ccpx=D^jG>xq0y zl0zB=jF&Y>1W`_aI6B*~6u}d_&^0+5V8~Dsek3v-g=sUgkP9Ny!{zx2a{DCn8(kY(j%)!pa=RN8GgdlVk3LrCTaVZ zGl?feYI+6x9Q^C9lh?fN%0= zxrOE%3g zg&&yD8JlILrnY1j*DNUhYkw4{9FYTC8~LiBvQZUT%+3*UPKglDCi?Fg4k$rfthrx2 zJF|rb@Qz%t0wXOC{3YDXX~JJ6a@k2UetOgw^PgtY`|Rkfm?*GpfR`V#4v!1FJ=<&T zb-8~V>Kno8zy213PI5x)e(DnK2>&6+1dLnfJ{NaTn#jQXekXa1T85nSJ=Z@w@IIp# z0#%>}vtw+sLI?z9j91-WJ$2DJNfDa3&`qpMfC%tKrd`d9&9`u8-23iU61{|HxmtiN zeWf`N3n<=s{PO)E9qK4!)) zv10i9w}}Ynopi*ihFfDit@XFea*_aJ|B<@5!EsN@p6eq%a%m!$6(taIopb6*r`YjM zUDl!ZcygU0I-k^O+q@IHYrd9M)KRCu^V+i7p(UOxz2UCp}_q_>~I7=yrAFS_Vz=|Je zhAJ*jeC$_k3?Rozs})FEO;*M6Q`= zaNyc}_96YJ&Sc$LRvsPIm#P%rtO#wT<54PLwvkce_X2*%Gx_kH6wQ#X6Y=m0cRt6! zt5-SSBlgJ^9}+GFiP5Jtin9?+Q&`;1H#pZvLWd8{48xvNqfsMkrNQBH>#{h=wL%?D zP>FsHu%5}F9}yit$h!|CYzzbXF3a$vguvKr5e6WD^GblHil20ebe0O5Ix;=HzZYR3 zYA|r_o^kZUji$GaKwT?om-W?G9cr!R78VJ>fc7X;+MDgZCj@==OTiOOK-uG5S!}J> zhKAYyExszTr5n^iA2VxLsu^<^EJY(g*Q>BGdx+!s3Ke3L=wY{(I`V}cqnYSSXuV^e zK=b(RtU(Wp2(*!J7;;V<6;BzE->@nPa#`1hE)#DPqbRbz zs?+A%V$G3r8KtHuJw|QMtZIJrrpX1Z
Opi(#|07L4NqKm0fwNFid&*na>(Kuwx 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 YM|>=w9G!EM;^AI;T1J|0AP#Z=0}=NFtpET3 literal 0 HcmV?d00001 diff --git a/src/MyApplication/app/src/main/res/drawable/create_room.png b/src/MyApplication/app/src/main/res/drawable/create_room.png new file mode 100644 index 0000000000000000000000000000000000000000..b5225476fd0b844afa20166f136773e8c379e7d4 GIT binary patch literal 4458 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 + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/drawable/editstyle.xml b/src/MyApplication/app/src/main/res/drawable/editstyle.xml new file mode 100644 index 0000000..e1b6a03 --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable/editstyle.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/drawable/ic_back.png b/src/MyApplication/app/src/main/res/drawable/ic_back.png new file mode 100644 index 0000000000000000000000000000000000000000..4b0551e46a12d9c1f0766cc4cfe0e5b754ae03a8 GIT binary patch literal 373 zcmV-*0gC>KP)PytZET?ar1bYSGjcM1vlK-zW0N|Ev_^LEB| zEEYamSfBp|U}iVKv!t(5&dqkf%+2TI{%m|t9i?P#FKS-*V#LO+kF)+=Mb5v0r28`1EaEQ3}N1KG2F|Cuv=)H|H)STS=Q5 z5Pw<8sz6Kv#Lw!mlop4W1<--WU&~u_!ku_3IizMgP@@1R*YaATy^SbCXh`E501=Bi T#P4zL00000NkvXXu0mjfTnM6i literal 0 HcmV?d00001 diff --git a/src/MyApplication/app/src/main/res/drawable/ic_dashboard_black_24dp.xml b/src/MyApplication/app/src/main/res/drawable/ic_dashboard_black_24dp.xml new file mode 100644 index 0000000..46fc8de --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable/ic_dashboard_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/MyApplication/app/src/main/res/drawable/ic_default_head.xml b/src/MyApplication/app/src/main/res/drawable/ic_default_head.xml new file mode 100644 index 0000000..f68423e --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable/ic_default_head.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/src/MyApplication/app/src/main/res/drawable/ic_home_black_24dp.xml b/src/MyApplication/app/src/main/res/drawable/ic_home_black_24dp.xml new file mode 100644 index 0000000..f8bb0b5 --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable/ic_home_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/MyApplication/app/src/main/res/drawable/ic_launcher_background.xml b/src/MyApplication/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/MyApplication/app/src/main/res/drawable/ic_navigate1.png b/src/MyApplication/app/src/main/res/drawable/ic_navigate1.png new file mode 100644 index 0000000000000000000000000000000000000000..bccb0eb56d9bd547217adfed96568019a8bf6551 GIT binary patch literal 648 zcmV;30(bq1P)t|bdXdKQURm_NCgQMi22>fp7q|^yS}}d zXvTlpyLwN0`mpJd%^ummRsnGL14(Zsy_R&Cf&VM%r=%-0duS!r1i;;oBz=)|+<5V& zq_1Z7yY~GefMEPh(udkbGw**$`n(j8SpdQMyCm567*Tj^`uvlim^I!0F)1PzSeMjYGyFrSfmp6xsK=)V>yoi;=uh%&o_kH%m6;I8TP|B zPX{fe0LTqx*J3z^F`chy?oQb~n|b|lh*k=qReU#QMk}5*cdwB-H?tEiNCCj+RReuW zX~W#zxx~%vJUv%o&!;1awE)J0;hZ*&(QYX_K-JiH0idOB1h)X7C6YTu;Lgk@BRD`P zVUITGqBSc5sEKe??t=1L*mJxn!lm48vCl*YbM}SB>PXHM%aD#W*N9jyXsZ(o!7(>l z9S`TX8&L?W)QTA_hv^gx$1u*_Uctz?5YcLxNbBoaLa z^W#-ZX##@q)8ltt(JmyN?6j6=jfU!=543JeSFtbj{g@OQ4-sLVD*c+_jOTLizh*rG isGV*4H>_RK^Zq}TyZ<4mWWqH70000 + + diff --git a/src/MyApplication/app/src/main/res/drawable/ic_password.xml b/src/MyApplication/app/src/main/res/drawable/ic_password.xml new file mode 100644 index 0000000..716e402 --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable/ic_password.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/src/MyApplication/app/src/main/res/drawable/ic_phone.xml b/src/MyApplication/app/src/main/res/drawable/ic_phone.xml new file mode 100644 index 0000000..56cf551 --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable/ic_phone.xml @@ -0,0 +1,4 @@ + + + diff --git a/src/MyApplication/app/src/main/res/drawable/ic_search.png b/src/MyApplication/app/src/main/res/drawable/ic_search.png new file mode 100644 index 0000000000000000000000000000000000000000..4926e5dd961e6c0ab2252d0ab7c47ec1ba5c4ae5 GIT binary patch literal 797 zcmV+&1LFLNP)r(J6Nn3NnaK$>ClF5{*@9K#1z=oR z2*sc39wr$Em}yL*v+bVO-~0Q2@3r8KKUwyC=j`6W`e%QNg$ia0|{J_YzAKOd|8-O0F|w^Havq!ISNehHy}ampdA6;YeB#+VO4|5)|Dy9 zLI9`U-Vwp2%9y~T5Vf&o`@vD6n+)zW?n(ll2(ULP*&kCm2L*=BYAjafj;1&I} z|7HL->YY;vzNx$BAh&Ol`OKAEboMRcnnb{7yO0)R3LwmWbg!fz3qA!$Zqp>|d3!b* zZ6A=YAinoJ_jFO5X@GjWY>E6J@vHB-rI#KaU4kDHeXXYYUIkKjz=B>@8M-hrKeiTRSMM21fD!8AZ5nb?JS4aY?G_@0gW zT@AuxbAY$L0@KnlRU+T$gjbrP=yVx2?n)MTnN>O_0IDtPSj0o$b7v-K6l10n#!4r% zji!M_ah7UClLitsqkxvZ`w}xo=2KIY1AEiB6({SLWQ$hrU>OK!(oI#YG2|fYZ7_cv ztC_GqYzkys4-}EZtU!8>-rd9%al*;>nM7F) zF};^~;j~CFflybmTzv3Qb{gVlxjTyd#%L0^Q&#q8u z;z5MXv52q6w|-4=)YA12RD+6JOM@^1$jTzQ9`yii#FR;>)>i_c0{<&Tb~(uHF7m_5 z02D;N(QfHVO7X)=0Zja`QUGn>$xK+}hm`}w{Q$~&&)YhQoAy-zLM1vU7}$Q&jIRc; bsFeQzd?1uC{TGbJ00000NkvXXu0mjfE-!XX literal 0 HcmV?d00001 diff --git a/src/MyApplication/app/src/main/res/drawable/ic_setting.png b/src/MyApplication/app/src/main/res/drawable/ic_setting.png new file mode 100644 index 0000000000000000000000000000000000000000..84ca12681cec4b1ae9a3d872e5998f9f15cdcc3a GIT binary patch literal 616 zcmV-u0+;=XP)4wMSS3e*m?f^+sw@+RbcBpF~F?+-u7 zUG_e9FOT?RW9j{7wgPa{;kP0=EQwhJz|777yd*9-Ci$5QViy3;NxuGH0ItV}0Hy$D zB)@$&W;O?KmB>zKCf?7r?G}LAcTe&z^j~X%ndwg*_NL1PM1!Z_qs-FEPq8lC#bLZ* zI3qOxGusF70YJaIv?r1ye?bT!r@Y$&Ru5_gz{~~!-nJDzBTlUs9)M_bn&B88c?aO> zrUB~`r>?NqB#6Tu>-pr&GqH~)agu>RSfcG#nYx5?VwL41u+bW>m zJmh8&pG#C=OmY_bghHg!Jx0%*Hlqj7H@RKGBsu~k)1}&cB~~#ioB{FsrX<1! zXX|%CypGl5l!|R|Z{;d6lA2a?6f2?jwEDP9TVqn24usF{rF+?^#~Rd<>P!GAOC{wu z?UJMzS6i19YoHdQi9hKCMjDV>+XAg^SwGF)rqso2F&iyN)!oblOnT90|NL3rms;kR z(M~In6s+8h=@ZRbuVGaZAE%8ePt8>^fK + + + + + diff --git a/src/MyApplication/app/src/main/res/drawable/icon_collect1.png b/src/MyApplication/app/src/main/res/drawable/icon_collect1.png new file mode 100644 index 0000000000000000000000000000000000000000..2e93c83db703f6118b1ea7ed3df50cd7624149e7 GIT binary patch literal 653 zcmV;80&@L{P)p&0oeZD8^~G$0AJgFb?*cs;+dqM34CPxs)t0k0uk{= z((44huzhlG1R~;4(r-x@2?~)e6}l9tqCb)ZnQxHkQDHHGD*CUb_#%R0e3~j;FG)oY zfe(`2OL|f4mv%&jGuwQhy%rIOh{u`xOWQ*aC@UgClm~``Q&H>+E$f1mp;%FmLM4dfa^I~KR3z{?GB2v=eKKe5P^8#)1iz&~l}i|- z#D5_%1-_F2|E&5v@^>rI0^ds@Nz_%nn8Y0LNdjv~RNy-;Th~gn5v4ux_t<({Z7%Kj zQqr4Zw`L!hsNgdBX1CdDSRJ&SG)Dm%6BcSlQ#t9*yjY{a?8_EVT!iAmN|Fl?J&C$MFbIjB$tv-=Dz)NmY~w}Ovzp+v=m?-T=o9+DsKX6 nqPq{Y+V0x#O&6>MXr2EHHiaTEQX*pF00000NkvXXu0mjfLlqv9 literal 0 HcmV?d00001 diff --git a/src/MyApplication/app/src/main/res/drawable/img.png b/src/MyApplication/app/src/main/res/drawable/img.png new file mode 100644 index 0000000000000000000000000000000000000000..9daa78d993471a9ca3d8015d5c9e59caa50e00f8 GIT binary patch literal 506 zcmV*CqP*~LwQV|=z%-D;fa&cy}gFn6auvw?Md9(vE>jHNRI>-ufzw+MPv z>YoKx{8Nn9K(9*cM1f8FBRcndb-(nSUJjSk1mdNz=+Q+b@| z>94~*ylQqKEL@8hmom1Gu3=seOfZ+$#glpw#Jl&5_ktU&H7f%P@6{s&HY+J=&8MKz ztOTuU6-+mCQVm7ys)T)@IkdY>K+YF31P!y)|w zB|fds@8O_k3HOMGFA)~sizY=I*!1E?vxHhT3Z|RzL^ok>?e3Z%0_*%HnjE!y&?I*d z9W|f8Uiv1vC5#Uug7{I)i)A2y75*5e6%#*-3F4R0v3tfDdd2d>p7dozFy4$6tZ?jN znMY-D2suS)A=p#Z-#u?Bin>R$wGIdo6Vf!eZZ&jI^7 wVxMRV=H_?%5@0jJGk~475~uFj`i}n;-{ZBukr64>!T*CqP*~LwQV|=z%-D;fa&cy}gFn6auvw?Md9(vE>jHNRI>-ufzw+MPv z>YoKx{8Nn9K(9*cM1f8FBRcndb-(nSUJjSk1mdNz=+Q+b@| z>94~*ylQqKEL@8hmom1Gu3=seOfZ+$#glpw#Jl&5_ktU&H7f%P@6{s&HY+J=&8MKz ztOTuU6-+mCQVm7ys)T)@IkdY>K+YF31P!y)|w zB|fds@8O_k3HOMGFA)~sizY=I*!1E?vxHhT3Z|RzL^ok>?e3Z%0_*%HnjE!y&?I*d z9W|f8Uiv1vC5#Uug7{I)i)A2y75*5e6%#*-3F4R0v3tfDdd2d>p7dozFy4$6tZ?jN znMY-D2suS)A=p#Z-#u?Bin>R$wGIdo6Vf!eZZ&jI^7 wVxMRV=H_?%5@0jJGk~475~uFj`i}n;-{ZBukr64>!T*CqP*~LwQV|=z%-D;fa&cy}gFn6auvw?Md9(vE>jHNRI>-ufzw+MPv z>YoKx{8Nn9K(9*cM1f8FBRcndb-(nSUJjSk1mdNz=+Q+b@| z>94~*ylQqKEL@8hmom1Gu3=seOfZ+$#glpw#Jl&5_ktU&H7f%P@6{s&HY+J=&8MKz ztOTuU6-+mCQVm7ys)T)@IkdY>K+YF31P!y)|w zB|fds@8O_k3HOMGFA)~sizY=I*!1E?vxHhT3Z|RzL^ok>?e3Z%0_*%HnjE!y&?I*d z9W|f8Uiv1vC5#Uug7{I)i)A2y75*5e6%#*-3F4R0v3tfDdd2d>p7dozFy4$6tZ?jN znMY-D2suS)A=p#Z-#u?Bin>R$wGIdo6Vf!eZZ&jI^7 wVxMRV=H_?%5@0jJGk~475~uFj`i}n;-{ZBukr64>!T + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/drawable/message_center.9.png b/src/MyApplication/app/src/main/res/drawable/message_center.9.png new file mode 100644 index 0000000000000000000000000000000000000000..29eddb9bb72c23806344f42f156b82671ffec3c1 GIT binary patch literal 4533 zcmV;m5lZffP)5(<`}X;K zwoFQAds`7!P!Sd~QV4x3gBGQ6U<#;hF6DFb^ZQDDYdwqh?dRYdUbbT;@&x^msgmHZU+?d|C%oCHSyCANIpK3ZgXf z@lj>SOJNv$PCiw}>-8E#PzgS6x7&_4%FJnY&kU~*#{#F;D1p@)b zT>(Bnp`Emt9V1kl_g{c;LYwpyImicw)ganU^Bs(TH)gSWK)L7sN^k<|izOjmF{_$_KIe z#Y%K{90YQGh$iz$P??m(Sw_YS3$&)oW0c3#bwl539Bsp5E8?6+YEG*;S9aDLVao0k z3K1gdR36+t{Yi|wdy#zmkj>XQ?+AG0Vl6NWA zEVD8jL&dX*gd!NCdR__SL<`P#N=)QsE0SX14;sF^?)gt_eR;in$qY&3kE*w$;!l2# zr&I(+oruMit-z@V#zRzYuH zzu{+q)8dQ==eov6WunX@;Fn0CQ0K&Zg;=xbB?Ytl-o@YD`wLWjWi8s9U$+Jn_tT$uU^F=6)=E>L+OLN+Fw038e(T*AmL(lUWn@EXcGbV`(#!y=5cN zBWQKX#IY$~f4`+*zsSVjtk*@_Rz&?#VUUXzJJUtWz_KVA^`Aj~{crH_ta+HfW~0PJ z9ugLy`^QDjblQu=xrY#Iy$(P5kD2fuza51$qp@N2eb}_C0l8$@2oq0dMVK^_t}O^( zybl*UQ^=&Uz)(rt(lY{L70vQFp}9pFk%=<0USrx;M177H(6vN^ib_%`zf30)C21@x z5t@>PDS000;C>|fmLhWcJLo<<5znr=2lM}D7W|^bVB;k8HjPK1>6RG6OF? z_dU28ry+W3EWFL%K*uMy;o`^B&|NbH-lmC&wvIutZ4%BLz7x&w-i`hSY1=jq>EB+D zcXoXj+xC8HW-KA`m=;&|1;vOmel(WFy9ak*%C~1BA3r7VFKz&t(M;4RrFz&A(;MEsrAb@+JftZ$($l zM0|F5vM6;M29DhdPtyeW8pp%acr(1mCLwt276guumHJ!cx0J>S5>sPwVE0rkSiN6n zM%-u6BXK2gn@LI>Wl<{tbM}I)KN3wtsW!}d>~UN?{f@+0fr=Pq?7)h~3+PjrxuMTFUkyY7D}kv zyAppqZYe6RS%j5)Uz) z{`fn1e&df(Xder=1g={w=N5PIisij!1@==tn0x;l?oj3>t7842c4+gOK- zl-=PnCA3^g!QZo#$8gJx`Wwa~);l=Ufm{wXxPeJ9@9`40%Tl!NxNL4Tj3d|!m0 z%8W-}?KMWebX<6BTsM zsLouO&&x7Q`ys^JIMDTiC^wmbxjLJbx_%6Nb)(^~y%qxvUqe^zc=Q~-9bKPH zk#*-bTT!ktx`1kNH?oX}zfN4Z?kl3e4d^;@J$h@#NMC=8bz2&Y41ImW8JKj2`$2lp zF#J~V45BAQ?s~hsyG7#+`~hY(hGd2YKn$y%UL+8{j#9BiuFD zz;k9gQvNqFls%4)_Lnix@j>0~tJQoJ?$)UYo|qzTItsxi**MmY#=xoB#?l8q>c+D5N3m%~GhW@( zj2&;ZVN=y9ys)DVcg)y=w?8-|twx^bS!_jg?{8%;q){Se;s)sxxa;2OChe1AHbi2l zD3ooxYRtg-gA*e)!IynB?iOfUcf?v$d!2&P>Z?idb8f z0@A5-cxv&_@u!p4V9ec5N+)uDmKl*{6zPz)bqUB}CnriBYw5-#|6OJ3;FCP5s~u(l5qP%s9anHcQA{}RXie>kd<9)L#rF}R=3FNehci2q8dgMeu&fM)t>nXpN4BD3)GExJvjFtXlpsXo zCwnk`<{S~0XY-Pk_ROS3KPKZMR!Y^!&0Pxa?)Q<-=SN4`3L0?xjep>ms;U^$bR?f_bqpmX@l$V2w z%Vnj5PPM%$3(%XQq--d2F>KttSWam_6p9-Iy-d$oXL>sW;}03Ws$I+R@h5v_c7dL= zd*zhbELLU)2Iw8&S}wGG zEL~b@Xl|DUbt(?W&F{&EwcaHfR_4~OkHp9@U_Dg(?NPa z!s5)hYch;JOV?w9&hNJr<-){lMZT65e!%^@9_*L4H?&z-ByHx zYHpX`R$4SlOsXQtj@x&(SYb`l$3T8|Ik`4zJ}NTg&oV`*u_Y>0I$rRf~< zXs$prHxUW$*18R-{%EI&-DQMNB+}B}y1UUNH+e2gnJSDaq&XAC9Dq~Fq61&rW;g>Q zxXxsOY;#Jo6No0Qb`-$vwk~|sU{3hdI?|ccPN(z8$Obkp=X55*2`cmsjSDB=2-H&T zNYHBqYR=%J^{52fkjc7M7@6Kzt40L5GAYu;^4YWmt;fE8)Akfb$I$GJ!l>OR$Cnu( zj8g&S*ZUT>QA3Pa5S{Q#26oJ=FV+zV$f(mu|DnURC z46!}i=|vCw?CG_x-YA>KkjAXugk1)|nhsJyDFg>3qvn1U>TGloQ%718x?h4 zhB|L%okmc8lkG@Z_xE%Mdfnhe59MPUrLmqx>lAhPThUT!w7&D&%?ZtFeMLJbZGDwug z@~I%Ii1I7V$>;1_Y0i2lpR;eJ*^1B-Iw&no%{kSy4jb}Ki&1d>0|9-SJajdsaoQ<_ z{#}W`)dl!XA^51Pu%5i^pMB|OknTrWl*T%~_3mEXjyxR4R^%!kGXEjV7k>U9e1{z@0hyle`&?*6q zXEs@8vS(s8na$1^=7X=>Ip_R=?9T2Gk{r#HbT}Lihr{tdDQBlhiEe{8gk@d`qjj*U z;TQPWs^@2e`Y}jmJ5lo2p?Os?RFYOnk#0m=O9WZ;0+q89@ar8Znh#Ov$NORu2$Xu5 zQ0R-%3{=c);YKOS`*)%di2p&E|B9NV>s#bTp%JK**-f35a@bk4t4=2io)g;^bshR8;32(J`{LI1x+i68R&{G z!NPk~$QA`X0#B(2>pE?}DiMWEKM`57&;S%D%@fqHP! z16pLW0!1KB&YOg-%>i8effn1Spi7_-=FP(b27aR=HYw;4D5O9aVc{JrWQ&5BfjCVv z1~-g7G7=9~nM-dL-s_K1QIiS=2ow@6YEppc>XAP9>-t^90Y~a5x-s;Lm_z a+ml}|VoqDiLD7%^0000b@?P)yhr z>r7(KLS_C6A(ICnPfxX#3d?Yy=FKl0z$U6EiNb^{PaslK*&9sB@0x? zv2L(aG6bQvFua&NVy9#XLLJHQBJzoyk|78M2N#!gXd!h;M~Q`OatP;voo?<@ZnrJ0(L9YD%;HEhU#99 z<6Y287AXqfpB{-2hgt{1A|+vavk@ZXzI{+F#rEa)_QA&{YoO%)knq%;mVbme?m=PI zyaz+_0N&GXuvC(C+&6f9o8~`$+T{IevMx)W>1OEojD+A>h;I2 + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/drawable/search.png b/src/MyApplication/app/src/main/res/drawable/search.png new file mode 100644 index 0000000000000000000000000000000000000000..bacdec4fe4467f4d111a398dd0490845b39e2c8c GIT binary patch literal 3818 zcmW+(2UL?u7yS}~CPAfF0YeBZp{(>?0t86ty#-bjWhsK8t0)8nq)G@NMVc7t1eGo; zpcKPuXbMuof}o&aK&eVZ{`k*1Gk4CNH*fBlIrH9m>5leRC*cxs002(naad;#(tmg8 zG0xcJNh{|7DAL)=44{ojeg=S3R6N$y_3B@&GD5^#eZExIV&igOWU68epC|019Jzqc z-E11#fZJYi%AOO5i0s|0ZfO|;@14(~#(#ow00O|(DbQ!wb0IoDlw_bpQa;ZZ>LudfA6xHuk zpa5VL)imuj>_LD)&0OY#|DMI|AFPg6^ya7bt6B;H2#r)kO~TcySLZbu?DzhK%P-kI z3G?kLhpa(|h5ZCf&|J*Xm4o@2nVFn#3v;Z!sWe_c2@NBSGt~gF zi%f9IWoIj19~A^-V0n2tE(2os=Efa&$8Q+mfkO3!qZ>%wGQDThq})0uKgvx!05=&n z*M6A#sR|kN72yVK?Xl(@IIS>r?he}Zkz>diRczrE+~D1|WCBKBDvhQtgZ?9`r=CozE zEoXpHT4l)F_gT`hv9UT+C&Gh`^KjzAUgVgEUQfj^fhrF+6(}v zkpcxi7~AoaE^D8*u1SJ>IrvGIXtw*WdgZBh6ei4SB5ujv;GGe1&J#pwD$*X)6>beE zBXZGh1*tjD$cT?iGHNjT;Nal9KJMN*+Bz+Gq}jg;wnhPiV0AjF_sBGxHS2Hkcs5o+ zVeC<5!498ps&CVo3Fh$T_&r9dwt9wk@RVyuiZ>IRAw1sG_+$#I6^081my`{ zemoWmNISuj2rau?nWNa1Ne~Rz5V(wRt|waVSwX@^L8x0J4PdY?@|n@rBXT}Z?uQO~ z0|=RNYtMld)7^lp=sSNLj*~If??xh=b!Xe3nelj3gkzBJqP{@|#^QgH*y0~jPaINP z^_Z2mMaH* z){Bhx-LGD0S}QfS`Qg2m56Bm_IM)CNl#1g;yqpuI;Jm z8kr9tr0usUMPrDQXz}#I$kivH%@El&613_z`=3csB>P@dz&d`^2`kKJ$}5#}EpdnF zt1{Y_rj2N6vkE+K-?T(qk3Y{JezP7@*Yb*y6-Nc2)wL7g*tCdj; ziU<$?w#n3pdN}ScZ)d(5a>>0@VJW<$8IJHCztwGxmm$pLFyoE>K9kdy21oc5J_wR< zTFp?}0?`k?1kGGO)W~IEc*uE!U9H@n%aiy3B%wlJ8t)S_tKYKRf?L;nP0-=eM;o)nwvrdPeNlq7B+f8v9vXq#8lZwV!RgBYn&A5^TVmM zFm+)2N5o#952{It45kksm`nT>(h2s8CFTDJ7bmsi^VDxMUs`feyc3`U7UAV{2k_<5 zABj6=b*kBy&9R^=rvze%f;7!|rZFJUZ_^7Sgz(uwe>P-fzYpzBl1Xr{$cQzt1gU#e z+Vm^7SPU|(8=qQ9oF>15Sf73C55g;sIVFf~ZzX?*UiR8ay04F*aGPaI$Um>vb@c+R z;I%Du2vq={<#%nAP;fZya|RcrEE_S=o5a+bKHY3B}Z`gutlpVzoY z>5ChLOHa!+z-|~S%WG7xA>*a6Hl1nVvL@*6peIIt+mNzPyX|JaT3Tr7o*NmD_HO_q zuhqdl`f<*!`GP}_58zkZ>(Cf$-j@e7kD)Y4gxpz?V_cML!cyGV#cd7m$rWmIkxl>n ztexk7HXv7;PM^eL+2!`)gtE|j&)4^B_E$s)I8IlZ(H{;X_P@5g&xkxbuT+4%DT#G# zJ)Gsl&likDS!Fch(KaKjqx*^G>f5ebEFaDDjJ(&*I>{wvk7y`r^v^>NMXfZ=jLMG$ zZKMzDecP04CL#@aiK~y%GxX`cglXU-?`HMV$bw({C9HZ0)6~10?>G+_`r$2aShZr7 zSlE2OKkNSNV96{YqD}92P7__pH-&9$9u0-Ca!>N%g}$|V)SS@CxhMB-YJT-oXk0WW zJqqrh+{ ztMpP+OH`ekN>GG01{J#STxV=j9WwmbBkGL(Xxw>YqlHEilxOdp>!;9;If8k-Gs_hc zZRNJ>?~cLY@%1U!2ae_V%zOHKmrC&k)pO&fQm~$}t{qBo{22NUg@&{1Vm;M0Jc@xy zwna6aVm%Q{{%8Y$R;abIN}qe&neU(-U&n9h0gZ=kO4`mXNw-k zdgmZ0^b=y+XtZQ4Om;z4*gwDDA7#M?VC~dEsIj>DlPOc8-_2kP3|JP1a7s$1(nu-ZVhc;nSs4i9Dg93(aa2X(! z+{cn6v(X4ewL^*0LO|@y`t_Op!;qkC`DZwQvPu@>rt9wZ8UGre){E&$y%@ZomKiJI>LiK3^(Tkes%83W7QX z=-GB_n(9S8l9?Fex`$r+;&S(!M(Erxou3;OhXsFo_KN#`-%ei>JSApZLGgGOPe3uWVsW(`%TOsgIN97RH=Wi9NLF)^8`^A^DWNQfdl|# z1ow^FsSObzaq|zQMLh~YzPR59P)Qy*0Q!?)2g)G>d|LZ`7-?A;ka(^^X%Wrw9lhU2 zDo1h%lfPa1%uyi343mp1E)4}h;!AxKDIC+`4e9SmzbA=De^z7Cb0H+<73uF)0>7Ds zKWP~JZ-!&@g7VuTET!K%8@Ep10jbIVZX0>(cqM{Ve=Ed79!k!u&z1tg!FiR|Du@F+` zEKce>%5Xv;C}|7*^fE)>z0ivVJ2WB@wPTbO`3DqZTYM%jSE0`oj6o?bY0!ibIL;sW zY|%9Op9#LXe3}z^TkWO!u{QXumQJuaYNppd=fAm$c2)-~hHVjv1h6i4Ssyut+0qDA zSH_MTNUJUpdsPMo2Fmc^W+iZd&rVD2t^tQP$XiO*6b29_!55TcIee`AAS_4`z-Uem zcy4fNxDDG3!3kG@6j-1Bn8~U9n8iYWQ0o9-+*Q!O%LO2HYM||LE+C+)PJSq&rtfH0 XLoY02_enRWcm?nl_E?&kU(){o%D~yn literal 0 HcmV?d00001 diff --git a/src/MyApplication/app/src/main/res/drawable/type_label_style.xml b/src/MyApplication/app/src/main/res/drawable/type_label_style.xml new file mode 100644 index 0000000..11b1e1a --- /dev/null +++ b/src/MyApplication/app/src/main/res/drawable/type_label_style.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/drawable/voice.png b/src/MyApplication/app/src/main/res/drawable/voice.png new file mode 100644 index 0000000000000000000000000000000000000000..f07a2a5242640702468e1ca7291e5dd322a19d18 GIT binary patch literal 5115 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 yE31P9Jb~26-6w* + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/layout/activity_detail.xml b/src/MyApplication/app/src/main/res/layout/activity_detail.xml new file mode 100644 index 0000000..1337336 --- /dev/null +++ b/src/MyApplication/app/src/main/res/layout/activity_detail.xml @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/layout/activity_login.xml b/src/MyApplication/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..6d652b1 --- /dev/null +++ b/src/MyApplication/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/layout/activity_main.xml b/src/MyApplication/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..0bd11c6 --- /dev/null +++ b/src/MyApplication/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/layout/activity_poetry_list.xml b/src/MyApplication/app/src/main/res/layout/activity_poetry_list.xml new file mode 100644 index 0000000..d669206 --- /dev/null +++ b/src/MyApplication/app/src/main/res/layout/activity_poetry_list.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/layout/activity_register.xml b/src/MyApplication/app/src/main/res/layout/activity_register.xml new file mode 100644 index 0000000..f9601ba --- /dev/null +++ b/src/MyApplication/app/src/main/res/layout/activity_register.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/MyApplication/app/src/main/res/layout/activity_test.xml b/src/MyApplication/app/src/main/res/layout/activity_test.xml new file mode 100644 index 0000000..6a69b98 --- /dev/null +++ b/src/MyApplication/app/src/main/res/layout/activity_test.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + +