From cfd8165b5e790c43d7985d69dbc0dda4edd7bf08 Mon Sep 17 00:00:00 2001 From: YunLei Date: Thu, 17 Aug 2023 15:54:49 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=B5=E5=AD=90=E7=8F=AD=E7=89=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 16 + .idea/.name | 1 + .idea/codeStyles/Project.xml | 122 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/compiler.xml | 6 + .idea/gradle.xml | 20 + .idea/inspectionProfiles/Project_Default.xml | 7 + .idea/jarRepositories.xml | 45 + .idea/kotlinc.xml | 6 + .idea/misc.xml | 88 + .idea/render.experimental.xml | 6 + .idea/vcs.xml | 6 + README.MD | 3 + app/.gitignore | 1 + app/build.gradle | 207 + app/proguard-rules.pro | 104 + .../com/yzx/ebrand/ExampleInstrumentedTest.kt | 24 + app/src/main/AndroidManifest.xml | 88 + .../main/assets/weex/components/HelloWorld.js | 132 + app/src/main/assets/weex/index.js | 322 + app/src/main/assets/weex/reader.js | 287 + app/src/main/java/com/yzx/ebrand/App.kt | 77 + .../main/java/com/yzx/ebrand/MainActivity.kt | 638 + .../com/yzx/ebrand/activity/CameraActivity.kt | 24 + .../com/yzx/ebrand/activity/HomeActivity.kt | 304 + .../com/yzx/ebrand/activity/LoginActivity.kt | 247 + .../com/yzx/ebrand/activity/WebActivity.kt | 502 + .../yzx/ebrand/activity/base/BaseActivity.kt | 121 + .../ebrand/adapter/ChangeDialogStepAdapter.kt | 94 + .../yzx/ebrand/adapter/ChangeListAdapter.kt | 80 + .../com/yzx/ebrand/adapter/HomeAdapter.kt | 14 + .../ebrand/adapter/HomeDialogStepAdapter.kt | 102 + .../com/yzx/ebrand/adapter/HomeListAdapter.kt | 74 + .../adapter/VisitorDialogStepAdapter.kt | 49 + .../yzx/ebrand/adapter/VisitorListAdapter.kt | 121 + .../ebrand/adapter/base/BaseListAdapter.java | 154 + .../ebrand/adapter/base/BaseViewHolder.java | 19 + .../yzx/ebrand/adapter/base/EasyAdapter.java | 92 + .../yzx/ebrand/adapter/base/GroupAdapter.java | 204 + .../yzx/ebrand/adapter/base/IViewHolder.java | 15 + .../ebrand/adapter/base/ViewHolderImpl.java | 42 + .../main/java/com/yzx/ebrand/config/Config.kt | 39 + .../com/yzx/ebrand/config/RefreshToken.kt | 89 + .../com/yzx/ebrand/config/YzxInterface.kt | 52 + .../com/yzx/ebrand/fragment/ChangeFragment.kt | 428 + .../yzx/ebrand/fragment/ClassBrandFragment.kt | 509 + .../com/yzx/ebrand/fragment/HomeFragment.kt | 557 + .../com/yzx/ebrand/fragment/MyFragment.kt | 174 + .../yzx/ebrand/fragment/VisitorFragment.kt | 449 + .../yzx/ebrand/fragment/base/BaseFragment.kt | 105 + .../java/com/yzx/ebrand/model/BaseBean.kt | 16 + .../main/java/com/yzx/ebrand/model/Book.kt | 24 + .../java/com/yzx/ebrand/model/CBClassInfo.kt | 75 + .../java/com/yzx/ebrand/model/HomeItem.kt | 7 + .../java/com/yzx/ebrand/model/MessageEvent.kt | 39 + .../main/java/com/yzx/ebrand/model/Note.kt | 7 + .../main/java/com/yzx/ebrand/model/QrCode.kt | 8 + .../main/java/com/yzx/ebrand/model/ReToken.kt | 5 + .../java/com/yzx/ebrand/model/StuChange.kt | 209 + .../java/com/yzx/ebrand/model/StuLeave.kt | 199 + .../java/com/yzx/ebrand/model/TabEntity.kt | 21 + .../java/com/yzx/ebrand/model/TeacherInfo.kt | 102 + .../java/com/yzx/ebrand/model/UploadBean.kt | 13 + .../main/java/com/yzx/ebrand/model/User.kt | 105 + .../java/com/yzx/ebrand/model/Vacation.kt | 21 + .../main/java/com/yzx/ebrand/model/Version.kt | 11 + .../java/com/yzx/ebrand/model/ViewImage.kt | 7 + .../main/java/com/yzx/ebrand/model/Visitor.kt | 113 + .../com/yzx/ebrand/model/YzxClientInfo.kt | 25 + .../yzx/ebrand/presenter/ChangePresenter.kt | 77 + .../ebrand/presenter/ClassBrandPresenter.kt | 176 + .../com/yzx/ebrand/presenter/HomePresenter.kt | 131 + .../yzx/ebrand/presenter/LoginPresenter.kt | 207 + .../com/yzx/ebrand/presenter/MainPresenter.kt | 48 + .../com/yzx/ebrand/presenter/MyPresenter.kt | 51 + .../yzx/ebrand/presenter/VisitorPresenter.kt | 140 + .../ebrand/presenter/base/BasePresenter.kt | 19 + .../yzx/ebrand/presenter/base/Convert.java | 50 + .../com/yzx/ebrand/presenter/base/IView.kt | 12 + .../ebrand/presenter/base/JsonCallBack.java | 193 + .../ebrand/presenter/base/SimpleResponse.java | 20 + .../presenter/base/YzxListResponse.java | 27 + .../ebrand/presenter/base/YzxResponse.java | 30 + .../com/yzx/ebrand/receiver/BootReceiver.kt | 21 + .../java/com/yzx/ebrand/utils/FileUpload.kt | 49 + .../main/java/com/yzx/ebrand/utils/KotlinX.kt | 117 + .../main/java/com/yzx/ebrand/utils/Monitor.kt | 130 + .../com/yzx/ebrand/utils/YzxFileProvider.kt | 15 + .../java/com/yzx/ebrand/widget/BaseDialog.kt | 39 + .../com/yzx/ebrand/widget/ChangeDialog.kt | 122 + .../java/com/yzx/ebrand/widget/LeaveDialog.kt | 100 + .../java/com/yzx/ebrand/widget/TimeView.kt | 28 + .../com/yzx/ebrand/widget/ViewImageDialog.kt | 56 + .../com/yzx/ebrand/widget/VisitorDialog.kt | 190 + .../com/yzx/ebrand/widget/YzxPDFViewPager.kt | 26 + app/src/main/res/anim/rotate_0_to_180.xml | 8 + app/src/main/res/anim/rotate_180_to_360.xml | 8 + app/src/main/res/anim/slide_bottom_in.xml | 7 + app/src/main/res/anim/slide_bottom_out.xml | 7 + app/src/main/res/anim/slide_left_in.xml | 6 + app/src/main/res/anim/slide_left_out.xml | 6 + app/src/main/res/anim/slide_right_in.xml | 6 + app/src/main/res/anim/slide_right_out.xml | 6 + app/src/main/res/anim/slide_top_in.xml | 8 + app/src/main/res/anim/slide_top_out.xml | 6 + app/src/main/res/color/s_app_color_blue.xml | 6 + .../res/color/s_app_color_gray2_to_blue.xml | 6 + .../res/color/s_app_color_gray_to_blue.xml | 6 + .../main/res/color/s_app_color_status_bg.xml | 6 + .../res/color/s_app_color_status_border.xml | 6 + .../res/color/s_app_color_status_text.xml | 6 + .../res/color/selector_btn_read_setting.xml | 8 + app/src/main/res/color/selector_chapter.xml | 7 + .../drawable-v24/ic_launcher_foreground.xml | 34 + .../res/drawable-v24/progress_horizontal.xml | 29 + app/src/main/res/drawable/background0.png | Bin 0 -> 14612 bytes app/src/main/res/drawable/background1.png | Bin 0 -> 14875 bytes app/src/main/res/drawable/background10.png | Bin 0 -> 14642 bytes app/src/main/res/drawable/background11.jpg | Bin 0 -> 53313 bytes app/src/main/res/drawable/background2.png | Bin 0 -> 14941 bytes app/src/main/res/drawable/background3.png | Bin 0 -> 16321 bytes app/src/main/res/drawable/background4.png | Bin 0 -> 15934 bytes app/src/main/res/drawable/background5.png | Bin 0 -> 15274 bytes app/src/main/res/drawable/background6.png | Bin 0 -> 15216 bytes app/src/main/res/drawable/background7.png | Bin 0 -> 24050 bytes app/src/main/res/drawable/background8.png | Bin 0 -> 275080 bytes app/src/main/res/drawable/background9.png | Bin 0 -> 25494 bytes app/src/main/res/drawable/btn_blue_select.xml | 5 + app/src/main/res/drawable/btn_select.xml | 5 + app/src/main/res/drawable/custom_bg.png | Bin 0 -> 19398 bytes app/src/main/res/drawable/dialog_border.xml | 8 + .../res/drawable/ic_launcher_background.xml | 74 + .../res/drawable/ic_note_page_left_normal.png | Bin 0 -> 791 bytes .../drawable/ic_note_page_right_normal.png | Bin 0 -> 762 bytes .../linearlayout_vertical_divider.xml | 5 + app/src/main/res/drawable/login_bg.xml | 8 + .../main/res/drawable/progress_horizontal.xml | 29 + app/src/main/res/drawable/ripple_water.xml | 5 + app/src/main/res/drawable/s_app_btn_bule.xml | 7 + app/src/main/res/drawable/save_bg.xml | 6 + app/src/main/res/drawable/seekbar_bg.xml | 23 + app/src/main/res/drawable/seekbar_thumb.xml | 8 + .../drawable/selector_btn_read_setting.xml | 6 + .../res/drawable/selector_category_load.xml | 16 + .../res/drawable/selector_category_unload.xml | 16 + app/src/main/res/drawable/shape_b_a_round.xml | 5 + app/src/main/res/drawable/shape_blue.xml | 5 + .../shape_btn_read_setting_checked.xml | 8 + .../shape_btn_read_setting_normal.xml | 8 + app/src/main/res/drawable/shape_corner.xml | 5 + .../main/res/drawable/shape_corner_plain.xml | 6 + app/src/main/res/drawable/shape_dialog.xml | 9 + app/src/main/res/drawable/shape_green.xml | 5 + .../main/res/drawable/shape_login_form.xml | 6 + .../main/res/drawable/shape_login_round.xml | 5 + app/src/main/res/drawable/shape_purple.xml | 5 + app/src/main/res/drawable/shape_red.xml | 5 + .../main/res/drawable/shape_school_name.xml | 5 + app/src/main/res/drawable/shape_select.xml | 4 + .../main/res/drawable/shape_switch_btn.xml | 6 + app/src/main/res/drawable/shape_w_round.xml | 5 + .../main/res/drawable/switch_ios_thumb.xml | 11 + .../res/drawable/switch_ios_track_off.xml | 6 + .../main/res/drawable/switch_ios_track_on.xml | 6 + .../drawable/switch_ios_track_selector.xml | 5 + .../main/res/layout/activity_base_weex.xml | 82 + app/src/main/res/layout/activity_camera.xml | 9 + app/src/main/res/layout/activity_home.xml | 145 + app/src/main/res/layout/activity_login.xml | 181 + app/src/main/res/layout/activity_main.xml | 75 + app/src/main/res/layout/activity_pdf_view.xml | 57 + app/src/main/res/layout/activity_read.xml | 190 + app/src/main/res/layout/activity_web.xml | 94 + app/src/main/res/layout/dialog_change.xml | 196 + app/src/main/res/layout/dialog_leave.xml | 189 + .../main/res/layout/dialog_read_setting.xml | 329 + app/src/main/res/layout/dialog_test.xml | 41 + app/src/main/res/layout/dialog_vacation.xml | 206 + app/src/main/res/layout/dialog_view_img.xml | 16 + app/src/main/res/layout/dialog_visitor.xml | 493 + app/src/main/res/layout/download_dialog.xml | 47 + app/src/main/res/layout/fragment_change.xml | 298 + .../main/res/layout/fragment_class_brand.xml | 158 + app/src/main/res/layout/fragment_home.xml | 319 + app/src/main/res/layout/fragment_my.xml | 282 + app/src/main/res/layout/fragment_visitor.xml | 326 + app/src/main/res/layout/item_category.xml | 25 + app/src/main/res/layout/item_home.xml | 26 + app/src/main/res/layout/item_read_bg.xml | 20 + .../main/res/layout/layout_banner_item.xml | 10 + .../res/layout/layout_brand_active_info.xml | 34 + .../res/layout/layout_brand_class_info.xml | 136 + .../res/layout/layout_brand_image_info.xml | 84 + .../main/res/layout/layout_brand_tea_info.xml | 35 + .../layout/layout_brand_timetable_info.xml | 34 + .../main/res/layout/layout_change_table.xml | 97 + .../res/layout/layout_class_active_item.xml | 50 + .../main/res/layout/layout_class_empty.xml | 18 + .../main/res/layout/layout_class_tea_item.xml | 28 + app/src/main/res/layout/layout_empty.xml | 22 + app/src/main/res/layout/layout_leave_step.xml | 122 + .../main/res/layout/layout_leave_table.xml | 113 + app/src/main/res/layout/layout_loading.xml | 17 + .../main/res/layout/layout_smooth_scroll.xml | 17 + .../res/layout/layout_time_table_item.xml | 29 + .../main/res/layout/layout_visitor_step.xml | 74 + .../main/res/layout/layout_visitor_table.xml | 195 + .../main/res/layout/leave_dialog_title.xml | 6 + app/src/main/res/layout/version_dialog.xml | 82 + app/src/main/res/layout/view_time.xml | 48 + app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2577 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3787 bytes .../main/res/mipmap-mdpi/change_select.png | Bin 0 -> 827 bytes .../main/res/mipmap-mdpi/change_unselect.png | Bin 0 -> 1201 bytes app/src/main/res/mipmap-mdpi/empty.png | Bin 0 -> 20637 bytes app/src/main/res/mipmap-mdpi/home_select.png | Bin 0 -> 581 bytes .../main/res/mipmap-mdpi/home_unselect.png | Bin 0 -> 836 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1816 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2205 bytes app/src/main/res/mipmap-mdpi/leave_select.png | Bin 0 -> 1270 bytes .../main/res/mipmap-mdpi/leave_unselect.png | Bin 0 -> 1579 bytes app/src/main/res/mipmap-mdpi/my_select.png | Bin 0 -> 998 bytes app/src/main/res/mipmap-mdpi/my_unselect.png | Bin 0 -> 1248 bytes .../main/res/mipmap-mdpi/visitor_select.png | Bin 0 -> 1881 bytes .../main/res/mipmap-mdpi/visitor_unselect.png | Bin 0 -> 1630 bytes app/src/main/res/mipmap-xhdpi/bg_img.png | Bin 0 -> 49468 bytes .../main/res/mipmap-xhdpi/empty_view_img.png | Bin 0 -> 23352 bytes app/src/main/res/mipmap-xhdpi/ic_account.png | Bin 0 -> 869 bytes .../main/res/mipmap-xhdpi/ic_avatar_def.png | Bin 0 -> 6020 bytes app/src/main/res/mipmap-xhdpi/ic_back_def.png | Bin 0 -> 673 bytes app/src/main/res/mipmap-xhdpi/ic_book_add.png | Bin 0 -> 640 bytes .../main/res/mipmap-xhdpi/ic_book_clear.png | Bin 0 -> 1038 bytes .../main/res/mipmap-xhdpi/ic_book_init.png | Bin 0 -> 309 bytes app/src/main/res/mipmap-xhdpi/ic_book_pen.png | Bin 0 -> 618 bytes .../res/mipmap-xhdpi/ic_book_pen_select.png | Bin 0 -> 505 bytes .../main/res/mipmap-xhdpi/ic_book_rubber.png | Bin 0 -> 610 bytes .../mipmap-xhdpi/ic_book_rubber_select.png | Bin 0 -> 514 bytes .../res/mipmap-xhdpi/ic_brightness_minus.png | Bin 0 -> 1291 bytes .../res/mipmap-xhdpi/ic_brightness_plus.png | Bin 0 -> 1597 bytes app/src/main/res/mipmap-xhdpi/ic_checked.png | Bin 0 -> 615 bytes app/src/main/res/mipmap-xhdpi/ic_clear.png | Bin 0 -> 1162 bytes app/src/main/res/mipmap-xhdpi/ic_close.png | Bin 0 -> 569 bytes .../res/mipmap-xhdpi/ic_home_classwork.png | Bin 0 -> 3313 bytes app/src/main/res/mipmap-xhdpi/ic_home_def.png | Bin 0 -> 607 bytes .../res/mipmap-xhdpi/ic_home_errorbook.png | Bin 0 -> 3857 bytes app/src/main/res/mipmap-xhdpi/ic_home_my.png | Bin 0 -> 4964 bytes .../res/mipmap-xhdpi/ic_home_notebook.png | Bin 0 -> 2855 bytes .../main/res/mipmap-xhdpi/ic_home_rack.png | Bin 0 -> 3255 bytes .../main/res/mipmap-xhdpi/ic_home_work.png | Bin 0 -> 4552 bytes .../main/res/mipmap-xhdpi/ic_home_write.png | Bin 0 -> 4624 bytes .../ic_item_category_activated.png | Bin 0 -> 616 bytes .../ic_item_category_download.png | Bin 0 -> 246 bytes .../mipmap-xhdpi/ic_item_category_normal.png | Bin 0 -> 246 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3205 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5190 bytes app/src/main/res/mipmap-xhdpi/ic_left.png | Bin 0 -> 298 bytes .../main/res/mipmap-xhdpi/ic_page_left.png | Bin 0 -> 651 bytes .../main/res/mipmap-xhdpi/ic_page_right.png | Bin 0 -> 611 bytes app/src/main/res/mipmap-xhdpi/ic_psw.png | Bin 0 -> 961 bytes .../mipmap-xhdpi/ic_read_menu_category.png | Bin 0 -> 257 bytes .../mipmap-xhdpi/ic_read_menu_download.png | Bin 0 -> 399 bytes .../res/mipmap-xhdpi/ic_read_menu_font.png | Bin 0 -> 1147 bytes .../res/mipmap-xhdpi/ic_read_menu_morning.png | Bin 0 -> 1159 bytes .../res/mipmap-xhdpi/ic_read_menu_night.png | Bin 0 -> 1326 bytes app/src/main/res/mipmap-xhdpi/ic_refresh.png | Bin 0 -> 1003 bytes app/src/main/res/mipmap-xhdpi/ic_right.png | Bin 0 -> 287 bytes app/src/main/res/mipmap-xhdpi/ic_setting.png | Bin 0 -> 1593 bytes .../main/res/mipmap-xhdpi/ic_unit_switch.png | Bin 0 -> 389 bytes app/src/main/res/mipmap-xhdpi/ic_ya.png | Bin 0 -> 15954 bytes .../main/res/mipmap-xhdpi/icon_class_stat.png | Bin 0 -> 839 bytes .../main/res/mipmap-xhdpi/icon_class_sw.png | Bin 0 -> 818 bytes .../res/mipmap-xhdpi/icon_class_userhead.png | Bin 0 -> 697 bytes app/src/main/res/mipmap-xhdpi/icon_hhxx.png | Bin 0 -> 6414 bytes .../main/res/mipmap-xhdpi/icon_save_btn.png | Bin 0 -> 615 bytes app/src/main/res/mipmap-xhdpi/img.png | Bin 0 -> 308 bytes app/src/main/res/mipmap-xhdpi/login_bg.jpg | Bin 0 -> 126995 bytes app/src/main/res/mipmap-xhdpi/search.png | Bin 0 -> 1482 bytes .../res/mipmap-xhdpi/seekbar_thumb_normal.png | Bin 0 -> 750 bytes .../mipmap-xhdpi/seekbar_thumb_selected.png | Bin 0 -> 750 bytes app/src/main/res/mipmap-xhdpi/student.png | Bin 0 -> 3377 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4887 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 7818 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5969 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 8166 bytes app/src/main/res/values/colors.xml | 110 + app/src/main/res/values/dimens.xml | 90 + app/src/main/res/values/ids.xml | 6 + app/src/main/res/values/strings.xml | 5 + app/src/main/res/values/styles.xml | 230 + app/src/main/res/values/styles_text.xml | 63 + app/src/main/res/values/styles_widget.xml | 6 + .../main/res/xml/network_security_config.xml | 4 + app/src/main/res/xml/provider_paths.xml | 12 + .../java/com/yzx/ebrand/ExampleUnitTest.kt | 17 + build.gradle | 35 + buildKey/wenote.jks | Bin 0 -> 2379 bytes buildKey/wetao_app_key | Bin 0 -> 2223 bytes gradle.properties | 32 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 234 + gradlew.bat | 89 + hs_err_pid15488.log | 390 + hs_err_pid8124.log | 496 + proguard-rules.pro | 115 + replay_pid15488.log | 22859 ++++++++++++++++ settings.gradle | 2 + versions.gradle | 84 + yzx.jks | Bin 0 -> 2231 bytes 309 files changed, 40414 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.name create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/render.experimental.xml create mode 100644 .idea/vcs.xml create mode 100644 README.MD create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/proguard-rules.pro create mode 100644 app/src/androidTest/java/com/yzx/ebrand/ExampleInstrumentedTest.kt create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/weex/components/HelloWorld.js create mode 100644 app/src/main/assets/weex/index.js create mode 100644 app/src/main/assets/weex/reader.js create mode 100644 app/src/main/java/com/yzx/ebrand/App.kt create mode 100644 app/src/main/java/com/yzx/ebrand/MainActivity.kt create mode 100644 app/src/main/java/com/yzx/ebrand/activity/CameraActivity.kt create mode 100644 app/src/main/java/com/yzx/ebrand/activity/HomeActivity.kt create mode 100644 app/src/main/java/com/yzx/ebrand/activity/LoginActivity.kt create mode 100644 app/src/main/java/com/yzx/ebrand/activity/WebActivity.kt create mode 100644 app/src/main/java/com/yzx/ebrand/activity/base/BaseActivity.kt create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/ChangeDialogStepAdapter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/ChangeListAdapter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/HomeAdapter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/HomeDialogStepAdapter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/HomeListAdapter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/VisitorDialogStepAdapter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/VisitorListAdapter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/base/BaseListAdapter.java create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/base/BaseViewHolder.java create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/base/EasyAdapter.java create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/base/GroupAdapter.java create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/base/IViewHolder.java create mode 100644 app/src/main/java/com/yzx/ebrand/adapter/base/ViewHolderImpl.java create mode 100644 app/src/main/java/com/yzx/ebrand/config/Config.kt create mode 100644 app/src/main/java/com/yzx/ebrand/config/RefreshToken.kt create mode 100644 app/src/main/java/com/yzx/ebrand/config/YzxInterface.kt create mode 100644 app/src/main/java/com/yzx/ebrand/fragment/ChangeFragment.kt create mode 100644 app/src/main/java/com/yzx/ebrand/fragment/ClassBrandFragment.kt create mode 100644 app/src/main/java/com/yzx/ebrand/fragment/HomeFragment.kt create mode 100644 app/src/main/java/com/yzx/ebrand/fragment/MyFragment.kt create mode 100644 app/src/main/java/com/yzx/ebrand/fragment/VisitorFragment.kt create mode 100644 app/src/main/java/com/yzx/ebrand/fragment/base/BaseFragment.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/BaseBean.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/Book.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/CBClassInfo.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/HomeItem.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/MessageEvent.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/Note.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/QrCode.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/ReToken.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/StuChange.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/StuLeave.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/TabEntity.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/TeacherInfo.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/UploadBean.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/User.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/Vacation.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/Version.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/ViewImage.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/Visitor.kt create mode 100644 app/src/main/java/com/yzx/ebrand/model/YzxClientInfo.kt create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/ChangePresenter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/ClassBrandPresenter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/HomePresenter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/LoginPresenter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/MainPresenter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/MyPresenter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/VisitorPresenter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/base/BasePresenter.kt create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/base/Convert.java create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/base/IView.kt create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/base/JsonCallBack.java create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/base/SimpleResponse.java create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/base/YzxListResponse.java create mode 100644 app/src/main/java/com/yzx/ebrand/presenter/base/YzxResponse.java create mode 100644 app/src/main/java/com/yzx/ebrand/receiver/BootReceiver.kt create mode 100644 app/src/main/java/com/yzx/ebrand/utils/FileUpload.kt create mode 100644 app/src/main/java/com/yzx/ebrand/utils/KotlinX.kt create mode 100644 app/src/main/java/com/yzx/ebrand/utils/Monitor.kt create mode 100644 app/src/main/java/com/yzx/ebrand/utils/YzxFileProvider.kt create mode 100644 app/src/main/java/com/yzx/ebrand/widget/BaseDialog.kt create mode 100644 app/src/main/java/com/yzx/ebrand/widget/ChangeDialog.kt create mode 100644 app/src/main/java/com/yzx/ebrand/widget/LeaveDialog.kt create mode 100644 app/src/main/java/com/yzx/ebrand/widget/TimeView.kt create mode 100644 app/src/main/java/com/yzx/ebrand/widget/ViewImageDialog.kt create mode 100644 app/src/main/java/com/yzx/ebrand/widget/VisitorDialog.kt create mode 100644 app/src/main/java/com/yzx/ebrand/widget/YzxPDFViewPager.kt create mode 100644 app/src/main/res/anim/rotate_0_to_180.xml create mode 100644 app/src/main/res/anim/rotate_180_to_360.xml create mode 100644 app/src/main/res/anim/slide_bottom_in.xml create mode 100644 app/src/main/res/anim/slide_bottom_out.xml create mode 100644 app/src/main/res/anim/slide_left_in.xml create mode 100644 app/src/main/res/anim/slide_left_out.xml create mode 100644 app/src/main/res/anim/slide_right_in.xml create mode 100644 app/src/main/res/anim/slide_right_out.xml create mode 100644 app/src/main/res/anim/slide_top_in.xml create mode 100644 app/src/main/res/anim/slide_top_out.xml create mode 100644 app/src/main/res/color/s_app_color_blue.xml create mode 100644 app/src/main/res/color/s_app_color_gray2_to_blue.xml create mode 100644 app/src/main/res/color/s_app_color_gray_to_blue.xml create mode 100644 app/src/main/res/color/s_app_color_status_bg.xml create mode 100644 app/src/main/res/color/s_app_color_status_border.xml create mode 100644 app/src/main/res/color/s_app_color_status_text.xml create mode 100644 app/src/main/res/color/selector_btn_read_setting.xml create mode 100644 app/src/main/res/color/selector_chapter.xml create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable-v24/progress_horizontal.xml create mode 100644 app/src/main/res/drawable/background0.png create mode 100644 app/src/main/res/drawable/background1.png create mode 100644 app/src/main/res/drawable/background10.png create mode 100644 app/src/main/res/drawable/background11.jpg create mode 100644 app/src/main/res/drawable/background2.png create mode 100644 app/src/main/res/drawable/background3.png create mode 100644 app/src/main/res/drawable/background4.png create mode 100644 app/src/main/res/drawable/background5.png create mode 100644 app/src/main/res/drawable/background6.png create mode 100644 app/src/main/res/drawable/background7.png create mode 100644 app/src/main/res/drawable/background8.png create mode 100644 app/src/main/res/drawable/background9.png create mode 100644 app/src/main/res/drawable/btn_blue_select.xml create mode 100644 app/src/main/res/drawable/btn_select.xml create mode 100644 app/src/main/res/drawable/custom_bg.png create mode 100644 app/src/main/res/drawable/dialog_border.xml create mode 100644 app/src/main/res/drawable/ic_launcher_background.xml create mode 100644 app/src/main/res/drawable/ic_note_page_left_normal.png create mode 100644 app/src/main/res/drawable/ic_note_page_right_normal.png create mode 100644 app/src/main/res/drawable/linearlayout_vertical_divider.xml create mode 100644 app/src/main/res/drawable/login_bg.xml create mode 100644 app/src/main/res/drawable/progress_horizontal.xml create mode 100644 app/src/main/res/drawable/ripple_water.xml create mode 100644 app/src/main/res/drawable/s_app_btn_bule.xml create mode 100644 app/src/main/res/drawable/save_bg.xml create mode 100644 app/src/main/res/drawable/seekbar_bg.xml create mode 100644 app/src/main/res/drawable/seekbar_thumb.xml create mode 100644 app/src/main/res/drawable/selector_btn_read_setting.xml create mode 100644 app/src/main/res/drawable/selector_category_load.xml create mode 100644 app/src/main/res/drawable/selector_category_unload.xml create mode 100644 app/src/main/res/drawable/shape_b_a_round.xml create mode 100644 app/src/main/res/drawable/shape_blue.xml create mode 100644 app/src/main/res/drawable/shape_btn_read_setting_checked.xml create mode 100644 app/src/main/res/drawable/shape_btn_read_setting_normal.xml create mode 100644 app/src/main/res/drawable/shape_corner.xml create mode 100644 app/src/main/res/drawable/shape_corner_plain.xml create mode 100644 app/src/main/res/drawable/shape_dialog.xml create mode 100644 app/src/main/res/drawable/shape_green.xml create mode 100644 app/src/main/res/drawable/shape_login_form.xml create mode 100644 app/src/main/res/drawable/shape_login_round.xml create mode 100644 app/src/main/res/drawable/shape_purple.xml create mode 100644 app/src/main/res/drawable/shape_red.xml create mode 100644 app/src/main/res/drawable/shape_school_name.xml create mode 100644 app/src/main/res/drawable/shape_select.xml create mode 100644 app/src/main/res/drawable/shape_switch_btn.xml create mode 100644 app/src/main/res/drawable/shape_w_round.xml create mode 100644 app/src/main/res/drawable/switch_ios_thumb.xml create mode 100644 app/src/main/res/drawable/switch_ios_track_off.xml create mode 100644 app/src/main/res/drawable/switch_ios_track_on.xml create mode 100644 app/src/main/res/drawable/switch_ios_track_selector.xml create mode 100644 app/src/main/res/layout/activity_base_weex.xml create mode 100644 app/src/main/res/layout/activity_camera.xml create mode 100644 app/src/main/res/layout/activity_home.xml create mode 100644 app/src/main/res/layout/activity_login.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_pdf_view.xml create mode 100644 app/src/main/res/layout/activity_read.xml create mode 100644 app/src/main/res/layout/activity_web.xml create mode 100644 app/src/main/res/layout/dialog_change.xml create mode 100644 app/src/main/res/layout/dialog_leave.xml create mode 100644 app/src/main/res/layout/dialog_read_setting.xml create mode 100644 app/src/main/res/layout/dialog_test.xml create mode 100644 app/src/main/res/layout/dialog_vacation.xml create mode 100644 app/src/main/res/layout/dialog_view_img.xml create mode 100644 app/src/main/res/layout/dialog_visitor.xml create mode 100644 app/src/main/res/layout/download_dialog.xml create mode 100644 app/src/main/res/layout/fragment_change.xml create mode 100644 app/src/main/res/layout/fragment_class_brand.xml create mode 100644 app/src/main/res/layout/fragment_home.xml create mode 100644 app/src/main/res/layout/fragment_my.xml create mode 100644 app/src/main/res/layout/fragment_visitor.xml create mode 100644 app/src/main/res/layout/item_category.xml create mode 100644 app/src/main/res/layout/item_home.xml create mode 100644 app/src/main/res/layout/item_read_bg.xml create mode 100644 app/src/main/res/layout/layout_banner_item.xml create mode 100644 app/src/main/res/layout/layout_brand_active_info.xml create mode 100644 app/src/main/res/layout/layout_brand_class_info.xml create mode 100644 app/src/main/res/layout/layout_brand_image_info.xml create mode 100644 app/src/main/res/layout/layout_brand_tea_info.xml create mode 100644 app/src/main/res/layout/layout_brand_timetable_info.xml create mode 100644 app/src/main/res/layout/layout_change_table.xml create mode 100644 app/src/main/res/layout/layout_class_active_item.xml create mode 100644 app/src/main/res/layout/layout_class_empty.xml create mode 100644 app/src/main/res/layout/layout_class_tea_item.xml create mode 100644 app/src/main/res/layout/layout_empty.xml create mode 100644 app/src/main/res/layout/layout_leave_step.xml create mode 100644 app/src/main/res/layout/layout_leave_table.xml create mode 100644 app/src/main/res/layout/layout_loading.xml create mode 100644 app/src/main/res/layout/layout_smooth_scroll.xml create mode 100644 app/src/main/res/layout/layout_time_table_item.xml create mode 100644 app/src/main/res/layout/layout_visitor_step.xml create mode 100644 app/src/main/res/layout/layout_visitor_table.xml create mode 100644 app/src/main/res/layout/leave_dialog_title.xml create mode 100644 app/src/main/res/layout/version_dialog.xml create mode 100644 app/src/main/res/layout/view_time.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/change_select.png create mode 100644 app/src/main/res/mipmap-mdpi/change_unselect.png create mode 100644 app/src/main/res/mipmap-mdpi/empty.png create mode 100644 app/src/main/res/mipmap-mdpi/home_select.png create mode 100644 app/src/main/res/mipmap-mdpi/home_unselect.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/leave_select.png create mode 100644 app/src/main/res/mipmap-mdpi/leave_unselect.png create mode 100644 app/src/main/res/mipmap-mdpi/my_select.png create mode 100644 app/src/main/res/mipmap-mdpi/my_unselect.png create mode 100644 app/src/main/res/mipmap-mdpi/visitor_select.png create mode 100644 app/src/main/res/mipmap-mdpi/visitor_unselect.png create mode 100644 app/src/main/res/mipmap-xhdpi/bg_img.png create mode 100644 app/src/main/res/mipmap-xhdpi/empty_view_img.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_account.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_avatar_def.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_back_def.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_book_add.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_book_clear.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_book_init.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_book_pen.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_book_pen_select.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_book_rubber.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_book_rubber_select.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_brightness_minus.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_brightness_plus.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_checked.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_clear.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_close.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_classwork.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_def.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_errorbook.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_my.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_notebook.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_rack.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_work.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_write.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_item_category_activated.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_item_category_download.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_item_category_normal.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_left.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_page_left.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_page_right.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_psw.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_read_menu_category.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_read_menu_download.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_read_menu_font.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_read_menu_morning.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_read_menu_night.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_refresh.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_right.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_setting.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_unit_switch.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_ya.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_class_stat.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_class_sw.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_class_userhead.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_hhxx.png create mode 100644 app/src/main/res/mipmap-xhdpi/icon_save_btn.png create mode 100644 app/src/main/res/mipmap-xhdpi/img.png create mode 100644 app/src/main/res/mipmap-xhdpi/login_bg.jpg create mode 100644 app/src/main/res/mipmap-xhdpi/search.png create mode 100644 app/src/main/res/mipmap-xhdpi/seekbar_thumb_normal.png create mode 100644 app/src/main/res/mipmap-xhdpi/seekbar_thumb_selected.png create mode 100644 app/src/main/res/mipmap-xhdpi/student.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/dimens.xml create mode 100644 app/src/main/res/values/ids.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/values/styles_text.xml create mode 100644 app/src/main/res/values/styles_widget.xml create mode 100644 app/src/main/res/xml/network_security_config.xml create mode 100644 app/src/main/res/xml/provider_paths.xml create mode 100644 app/src/test/java/com/yzx/ebrand/ExampleUnitTest.kt create mode 100644 build.gradle create mode 100644 buildKey/wenote.jks create mode 100644 buildKey/wetao_app_key create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 100644 hs_err_pid15488.log create mode 100644 hs_err_pid8124.log create mode 100644 proguard-rules.pro create mode 100644 replay_pid15488.log create mode 100644 settings.gradle create mode 100644 versions.gradle create mode 100644 yzx.jks diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a1bdd84 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +*.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 +/app/debug +/app/release \ No newline at end of file diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..b24dfeb --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +WebScreen \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..88ea3aa --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,122 @@ + + + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+ + +
+
\ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..cbbe561 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..2c5b9b7 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..9398632 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..7e340a7 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a40d241 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,88 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/render.experimental.xml b/.idea/render.experimental.xml new file mode 100644 index 0000000..8ec256a --- /dev/null +++ b/.idea/render.experimental.xml @@ -0,0 +1,6 @@ + + + + + \ 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/README.MD b/README.MD new file mode 100644 index 0000000..5fe60c7 --- /dev/null +++ b/README.MD @@ -0,0 +1,3 @@ +### 电子书项目 + +#### 开发工具 AndroidStudio \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..2d027b4 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,207 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +//apply from: 'https://raw.githubusercontent.com/apache/incubator-weex/release/0.28/android/sdk/buildSrc/download_jsc.gradle' + +//apply plugin: 'org.greenrobot.greendao' + +androidExtensions { + experimental = true +} +android { + compileSdkVersion 30 + buildToolsVersion "30.0.3" + defaultConfig { + applicationId "com.yzx.ebrand" +// minSdkVersion 26 + minSdkVersion 21 + targetSdkVersion 25 + versionCode 20109 + versionName "2.1.9" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + ndk { + abiFilters "armeabi-v7a", "arm64-v8a", "x86" + } + } + signingConfigs { + yzx { + keyAlias ALIAS_NAME + keyPassword ALIAS_PWD + storeFile file(KEY_PATH) + storePassword KEY_PWD + v2SigningEnabled false + } + release { +// storeFile file("../buildKey/wenote.jks") +// keyAlias 'wetao' +// keyPassword 'lhb@123' +// storePassword 'lhb@123' + keyAlias ALIAS_NAME + keyPassword ALIAS_PWD + storeFile file(KEY_PATH) + storePassword KEY_PWD + v2SigningEnabled false + } + debug { +// storeFile file("../buildKey/wenote.jks") +// keyAlias 'wetao' +// keyPassword 'lhb@123' +// storePassword 'lhb@123' + keyAlias ALIAS_NAME + keyPassword ALIAS_PWD + storeFile file(KEY_PATH) + storePassword KEY_PWD + v2SigningEnabled false + } + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' +// zipAlignEnabled true +// debuggable false + signingConfig signingConfigs.release + // 移除无用的resource文件 +// shrinkResources false + buildConfigField "String", "BASE_URL", '"https://oa.qbjjyyun.net/api"' + buildConfigField "String", "M_URL", '"https://m.qbjjyyun.net"' + buildConfigField "String", "OA_URL", '"https://oa.qbjjyyun.net"' + buildConfigField "String", "APP_NAME", '"电子班牌"' + buildConfigField "String", "MP_APPID", '"wx358f1c471740cb95"' + buildConfigField "String", "WS_URL", '"wss://oa.qbjjyyun.net/ws2api/"' +// buildConfigField "String", "BASE_URL", '"http://192.168.69.99:9009"' +// buildConfigField "String", "M_URL", '"http://192.168.69.99:8098"' +// buildConfigField "String", "APP_NAME", '"家校互通(测试)"' + } + + debug { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + debuggable true + signingConfig signingConfigs.release + // 移除无用的resource文件 + shrinkResources false +// buildConfigField "String", "BASE_URL", '"http://192.168.69.99:9009"' +// buildConfigField "String", "M_URL", '"http://192.168.69.112:8098"' + buildConfigField "String", "BASE_URL", '"https://oa.qbjjyyun.net/api"' + buildConfigField "String", "OA_URL", '"https://oa.live.educlouddata.com"' +// buildConfigField "String", "OA_URL", '"http://192.168.69.114:3000"' + buildConfigField "String", "M_URL", '"https://m.live.educlouddata.com/"' +// buildConfigField "String", "BASE_URL", '"https://oa.live.educlouddata.com/api"' + buildConfigField "String", "APP_NAME", '"一体化平台(开发)"' + buildConfigField "String", "MP_APPID", '"wxbb397ddae71bb14c"' +// buildConfigField "String", "WS_URL", '"ws://192.168.69.114:9801/"' + buildConfigField "String", "WS_URL", '"wss://oa.live.educlouddata.com/ws2api/"' + } + + yzx_test { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + debuggable true + signingConfig signingConfigs.release + // 移除无用的resource文件 +// shrinkResources false + buildConfigField "String", "BASE_URL", '"http://192.168.69.99:9009"' + buildConfigField "String", "M_URL", '"http://192.168.69.99:8098"' + buildConfigField "String", "APP_NAME", '"家校互通(测试)"' + buildConfigField "String", "MP_APPID", '"wxbb397ddae71bb14c"' + buildConfigField "String", "WS_URL", '"wss://oa.live.educlouddata.com/ws2api/"' + } + + applicationVariants.all { variant -> + variant.outputs.all { output -> + def fileName + fileName = "Yzx_${variant.versionName}.apk" + output.outputFileName = fileName + } + } + + } + + lintOptions { + checkReleaseBuilds false + // Or, if you prefer, you can continue to check for errors in release builds, + // but continue the build even when errors are found: + abortOnError false + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} + + +//greendao{ +// schemaVersion 4 +// daoPackage 'com.yzx.webebook.model.gen' +// targetGenDir 'src/main/java' +//} + +repositories { + maven { + url 'https://dl.bintray.com/qichuan/maven/' + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "org.jetbrains.anko:anko:$anko_version" + // 基础依赖包,必须要依赖 + implementation 'com.gyf.immersionbar:immersionbar:3.0.0' + // fragment快速实现(可选) + implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' + // kotlin扩展(可选) + implementation 'com.gyf.immersionbar:immersionbar-ktx:3.0.0' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'com.google.android.material:material:1.1.0' + implementation 'androidx.core:core-ktx:1.2.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + implementation 'com.github.bumptech.glide:glide:4.11.0' + implementation 'com.lzy.net:okgo:3.0.4' + implementation 'com.blankj:utilcodex:1.30.5' + implementation 'com.google.code.gson:gson:2.8.6' + annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' + implementation 'com.github.AlexLiuSheng:CheckVersionLib:2.4.1_androidx' + // 友盟统计SDK + implementation 'com.umeng.umsdk:common:9.3.6' // 必选 + implementation 'com.umeng.umsdk:asms:1.2.1' // 必选 + implementation 'com.github.thomhurst:RoundImageView:1.0.2' + implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4' + +// implementation 'org.apache.weex:sdk:0.28.0' +// implementation 'com.alibaba:fastjson:1.1.46.android' + + + //ORM Database +// implementation deps.greendao.runtime +// testImplementation deps.testing.junit + + //RxJava +// implementation deps.reactivex.rxandroid +// implementation deps.reactivex.rxjava2 + + implementation 'es.voghdev.pdfviewpager:library:1.1.2' + + implementation 'io.github.h07000223:flycoTabLayout:3.0.0' + implementation 'com.qmuiteam:qmui:2.0.0-alpha10' + + api 'com.tencent.tbs:tbssdk:44181' + implementation 'com.github.HuanTanSheng:EasyPhotos:3.1.5' + + implementation("org.greenrobot:eventbus:3.3.1") + + implementation 'com.github.chrisbanes:PhotoView:2.0.0' + + implementation "org.java-websocket:Java-WebSocket:1.5.1" + + implementation 'com.github.wanggaowan:PhotoPreview:2.5.5' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..0546140 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,104 @@ +# 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 + +-flattenpackagehierarchy +-allowaccessmodification +-keepattributes Exceptions,InnerClasses,Signature,SourceFile,LineNumberTable +-dontskipnonpubliclibraryclassmembers +-ignorewarnings +#kotlin +-keep class kotlin.Metadata { *; } +-dontwarn kotlin.** +-keepclassmembers class **$WhenMappings { + ; +} +-keepclassmembers class kotlin.Metadata { + public ; +} +-assumenosideeffects class kotlin.jvm.internal.Intrinsics { + static void checkParameterIsNotNull(java.lang.Object, java.lang.String); +} + +-keepclasseswithmembernames class * { + native ; +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} +-keepclassmembers class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} +-keep class **.R$* {*;} +-keepclassmembers enum * { *;} + + + + +#Gson +-keepclassmembers public class com.google.gson.** +-keepclassmembers public class com.google.gson.** {public private protected *;} +-keepclassmembers public class com.project.mocha_patient.login.SignResponseData { private *; } +-keepclassmembers class sun.misc.Unsafe { *; } +-keep @interface com.google.gson.annotations.SerializedName +-keepclassmembers class * { + @com.google.gson.annotations.SerializedName ; +} + +#bean +-keep class com.yzx.ebrand.model.** { *; } +-keep class com.yzx.ebrand.model.Note { *; } +-keep class com.yzx.ebrand.model.UploadBean { *; } +-keep class com.yzx.ebrand.model.UploadContent { *; } + +-keep class **$Properties {*;} + +#Glide +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +# for DexGuard only +#-keepresourcexmlelements manifest/application/meta-data@value=GlideModule +-dontwarn com.bumptech.glide.** + + +# ProGuard configurations for Bugtags +-keepattributes LineNumberTable,SourceFile +-dontwarn com.bugtags.library.** +-dontwarn io.bugtags.** +-dontwarn org.apache.http.** +-dontwarn android.net.http.AndroidHttpClient + +# x5 +-dontwarn dalvik.** +-dontwarn com.tencent.smtt.** + +-keep class com.tencent.smtt.** { + *; +} + +-keep class com.tencent.tbs.** { + *; +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/yzx/ebrand/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/yzx/ebrand/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..615b6eb --- /dev/null +++ b/app/src/androidTest/java/com/yzx/ebrand/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.yzx.ebrand + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.yzx.webebook", appContext.packageName) + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..f2cbd4e --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/weex/components/HelloWorld.js b/app/src/main/assets/weex/components/HelloWorld.js new file mode 100644 index 0000000..c71637f --- /dev/null +++ b/app/src/main/assets/weex/components/HelloWorld.js @@ -0,0 +1,132 @@ +// { "framework": "Vue"} + +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 2); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +var __vue_exports__, __vue_options__ +var __vue_styles__ = [] + +/* template */ +var __vue_template__ = __webpack_require__(1) +__vue_options__ = __vue_exports__ = __vue_exports__ || {} +if ( + typeof __vue_exports__.default === "object" || + typeof __vue_exports__.default === "function" +) { +if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")} +__vue_options__ = __vue_exports__ = __vue_exports__.default +} +if (typeof __vue_options__ === "function") { + __vue_options__ = __vue_options__.options +} +__vue_options__.__file = "D:\\demo\\androidweex\\src\\components\\HelloWorld.vue" +__vue_options__.render = __vue_template__.render +__vue_options__.staticRenderFns = __vue_template__.staticRenderFns +__vue_options__.style = __vue_options__.style || {} +__vue_styles__.forEach(function (module) { + for (var name in module) { + __vue_options__.style[name] = module[name] + } +}) +if (typeof __register_static_styles__ === "function") { + __register_static_styles__(__vue_options__._scopeId, __vue_styles__) +} + +module.exports = __vue_exports__ + + +/***/ }), +/* 1 */ +/***/ (function(module, exports) { + +module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h; + return _c('text', { + staticClass: ["message"] + }, [_vm._v("Now, let's use Vue.js to build your Weex app.")]) +},staticRenderFns: []} +module.exports.render._withStripped = true + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _HelloWorld = __webpack_require__(0); + +var _HelloWorld2 = _interopRequireDefault(_HelloWorld); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +_HelloWorld2.default.el = '#root'; +new Vue(_HelloWorld2.default); + +/***/ }) +/******/ ]); \ No newline at end of file diff --git a/app/src/main/assets/weex/index.js b/app/src/main/assets/weex/index.js new file mode 100644 index 0000000..abf2c2c --- /dev/null +++ b/app/src/main/assets/weex/index.js @@ -0,0 +1,322 @@ +// { "framework": "Vue"} + +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 3); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +var __vue_exports__, __vue_options__ +var __vue_styles__ = [] + +/* template */ +var __vue_template__ = __webpack_require__(1) +__vue_options__ = __vue_exports__ = __vue_exports__ || {} +if ( + typeof __vue_exports__.default === "object" || + typeof __vue_exports__.default === "function" +) { +if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")} +__vue_options__ = __vue_exports__ = __vue_exports__.default +} +if (typeof __vue_options__ === "function") { + __vue_options__ = __vue_options__.options +} +__vue_options__.__file = "D:\\demo\\androidweex\\src\\components\\HelloWorld.vue" +__vue_options__.render = __vue_template__.render +__vue_options__.staticRenderFns = __vue_template__.staticRenderFns +__vue_options__.style = __vue_options__.style || {} +__vue_styles__.forEach(function (module) { + for (var name in module) { + __vue_options__.style[name] = module[name] + } +}) +if (typeof __register_static_styles__ === "function") { + __register_static_styles__(__vue_options__._scopeId, __vue_styles__) +} + +module.exports = __vue_exports__ + + +/***/ }), +/* 1 */ +/***/ (function(module, exports) { + +module.exports={render:function (){var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h; + return _c('text', { + staticClass: ["message"] + }, [_vm._v("Now, let's use Vue.js to build your Weex app.")]) +},staticRenderFns: []} +module.exports.render._withStripped = true + +/***/ }), +/* 2 */, +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _index = __webpack_require__(4); + +var _index2 = _interopRequireDefault(_index); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +_index2.default.el = '#root'; +new Vue(_index2.default); + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +var __vue_exports__, __vue_options__ +var __vue_styles__ = [] + +/* styles */ +__vue_styles__.push(__webpack_require__(5) +) + +/* script */ +__vue_exports__ = __webpack_require__(6) + +/* template */ +var __vue_template__ = __webpack_require__(8) +__vue_options__ = __vue_exports__ = __vue_exports__ || {} +if ( + typeof __vue_exports__.default === "object" || + typeof __vue_exports__.default === "function" +) { +if (Object.keys(__vue_exports__).some(function (key) { return key !== "default" && key !== "__esModule" })) {console.error("named exports are not supported in *.vue files.")} +__vue_options__ = __vue_exports__ = __vue_exports__.default +} +if (typeof __vue_options__ === "function") { + __vue_options__ = __vue_options__.options +} +__vue_options__.__file = "D:\\demo\\androidweex\\src\\index.vue" +__vue_options__.render = __vue_template__.render +__vue_options__.staticRenderFns = __vue_template__.staticRenderFns +__vue_options__._scopeId = "data-v-1a4d8e3c" +__vue_options__.style = __vue_options__.style || {} +__vue_styles__.forEach(function (module) { + for (var name in module) { + __vue_options__.style[name] = module[name] + } +}) +if (typeof __register_static_styles__ === "function") { + __register_static_styles__(__vue_options__._scopeId, __vue_styles__) +} + +module.exports = __vue_exports__ + + +/***/ }), +/* 5 */ +/***/ (function(module, exports) { + +module.exports = { + "wrapper": { + "justifyContent": "center", + "alignItems": "center" + }, + "logo": { + "width": "424", + "height": "200" + }, + "greeting": { + "textAlign": "center", + "fontSize": "50", + "color": "#FF0000", + "position": "absolute", + "left": "10", + "top": "10", + "paddingTop": "50", + "paddingRight": "50", + "paddingBottom": "50", + "paddingLeft": "50" + }, + "message": { + "marginTop": "30", + "marginRight": "30", + "marginBottom": "30", + "marginLeft": "30", + "fontSize": "32", + "color": "#727272" + } +} + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _HelloWorld = __webpack_require__(0); + +var _HelloWorld2 = _interopRequireDefault(_HelloWorld); + +var _dayjs = __webpack_require__(7); + +var _dayjs2 = _interopRequireDefault(_dayjs); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// + +exports.default = { + name: 'App', + components: { + HelloWorld: _HelloWorld2.default + }, + data: function data() { + return { + logo: 'https://gw.alicdn.com/tfs/TB1yopEdgoQMeJjy1XaXXcSsFXa-640-302.png', + params: "", + day: (0, _dayjs2.default)().format("YYYY_MM_DD") + }; + }, + mounted: function mounted() { + this.params = weex.config.params; + + localStorage.key = "nihao"; + + console.log("dsdishids", localStorage.key); + var json = { + a: 1111, + b: 2222 + }; + alert(JSON.stringify(json)); + }, + + methods: { + onJumpClick: function onJumpClick() { + var json = { + url: "weex/reader.js", + params: "你好rader,我是首页" + }; + try { + + // weex.requireModule("navevent").toast("显示消息") + weex.requireModule("navevent").navigateTo("weex/reader.js", "你好rader,我是首页"); + this.params = "点击了图片"; + } catch (error) { + this.params = JSON.stringify(error); + } + // weex.requireModule("activity").navigateTo(json) + } + } +}; + +/***/ }), +/* 7 */ +/***/ (function(module, exports, __webpack_require__) { + +!function(t,e){ true?module.exports=e():"function"==typeof define&&define.amd?define(e):t.dayjs=e()}(this,function(){"use strict";var t="millisecond",e="second",n="minute",r="hour",i="day",s="week",u="month",a="quarter",o="year",f="date",h=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,c=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,d={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_")},$=function(t,e,n){var r=String(t);return!r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},l={s:$,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return(e<=0?"+":"-")+$(r,2,"0")+":"+$(i,2,"0")},m:function t(e,n){if(e.date()() + map[TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER] = true + map[TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE] = true + QbSdk.initTbsSettings(map) + //腾讯x5内核 + QbSdk.initX5Environment(this, object : QbSdk.PreInitCallback { + override fun onCoreInitFinished() { + } + + /** + * 预初始化结束 + * 由于X5内核体积较大,需要依赖网络动态下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替 + * @param isX5 是否使用X5内核 + */ + override fun onViewInitFinished(isX5: Boolean) { + } + }) + QbSdk.setDownloadWithoutWifi(true) + + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/MainActivity.kt b/app/src/main/java/com/yzx/ebrand/MainActivity.kt new file mode 100644 index 0000000..90d9813 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/MainActivity.kt @@ -0,0 +1,638 @@ +package com.yzx.ebrand + +import android.annotation.SuppressLint +import android.app.Dialog +import android.content.Context +import android.content.Intent +import android.os.Handler +import android.os.Looper +import android.util.Log +import android.view.KeyEvent +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.widget.ContentLoadingProgressBar +import androidx.fragment.app.Fragment +import androidx.viewpager2.adapter.FragmentStateAdapter +import androidx.viewpager2.widget.ViewPager2 +import com.allenliu.versionchecklib.v2.AllenVersionChecker +import com.allenliu.versionchecklib.v2.builder.UIData +import com.allenliu.versionchecklib.v2.callback.CustomDownloadingDialogListener +import com.blankj.utilcode.constant.PermissionConstants +import com.blankj.utilcode.util.* +import com.flyco.tablayout.listener.CustomTabEntity +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.lzy.okgo.OkGo +import com.lzy.okgo.callback.StringCallback +import com.lzy.okgo.model.Response +import com.qmuiteam.qmui.widget.dialog.QMUIDialog +import com.yzx.ebrand.activity.LoginActivity +import com.yzx.ebrand.activity.base.BaseActivity +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.config.RefreshToken +import com.yzx.ebrand.fragment.ChangeFragment +import com.yzx.ebrand.fragment.ClassBrandFragment +import com.yzx.ebrand.fragment.MyFragment +import com.yzx.ebrand.fragment.VisitorFragment +import com.yzx.ebrand.model.* +import com.yzx.ebrand.presenter.MainPresenter +import com.yzx.ebrand.presenter.MainView +import com.yzx.ebrand.utils.hideNavigationBar +import com.yzx.ebrand.widget.* +import kotlinx.android.synthetic.main.activity_main.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.java_websocket.client.WebSocketClient +import org.java_websocket.drafts.Draft_6455 +import org.java_websocket.handshake.ServerHandshake +import org.jetbrains.anko.find +import org.jetbrains.anko.toast +import java.net.URI +import java.util.* + + +/** + * Yun.Lei + * 2020年5月6日14:49:10 + */ +class MainActivity : BaseActivity(), NetworkUtils.OnNetworkStatusChangedListener, + MainView { + + + override val inflateId: Int + get() = R.layout.activity_main + var netLoadingDialog: QMUIDialog? = null + var netErrorDialog: QMUIDialog? = null + private val netLoadingRun = Runnable { + netLoadingDialog?.apply { + dismiss() + } + showNetworkError() + } + private var idsLoading = false + private var isAutoShowLeave = false + private var isAutoShowChange = false + + private val mHandler = Handler(Looper.getMainLooper()) + private val runnable = object : Runnable { + override fun run() { + val isAutoShowLeave = SPUtils.getInstance().getBoolean("auto_show_leave", false) + val isAutoShowChange = SPUtils.getInstance().getBoolean("auto_show_change", false) + if (isAutoShowLeave || isAutoShowChange) { + if (!idsLoading) { + idsLoading = true + LogUtils.d("获取详情开始--ids", TimeUtils.getNowMills()) + mPresenter?.getLeaveShowIds() + } + mHandler.postDelayed(this, 2000) + } else { + mHandler.removeCallbacks(this) + } + + } + } + + private val mTimeHandler = Handler(Looper.getMainLooper()) + private val timeRunnable = object : Runnable { + override fun run() { + EventBus.getDefault().post(TimeShow().getNowObj()) + mTimeHandler.postDelayed(this, 1000) + } + } + + private val dialogList = mutableListOf() + + private var client: WebSocketClient? = null + + override fun initView() { + if (NetworkUtils.isConnected()) { + if (!User.isLogin() && User.getUser().token.isEmpty()) { +// WebActivity.active(this, "${Config.OA_URL}/login") + LoginActivity.active(this) + finish() + } + if (!User.isLogin()) { + RefreshToken.refresh(object : RefreshToken.RefreshCallback { + override fun onSuccess() { + checkVersion() + checkAuto() + } + + override fun onError() { + + } + }) + } else { + checkVersion() + checkAuto() + RefreshToken.refresh(object : RefreshToken.RefreshCallback { + override fun onSuccess() { + } + + override fun onError() { + + } + }) + } + } else { + showNetworkLoading() //显示网络检查中 + } + val tabData = arrayListOf() +// tabData.add(TabEntity("学生请假", R.mipmap.leave_select, R.mipmap.leave_unselect)) +// tabData.add(TabEntity("学籍异动", R.mipmap.change_select, R.mipmap.change_unselect)) +// tabData.add(TabEntity("访客管理", R.mipmap.visitor_select, R.mipmap.visitor_unselect)) +// tabData.add(TabEntity("我的", R.mipmap.my_select, R.mipmap.my_unselect)) +// tabLayout.setTabData(tabData) +// tabLayout.visibility = View.GONE + + viewPager2.adapter = HomePagerAdapter(this) + viewPager2.offscreenPageLimit = 1 + viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + super.onPageSelected(position) +// tabLayout.currentTab = position + } + }) +// tabLayout.setOnTabSelectListener(object : OnTabSelectListener { +// override fun onTabSelect(position: Int) { +//// viewPager2.currentItem = position +// viewPager2.setCurrentItem(position, false) +// KeyboardUtils.hideSoftInput(viewPager2) +// } +// +// override fun onTabReselect(position: Int) { +// } +// +// }) + viewPager2.setCurrentItem(0, false) + + mTimeHandler.post(timeRunnable) + } + + private fun checkAuto() { + isAutoShowLeave = SPUtils.getInstance().getBoolean("auto_show_leave", false) + isAutoShowChange = SPUtils.getInstance().getBoolean("auto_show_change", false) +// if (isAutoShowLeave || isAutoShowChange) { +// mHandler.removeCallbacks(runnable) +// mHandler.postDelayed(runnable, 2000) +// } else { +// mHandler.removeCallbacks(runnable) +// } + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: AutoSwitchChange) { + checkAuto() + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: UserLoginEvent) { + if (client?.isOpen == true) { + client?.close() + } + client = null + } + + override fun onDestroy() { + super.onDestroy() + mTimeHandler.removeCallbacks(timeRunnable) + if (client?.isOpen == true) { + client?.close() + } + } + + //接收请假消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(detail: StuLeave) { + removeOld(detail.id, 0) + val dialog = LeaveDialog(this) + dialog.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + dialog.setData(detail) + dialog.setTag(R.id.tag_dialog_name, detail.id) + dialog.setTag(R.id.tag_dialog_type, 0) + dialog.onCloseClick = { + dialogLayout.removeView(it) + dialogList.remove(it) + } + dialogLayout.addView(dialog) + dialogList.add(dialog) + } + + //接收异动消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(detail: StuChange) { + removeOld(detail.id, 1) + val dialog = ChangeDialog(this) + dialog.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + dialog.setData(detail) + dialog.setTag(R.id.tag_dialog_name, detail.id) + dialog.setTag(R.id.tag_dialog_type, 1) + dialog.onCloseClick = { + dialogLayout.removeView(it) + dialogList.remove(it) + } + dialogLayout.addView(dialog, 0) //请假权限更高,异动插入到最底层 + dialogList.add(dialog) + } + + //接收访客消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(detail: Visitor) { + removeOld(detail.id, 2) + val dialog = VisitorDialog(this) + dialog.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + dialog.setData(detail) + dialog.setTag(R.id.tag_dialog_name, detail.id) + dialog.setTag(R.id.tag_dialog_type, 2) + dialog.onCloseClick = { + dialogLayout.removeView(it) + dialogList.remove(it) + } + dialogLayout.addView(dialog, 0) //请假权限更高,访客插入到最底层 + dialogList.add(dialog) + } + + //接收查看图片消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(detail: ViewImage) { + removeOld(detail.id, 3) + val dialog = ViewImageDialog(this) + dialog.layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + dialog.setData(detail) + dialog.setTag(R.id.tag_dialog_name, detail.id) + dialog.setTag(R.id.tag_dialog_type, 3) + dialog.onCloseClick = { + dialogLayout.removeView(it) + dialogList.remove(it) + } + dialogLayout.addView(dialog) + dialogList.add(dialog) + } + + private fun removeOld(id: Int, type: Int) { + val view = dialogList.find { + val tagId: Int = it.getTag(R.id.tag_dialog_name) as Int + val tagType: Int = it.getTag(R.id.tag_dialog_type) as Int + return@find id == tagId && type == tagType + } + view?.apply { + dialogList.remove(this) + dialogLayout.removeView(this) + } + } + + override fun initData() { + NetworkUtils.registerNetworkStatusChangedListener(this) + PermissionUtils.permissionGroup(PermissionConstants.STORAGE) + .rationale { activity, shouldRequest -> + + }.callback(object : PermissionUtils.FullCallback { + override fun onGranted(granted: MutableList) { + LogUtils.d("权限通过", granted) + } + + override fun onDenied( + deniedForever: MutableList, + denied: MutableList + ) { + LogUtils.d("权限拒绝", denied) + } + + }).theme { activity -> ScreenUtils.setFullScreen(activity) } + .request() + + } + + override fun onResume() { + super.onResume() + if (NetworkUtils.isConnected() && User.isLogin() && User.getUser().user_id > 0 && client?.isOpen !== true) { +// initWs() + } + } + + private fun initWs() { + client = + object : WebSocketClient(URI.create(Config.WS_URL), Draft_6455(), null, 10 * 1000) { + override fun onOpen(handshakedata: ServerHandshake?) { + LogUtils.d("WebSocketClient-onOpen", handshakedata) + val user = User.getUser() + val clientInfo = YzxClientInfo() + clientInfo.type = 70 + clientInfo.user_id = user.user_id.toString() + clientInfo.unit_id = user.school_id.toString() + clientInfo.token = user.token + + client?.send(Gson().toJson(clientInfo)) + + } + + override fun onClose(code: Int, reason: String?, remote: Boolean) { + LogUtils.d("WebSocketClient-onClose", code, reason, remote) + + } + + override fun onMessage(message: String?) { + LogUtils.d("WebSocketClient-onMessage", message) + if (message?.startsWith("ECHO:", true) == false) { + viewPager2.post { + wsMessage(message) + } + } + } + + override fun onError(ex: Exception?) { + LogUtils.d("WebSocketClient-onError", ex) + + } + + } + try { + client?.connectBlocking() + wsHeart() + } catch (e: InterruptedException) { + e.printStackTrace() + LogUtils.d("WebSocketClient-catch", e) + } + } + + private fun wsMessage(msg: String) { + val resultType = object : TypeToken() {}.type + val gson = Gson() + val res = gson.fromJson(msg, resultType) + if (res.data.student_id > 0) { + if (isAutoShowLeave || isAutoShowChange) { + mPresenter?.getLeaveShowIds("${res.data.student_id}") + } + } + } + + private fun wsHeart() { + viewPager2.postDelayed({ + if (client?.isOpen == true) { + client?.apply { + send(Gson().toJson(YzxHeart().getYzxHeader())) + } + } else { + if (client != null) { + client?.reconnectBlocking() + } else { + initWs() + } + } + wsHeart() + }, 10 * 1000) + } + + private fun showNetworkError() { + if (!NetworkUtils.isConnected()) { //无网提示 + val builder = QMUIDialog.MessageDialogBuilder(this) + + builder.setMessage("你还没有连接网络,请先连接网络!") + .setTitle("温馨提示") + .addAction( + "去设置" + ) { dialog, index -> + NetworkUtils.openWirelessSettings() + } + .setCancelable(false) + .setCanceledOnTouchOutside(false) + netErrorDialog = builder.show() + netErrorDialog?.hideNavigationBar() + } + } + + private fun showNetworkLoading() { + val builder = QMUIDialog.MessageDialogBuilder(this) + + builder.setMessage("网络检查中,请稍后...") + .setTitle("温馨提示") + .setCancelable(false) + .setCanceledOnTouchOutside(false) + netLoadingDialog = builder.show() + netLoadingDialog?.hideNavigationBar() + + viewPager2.postDelayed(netLoadingRun, 5000) + } + + override fun initPresenter(): MainPresenter = MainPresenter(this) + + @SuppressLint("SetTextI18n") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + } + + override fun onBackPressed() { +// super.onBackPressed() + } + + override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) { + return true + } + return super.onKeyUp(keyCode, event) + } + + override fun onDisconnected() { + showNetworkError() + } + + override fun onConnected(networkType: NetworkUtils.NetworkType?) { + netLoadingDialog?.apply { + if (isShowing) { + dismiss() + } + } + netErrorDialog?.apply { + if (isShowing) { + dismiss() + } + } + viewPager2.removeCallbacks(netLoadingRun) + if (!User.isLogin()) { +// WebActivity.active(this, "${Config.OA_URL}/login?logout=1") + LoginActivity.active(this) + finish() + } + checkVersion() + checkAuto() + initWs() + } + + private fun checkVersion(userCheck: Boolean = false): Unit { + val BASE_URL = Config.BASE_URL + OkGo.post("$BASE_URL/parent/common/getInkBottleMaxVersion") + .tag(this) + .params("app_id", Config.APP_ID) + .execute(object : StringCallback() { + + override fun onSuccess(response: Response) { + val json = response.body() + Log.d("checkVersion", "onSuccess: ${json}") + val resultType = object : TypeToken>() {}.type + val gson = Gson() + val res = gson.fromJson>(json, resultType) + if (res.code == 0) { + val appVersion = AppUtils.getAppVersionName() + val appVersionCode = AppUtils.getAppVersionCode() + val versionCode = res?.data?.version_code ?: 0 + val curr = Date().time + val lastTipTime = SPUtils.getInstance() + .getLong("last_tip_time${res.data.version_code}", 0) + if (versionCode > appVersionCode) { //有新版本 + when { + res.data.type == 1 -> { //强制升级 + updateApp(res.data) + } + curr - lastTipTime > 24 * 60 * 60 * 1000 -> { //非强制一天以内提示一次 + updateApp(res.data) + } + userCheck -> { // + updateApp(res.data) + } + } + + } else { + if (userCheck) { + toast("已经是最新版本了!") + } + } + } + } + + }) + + + } + + + private fun updateApp(version: Version) { + AllenVersionChecker + .getInstance() + .downloadOnly( + UIData.create() + .setTitle("检测到新版本") + .setContent(version.explain) + .setDownloadUrl(version.app_src) + ) + .setCustomVersionDialogListener { context, versionBundle -> + val dialog = BaseDialog(context, R.style.BaseDialog, R.layout.version_dialog) + val title = dialog.find(R.id.tv_title) + title.text = "检测到新版本" + val content = dialog.find(R.id.tv_msg) + content.text = version.explain + val cancelBtn = dialog.find(R.id.cancel_btn) + if (version.type == 1) { + cancelBtn.visibility = View.GONE + } + dialog.hideNavigationBar() + return@setCustomVersionDialogListener dialog + } + .setOnCancelListener { + SPUtils.getInstance().put("last_tip_time${version.version_code}", Date().time) + } + .setCustomDownloadingDialogListener(object : CustomDownloadingDialogListener { + @SuppressLint("SetTextI18n") + override fun updateUI(dialog: Dialog?, progress: Int, versionBundle: UIData?) { + val tvProgress: TextView = dialog!!.findViewById(R.id.tv_progress) + val progressBar: ContentLoadingProgressBar = dialog.findViewById(R.id.pb) + progressBar.progress = progress + tvProgress.text = "$progress%" + + Log.d("checkVersion", "onSuccess: ${progress}") + } + + override fun getCustomDownloadingDialog( + context: Context?, + progress: Int, + versionBundle: UIData? + ): Dialog { + val downDialog = BaseDialog( + context!!, + R.style.BaseDialog, + R.layout.download_dialog + ) + downDialog.hideNavigationBar() + return downDialog + } + + }) + .executeMission(this) + } + + override fun onLeaveIDsSuccess(list: MutableList) { + idsLoading = false + LogUtils.d("获取详情结束--ids", TimeUtils.getNowMills()) + val listLeave = list.filter { it.type == 0 }.toMutableList() + val listChange = list.filter { it.type == 1 }.toMutableList() + var type = 0 + if (listLeave.isNotEmpty() && isAutoShowLeave) { + viewPager2.currentItem = 0 + type = 0 + } else if (listChange.isNotEmpty() && isAutoShowChange) { + viewPager2.currentItem = 1 + type = 1 + } + if (list.isNotEmpty() && (isAutoShowLeave || isAutoShowChange)) { + viewPager2.postDelayed({ + EventBus.getDefault().post(MessageEventAuto(list, type)) + }, 500) + } + } + + override fun onLeaveIDsError() { + LogUtils.d("获取详情结束--ids", TimeUtils.getNowMills()) + idsLoading = false + } + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + override fun onStop() { + mHandler.removeCallbacks(runnable) + super.onStop() + EventBus.getDefault().unregister(this) + } +} + +class HomePagerAdapter(act: AppCompatActivity) : FragmentStateAdapter(act) { + override fun getItemCount(): Int = 1 + + override fun createFragment(position: Int): Fragment { + when (position) { + 0 -> { + return ClassBrandFragment.getNewInstance() + } + 1 -> { + return ChangeFragment.getNewInstance() + } + 2 -> { + return VisitorFragment.getNewInstance() + } + 3 -> { + return MyFragment.getNewInstance() + } + } + return ClassBrandFragment.getNewInstance() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/activity/CameraActivity.kt b/app/src/main/java/com/yzx/ebrand/activity/CameraActivity.kt new file mode 100644 index 0000000..cfdd5f2 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/activity/CameraActivity.kt @@ -0,0 +1,24 @@ +package com.yzx.ebrand.activity + +import android.os.Bundle +import com.yzx.ebrand.R +import com.yzx.ebrand.activity.base.BaseActivity +import com.yzx.ebrand.presenter.base.BasePresenter + +class CameraActivity : BaseActivity>() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_camera) + } + + override val inflateId: Int + get() = R.layout.activity_camera + + override fun initView() { + } + + override fun initData() { + } + + override fun initPresenter(): BasePresenter<*>? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/activity/HomeActivity.kt b/app/src/main/java/com/yzx/ebrand/activity/HomeActivity.kt new file mode 100644 index 0000000..b371c50 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/activity/HomeActivity.kt @@ -0,0 +1,304 @@ +package com.yzx.ebrand.activity + +import android.Manifest +import android.annotation.SuppressLint +import android.app.AlertDialog +import android.app.Dialog +import android.content.Context +import android.content.DialogInterface +import android.util.Log +import android.view.View +import android.widget.TextView +import androidx.core.widget.ContentLoadingProgressBar +import androidx.recyclerview.widget.GridLayoutManager +import com.allenliu.versionchecklib.v2.AllenVersionChecker +import com.allenliu.versionchecklib.v2.builder.UIData +import com.allenliu.versionchecklib.v2.callback.CustomDownloadingDialogListener +import com.blankj.utilcode.constant.PermissionConstants +import com.blankj.utilcode.util.* +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.lzy.okgo.OkGo +import com.lzy.okgo.callback.StringCallback +import com.lzy.okgo.model.Response +import com.yzx.ebrand.MainActivity +import com.yzx.ebrand.R +import com.yzx.ebrand.activity.base.BaseActivity +import com.yzx.ebrand.adapter.HomeAdapter +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.model.BaseBean +import com.yzx.ebrand.model.HomeItem +import com.yzx.ebrand.model.User +import com.yzx.ebrand.model.Version +import com.yzx.ebrand.widget.BaseDialog +import com.yzx.ebrand.presenter.base.BasePresenter +import kotlinx.android.synthetic.main.activity_home.* +import org.jetbrains.anko.find +import org.jetbrains.anko.startActivity +import org.jetbrains.anko.toast +import java.util.* + +class HomeActivity : BaseActivity>(), NetworkUtils.OnNetworkStatusChangedListener { + + private val mAdapter: HomeAdapter by lazy { + val list = mutableListOf() + list.add(HomeItem("家庭作业", R.mipmap.ic_home_work, "/homework/ebook_list")) + list.add(HomeItem("笔记本", R.mipmap.ic_home_notebook, "/notebook/list")) + list.add(HomeItem("背诵默写", R.mipmap.ic_home_write, "/write/index")) + list.add(HomeItem("阅读", R.mipmap.ic_home_rack,"/read/index")) + list.add(HomeItem("错题本", R.mipmap.ic_home_errorbook, "/errorbook/ebookindex")) + list.add(HomeItem("随堂检测", R.mipmap.ic_home_classwork)) + list.add(HomeItem("我的", R.mipmap.ic_home_my, "/mine/ebook")) + HomeAdapter(list) + } + + private var count = 0 + private val run = Runnable { + count = 0 + } + + private var netDialog:AlertDialog ?= null + + override val inflateId: Int + get() = R.layout.activity_home + + + + override fun initView() { + + NetworkUtils.registerNetworkStatusChangedListener(this) + + + val layoutManager = GridLayoutManager(this, 3) + homeGridView.layoutManager = layoutManager + homeGridView.adapter = mAdapter + + switchBtn.setOnClickListener { + val url = "${Config.M_URL}/choiceunit.html?from=ehome" + WebActivity.active(this, url) + } + + loginBtn.setOnClickListener { + val url = "${Config.M_URL}/login.html?from=ehome" + WebActivity.active(this, url) + } + + testBtn.setOnClickListener { + count++ + testBtn.removeCallbacks(run) + testBtn.postDelayed(run, 1000) + if (count >= 5) { + startActivity() + } + } + } + + override fun initData() { + mAdapter.setOnItemClickListener { adapter, view, position -> + if (User.getUser().user_id == 0) { + val url = "${Config.M_URL}/login.html?from=ehome" + WebActivity.active(this, url) + } else { + val list = mAdapter.data + val item = list[position] + if (StringUtils.isTrimEmpty(item.url)) { + toast("功能设计中,敬请期待") + } else { + val url = Config.M_URL + item.url + WebActivity.active(this, url) + } + } + } + + + //请求权限 +// ActivityCompat.requestPermissions( +// this, +// PERMISSIONS, +// PERMISSIONS_REQUEST_STORAGE +// ) + + PermissionUtils.permissionGroup(PermissionConstants.STORAGE) + .rationale { activity, shouldRequest -> + + }.callback(object :PermissionUtils.FullCallback{ + override fun onGranted(granted: MutableList) { + LogUtils.d("权限通过",granted) + } + + override fun onDenied( + deniedForever: MutableList, + denied: MutableList + ) { + LogUtils.d("权限拒绝",denied) + } + + }).theme { activity -> ScreenUtils.setFullScreen(activity) } + .request() + + + } + + private val PERMISSIONS_REQUEST_STORAGE = 1 + + val PERMISSIONS = arrayOf( + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + + override fun initPresenter(): BasePresenter<*>? { + return null + } + + @SuppressLint("SetTextI18n") + override fun onResume() { + super.onResume() + val user = User.getUser() + if (user.user_id != 0) { + userNameTv.text = "你好,${user.user_name}" +// userInfoTv.text = "${user.school_name} | ${user.grade_name}${user.class_name}" + userInfoTv.visibility = View.VISIBLE + loginBtn.visibility = View.GONE + switchBtn.visibility = if (User.getUnitCount() > 1) { + View.VISIBLE + } else { + View.GONE + } + } else { + userNameTv.text = "未登录" + userInfoTv.text = "" + userInfoTv.visibility = View.GONE + loginBtn.visibility = View.VISIBLE + switchBtn.visibility = View.GONE + } + titleTv.text = Config.APP_NAME + if (NetworkUtils.isConnected()) { + checkVersion(false) + }else{ + checkNetwork() + } + } + + private fun checkNetwork() { + if(netDialog==null){ + val builder = AlertDialog.Builder(this) + builder.setTitle("温馨提示") + builder.setMessage("你还没有连接网络,请先连接网络!") + builder.setPositiveButton("去设置") { _, _ -> + NetworkUtils.openWirelessSettings() + } + builder.setCancelable(false) + netDialog = builder.create() + netDialog?.setCanceledOnTouchOutside(false) + netDialog?.getButton(DialogInterface.BUTTON_NEGATIVE)?.visibility = View.GONE + } + netDialog?.show() + } + + private fun checkVersion(userCheck: Boolean = false): Unit { + val BASE_URL = Config.BASE_URL + OkGo.post("$BASE_URL/parent/common/getInkBottleMaxVersion") + .tag(this) + .execute(object : StringCallback() { + + override fun onSuccess(response: Response) { + val json = response.body() + Log.d("checkVersion", "onSuccess: ${json}") + val resultType = object : TypeToken>() {}.type + val gson = Gson() + val res = gson.fromJson>(json, resultType) + if (res.code == 0) { + val appVersion = AppUtils.getAppVersionName() + val appVersionCode = AppUtils.getAppVersionCode() + val versionCode = res?.data?.version_code ?: 0 + val curr = Date().time + val lastTipTime = SPUtils.getInstance() + .getLong("last_tip_time${res.data.version_code}", 0) + if (versionCode > appVersionCode) { //有新版本 + when { + res.data.type == 1 -> { //强制升级 + updateApp(res.data) + } + curr - lastTipTime > 24 * 60 * 60 * 1000 -> { //非强制一天以内提示一次 + updateApp(res.data) + } + userCheck -> { // + updateApp(res.data) + } + } + + } else { + if (userCheck) { + toast("已经是最新版本了!") + } + } + } + } + + }) + + + } + + + private fun updateApp(version: Version) { + AllenVersionChecker + .getInstance() + .downloadOnly( + UIData.create() + .setTitle("检测到新版本") + .setContent(version.explain) + .setDownloadUrl(version.app_src) + ) + .setCustomVersionDialogListener { context, versionBundle -> + val dialog = BaseDialog(context, R.style.BaseDialog, R.layout.version_dialog) + val title = dialog.find(R.id.tv_title) + title.text = "检测到新版本" + val content = dialog.find(R.id.tv_msg) + content.text = version.explain + dialog.window?.setDimAmount(0.5f) + val cancelBtn = dialog.find(R.id.cancel_btn) + if (version.type == 1) { + cancelBtn.visibility = View.GONE + } + + return@setCustomVersionDialogListener dialog + } + .setOnCancelListener { + SPUtils.getInstance().put("last_tip_time${version.version_code}", Date().time) + } + .setCustomDownloadingDialogListener(object : CustomDownloadingDialogListener { + @SuppressLint("SetTextI18n") + override fun updateUI(dialog: Dialog?, progress: Int, versionBundle: UIData?) { + val tvProgress: TextView = dialog!!.findViewById(R.id.tv_progress) + val progressBar: ContentLoadingProgressBar = dialog.findViewById(R.id.pb) + progressBar.progress = progress + tvProgress.text = "$progress%" + + Log.d("checkVersion", "onSuccess: ${progress}") + } + + override fun getCustomDownloadingDialog( + context: Context?, + progress: Int, + versionBundle: UIData? + ): Dialog { + return BaseDialog( + context!!, + R.style.BaseDialog, + R.layout.download_dialog + ) + } + + }) + .executeMission(this) + } + + override fun onConnected(networkType: NetworkUtils.NetworkType?) { + netDialog?.dismiss() + } + + override fun onDisconnected() { + checkNetwork() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/activity/LoginActivity.kt b/app/src/main/java/com/yzx/ebrand/activity/LoginActivity.kt new file mode 100644 index 0000000..e961650 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/activity/LoginActivity.kt @@ -0,0 +1,247 @@ +package com.yzx.ebrand.activity + +import android.app.Activity +import android.view.View +import com.blankj.utilcode.util.KeyboardUtils +import com.blankj.utilcode.util.LogUtils +import com.blankj.utilcode.util.SPUtils +import com.flyco.tablayout.listener.CustomTabEntity +import com.flyco.tablayout.listener.OnTabSelectListener +import com.qmuiteam.qmui.widget.dialog.QMUIDialog +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog.Builder.ICON_TYPE_FAIL +import com.yzx.ebrand.MainActivity +import com.yzx.ebrand.R +import com.yzx.ebrand.activity.base.BaseActivity +import com.yzx.ebrand.model.BaseUser +import com.yzx.ebrand.model.TabEntity +import com.yzx.ebrand.model.User +import com.yzx.ebrand.presenter.LoginPresenter +import com.yzx.ebrand.presenter.LoginView +import com.yzx.ebrand.utils.hideNavigationBar +import com.yzx.ebrand.utils.setSrc +import kotlinx.android.synthetic.main.activity_login.accountEdit +import kotlinx.android.synthetic.main.activity_login.accountLayout +import kotlinx.android.synthetic.main.activity_login.loginBtn +import kotlinx.android.synthetic.main.activity_login.pswCheckbox +import kotlinx.android.synthetic.main.activity_login.pswEdit +import kotlinx.android.synthetic.main.activity_login.qrCodeImg +import kotlinx.android.synthetic.main.activity_login.qrLayout +import kotlinx.android.synthetic.main.activity_login.tabLayout +import org.jetbrains.anko.startActivity + +class LoginActivity : BaseActivity(), LoginView { + + companion object { + fun active(act: Activity) { + act.startActivity() + } + } + + private var mTicket = "" + + override val inflateId: Int + get() = R.layout.activity_login + + override fun initView() { + val tabData = arrayListOf() + tabData.add(TabEntity("账号密码登录", 0, 0)) + tabData.add(TabEntity("微信扫码登录", 0, 0)) + tabLayout.setTabData(tabData) + tabLayout.setOnTabSelectListener(object : OnTabSelectListener { + override fun onTabSelect(position: Int) { + if (position == 0) { + qrLayout.visibility = View.GONE + accountLayout.visibility = View.VISIBLE + SPUtils.getInstance().put("last_login_tab_index",0) + } else { + qrLayout.visibility = View.VISIBLE + accountLayout.visibility = View.GONE + SPUtils.getInstance().put("last_login_tab_index",1) + KeyboardUtils.hideSoftInput(this@LoginActivity) + } + } + + override fun onTabReselect(position: Int) { + + } + }) + val lastLoginTabIndex = SPUtils.getInstance().getInt("last_login_tab_index",0) + if(lastLoginTabIndex == 1){ + qrLayout.visibility = View.VISIBLE + accountLayout.visibility = View.GONE + tabLayout.currentTab = 1 + } + loginBtn.setOnClickListener { + this.doLogin() + } + val isSavePsw = SPUtils.getInstance().getBoolean("is_save_psw", false) + if (isSavePsw) { + pswCheckbox.isChecked = true + val phone = SPUtils.getInstance().getString("login_save_phone", "") + val psw = SPUtils.getInstance().getString("login_save_psw", "") + accountEdit.setText(phone) + pswEdit.setText(psw) + } else { + pswCheckbox.isChecked = false + } + } + + private fun doLogin() { + val phone = accountEdit.text.toString() + val psw = pswEdit.text.toString() + if (phone.isBlank()) { + showDialogToast("请输入账号", icon = QMUITipDialog.Builder.ICON_TYPE_FAIL) + return + } + if (psw.isBlank()) { + showDialogToast("请输入密码", icon = QMUITipDialog.Builder.ICON_TYPE_FAIL) + return + } + showLoading("登录中...") + if(pswCheckbox.isChecked){ + SPUtils.getInstance().put("is_save_psw",true) + SPUtils.getInstance().put("login_save_phone",phone) + SPUtils.getInstance().put("login_save_psw",psw) + }else{ + SPUtils.getInstance().put("is_save_psw",false) + SPUtils.getInstance().remove("login_save_phone") + SPUtils.getInstance().remove("login_save_psw") + } + mPresenter?.login(phone, psw) + } + + override fun initData() { + mPresenter?.getWXQrCode() + } + + override fun initPresenter(): LoginPresenter = LoginPresenter(this) + + override fun onLoginSuccess(user: BaseUser, list: MutableList) { + val teaList = list.filter { + return@filter it.type == 0 + } + when { + teaList.isEmpty() -> { + + if(user.type == 0){ + mPresenter?.switchUser(user.token, user.user_id, user.school_id) + }else{ + hideLoading() + this.showDialogToast("无登录权限", icon = ICON_TYPE_FAIL) + } + } + + teaList.size == 1 -> { //多个角色 + val item = teaList[0] + mPresenter?.switchUser(user.token, item.user_id, item.unit_id) + } + + else -> { + mPresenter?.getUserRoleList(user.token) + } + } + } + + override fun onLoginError(msg: String) { + hideLoading() + showDialogToast(msg, icon = ICON_TYPE_FAIL) + } + + override fun onUserInfoSuccess(user: User) { + hideLoading() + startActivity() + finish() + } + + override fun onWxQrCodeSuccess(imgUrl: String, ticket: String) { + qrCodeImg.setSrc(imgUrl) + mTicket = ticket + mPresenter?.loginQuery(ticket) + } + + override fun onDestroy() { + qrCodeImg?.apply { + removeCallbacks(null) + } + super.onDestroy() + } + + private var mBindDialog: QMUIDialog? = null + private var mOverTimeDialog: QMUIDialog? = null + + override fun onLoginQuerySuccess(user: BaseUser, code: Int) { + when (code) { + 0 -> { + if (user.direct_login == 1) { + mPresenter?.getUserLoginInfo(user.token) + } else { + mPresenter?.getUserRoleInfoByPhone(user.phone, user.tmp_token) + } + } + + 451 -> { + if (mBindDialog == null) { + mBindDialog = QMUIDialog.MessageDialogBuilder(this) + .setTitle("温馨提示") + .setMessage("您还未绑定微信公众,请绑定后再试!") + .addAction("知道了") { dialog, index -> + dialog.dismiss() + } + .create() + mBindDialog?.show() + mBindDialog?.hideNavigationBar() + } else if (!mBindDialog!!.isShowing) { + mBindDialog?.show() + } + qrCodeImg.postDelayed({ + mPresenter?.loginQuery(mTicket) + }, 1000) + } + + 452 -> { + qrCodeImg.postDelayed({ + mPresenter?.loginQuery(mTicket) + }, 1000) + } + + else -> { + if (mOverTimeDialog == null) { + mOverTimeDialog = QMUIDialog.MessageDialogBuilder(this) + .setTitle("温馨提示") + .setMessage("二维码已使用,请重新扫码!") + .addAction("知道了") { dialog, index -> + dialog.dismiss() + } + .create() + mOverTimeDialog!!.show() + mOverTimeDialog!!.hideNavigationBar() + } else if (!mOverTimeDialog!!.isShowing) { + mOverTimeDialog?.show() + } + mPresenter?.getWXQrCode() + } + } + } + + override fun onUserListSuccess(list: MutableList, token: String) { + LogUtils.d("onUserListSuccess", list) + hideLoading() + val builder = QMUIDialog.MenuDialogBuilder(this) + list.forEach { + builder.addItem( + it.unit_name + ) { dialog, which -> + LogUtils.d("itemClick", which) + val item = list[which] + showLoading("登录中...") + if(item.school_id>0){ + mPresenter?.switchUnit(item.user_id, item.unit_id,token) + }else{ + mPresenter?.switchUser(token, item.user_id, item.unit_id) + } + } + } + builder.show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/activity/WebActivity.kt b/app/src/main/java/com/yzx/ebrand/activity/WebActivity.kt new file mode 100644 index 0000000..9ccb6cc --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/activity/WebActivity.kt @@ -0,0 +1,502 @@ +package com.yzx.ebrand.activity + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.AlertDialog +import android.app.Dialog +import android.content.Context +import android.content.Intent +import android.os.Build +import android.text.TextUtils +import android.util.Log +import android.view.View +import android.view.ViewGroup +import android.webkit.JavascriptInterface +import android.widget.LinearLayout +import android.widget.TextView +import androidx.annotation.RequiresApi +import androidx.core.widget.ContentLoadingProgressBar +import com.allenliu.versionchecklib.v2.AllenVersionChecker +import com.allenliu.versionchecklib.v2.builder.UIData +import com.allenliu.versionchecklib.v2.callback.CustomDownloadingDialogListener +import com.blankj.utilcode.util.AppUtils +import com.blankj.utilcode.util.LogUtils +import com.blankj.utilcode.util.NetworkUtils +import com.blankj.utilcode.util.SPUtils +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.lzy.okgo.OkGo +import com.lzy.okgo.callback.StringCallback +import com.lzy.okgo.model.Response +import com.qmuiteam.qmui.widget.dialog.QMUIDialog +import com.tencent.smtt.export.external.interfaces.* +import com.tencent.smtt.sdk.WebChromeClient +import com.tencent.smtt.sdk.WebSettings +import com.tencent.smtt.sdk.WebView +import com.tencent.smtt.sdk.WebViewClient +import com.yzx.ebrand.MainActivity +import com.yzx.ebrand.R +import com.yzx.ebrand.activity.base.BaseActivity +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.model.BaseBean +import com.yzx.ebrand.model.User +import com.yzx.ebrand.model.UserLoginEvent +import com.yzx.ebrand.model.Version +import com.yzx.ebrand.presenter.base.BasePresenter +import com.yzx.ebrand.utils.hideNavigationBar +import com.yzx.ebrand.widget.BaseDialog +import kotlinx.android.synthetic.main.activity_web.* +import org.greenrobot.eventbus.EventBus +import org.jetbrains.anko.ctx +import org.jetbrains.anko.find +import org.jetbrains.anko.startActivity +import org.jetbrains.anko.toast +import java.util.* + +/** + * 类名:WebActivity + * 作者:Yun.Lei + * 功能: + * 创建日期:2020年5月6日14:42:16 + * 修改人: + * 修改时间: + * 修改备注: + */ +class WebActivity : BaseActivity>(), NetworkUtils.OnNetworkStatusChangedListener { + + + companion object { + fun active(act: Activity, link: String) { + act.startActivity("link" to link) + } + } + + private val webView: WebView by lazy { WebView(this) } + private var url: String = "" + private var count = 0 + private val run = Runnable { + count = 0 + } + var netErrorDialog: QMUIDialog? = null + + override val inflateId: Int + get() = R.layout.activity_web + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + url = intent?.getStringExtra("link") ?: "https://m.qbjjyyun.net/" + this.initData() + } + + fun checkVersion(userCheck: Boolean = false): Unit { + val BASE_URL = Config.BASE_URL + OkGo.post("$BASE_URL/parent/common/getInkBottleMaxVersion") + .tag(this) + .execute(object : StringCallback() { + + override fun onSuccess(response: Response) { + val json = response.body() + Log.d("checkVersion", "onSuccess: ${json}") + val resultType = object : TypeToken>() {}.type + val gson = Gson() + val res = gson.fromJson>(json, resultType) + if (res.code == 0) { + val appVersion = AppUtils.getAppVersionName() + val appVersionCode = AppUtils.getAppVersionCode() + val versionCode = res?.data?.version_code ?: 0 + val curr = Date().time + val lastTipTime = SPUtils.getInstance() + .getLong("last_tip_time${res.data.version_code}", 0) + if (versionCode > appVersionCode) { //有新版本 + when { + res.data.type == 1 -> { //强制升级 + updateApp(res.data) + } + curr - lastTipTime > 24 * 60 * 60 * 1000 -> { //非强制一天以内提示一次 + updateApp(res.data) + } + userCheck -> { // + updateApp(res.data) + } + } + + } else { + if (userCheck) { + toast("已经是最新版本了!") + } + } + } + } + + }) + + + } + + private fun updateApp(version: Version) { + AllenVersionChecker + .getInstance() + .downloadOnly( + UIData.create() + .setTitle("检测到新版本") + .setContent(version.explain) + .setDownloadUrl(version.app_src) + ) + .setCustomVersionDialogListener { context, versionBundle -> + val dialog = BaseDialog(context, R.style.BaseDialog, R.layout.version_dialog) + val title = dialog.find(R.id.tv_title) + title.text = "检测到新版本" + val content = dialog.find(R.id.tv_msg) + content.text = version.explain + dialog.window?.setDimAmount(0.5f) + val cancelBtn = dialog.find(R.id.cancel_btn) + if (version.type == 1) { + cancelBtn.visibility = View.GONE + } + + return@setCustomVersionDialogListener dialog + } + .setOnCancelListener { + SPUtils.getInstance().put("last_tip_time${version.version_code}", Date().time) + } + .setCustomDownloadingDialogListener(object : CustomDownloadingDialogListener { + @SuppressLint("SetTextI18n") + override fun updateUI(dialog: Dialog?, progress: Int, versionBundle: UIData?) { + val tvProgress: TextView = dialog!!.findViewById(R.id.tv_progress) + val progressBar: ContentLoadingProgressBar = dialog.findViewById(R.id.pb) + progressBar.progress = progress + tvProgress.text = "$progress%" + + Log.d("checkVersion", "onSuccess: ${progress}") + } + + override fun getCustomDownloadingDialog( + context: Context?, + progress: Int, + versionBundle: UIData? + ): Dialog { + return BaseDialog( + context!!, + R.style.BaseDialog, + R.layout.download_dialog + ) + } + + }) + .executeMission(this) + } + + @SuppressLint("SetJavaScriptEnabled") + override fun initView() { + url = intent?.getStringExtra("link") ?: "https://m.qbjjyyun.net/" +// titleTv.setOnClickListener { +// count++ +// titleTv.removeCallbacks(run) +// titleTv.postDelayed(run, 1000) +// if (count >= 5) { +// startActivity() +// } +// } + btnBack.setOnClickListener { onBackPressed() } + btnClose.setOnClickListener { +// webView.loadUrl(url) + finish() + } + btnRefresh.setOnClickListener { + webView.reload() + } + btnSetting.setOnClickListener { + NetworkUtils.openWirelessSettings() + } + webView.layoutParams = LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + webLayout.addView(webView) + webView.addJavascriptInterface(YzxJavascriptInterface(this), "YZX_SCREEN") + val userAgent = webView.settings.userAgentString + webView.settings.apply { + allowFileAccess = true + javaScriptEnabled = true + loadWithOverviewMode = true + useWideViewPort = true + defaultTextEncodingName = "gb2312" + setAppCacheEnabled(true) + mediaPlaybackRequiresUserGesture = false + javaScriptCanOpenWindowsAutomatically = true + cacheMode = WebSettings.LOAD_DEFAULT + databaseEnabled = true + setRenderPriority(WebSettings.RenderPriority.HIGH) + blockNetworkImage = false + domStorageEnabled = true + setAppCacheMaxSize(1024 * 1024 * 8) + setAppCachePath(ctx.cacheDir.absolutePath) + mixedContentMode = android.webkit.WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE + userAgentString = "$userAgent app/escreen" + } + webView.webViewClient = object : WebViewClient() { + @RequiresApi(Build.VERSION_CODES.LOLLIPOP) + override fun shouldOverrideUrlLoading( + view: WebView?, + request: WebResourceRequest? + ): Boolean { + view?.loadUrl(request?.url.toString()) + return super.shouldOverrideUrlLoading(view, request) + } + + // 即使加载失败后,webview执行完onReceivedError()方法也会执行这个方法 + override fun onPageFinished(view: WebView, url: String) { + super.onPageFinished(view, url) + webView.settings.blockNetworkImage = false + if (!TextUtils.isEmpty(view.title)) { +// titleTv.text = view.title//webView获取到网页title + } + } + + override fun onReceivedSslError( + view: WebView, + handler: SslErrorHandler, + error: SslError + ) { + handler.proceed() + } + + override fun onReceivedError( + p0: WebView?, + p1: WebResourceRequest?, + p2: WebResourceError? + ) { + super.onReceivedError(p0, p1, p2) + LogUtils.e("weberror-onReceivedError") +// showNetworkError("网络环境异常或服务器数据加载异常,请检查!", force = true) + } + + override fun onReceivedError(p0: WebView?, p1: Int, p2: String?, p3: String?) { + super.onReceivedError(p0, p1, p2, p3) + LogUtils.e("weberror-onReceivedError2") + } + } + webView.webChromeClient = object : WebChromeClient() { + override fun onProgressChanged(view: WebView?, newProgress: Int) { + super.onProgressChanged(view, newProgress) + progressbar.progress = newProgress + if (newProgress >= 100) { + view?.post { + progressbar.visibility = View.GONE + if (view.canGoBack()) { +// btnBack.visibility = View.VISIBLE +// btnClose.visibility = View.VISIBLE + } else { +// btnBack.visibility = View.GONE +// btnClose.visibility = View.GONE + } + } + } else { + if (progressbar.visibility == View.GONE) { + view?.post { progressbar.visibility = View.VISIBLE } + } + } + } + + override fun onJsAlert( + view: WebView?, + url: String?, + message: String?, + result: JsResult? + ): Boolean { + val b = AlertDialog.Builder(this@WebActivity) + b.setTitle(message) + b.setPositiveButton("确定") { _, _ -> + result?.confirm() + } + return true + } + } + WebView.setWebContentsDebuggingEnabled(true) //将 WebViews 配置为可调试状态 + webView.setLayerType(View.LAYER_TYPE_HARDWARE, null) + } + + override fun initData() { + webView.loadUrl(url) + showNetworkError() + + } + + override fun initPresenter(): BasePresenter<*>? { + return null + } + + override fun onResume() { + super.onResume() + webView.onResume() +// checkVersion() + } + + override fun onPause() { + super.onPause() + webView.onPause() + } + + override fun onBackPressed() { + if (webView.canGoBack()) { + webView.goBack() + } else { + super.onBackPressed() + } + } + + override fun onDestroy() { + super.onDestroy() + webView.apply { +// webViewClient = null + webChromeClient = null + (parent as ViewGroup).removeView(webView) + removeAllViews() + destroy() + } + AllenVersionChecker.getInstance().cancelAllMission() + } + + /** + * 调用js方法 + */ + private fun evaluateJavascript(funName: String, data: String) { + webView.post { + webView.evaluateJavascript("javascript:$funName('$data')") { + Log.d("javascriptCallBack:", it) + //toast(it) + } + } + } + + @SuppressLint("SetTextI18n") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + } + + override fun onDisconnected() { + + } + + override fun onConnected(networkType: NetworkUtils.NetworkType?) { + + } + + private fun showNetworkError(msg: String = "你还没有连接网络,请先连接网络!", force: Boolean = false) { + if (!NetworkUtils.isConnected() || force) { //无网提示 + val builder = QMUIDialog.MessageDialogBuilder(this) + + builder.setMessage(msg) + .setTitle("温馨提示") + + .setCancelable(false) + .setCanceledOnTouchOutside(false) + if (force) { + builder.addAction("关闭") { dialog, index -> + finish() + } + } + builder.addAction( + "去设置" + ) { dialog, index -> + NetworkUtils.openWirelessSettings() + } + netErrorDialog = builder.show() + netErrorDialog?.hideNavigationBar() + } + } + +} + + +class YzxJavascriptInterface(var ctx: Activity) { + + /** + * 获取电子书的clientId + */ + @JavascriptInterface + fun getClientId(): Int = 602 + + /** + * 提示 + */ + @JavascriptInterface + fun toast(msg: String) { + ctx.toast("android:$msg") + } + + /** + * 检查版本升级 + */ + @JavascriptInterface + fun mCheckVersion() { + Log.d("mCheckVersion", "mCheckVersion: -------------------->") + val act = ctx as WebActivity + act.checkVersion(true) + } + + /** + * 保存用户信息 + */ + @JavascriptInterface + fun saveUserInfo(json: String) { + val resultType = object : TypeToken() {}.type + val gson = Gson() + val user = gson.fromJson(json, resultType) + EventBus.getDefault().post(UserLoginEvent()) + user?.save() + } + + @JavascriptInterface + fun saveUnitCount(count: Int) { + User.saveUnitCount(count) + } + + @JavascriptInterface + fun toHome() { + ctx.startActivity() + ctx.finish() + } + + @JavascriptInterface + fun logout() { + val sp = SPUtils.getInstance() + sp.remove("user_name") + sp.remove("user_id") + sp.remove("type") + sp.remove("token") + sp.remove("school_id") + sp.remove("school_name") + sp.remove("phone") + sp.remove("grade_name") + sp.remove("grade_id") + sp.remove("class_name") + sp.remove("class_id") + sp.remove("ticket") + sp.remove("login_start") + sp.remove("unit_count") + ctx.startActivity() + } + +} + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/yzx/ebrand/activity/base/BaseActivity.kt b/app/src/main/java/com/yzx/ebrand/activity/base/BaseActivity.kt new file mode 100644 index 0000000..7d3f7ce --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/activity/base/BaseActivity.kt @@ -0,0 +1,121 @@ +package com.yzx.ebrand.activity.base + +import android.os.Bundle +import android.view.View +import android.view.WindowManager +import androidx.appcompat.app.AppCompatActivity +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog +import com.yzx.ebrand.presenter.base.BasePresenter +import com.yzx.ebrand.utils.hideNavigationBar + +/** + * 类名:BaseActivity + * 作者:Yun.Lei + * 功能: + * 创建日期:2020年5月6日14:27:04 + * 修改人: + * 修改时间: + * 修改备注: + */ +abstract class BaseActivity> : AppCompatActivity() { + + /** + * 当前页面需要加载的layoutId,等价setContentView + */ + abstract val inflateId: Int + + private var mLoadingDialog: QMUITipDialog? = null + + /** + * 初始化视图操作在这里执行,执行时机为onCreate之后 + */ + abstract fun initView(): Unit + + /** + * 数据初始化在这里执行,执行时机为initView之后 + */ + abstract fun initData(): Unit + + //kotlin 懒加载,在第一次使用Presenter时初始化,这种设计是针对一个View只针对一个Presenter。 + //多个Presenter的情况此处不应该使用泛型 + protected val mPresenter: P? by lazy { initPresenter() } + + abstract fun initPresenter(): P? + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + hideBottomUIMenu() + window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN + actionBar?.hide() + setContentView(inflateId) + initView() + initData() + setStatusBar() + + } + + open fun setStatusBar() { +// immersionBar { +// statusBarColor(R.color.white) +// fitsSystemWindows(false) +// statusBarDarkFont(true, 0.2f) +// keyboardEnable(true) +// init() +// } + } + + + private fun hideBottomUIMenu() { + val params: WindowManager.LayoutParams = window.attributes + params.systemUiVisibility = + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_IMMERSIVE + window.attributes = params + } + + + override fun onBackPressed() { + super.onBackPressed() + } + + override fun onDestroy() { + super.onDestroy() + + } + + fun showDialogToast( + msg: String, + duration: Long = 1500, + @QMUITipDialog.Builder.IconType icon: Int = QMUITipDialog.Builder.ICON_TYPE_SUCCESS + ) { + val tipDialog = QMUITipDialog.Builder(this) + .setIconType(icon) + .setTipWord(msg) + .create() + tipDialog.show() + tipDialog.hideNavigationBar() + window.decorView.postDelayed({ + tipDialog.dismiss() + }, duration) + + } + + fun showLoading(msg: String = "加载中...") { + mLoadingDialog = QMUITipDialog.Builder(this) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(msg) + .create() + mLoadingDialog?.apply { + show() + } + } + + fun hideLoading() { + mLoadingDialog?.apply { + if (isShowing) { + dismiss() + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/adapter/ChangeDialogStepAdapter.kt b/app/src/main/java/com/yzx/ebrand/adapter/ChangeDialogStepAdapter.kt new file mode 100644 index 0000000..e94aeec --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/ChangeDialogStepAdapter.kt @@ -0,0 +1,94 @@ +package com.yzx.ebrand.adapter + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yzx.ebrand.R +import com.yzx.ebrand.model.ChangeActivity +import com.yzx.ebrand.utils.setSrc +import com.yzx.ebrand.utils.toTime +import kotlinx.android.synthetic.main.layout_leave_step.view.* +import org.jetbrains.anko.dip + +class ChangeDialogStepAdapter(list: MutableList) : + BaseQuickAdapter(R.layout.layout_leave_step, list) { + + @SuppressLint("SetTextI18n") + override fun convert(holder: BaseViewHolder, item: ChangeActivity) { + holder.itemView.inImg.visibility = View.GONE + holder.itemView.visibility = View.VISIBLE + holder.itemView.addUserTypeName.visibility = View.GONE + holder.itemView.activityName.visibility = View.GONE + holder.itemView.addUserName.visibility = View.VISIBLE + when (item.is_approve) { + 0 -> { + + holder.itemView.addUserTypeName.visibility = View.GONE + holder.itemView.addUserName.text = "${item.add_user_name}发起异动申请${ + if (item.is_auto_pass == 1) { + "(直接通过)" + } else { + "" + } + }" + holder.itemView.approvalComments.visibility = View.GONE + } + 1 -> { + holder.itemView.addUserName.text = "班主任审批" + holder.itemView.statusName.text = when (item.approval_status) { + 0,1 -> "(待审批)" + 2 -> "(通过)" + 3 -> "(拒绝)" + else -> "" + } + holder.itemView.statusName.setTextColor(when (item.approval_status) { + 0,1 -> Color.parseColor("#3c7ef6") + 2 -> Color.parseColor("#07c160") + 3 -> Color.parseColor("#ff4040") + else -> 0 + }) + holder.itemView.approvalComments.visibility = View.VISIBLE + var str = "审批人:${item.add_user_name}" + if (item.approval_comments.isNotEmpty()) { + str += "。${item.approval_comments}" + } + holder.itemView.approvalComments.text = str + } + 2->{ + holder.itemView.addUserName.text = "提前结束" + holder.itemView.approvalComments.visibility = View.VISIBLE + var str = "操作人:${item.add_user_name}" + if (item.approval_comments.isNotEmpty()) { + str += "。${item.approval_comments}" + } + holder.itemView.approvalComments.text = str + } + else -> { + holder.itemView.visibility = View.GONE + } + } + + holder.itemView.signImg.visibility = if(item.sign_key?.isNotEmpty() == true){ + holder.itemView.signImg.setSrc(item.sign_identity,item.sign_key) + View.VISIBLE + }else{ + View.GONE + } + + holder.itemView.stepTime.text = item.add_time.toTime() + + if (holder.adapterPosition == 0) { + holder.itemView.line1.setBackgroundResource(R.color.transparent) + } else { + holder.itemView.line1.setBackgroundResource(R.color.gray_1) + } + + if (holder.adapterPosition == data.size - 1) { + holder.itemView.contentLayout.setPadding(0, 0, 0, 0) + } else { + holder.itemView.contentLayout.setPadding(0, 0, 0, holder.itemView.contentLayout.dip(20)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/adapter/ChangeListAdapter.kt b/app/src/main/java/com/yzx/ebrand/adapter/ChangeListAdapter.kt new file mode 100644 index 0000000..6a6a7bf --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/ChangeListAdapter.kt @@ -0,0 +1,80 @@ +package com.yzx.ebrand.adapter + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yzx.ebrand.R +import com.yzx.ebrand.model.StuChange +import com.yzx.ebrand.utils.setSrc +import com.yzx.ebrand.utils.toDay +import com.yzx.ebrand.utils.toTime +import kotlinx.android.synthetic.main.layout_change_table.view.* +import org.jetbrains.anko.textColor + +class ChangeListAdapter(list: MutableList) : + BaseQuickAdapter(R.layout.layout_change_table, list) { + + init { + addChildClickViewIds(R.id.cancelBtn,R.id.faceEmpty) + } + + @SuppressLint("SetTextI18n") + override fun convert(holder: BaseViewHolder, item: StuChange) { + holder.itemView.studentName.text = item.status_change_student_name + if (item.face_key.isNullOrBlank()) { + holder.itemView.faceEmpty.visibility = View.VISIBLE + holder.itemView.faceImg.visibility = View.GONE + } else { + holder.itemView.faceImg.visibility = View.VISIBLE + holder.itemView.faceEmpty.visibility = View.GONE + holder.itemView.faceImg.setSrc(item.face_identity, item.face_key) + } + holder.itemView.className.text = "${item.grade_name}${item.class_name}" + holder.itemView.typeName.text = item.status_change_type_name + + var time = "--" + if (item.start_time > 0) { + time = item.start_time.toDay() + } + if (item.end_time > 0) { + time = "$time -- ${item.end_time.toDay()}" + } + holder.itemView.leaveTime.text = time + + holder.itemView.statusName.text = when (item.status) { + 1 -> "待处理" + 2 -> "已确认" + 3 -> "已拒绝" + else -> "--" + } + holder.itemView.statusName.textColor = when (item.status) { + 1 -> Color.parseColor("#333333") + 2 -> Color.parseColor("#3c7ef6") + 3 -> Color.parseColor("#ff4040") + 4 -> Color.parseColor("#3c7ef6") + 5 -> Color.parseColor("#ff4040") + else -> Color.parseColor("#333333") + } + if (item.getSubStatusName().isNotEmpty()) { + holder.itemView.subStatusName.text = "(${item.getSubStatusName()})" + holder.itemView.subStatusName.textColor = when (item.sub_status) { + 0, 2 -> Color.parseColor("#ff4040") + 1, 3 -> Color.parseColor("#07c160") + else -> Color.parseColor("#333333") + } + } else { + holder.itemView.subStatusName.text = "" + } + + holder.itemView.applyTime.text = item.add_time.toTime() + + holder.itemView.bottomLine.visibility = if (holder.adapterPosition == data.size - 1) { + View.GONE + } else { + View.VISIBLE + } + holder.itemView.addUser.text = item.add_user_name + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/adapter/HomeAdapter.kt b/app/src/main/java/com/yzx/ebrand/adapter/HomeAdapter.kt new file mode 100644 index 0000000..9d0c3f1 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/HomeAdapter.kt @@ -0,0 +1,14 @@ +package com.yzx.ebrand.adapter + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yzx.ebrand.R +import com.yzx.ebrand.model.HomeItem +import kotlinx.android.synthetic.main.item_home.view.* + +class HomeAdapter(list: MutableList) : BaseQuickAdapter(R.layout.item_home,list) { + override fun convert(holder: BaseViewHolder, item: HomeItem) { + holder.itemView.img.setImageResource(item.img) + holder.itemView.name.text = item.title + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/adapter/HomeDialogStepAdapter.kt b/app/src/main/java/com/yzx/ebrand/adapter/HomeDialogStepAdapter.kt new file mode 100644 index 0000000..2eec326 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/HomeDialogStepAdapter.kt @@ -0,0 +1,102 @@ +package com.yzx.ebrand.adapter + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yzx.ebrand.R +import com.yzx.ebrand.model.LeaveActivity +import com.yzx.ebrand.utils.setSrc +import com.yzx.ebrand.utils.toTime +import kotlinx.android.synthetic.main.layout_leave_step.view.* +import org.jetbrains.anko.dip +import org.jetbrains.anko.textColor + +class HomeDialogStepAdapter(list: MutableList) : + BaseQuickAdapter(R.layout.layout_leave_step, list) { + + @SuppressLint("SetTextI18n") + override fun convert(holder: BaseViewHolder, item: LeaveActivity) { + holder.itemView.inImg.visibility = View.GONE + when (item.is_approve) { + 0 -> { + holder.itemView.addUserName.visibility = View.VISIBLE + holder.itemView.addUserName.text = item.add_user_name + holder.itemView.approvalComments.visibility = View.GONE + } + 2 -> { + holder.itemView.addUserName.visibility = View.GONE + holder.itemView.approvalComments.visibility = View.VISIBLE + holder.itemView.approvalComments.text = item.approval_comments + holder.itemView.approvalComments.textColor = if (item.color.isNotEmpty()) { + Color.parseColor(item.color) + } else { + Color.parseColor("#333333") + } + + val inItem = item.getInImg() + if (inItem != null) { + holder.itemView.inImg.visibility = View.VISIBLE + holder.itemView.inImg.setSrc(inItem.identity, inItem.attachment_id) + } else { + holder.itemView.inImg.visibility = View.GONE + } + } + else -> { + holder.itemView.addUserName.visibility = View.GONE + holder.itemView.approvalComments.visibility = View.VISIBLE + var str = "审批人:${item.add_user_name}" + if (item.approval_comments != null && item.approval_comments.isNotEmpty()) { + str += "。${item.approval_comments}" + } + holder.itemView.approvalComments.text = str + } + } + if (item.add_user_type_name.isNullOrBlank()) { + holder.itemView.addUserTypeName.visibility = View.GONE + } else { + holder.itemView.addUserTypeName.visibility = View.VISIBLE + holder.itemView.addUserTypeName.text = "(${item.add_user_type_name})" + } + holder.itemView.activityName.text = item.activity_name + + if (item.is_approve == 1 && item.approval_status > 0) { + holder.itemView.statusName.visibility = View.VISIBLE + holder.itemView.statusName.text = when (item.approval_status) { + 1 -> "(待审批)" + 2 -> "(通过)" + 3 -> "(拒绝)" + else -> "" + } + } else { + holder.itemView.statusName.visibility = View.GONE + } + + if (item?.sign_key != null && item?.sign_key?.isNotEmpty()) { + holder.itemView.signImg.visibility = View.VISIBLE + holder.itemView.signImg.setSrc(item.sign_identity, item.sign_key) + } else { + holder.itemView.signImg.visibility = View.GONE + } + + if (item.is_approve == 0 || item.approval_status > 1) { + holder.itemView.stepTime.visibility = View.VISIBLE + holder.itemView.stepTime.text = item.add_time.toTime() + } else { + holder.itemView.stepTime.visibility = View.GONE + } + + if (holder.adapterPosition == 0) { + holder.itemView.line1.setBackgroundResource(R.color.transparent) + } else { + holder.itemView.line1.setBackgroundResource(R.color.gray_1) + } + + if (holder.adapterPosition == data.size - 1) { + holder.itemView.contentLayout.setPadding(0, 0, 0, 0) + } else { + holder.itemView.contentLayout.setPadding(0, 0, 0, holder.itemView.contentLayout.dip(20)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/adapter/HomeListAdapter.kt b/app/src/main/java/com/yzx/ebrand/adapter/HomeListAdapter.kt new file mode 100644 index 0000000..9693a4f --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/HomeListAdapter.kt @@ -0,0 +1,74 @@ +package com.yzx.ebrand.adapter + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yzx.ebrand.R +import com.yzx.ebrand.model.StuLeave +import com.yzx.ebrand.utils.durationStr +import com.yzx.ebrand.utils.setSrc +import com.yzx.ebrand.utils.toTime +import kotlinx.android.synthetic.main.layout_leave_table.view.* +import org.jetbrains.anko.textColor + +class HomeListAdapter(list: MutableList) : + BaseQuickAdapter(R.layout.layout_leave_table, list) { + + init { + addChildClickViewIds(R.id.cancelBtn,R.id.faceEmpty) + + } + + @SuppressLint("SetTextI18n") + override fun convert(holder: BaseViewHolder, item: StuLeave) { + holder.itemView.studentName.text = item.leave_student_name + if (item.face_key.isNullOrBlank()) { + holder.itemView.faceEmpty.visibility = View.VISIBLE + holder.itemView.faceImg.visibility = View.GONE + } else { + holder.itemView.faceImg.visibility = View.VISIBLE + holder.itemView.faceEmpty.visibility = View.GONE + holder.itemView.faceImg.setSrc(item.face_identity, item.face_key) + } + holder.itemView.className.text = "${item.grade_name}${item.class_name}" + holder.itemView.typeName.text = item.leave_request_type_name + holder.itemView.leaveTime.text = + "${item.start_time.toTime()} -- -- ${item.end_time.toTime()}" + holder.itemView.durationStrName.text = (item.end_time - item.start_time).durationStr() + holder.itemView.statusName.text = when (item.status) { + 1 -> "待处理" + 2 -> "已确认" + 3 -> "已拒绝" + 4 -> "正常销假" + 5 -> "超时销假" + else -> "--" + } + holder.itemView.statusName.textColor = when (item.status) { + 1 -> Color.parseColor("#333333") + 2 -> Color.parseColor("#3c7ef6") + 3 -> Color.parseColor("#ff4040") + 4 -> Color.parseColor("#3c7ef6") + 5 -> Color.parseColor("#ff4040") + else -> Color.parseColor("#333333") + } + holder.itemView.applyTime.text = item.add_time.toTime() + + holder.itemView.bottomLine.visibility = if (holder.adapterPosition == data.size - 1) { + View.GONE + } else { + View.VISIBLE + } + + + holder.itemView.cancelBtn.visibility = if(item.is_cancel_leave ==1 ){ + holder.itemView.placeHolder.visibility = View.GONE + View.VISIBLE + }else{ + holder.itemView.placeHolder.visibility = View.VISIBLE + View.GONE + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/adapter/VisitorDialogStepAdapter.kt b/app/src/main/java/com/yzx/ebrand/adapter/VisitorDialogStepAdapter.kt new file mode 100644 index 0000000..8d3fd5f --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/VisitorDialogStepAdapter.kt @@ -0,0 +1,49 @@ +package com.yzx.ebrand.adapter + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yzx.ebrand.R +import com.yzx.ebrand.model.AuditRecordOut +import com.yzx.ebrand.utils.toTime +import kotlinx.android.synthetic.main.layout_visitor_step.view.* +import org.jetbrains.anko.dip +import org.jetbrains.anko.textColor + +class VisitorDialogStepAdapter(list: MutableList) : + BaseQuickAdapter(R.layout.layout_visitor_step, list) { + + @SuppressLint("SetTextI18n") + override fun convert(holder: BaseViewHolder, item: AuditRecordOut) { + + holder.itemView.visibility = View.VISIBLE + holder.itemView.addUserName.text = item.getTitle() + holder.itemView.approvalComments.visibility = if(item.audit_user_name.isNotEmpty()){ + holder.itemView.approvalComments.text = "审批人:${item.audit_user_name}。${item.audit_remark}" + holder.itemView.approvalComments.textColor = when (item.audit_status) { + 0 -> Color.parseColor("#ff4040") + 1 -> Color.parseColor("#3c7ef6") + 2 -> Color.parseColor("#ff4040") + -1 -> Color.parseColor("#999999") + else -> Color.parseColor("#333333") + } + View.VISIBLE + }else{ + View.GONE + } + holder.itemView.approvalTime.text = item.add_time.toTime() + if (holder.adapterPosition == 0) { + holder.itemView.line1.setBackgroundResource(R.color.transparent) + } else { + holder.itemView.line1.setBackgroundResource(R.color.gray_1) + } + + if (holder.adapterPosition == data.size - 1) { + holder.itemView.contentLayout.setPadding(0, 0, 0, 0) + } else { + holder.itemView.contentLayout.setPadding(0, 0, 0, holder.itemView.contentLayout.dip(20)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/adapter/VisitorListAdapter.kt b/app/src/main/java/com/yzx/ebrand/adapter/VisitorListAdapter.kt new file mode 100644 index 0000000..625866d --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/VisitorListAdapter.kt @@ -0,0 +1,121 @@ +package com.yzx.ebrand.adapter + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.View +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yzx.ebrand.R +import com.yzx.ebrand.model.Visitor +import com.yzx.ebrand.utils.setSrc +import com.yzx.ebrand.utils.toTime +import kotlinx.android.synthetic.main.layout_visitor_table.view.* +import org.jetbrains.anko.textColor + +class VisitorListAdapter(list: MutableList) : + BaseQuickAdapter(R.layout.layout_visitor_table, list) { + + init { + addChildClickViewIds(R.id.faceEmpty,R.id.nucleinEmpty,R.id.tripCodeEmpty,R.id.healthCodeEmpty) + } + + @SuppressLint("SetTextI18n", "Range") + override fun convert(holder: BaseViewHolder, item: Visitor) { + holder.itemView.userName.text = item.user_name + if (item.face_key.isNotEmpty()) { + holder.itemView.faceImg.visibility = View.VISIBLE + holder.itemView.faceEmpty.visibility = View.GONE + holder.itemView.faceImg.setSrc(item.face_identity, item.face_key) + } else { + holder.itemView.faceEmpty.visibility = View.VISIBLE + holder.itemView.faceImg.visibility = View.GONE + } + when { + item.health_code_status >= 0 -> { + holder.itemView.healthCodeStatusLayout.visibility = View.VISIBLE + holder.itemView.healthCodeImg.visibility = View.GONE + holder.itemView.healthCodeEmpty.visibility = View.GONE + when (item.health_code_status) { + 0 -> { + holder.itemView.healthCodeStatus.text = "状态:绿码" + holder.itemView.healthCodeStatus.textColor = Color.parseColor("#5DAD64") + } + 1 -> { + holder.itemView.healthCodeStatus.text = "状态:黄码" + holder.itemView.healthCodeStatus.textColor = Color.parseColor("#FCCF13") + } + 10 -> { + holder.itemView.healthCodeStatus.text = "状态:红码" + holder.itemView.healthCodeStatus.textColor = Color.parseColor("#FC0416") + } + } + } + item.health_code_key.isNotEmpty() -> { + holder.itemView.healthCodeStatusLayout.visibility = View.GONE + holder.itemView.healthCodeImg.visibility = View.VISIBLE + holder.itemView.healthCodeEmpty.visibility = View.GONE + holder.itemView.healthCodeImg.setSrc( + item.health_code_identity, + item.health_code_key + ) + + } + else -> { + holder.itemView.healthCodeStatusLayout.visibility = View.GONE + holder.itemView.healthCodeEmpty.visibility = View.VISIBLE + holder.itemView.healthCodeImg.visibility = View.GONE + } + } + if(item.nuclein_file_key.isNullOrBlank()){ + holder.itemView.nucleinEmpty.visibility = View.VISIBLE + holder.itemView.nucleinImg.visibility = View.GONE + }else{ + holder.itemView.nucleinImg.visibility = View.VISIBLE + holder.itemView.nucleinEmpty.visibility = View.GONE + holder.itemView.nucleinImg.setSrc(item.nuclein_file_identity, item.nuclein_file_key) + } + if(item.nuclein_time>0){ + holder.itemView.nucleinStatusLayout.visibility = View.VISIBLE + holder.itemView.nucleinStatus.text = item.getNucleinStatusObj().nuclein_name + holder.itemView.nucleinStatus.setTextColor(Color.parseColor(item.getNucleinStatusObj().nuclein_color)) + }else{ + holder.itemView.nucleinStatusLayout.visibility = View.GONE + } + if (item.trip_code_key.isNullOrBlank()) { + holder.itemView.tripCodeEmpty.visibility = View.VISIBLE + holder.itemView.tripCodeImg.visibility = View.GONE + } else { + holder.itemView.tripCodeImg.visibility = View.VISIBLE + holder.itemView.tripCodeEmpty.visibility = View.GONE + holder.itemView.tripCodeImg.setSrc(item.trip_code_identity, item.trip_code_key) + } + holder.itemView.isDrive.text = if (item.is_drive == 1) { + "是" + } else { + "否" + } + holder.itemView.receptionUser.text = item.reception_user + holder.itemView.statusName.text = when (item.audit_status) { + 0 -> "待审核" + 1 -> "可通行" + 2 -> "审核拒绝" + -1 -> "已失效" + else -> "--" + } + holder.itemView.statusName.textColor = when (item.audit_status) { + 0 -> Color.parseColor("#333333") + 1 -> Color.parseColor("#3c7ef6") + 2 -> Color.parseColor("#ff4040") + -1 -> Color.parseColor("#999999") + else -> Color.parseColor("#333333") + } + + holder.itemView.applyTime.text = item.add_time.toTime() + + holder.itemView.bottomLine.visibility = if (holder.adapterPosition == data.size - 1) { + View.GONE + } else { + View.VISIBLE + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/adapter/base/BaseListAdapter.java b/app/src/main/java/com/yzx/ebrand/adapter/base/BaseListAdapter.java new file mode 100644 index 0000000..b784c92 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/base/BaseListAdapter.java @@ -0,0 +1,154 @@ +package com.yzx.ebrand.adapter.base; + +import android.os.Handler; +import android.view.View; +import android.view.ViewGroup; + +import androidx.recyclerview.widget.RecyclerView; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Created by newbiechen on 17-3-21. + */ + +public abstract class BaseListAdapter extends RecyclerView.Adapter{ + + private static final String TAG = "BaseListAdapter"; + /*common statement*/ + protected final List mList = new ArrayList<>(); + protected OnItemClickListener mClickListener; + protected OnItemLongClickListener mLongClickListener; + + /************************abstract area************************/ + protected abstract IViewHolder createViewHolder(int viewType); + + /*************************rewrite logic area***************************************/ + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + IViewHolder viewHolder = createViewHolder(viewType); + + View view = viewHolder.createItemView(parent); + //初始化 + RecyclerView.ViewHolder holder = new BaseViewHolder(view, viewHolder); + return holder; + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + //防止别人直接使用RecyclerView.ViewHolder调用该方法 + if (!(holder instanceof BaseViewHolder)) + throw new IllegalArgumentException("The ViewHolder item must extend BaseViewHolder"); + + IViewHolder iHolder = ((BaseViewHolder) holder).holder; + iHolder.onBind(getItem(position),position); + + //设置点击事件 + holder.itemView.setOnClickListener((v)->{ + if (mClickListener != null){ + mClickListener.onItemClick(v,position); + } + //adapter监听点击事件 + iHolder.onClick(); + onItemClick(v,position); + }); + //设置长点击事件 + holder.itemView.setOnLongClickListener( + (v) -> { + boolean isClicked = false; + if (mLongClickListener != null){ + isClicked = mLongClickListener.onItemLongClick(v,position); + } + //Adapter监听长点击事件 + onItemLongClick(v,position); + return isClicked; + } + ); + } + + @Override + public int getItemCount() { + return mList.size(); + } + + protected void onItemClick(View v,int pos){ + } + + protected void onItemLongClick(View v,int pos){ + } + + /******************************public area***********************************/ + + public void setOnItemClickListener(OnItemClickListener mListener) { + this.mClickListener = mListener; + } + + public void setOnItemLongClickListener(OnItemLongClickListener mListener){ + this.mLongClickListener = mListener; + } + + public void addItem(T value){ + mList.add(value); + notifyDataSetChanged(); + } + + public void addItem(int index,T value){ + mList.add(index, value); + notifyDataSetChanged(); + } + + public void addItems(List values){ + mList.addAll(values); + + Handler handler = new Handler(); + handler.post(new Runnable() { + @Override + public void run() { + notifyDataSetChanged(); + } + }); + } + + public void removeItem(T value){ + mList.remove(value); + notifyDataSetChanged(); + } + + public void removeItems(List value){ + mList.removeAll(value); + notifyDataSetChanged(); + } + + public T getItem(int position){ + return mList.get(position); + } + + public List getItems(){ + return Collections.unmodifiableList(mList); + } + + public int getItemSize(){ + return mList.size(); + } + + public void refreshItems(List list){ + mList.clear(); + mList.addAll(list); + notifyDataSetChanged(); + } + + public void clear(){ + mList.clear(); + } + + /***************************inner class area***********************************/ + public interface OnItemClickListener{ + void onItemClick(View view, int pos); + } + + public interface OnItemLongClickListener{ + boolean onItemLongClick(View view, int pos); + } +} diff --git a/app/src/main/java/com/yzx/ebrand/adapter/base/BaseViewHolder.java b/app/src/main/java/com/yzx/ebrand/adapter/base/BaseViewHolder.java new file mode 100644 index 0000000..9a5080b --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/base/BaseViewHolder.java @@ -0,0 +1,19 @@ +package com.yzx.ebrand.adapter.base; + +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +/** + * Created by newbiechen on 17-5-17. + */ + +public class BaseViewHolder extends RecyclerView.ViewHolder{ + public IViewHolder holder; + + public BaseViewHolder(View itemView, IViewHolder holder) { + super(itemView); + this.holder = holder; + holder.initView(); + } +} diff --git a/app/src/main/java/com/yzx/ebrand/adapter/base/EasyAdapter.java b/app/src/main/java/com/yzx/ebrand/adapter/base/EasyAdapter.java new file mode 100644 index 0000000..8a56321 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/base/EasyAdapter.java @@ -0,0 +1,92 @@ +package com.yzx.ebrand.adapter.base; + +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Created by newbiechen on 17-6-5. + * ListView 使用的Adapter + */ + +public abstract class EasyAdapter extends BaseAdapter { + + private List mList = new ArrayList(); + + @Override + public int getCount() { + return mList.size(); + } + + @Override + public T getItem(int position) { + return mList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + public void addItem(T value){ + mList.add(value); + notifyDataSetChanged(); + } + + public void addItem(int index,T value){ + mList.add(index, value); + notifyDataSetChanged(); + } + + public void addItems(List values){ + mList.addAll(values); + notifyDataSetChanged(); + } + + public void removeItem(T value){ + mList.remove(value); + notifyDataSetChanged(); + } + + public List getItems(){ + return Collections.unmodifiableList(mList); + } + + public int getItemSize(){ + return mList.size(); + } + + public void refreshItems(List list){ + mList.clear(); + mList.addAll(list); + notifyDataSetChanged(); + } + + public void clear(){ + mList.clear(); + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + IViewHolder holder = null; + if (convertView == null){ + holder = onCreateViewHolder(getItemViewType(position)); + convertView = holder.createItemView(parent); + convertView.setTag(holder); + //初始化 + holder.initView(); + } + else { + holder = (IViewHolder)convertView.getTag(); + } + //执行绑定 + holder.onBind(getItem(position),position); + return convertView; + } + + protected abstract IViewHolder onCreateViewHolder(int viewType); +} diff --git a/app/src/main/java/com/yzx/ebrand/adapter/base/GroupAdapter.java b/app/src/main/java/com/yzx/ebrand/adapter/base/GroupAdapter.java new file mode 100644 index 0000000..e4e85a1 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/base/GroupAdapter.java @@ -0,0 +1,204 @@ +package com.yzx.ebrand.adapter.base; + +import android.view.View; +import android.view.ViewGroup; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +/** + * Created by newbiechen on 17-5-5. + * 用于头标签 + 表格的布局View + */ + +public abstract class GroupAdapter extends RecyclerView.Adapter{ + private static final String TAG = "GroupAdapter"; + + private static final int TYPE_GROUP = 1; + private static final int TYPE_CHILD = 2; + + private OnGroupClickListener mGroupListener; + private OnChildClickListener mChildClickListener; + + public abstract int getGroupCount(); + public abstract int getChildCount(int groupPos); + + public abstract T getGroupItem(int groupPos); + public abstract R getChildItem(int groupPos,int childPos); + + protected abstract IViewHolder createGroupViewHolder(); + protected abstract IViewHolder createChildViewHolder(); + + public GroupAdapter(RecyclerView recyclerView,int spanSize){ + GridLayoutManager manager = new GridLayoutManager(recyclerView.getContext(),spanSize); + manager.setSpanSizeLookup(new GroupSpanSizeLookup(spanSize)); + recyclerView.setLayoutManager(manager); + } + + public void setOnGroupItemListener(OnGroupClickListener listener){ + mGroupListener = listener; + } + + public void setOnChildItemListener(OnChildClickListener listener) { + mChildClickListener = listener; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ + IViewHolder iViewHolder = null; + View view = null; + if (viewType == TYPE_GROUP){ + iViewHolder = createGroupViewHolder(); + view = iViewHolder.createItemView(parent); + } + else if (viewType == TYPE_CHILD){ + iViewHolder = createChildViewHolder(); + view = iViewHolder.createItemView(parent); + } + RecyclerView.ViewHolder viewHolder = new BaseViewHolder(view, iViewHolder); + return viewHolder; + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + if (! (holder instanceof BaseViewHolder)) + throw new IllegalArgumentException("The ViewHolder item must extend BaseViewHolder"); + + IViewHolder iHolder = ((BaseViewHolder) holder).holder; + int type = getItemViewType(position); + if (type == TYPE_GROUP){ + //计算当前的group + int groupPos = calculateGroup(position); + holder.itemView.setOnClickListener( + (v) -> { + iHolder.onClick(); + if (mGroupListener != null){ + mGroupListener.onGroupClick(v,groupPos); + } + } + ); + iHolder.onBind(getGroupItem(groupPos),groupPos); + } + else if (type == TYPE_CHILD){ + int groupPos = calculateGroup(position); + int childPos = calculateChild(position); + + holder.itemView.setOnClickListener( + v -> { + iHolder.onClick(); + if (mChildClickListener != null) { + mChildClickListener.onChildClick(v,groupPos,childPos); + } + } + ); + //这里有点小问题,返回的是childPos + iHolder.onBind(getChildItem(groupPos,childPos),childPos); + } + } + + //计算position是哪个group中的头 + private int calculateGroup(int position){ + int total = 0; + for (int i=0; i position){ //判断是否pos在total内 + return i; + } + } + return -1; + } + + //计算position是那个group中的child + protected int calculateChild(int position){ + for (int i=0; i { + View createItemView(ViewGroup parent); + void initView(); + void onBind(T data,int pos); + void onClick(); +} diff --git a/app/src/main/java/com/yzx/ebrand/adapter/base/ViewHolderImpl.java b/app/src/main/java/com/yzx/ebrand/adapter/base/ViewHolderImpl.java new file mode 100644 index 0000000..fea8045 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/adapter/base/ViewHolderImpl.java @@ -0,0 +1,42 @@ +package com.yzx.ebrand.adapter.base; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * Created by newbiechen on 17-5-17. + */ + +public abstract class ViewHolderImpl implements IViewHolder { + private View view; + private Context context; + /****************************************************/ + protected abstract int getItemLayoutId(); + + + @Override + public View createItemView(ViewGroup parent) { + view = LayoutInflater.from(parent.getContext()) + .inflate(getItemLayoutId(), parent, false); + context = parent.getContext(); + return view; + } + + protected V findById(int id){ + return (V) view.findViewById(id); + } + + protected Context getContext(){ + return context; + } + + protected View getItemView(){ + return view; + } + + @Override + public void onClick() { + } +} diff --git a/app/src/main/java/com/yzx/ebrand/config/Config.kt b/app/src/main/java/com/yzx/ebrand/config/Config.kt new file mode 100644 index 0000000..f0ee91c --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/config/Config.kt @@ -0,0 +1,39 @@ +package com.yzx.ebrand.config + +import com.yzx.ebrand.BuildConfig +import com.yzx.ebrand.model.StuChangeType + +object Config { + var BASE_URL = BuildConfig.BASE_URL + var APP_NAME = BuildConfig.APP_NAME + var M_URL = BuildConfig.M_URL + var OA_URL = BuildConfig.OA_URL + var WS_URL = BuildConfig.WS_URL + var MP_APPID = BuildConfig.MP_APPID + val APP_ID = 701 + + + const val STU_CHANGE_STATUS_DROP_OUT = 42001 + const val STU_CHANGE_STATUS_LEAVE_SCHOOL = 42002 + const val STU_CHANGE_STATUS_RETURN_SCHOOL = 42003 + const val STU_CHANGE_STATUS_OUT_SCHOOL = 42004 + const val STU_CHANGE_STATUS_TRANSFER_SCHOOL = 42005 + const val STU_CHANGE_STATUS_REPEAT = 42006 + const val STU_CHANGE_STATUS_DOWNGRADE = 42007 + const val STU_CHANGE_STATUS_TRANSFER_OUT = 42008 + const val STU_CHANGE_STATUS_INTROSPECTION = 42009 + const val STU_CHANGE_STATUS_INTERNSHIP = 42010 + + val STU_CHANGE_STATUS_LIST = mutableListOf( + StuChangeType(STU_CHANGE_STATUS_DROP_OUT,"辍学",""), + StuChangeType(STU_CHANGE_STATUS_LEAVE_SCHOOL,"休学",""), + StuChangeType(STU_CHANGE_STATUS_RETURN_SCHOOL,"复学",""), + StuChangeType(STU_CHANGE_STATUS_OUT_SCHOOL,"退学",""), + StuChangeType(STU_CHANGE_STATUS_TRANSFER_SCHOOL,"转学",""), + StuChangeType(STU_CHANGE_STATUS_REPEAT,"留级",""), + StuChangeType(STU_CHANGE_STATUS_TRANSFER_OUT,"转出",""), + StuChangeType(STU_CHANGE_STATUS_DOWNGRADE,"降级",""), + StuChangeType(STU_CHANGE_STATUS_INTROSPECTION,"回家反省","反省"), + StuChangeType(STU_CHANGE_STATUS_INTERNSHIP,"实习","反省") + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/config/RefreshToken.kt b/app/src/main/java/com/yzx/ebrand/config/RefreshToken.kt new file mode 100644 index 0000000..2291c6d --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/config/RefreshToken.kt @@ -0,0 +1,89 @@ +package com.yzx.ebrand.config + +import android.content.Intent +import com.blankj.utilcode.util.ActivityUtils +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.ebrand.App.Companion.getContext +import com.yzx.ebrand.MainActivity +import com.yzx.ebrand.activity.LoginActivity +import com.yzx.ebrand.config.Config.OA_URL +import com.yzx.ebrand.model.ReToken +import com.yzx.ebrand.model.RefreshTokenEvent +import com.yzx.ebrand.model.User +import com.yzx.ebrand.presenter.base.JsonCallBack +import com.yzx.ebrand.presenter.base.YzxResponse +import org.greenrobot.eventbus.EventBus +import java.util.* + +object RefreshToken { + fun refresh(callBack:RefreshCallback) { + val user = User.getUser() + val lastLoginTime = user.loginTime + val currTime = Date().time + if (currTime - lastLoginTime > 12L * 60 * 60 * 1000 && currTime - lastLoginTime < 365L * 24 * 60 * 60 * 1000) { + if (user.user_id > 0) { + val url = Config.BASE_URL + YzxInterface.INTERFACE_REFRESH_TOKEN + OkGo.post>(url) + .tag(this) + .params("old_token", User.getUser().token) + .params("type", 1) + .params("source", "201") + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + val token = response?.body()?.data?.token ?: "" + if (token.isNotBlank()) { + user.token = token + user.loginTime = Date().time + user.save() + callBack.onSuccess() + EventBus.getDefault().post(RefreshTokenEvent(token)) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + User.clearUserInfo() +// val intent = Intent(getContext(), WebActivity::class.java) + val intent = Intent(getContext(), LoginActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + intent.putExtra("link", OA_URL + "/login?logout=1") + ActivityUtils.startActivity(intent) + ActivityUtils.finishActivity(MainActivity::class.java) + callBack.onError() + } + }) + }else{ + User.clearUserInfo() +// val intent = Intent(getContext(), WebActivity::class.java) + val intent = Intent(getContext(), LoginActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + intent.putExtra("link", OA_URL + "/login?logout=1") + ActivityUtils.startActivity(intent) + ActivityUtils.finishActivity(MainActivity::class.java) + callBack.onError() + } + }else{ + if (currTime - lastLoginTime > 365L * 24 * 60 * 60 * 1000){ + User.clearUserInfo() +// val intent = Intent(getContext(), WebActivity::class.java) + val intent = Intent(getContext(), LoginActivity::class.java) + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + intent.putExtra("link", OA_URL + "/login?logout=1") + ActivityUtils.startActivity(intent) + ActivityUtils.finishActivity(MainActivity::class.java) + callBack.onError() + }else{ + callBack.onSuccess() + } + } + } + + interface RefreshCallback{ + fun onSuccess() + fun onError() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/config/YzxInterface.kt b/app/src/main/java/com/yzx/ebrand/config/YzxInterface.kt new file mode 100644 index 0000000..61c0c75 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/config/YzxInterface.kt @@ -0,0 +1,52 @@ +package com.yzx.ebrand.config + +object YzxInterface { + + const val FILE_UPLOAD_URL = "https://fileupload.oa.qbjjyyun.net/edufile/fileUpload" + + const val INTERFACE_LOGIN_ALL= "/login/user2/doLoginAll" //老师学生统一登录 + const val INTERFACE_USER_ROLE_LIST= "/login/user2/getUserLoginRoleList" //多角色获取角色列表 + const val INTERFACE_USER_ROLE_LIST_BY_PHONE= "/edu/weixin/getRolesByPhone" //多角色获取角色列表 + const val INTERFACE_USER_SWITCH= "/login/user2/switchLoginRole" //切换角色 + const val INTERFACE_USER_SWITCH_UNIT= "/edu/weixin/switchUnit" //切换角色 + const val INTERFACE_COMMON_LOGIN_BY_TOKEN= "/login/user2/getUserLoginInfo" // 通过token登陆 + const val INTERFACE_GET_COMMON_YUN_AVATAR= "/edu/activeApi/getYkjHeadPortrait" //根据登录人获取云空间头像 + + const val INTERFACE_REFRESH_TOKEN = "/login/user2/refreshToken"// 刷新token + const val INTERFACE_GET_ACCESS_TOKEN= "/rights/weixin/getAccessTokenByAppId" // 通过app_id获取access_token + const val INTERFACE_GET_MINI_CODE= "/parent/mini/getMiniCode" // 获取小程序二维码 + + const val INTERFACE_GENERATE_WX_QR_TICKET= "/login/wechat/generateQrTicket" // 获取微信带参数二维码的ticket + const val INTERFACE_WX_DO_LOGIN_QUERY= "/edu/user/common/doLoginQuery" // 微信登录的轮询 + + /** + * 学生请假 + */ + const val INTERFACE_GET_STU_LEAVE_LIST= "/edu/attendance/teacher/listStudentLeaveRequest"//获取学生请假列表 + const val INTERFACE_GET_STU_LEAVE_INFO_DETAIL= "/edu/attendance/getStudentLeaveRequestDetail" //获取学生的请假信息详情 + const val INTERFACE_GET_TEACHER_INFO= "/rights/teacherWork/getTeacherByUserId"//获取人员信息 + const val INTERFACE_STUDENT_GET_SHOW_BOX_LIST_OLD= "/edu/attendance/student/getStudentLeaveIds" //获取需要弹出的数据 + const val INTERFACE_STUDENT_GET_SHOW_BOX_LIST= "/edu/attendance/student/getStudentLeaveIdsV2" //获取需要弹出的数据 + const val INTERFACE_STUDENT_POST_LEAVE_VACATION= "/edu/attendance/student/studentLeaveVacation"//人工销假操作 + /** + * 学籍异动 + */ + + const val INTERFACE_STUDENT_GET_CHANGE_LIST= "/edu/attendance/teacher/listStudentStatusChange"//学籍异动列表 + const val INTERFACE_STUDENT_GET_CHANGE_DETAIL= "/edu/attendance/getStudentStatusChangeDetail"//学籍异动详情 + /** + * 访客管理 + */ + const val INTERFACE_ACCESS_CONTROL_GET_FACE_LIST= "/parent/entranceGuard/getEntranceGuardFaceList" // 获取访客人脸信息列表 + const val INTERFACE_ACCESS_CONTROL_GET_FACE_INFO_DETAIL= "/parent/entranceGuard/getEntranceGuardFaceById" // 访客信息 + + /** + * 电子班牌 + */ + const val INTERFACE_CLASS_BRAND_CLASS_INFO = "/edu/electronicClassBoard/getClassInfo" //班级信息 + const val INTERFACE_CLASS_BRAND_TEA_INFO = "/edu/electronicClassBoard/getTeacherInfo" //老师列表 + const val INTERFACE_CLASS_BRAND_IMAGE_INFO = "/edu/electronicClassBoard/getClassStyle" //班级风采 + const val INTERFACE_CLASS_BRAND_ACTIVE_INFO = "/edu/electronicClassBoard/getClassDynamics" //班级动态 + const val INTERFACE_CLASS_BRAND_TIME_TABLE_INFO = "/edu/electronicClassBoard/getTodayClassSchedule" //今日课表 + const val INTERFACE_GET_VOTE_TEA_CLASS= "/edu/vote/getMyClassList" //班主任获取自己的班级 +} diff --git a/app/src/main/java/com/yzx/ebrand/fragment/ChangeFragment.kt b/app/src/main/java/com/yzx/ebrand/fragment/ChangeFragment.kt new file mode 100644 index 0000000..d7fbfa5 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/fragment/ChangeFragment.kt @@ -0,0 +1,428 @@ +package com.yzx.ebrand.fragment + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent +import android.graphics.Color +import android.text.Editable +import android.text.TextWatcher +import android.view.KeyEvent +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.blankj.utilcode.util.* +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import com.yzx.ebrand.R +import com.yzx.ebrand.adapter.ChangeListAdapter +import com.yzx.ebrand.fragment.base.BaseFragment +import com.yzx.ebrand.model.* +import com.yzx.ebrand.presenter.ChangePresenter +import com.yzx.ebrand.presenter.ChangeView +import com.yzx.ebrand.utils.FileUploadCallBack +import com.yzx.ebrand.widget.BaseDialog +import kotlinx.android.synthetic.main.fragment_change.* +import kotlinx.android.synthetic.main.layout_loading.view.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.jetbrains.anko.support.v4.ctx +import org.jetbrains.anko.support.v4.toast +import org.jetbrains.anko.textColor + + +class ChangeFragment : BaseFragment(), ChangeView, + NetworkUtils.OnNetworkStatusChangedListener, FileUploadCallBack { + + companion object { + + val CAMER_REQUEST_CODE = 0x01 + + @JvmStatic + fun getNewInstance() = + ChangeFragment() + } + + private val mAdapter: ChangeListAdapter by lazy { + val list = mutableListOf() + ChangeListAdapter(list) + } + + private var mPager = Pager() + var list = mutableListOf() + private val statusBtnList = mutableListOf() + var keyword: String = "" + var status: String = "" + private var isLoading = false + private val mShowList = mutableListOf() + private val mShowDialogList = mutableListOf() + private var isRefresh = false + + private val refreshRun = Runnable { + refreshData() + } + + override val inflateId: Int + get() = R.layout.fragment_change + + override fun initView() { + NetworkUtils.registerNetworkStatusChangedListener(this) + recyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + recyclerView.adapter = mAdapter + + preTxtBtn.setOnClickListener { pre() } + nextTxtBtn.setOnClickListener { next() } + allBtn.setOnClickListener { changeStatus(0) } + status1Btn.setOnClickListener { changeStatus(1) } + status2Btn.setOnClickListener { changeStatus(2) } + status3Btn.setOnClickListener { changeStatus(3) } + statusBtnList.add(allBtn) + statusBtnList.add(status1Btn) + statusBtnList.add(status2Btn) + statusBtnList.add(status3Btn) + keywordInput.setOnKeyListener { _, keyCode, _ -> + if (!isLoading) { + if (keyCode == KeyEvent.KEYCODE_ENTER) { + keyword = keywordInput.text.toString() + initData() + KeyboardUtils.hideSoftInput(keywordInput) + } + } + false + } + clearBtn.setOnClickListener { + keyword = "" + keywordInput.setText("") + KeyboardUtils.hideSoftInput(keywordInput) + initData() + } + var lastClickTime = TimeUtils.getNowMills() + mAdapter.setOnItemClickListener { adapter, view, position -> + val curr = TimeUtils.getNowMills() + if(curr - lastClickTime > 500){ + lastClickTime = curr + mPresenter?.getDetail(mAdapter.getItem(position).id) + } + } + + mAdapter.setOnItemChildClickListener { adapter, view, position -> + LogUtils.d("setOnItemChildClickListener", position) + val curr = TimeUtils.getNowMills() + if(curr - lastClickTime > 500){ + lastClickTime = curr + when (view.id) { + R.id.cancelBtn -> { + + } + R.id.faceEmpty -> { + mPresenter?.getDetail(mAdapter.getItem(position).id) + } + } + } + + } + + + switchBtn.setOnCheckedChangeListener { buttonView, isChecked -> + SPUtils.getInstance().put("auto_show_change", isChecked) + changeSwitchBtnTxt(isChecked) + EventBus.getDefault().post(AutoSwitchChange(2)) + } + val isAutoShowLeave = SPUtils.getInstance().getBoolean("auto_show_change", false) + switchBtn.isChecked = isAutoShowLeave + changeSwitchBtnTxt(isAutoShowLeave) + + switchBtnTxt.setOnClickListener { + switchBtn.isChecked = !switchBtn.isChecked + } + keywordInput.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + if (s != null && s.isNotEmpty()) { + clearBtn.visibility = View.VISIBLE + } else { + clearBtn.visibility = View.INVISIBLE + } + } + + override fun afterTextChanged(s: Editable?) { + + } + + }) + filterLayout.setOnClickListener { + KeyboardUtils.hideSoftInput(keywordInput) + } + btnRefresh.setOnClickListener { + isRefresh = true + showLayoutLoading() + initData() + } + changeStatusBtn(0) + loadingLayout.setOnClickListener { + //do nothing + } + goPageOne.setOnClickListener { + showLayoutLoading() + initData() + } + } + + private fun showLayoutLoading(){ + loadingLayout.visibility = View.VISIBLE + } + + private fun hideLayoutLoading(){ + loadingLayout.visibility = View.GONE + } + + + private fun changeSwitchBtnTxt(isChecked: Boolean) { + if (isChecked) { + switchBtnTxt.setTextColor(ctx.resources.getColor(R.color.green2)) + } else { + switchBtnTxt.setTextColor(ctx.resources.getColor(R.color.black_3)) + } + } + + @SuppressLint("SetTextI18n") + private fun showLeaveDialog(detail: StuChange) { + EventBus.getDefault().post(detail) + } + + private fun changeStatusBtn(idx: Int) { + statusBtnList.forEachIndexed { index, button -> + button.isSelected = index == idx + } + } + + private fun changeStatus(status: Int) { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + changeStatusBtn(status) + this.status = if (status == 0) { + "" + } else { + "${status}" + } + showLayoutLoading() + initData() + } + + override fun initData() { + + mPager.page_no = 1 + if (NetworkUtils.isConnected()) { + showEmpty(1) + isLoading = true + mPresenter?.getList(mPager.page_no, keyword, status) + } else { + showEmpty(2) + } + + } + + /** + * type 1 loading 2 neterror 3 empty + */ + private fun showEmpty(type: Int) { + when (type) { + 1 -> { + mAdapter.setEmptyView(R.layout.layout_loading) + mAdapter.emptyLayout?.apply { + this.QMUIEmptyView.setLoadingShowing(true) + this.QMUIEmptyView.setTitleText("数据加载中") + } + } + 2 -> { + mAdapter.setEmptyView(R.layout.layout_loading) + mAdapter.emptyLayout?.apply { + this.QMUIEmptyView.show(false, null, "网络连接异常,请检查", "去设置") { + NetworkUtils.openWirelessSettings() + } + } + } + 3 -> { + mAdapter.setEmptyView(R.layout.layout_empty) + } + } + + } + + private fun refreshData() { + if (isLoading) { + return + } + isLoading = true + mPresenter?.getList(mPager.page_no, keyword, status) + } + + private fun pre() { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + if (mPager.page_no <= 1) { + } else { + isLoading = true + showLayoutLoading() + mPresenter?.getList(mPager.page_no - 1, keyword, status) + } + } + + private fun next() { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + if (mPager.page_no >= mPager.total_pages) { + } else { + isLoading = true + showLayoutLoading() + mPresenter?.getList(mPager.page_no + 1, keyword, status) + } + } + + override fun initPresenter(): ChangePresenter = ChangePresenter(this) + + @SuppressLint("SetTextI18n") + override fun onListSuccess(list: MutableList, pager: Pager) { + pageTv?.apply { + if(isRefresh){ + toast("刷新成功!") + isRefresh = false + } + mAdapter.setList(list) + mPager = pager + pageTv.text = "${pager.page_no} / ${pager.total_pages}" + totalTv.text = "共${pager.total_count}条" + + val disabledColor = Color.parseColor("#666666") + val color = Color.parseColor("#3ca0e9") + if (pager.page_no <= 1) { + preTxtBtn.textColor = disabledColor + goPageOne.visibility = View.GONE + } else { + preTxtBtn.textColor = resources.getColor(R.color.s_app_color_blue) + goPageOne.visibility = View.VISIBLE + } + + if (pager.page_no >= pager.total_pages) { + nextTxtBtn.textColor = disabledColor + } else { + nextTxtBtn.textColor = resources.getColor(R.color.s_app_color_blue) + } + isLoading = false + showEmpty(3) + hideLayoutLoading() + pageTv.postDelayed({ + refreshData() + }, 30 * 1000) + } + } + + override fun onStop() { + pageTv.removeCallbacks(refreshRun) + super.onStop() + EventBus.getDefault().unregister(this) + } + + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + override fun onListError(error: String) { + isLoading = false + if(isRefresh){ + toast("刷新失败,请重试!") + isRefresh = false + } + hideLayoutLoading() + showEmpty(3) + } + + override fun onDetailSuccess(detail: StuChange) { + pageTv?.apply { + val item = mShowList.find { it.id == detail.id } + if (item != null) { + //替换新的数据 + val index = mShowList.indexOf(item) + mShowList[index] = detail + + //移除原本的dialog + val dialogIndex = mShowDialogList.indexOfFirst { it.getLeaveId() == item.id } + if (dialogIndex > -1) { + mShowDialogList[dialogIndex].hide() + mShowDialogList.removeAt(dialogIndex) + } + + } else { + mShowList.add(detail) + } + showLeaveDialog(detail) + } + } + + override fun onDetailError(error: String) { + + } + + override fun onDisconnected() { + + } + + override fun onConnected(networkType: NetworkUtils.NetworkType?) { + refreshData() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK) { + + + } + super.onActivityResult(requestCode, resultCode, data) + } + + override fun onSuccess(identity: String, key: String) { + LogUtils.d(identity, key) + + } + + override fun onError(msg: String) { + LogUtils.d(msg) + + + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: MessageEventAuto) { + val list = event.list.filter { it.type == 1 }.toMutableList() + if (list.isNotEmpty() && switchBtn.isChecked) { + list.forEachIndexed { index, leaveID -> + pageTv.postDelayed({ + mPresenter?.getDetail(leaveID.id) + }, 500L * index) + } + } + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageRefreshEvent(event: RefreshTokenEvent) { + refreshData() + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: TimeShow) { + timeView.setTime(event) + } +} + diff --git a/app/src/main/java/com/yzx/ebrand/fragment/ClassBrandFragment.kt b/app/src/main/java/com/yzx/ebrand/fragment/ClassBrandFragment.kt new file mode 100644 index 0000000..7e596fb --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/fragment/ClassBrandFragment.kt @@ -0,0 +1,509 @@ +package com.yzx.ebrand.fragment + +import android.annotation.SuppressLint +import android.graphics.Color +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater +import android.view.View +import com.blankj.utilcode.util.ActivityUtils +import com.blankj.utilcode.util.LogUtils +import com.blankj.utilcode.util.SPUtils +import com.blankj.utilcode.util.TimeUtils +import com.bumptech.glide.Glide +import com.qmuiteam.qmui.widget.dialog.QMUIDialog +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog +import com.wgw.photo.preview.PhotoPreview +import com.yzx.ebrand.R +import com.yzx.ebrand.activity.LoginActivity +import com.yzx.ebrand.fragment.base.BaseFragment +import com.yzx.ebrand.model.* +import com.yzx.ebrand.presenter.ClassBrandPresenter +import com.yzx.ebrand.presenter.ClassBrandView +import com.yzx.ebrand.utils.getImgUrl +import com.yzx.ebrand.utils.hideNavigationBar +import com.yzx.ebrand.utils.setSrc +import com.yzx.ebrand.utils.toTime +import com.yzx.ebrand.utils.zhCn +import kotlinx.android.synthetic.main.fragment_class_brand.* +import kotlinx.android.synthetic.main.layout_brand_active_info.* +import kotlinx.android.synthetic.main.layout_brand_class_info.* +import kotlinx.android.synthetic.main.layout_brand_image_info.* +import kotlinx.android.synthetic.main.layout_brand_tea_info.* +import kotlinx.android.synthetic.main.layout_brand_timetable_info.* +import kotlinx.android.synthetic.main.layout_class_active_item.view.* +import kotlinx.android.synthetic.main.layout_class_tea_item.view.* +import kotlinx.android.synthetic.main.layout_time_table_item.view.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.jetbrains.anko.support.v4.act +import org.jetbrains.anko.support.v4.ctx + +class ClassBrandFragment : BaseFragment(), ClassBrandView { + + companion object { + + val CAMER_REQUEST_CODE = 0x01 + + @JvmStatic + fun getNewInstance() = + ClassBrandFragment() + } + + private var headClassList: MutableList = mutableListOf() + private var imgIndex = 0 + private var imgLoopRunnable: Runnable? = null + private var currClass = HeadClassInfo() + private val styleImgList: MutableList = mutableListOf() + private val styleImgUrlList: MutableList = mutableListOf() + + private val mClassInfoLoopTime = 10 * 60 * 1000L + private val mClassInfoHandler = Handler(Looper.getMainLooper()) + private val mClassInfoRunnable = object : Runnable { + override fun run() { + mClassInfoHandler.removeCallbacks(this) + mClassInfoHandler.postDelayed(this, mClassInfoLoopTime) + getClassInfo() + } + } + + private val mTimeHandler = Handler(Looper.getMainLooper()) + private val timeRunnable = object : Runnable { + override fun run() { + mTimeHandler.removeCallbacks(this) + mTimeHandler.postDelayed(this, 6000) + loopImg(this@ClassBrandFragment.styleImgList) + } + } + + override val inflateId: Int + get() = R.layout.fragment_class_brand + + private var clickCount = 0 + + override fun initView() { + btnRefresh.setOnClickListener { + clickCount++ + if (clickCount >= 2) { + clickCount = 0 + initData() + } + } + userNameLayout.setOnClickListener { + val tipDialog = QMUIDialog.MessageDialogBuilder(activity) + .setTitle("温馨提示") + .setMessage("是否确定退出?") + .addAction("暂不退出") { dialog, index -> + dialog.dismiss() + } + .addAction("立即退出") { dialog, index -> + dialog.dismiss() + User.clearUserInfo() + LoginActivity.active(act) + activity?.apply { + ActivityUtils.finishActivity(this) + } + } + .create() + tipDialog.show() + tipDialog.hideNavigationBar() + } + + styleImg0.setOnClickListener { + LogUtils.d("styleImg0Click", this.imgIndex) + previewImg(0, it) + } + styleImg1.setOnClickListener { + previewImg(1, it) + } + styleImg2.setOnClickListener { + previewImg(2, it) + } + styleImg3.setOnClickListener { + previewImg(3, it) + } + + classNameLayout.setOnClickListener { + val builder = QMUIDialog.MenuDialogBuilder(ctx) + headClassList.forEach { + builder.addItem( + "${it.grade_name}${it.class_name}" + ) { dialog, which -> + LogUtils.d("itemClick", which) + currClass = headClassList[which] + showLoading("加载中...") + getOtherData() + dialog.dismiss() + classNameTv.text = "${currClass.grade_name}${currClass.class_name}" + SPUtils.getInstance().put("local_class_id", currClass.class_id) + } + } + builder.show() + } +// mViewPager = find(R.id.bottomBannerView) +// mViewPager.setLifecycleRegistry(lifecycle) +// .setAdapter(BannerAdapter()) +// .setPageStyle(PageStyle.MULTI_PAGE_SCALE,1f) +// .setInterval(6000) +// .setScrollDuration(500) +// .setRevealWidth(dip(300)) +// .setPageMargin(dip(20)) +// .create() + } + + private fun previewImg(imgIndex: Int, view: View) { +// val url = +// styleImgList[this.imgIndex + imgIndex].identity.getImgUrl(styleImgList[this.imgIndex + imgIndex].picture_id) + val url = view.getTag(R.id.image_src_tag).toString() + LogUtils.d("previewImg", imgIndex) + val photoPreview = PhotoPreview.with(this) + .sources(styleImgUrlList) + .onDismissListener { + if (this.styleImgList.size > 4) { + styleImgBox.postDelayed(imgLoopRunnable, 6000) + } + } + .build() + photoPreview.setDefaultShowPosition(styleImgUrlList.indexOf(url)) + photoPreview.show(view) + if (imgLoopRunnable != null && this.styleImgList.size > 4) { + styleImgBox.removeCallbacks(imgLoopRunnable) + } + + } + + override fun initData() { + PhotoPreview.setGlobalImageLoader { position, source, imageView -> + Glide.with(imageView) + .load(source.toString()) + .into(imageView) + } + setClassInfo() + mPresenter?.getHeadClassList() + + } + + private fun getClassInfo(){ + mPresenter?.getClassInfo(currClass.class_id.toString()) + LogUtils.d("请求时间",TimeUtils.getNowString()) + } + + private fun getOtherData() { + mPresenter?.getImageInfo(currClass.class_id.toString()) + unitName.postDelayed({ + mPresenter?.getTeaList(currClass.class_id.toString()) + mPresenter?.getTimeTable(currClass.class_id.toString()) + mPresenter?.getActiveInfo(currClass.class_id.toString()) + }, 300) + } + + override fun onHeadClassSuccess(list: MutableList) { + if (list.size > 0) { + LogUtils.d("有班级") + val localClassId = SPUtils.getInstance().getInt("local_class_id", 0) + currClass = if (currClass.class_id > 0) { + list.find { it.class_id == currClass.class_id } ?: list[0] + } else if (localClassId > 0) { + list.find { it.class_id == localClassId } ?: list[0] + } else { + list[0] + } + + headClassList = list + getOtherData() + mClassInfoHandler.removeCallbacks(mClassInfoRunnable) + getClassInfo() + mClassInfoHandler.postDelayed(mClassInfoRunnable,mClassInfoLoopTime) + classNameTv.text = "${currClass.grade_name}${currClass.class_name}" + + classSwIcon.visibility = if (list.size > 1) { + View.VISIBLE + } else { + View.GONE + } + } else { + classSwIcon.visibility = View.GONE + val tipDialog = QMUIDialog.MessageDialogBuilder(activity) + .setTitle("温馨提示") + .setMessage("您没有班主任身份,无法使用电子班牌!") + .addAction("知道了") { dialog, index -> + dialog.dismiss() + User.clearUserInfo() + LoginActivity.active(act) + activity?.apply { + ActivityUtils.finishActivity(this) + } + } + .addAction("立即退出") { dialog, index -> + dialog.dismiss() + User.clearUserInfo() + LoginActivity.active(act) + activity?.apply { + ActivityUtils.finishActivity(this) + } + } + .create() + tipDialog.show() + tipDialog.hideNavigationBar() + } + } + + private fun setClassInfo() { + val user = User.getUser(); + unitName.text = user.unit_name + loginUserNameTv.text = user.user_name + } + + + override fun onAvatarSuccess(identity: String, head_portrait: String) { + headImgView?.setSrc(identity, head_portrait) + } + + override fun onClassInfoSuccess(info: CBClassInfo) { + classTeaNameTv?.let { + classTeaNameTv.text = info.class_teacher.user_name + classStuCountTv.text = "本班人数:${info.class_student_num}人" + faceCountTv.text = "刷脸入校:${info.brushed_face_num}人" + noFaceCountTv.text = "未刷脸:${info.unbrushed_face_num}人" + leaveCountTv.text = "请假:${info.leave_num}人" + + mClassInfoHandler.removeCallbacks(mClassInfoRunnable) + mClassInfoHandler.postDelayed(mClassInfoRunnable,mClassInfoLoopTime) + } + } + + override fun onTeaListSuccess(list: MutableList) { + classTeaListLL.removeAllViews() + list.forEachIndexed { index, it -> + val itemView = + LayoutInflater.from(activity).inflate(R.layout.layout_class_tea_item, null, false) + if (index % 2 == 0) { + itemView.setBackgroundColor(Color.parseColor("#5682ff")) + } else { + itemView.setBackgroundColor(Color.parseColor("#005682ff")) + } + itemView.teaSubjectNameTv.text = it.subject_name + val userName = if (it.type == 1) { + "${it.user_name}(班主任)" + } else { + it.user_name + } + itemView.teaUserNameTv.text = userName + classTeaListLL.addView(itemView) + } + if (list.size == 0) { + val emptyView = + LayoutInflater.from(activity).inflate(R.layout.layout_class_empty, null, false) + classTeaListLL.addView(emptyView) + } + } + + override fun onTimeTableSuccess(list: MutableList) { + timeTableLL.removeAllViews() + list.forEachIndexed { index, it -> + val itemView = + LayoutInflater.from(activity).inflate(R.layout.layout_time_table_item, null, false) + if (index % 2 == 0) { + itemView.setBackgroundColor(Color.parseColor("#33ffffff")) + } else { + itemView.setBackgroundColor(Color.parseColor("#00ffffff")) + } + itemView.lessonNoTv.text = it.lesson_name + itemView.lessonNameTv.text = it.subject_name + timeTableLL.addView(itemView) + } + if (list.size == 0) { + val emptyView = + LayoutInflater.from(activity).inflate(R.layout.layout_class_empty, null, false) + timeTableLL.addView(emptyView) + } + } + + private fun previewActiveImg(item: ClassActiveInfo, view: View) { + val list = item.getImgUrls() + if (list.size <= 0) { + this.showDialogToast("暂无可查看照片", icon = QMUITipDialog.Builder.ICON_TYPE_FAIL) + return + } + val photoPreview = PhotoPreview.with(this) + .sources(list) + .onDismissListener { + + } + .build() + photoPreview.show(view) + } + + private val mActiveList = mutableListOf() + override fun onActiveInfoSuccess(list: MutableList) { + classActiveLL.removeAllViews() + mActiveList.clear() + mActiveList.addAll(list) + list.forEachIndexed { index, it -> + val itemView = + LayoutInflater.from(activity) + .inflate(R.layout.layout_class_active_item, null, false) + itemView.activeContentTv.text = it.getNewContent() + itemView.addTimeTv.text = it.add_time.toTime() + itemView.addUserTv.text = it.user_name + itemView.setTag(R.id.row_index_key, index) + itemView.setOnClickListener { item -> + previewActiveImg(it, item) + } + classActiveLL.addView(itemView) + } + if (list.size == 0) { + val emptyView = + LayoutInflater.from(activity).inflate(R.layout.layout_class_empty, null, false) + classActiveLL.addView(emptyView) + } + } + + override fun onResume() { + setClassInfo() + super.onResume() + } + + override fun onDestroy() { + mTimeHandler.removeCallbacks(timeRunnable) + mClassInfoHandler.removeCallbacks(mClassInfoRunnable) + super.onDestroy() + } + + override fun onImageInfoSuccess(list: MutableList) { + hideLoading() + if (list.size > 0) { + imgEmpty.visibility = View.GONE + styleImgBox.visibility = View.VISIBLE + +// mViewPager.refreshData(list) + } + this.imgIndex = 0 + this.styleImgList.clear() + this.styleImgList.addAll(list) + styleImgUrlList.clear() + list.forEach { + styleImgUrlList.add(it.identity.getImgUrl(it.picture_id)) + } + when { + list.size == 0 -> { + imgEmpty.visibility = View.VISIBLE + styleImgBox.visibility = View.GONE + } + + list.size == 1 -> { + styleImg0.setSrc(list[0].identity, list[0].picture_id) + styleImg0.visibility = View.VISIBLE + styleImgLL.visibility = View.GONE + styleImg1.visibility = View.GONE + styleImg2.visibility = View.GONE + styleImg3.visibility = View.GONE + } + + list.size == 2 -> { + styleImg0.setSrc(list[0].identity, list[0].picture_id) + styleImg1.setSrc(list[1].identity, list[1].picture_id) + styleImg0.visibility = View.VISIBLE + styleImgLL.visibility = View.VISIBLE + styleImg1.visibility = View.VISIBLE + styleImg2.visibility = View.GONE + styleImg3.visibility = View.GONE + } + + list.size == 3 -> { + styleImg0.setSrc(list[0].identity, list[0].picture_id) + styleImg1.setSrc(list[1].identity, list[1].picture_id) + styleImg2.setSrc(list[2].identity, list[2].picture_id) + styleImg0.visibility = View.VISIBLE + styleImgLL.visibility = View.VISIBLE + styleImg1.visibility = View.VISIBLE + styleImg2.visibility = View.VISIBLE + styleImg3.visibility = View.GONE + } + + list.size >= 4 -> { + styleImg0.setSrc(list[0].identity, list[0].picture_id) + styleImg1.setSrc(list[1].identity, list[1].picture_id) + styleImg2.setSrc(list[2].identity, list[2].picture_id) + styleImg3.setSrc(list[3].identity, list[3].picture_id) + styleImg0.visibility = View.VISIBLE + styleImgLL.visibility = View.VISIBLE + styleImg1.visibility = View.VISIBLE + styleImg2.visibility = View.VISIBLE + styleImg3.visibility = View.VISIBLE + } + } + + if (list.size > 4) { + this.imgIndex = 4 +// styleImgBox.removeCallbacks(null) +// this.loopImg(list) + mTimeHandler.removeCallbacks(timeRunnable) + mTimeHandler.postDelayed(timeRunnable,6000) + } + } + + private fun groupingList() { + val topList = mutableListOf() + val bottomList = mutableListOf() + styleImgList.forEachIndexed { index, classStylePic -> + if (index % 4 == 0) { + topList.add(classStylePic) + } else { + bottomList.add(classStylePic) + } + } + } + + + + private fun loopImg(list: MutableList) { + if (this.imgIndex + 3 > list.size - 1) { + this.imgIndex = list.size - 1 - 3 + } + styleImg0?.let { + styleImg0.setSrc(list[this.imgIndex + 0].identity, list[this.imgIndex + 0].picture_id) + styleImg1.setSrc(list[this.imgIndex + 1].identity, list[this.imgIndex + 1].picture_id) + styleImg2.setSrc(list[this.imgIndex + 2].identity, list[this.imgIndex + 2].picture_id) + styleImg3.setSrc(list[this.imgIndex + 3].identity, list[this.imgIndex + 3].picture_id) + this.imgIndex += 4 + if (this.imgIndex > list.size - 1) { + this.imgIndex = 0 + } + styleImg0.visibility = View.VISIBLE + styleImgLL.visibility = View.VISIBLE + styleImg1.visibility = View.VISIBLE + styleImg2.visibility = View.VISIBLE + styleImg3.visibility = View.VISIBLE + } + + } + + override fun initPresenter(): ClassBrandPresenter = ClassBrandPresenter(this) + + override fun onStop() { + super.onStop() + EventBus.getDefault().unregister(this) + } + + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + //接收消息 + @SuppressLint("SetTextI18n") + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: TimeShow) { +// 2023年7月31日17:58:37 星期一 + val time = + TimeUtils.getNowString(TimeUtils.getSafeDateFormat("yyyy年MM月dd日 HH:mm:ss").zhCn()) + timeView.text = "$time ${event.week}" + + if (event.min == "30") { + this.getOtherData() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/fragment/HomeFragment.kt b/app/src/main/java/com/yzx/ebrand/fragment/HomeFragment.kt new file mode 100644 index 0000000..8ce8bfe --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/fragment/HomeFragment.kt @@ -0,0 +1,557 @@ +package com.yzx.ebrand.fragment + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent +import android.graphics.Color +import android.text.Editable +import android.text.TextWatcher +import android.view.KeyEvent +import android.view.View +import android.widget.EditText +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import com.blankj.utilcode.util.* +import com.huantansheng.easyphotos.EasyPhotos +import com.huantansheng.easyphotos.models.album.entity.Photo +import com.qmuiteam.qmui.widget.dialog.QMUIDialog +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import com.yzx.ebrand.R +import com.yzx.ebrand.adapter.HomeListAdapter +import com.yzx.ebrand.fragment.base.BaseFragment +import com.yzx.ebrand.model.* +import com.yzx.ebrand.presenter.HomePresenter +import com.yzx.ebrand.presenter.HomeView +import com.yzx.ebrand.utils.* +import com.yzx.ebrand.widget.BaseDialog +import kotlinx.android.synthetic.main.fragment_home.* +import kotlinx.android.synthetic.main.layout_loading.view.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.jetbrains.anko.find +import org.jetbrains.anko.support.v4.act +import org.jetbrains.anko.support.v4.ctx +import org.jetbrains.anko.support.v4.toast +import org.jetbrains.anko.textColor + + +class HomeFragment : BaseFragment(), HomeView, + NetworkUtils.OnNetworkStatusChangedListener, FileUploadCallBack { + + companion object { + + val CAMER_REQUEST_CODE = 0x01 + + @JvmStatic + fun getNewInstance() = + HomeFragment() + } + + private val mAdapter: HomeListAdapter by lazy { + val list = mutableListOf() + HomeListAdapter(list) + } + + private var mPager = Pager() + var list = mutableListOf() + private val statusBtnList = mutableListOf() + var keyword: String = "" + var status: String = "" + private var isLoading = false + private val mShowList = mutableListOf() + private val mShowDialogList = mutableListOf() + private var mCancelItem: StuLeave? = null + private var mCancelFaceImg: ImageView? = null + private var mDialogVacation: BaseDialog? = null + private val mVacation = Vacation() + private val mVacationAttachment = Attachment("", "", "") + private var isRefresh = false + + private val refreshRun = Runnable { + refreshData() + } + + override val inflateId: Int + get() = R.layout.fragment_home + + override fun initView() { + NetworkUtils.registerNetworkStatusChangedListener(this) + recyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + recyclerView.adapter = mAdapter + + preTxtBtn.setOnClickListener { pre() } + nextTxtBtn.setOnClickListener { next() } + allBtn.setOnClickListener { changeStatus(0) } + status1Btn.setOnClickListener { changeStatus(1) } + status2Btn.setOnClickListener { changeStatus(2) } + status3Btn.setOnClickListener { changeStatus(3) } + status4Btn.setOnClickListener { changeStatus(4) } + status5Btn.setOnClickListener { changeStatus(5) } + statusBtnList.add(allBtn) + statusBtnList.add(status1Btn) + statusBtnList.add(status2Btn) + statusBtnList.add(status3Btn) + statusBtnList.add(status4Btn) + statusBtnList.add(status5Btn) + keywordInput.setOnKeyListener { _, keyCode, _ -> + if (!isLoading) { + if (keyCode == KeyEvent.KEYCODE_ENTER) { + keyword = keywordInput.text.toString() + initData() + KeyboardUtils.hideSoftInput(keywordInput) + } + } + false + } + clearBtn.setOnClickListener { + keyword = "" + keywordInput.setText("") + KeyboardUtils.hideSoftInput(keywordInput) + initData() + } + var lastClickTime = TimeUtils.getNowMills() + mAdapter.setOnItemClickListener { adapter, view, position -> + val curr = TimeUtils.getNowMills() + if(curr - lastClickTime > 500){ + lastClickTime = curr + LogUtils.d("获取详情开始",TimeUtils.getNowMills(),mAdapter.getItem(position).id) + showLayoutLoading() + mPresenter?.getDetail(mAdapter.getItem(position).id) + } + } + + mAdapter.setOnItemChildClickListener { adapter, view, position -> + LogUtils.d("setOnItemChildClickListener", position) + val curr = TimeUtils.getNowMills() + if(curr - lastClickTime > 500){ + lastClickTime = curr + when (view.id) { + R.id.cancelBtn -> { + mCancelItem = mAdapter.getItem(position) + showCancelDialog() + } + R.id.faceEmpty -> { + showLayoutLoading() + mPresenter?.getDetail(mAdapter.getItem(position).id) + } + } + } + } + + + switchBtn.setOnCheckedChangeListener { buttonView, isChecked -> + SPUtils.getInstance().put("auto_show_leave", isChecked) + changeSwitchBtnTxt(isChecked) + EventBus.getDefault().post(AutoSwitchChange(1)) + } + val isAutoShowLeave = SPUtils.getInstance().getBoolean("auto_show_leave", false) + switchBtn.isChecked = isAutoShowLeave + changeSwitchBtnTxt(isAutoShowLeave) + + switchBtnTxt.setOnClickListener { + switchBtn.isChecked = !switchBtn.isChecked + + EventBus.getDefault().post(AutoSwitchChange(1)) + } + keywordInput.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + if (s != null && s.isNotEmpty()) { + clearBtn.visibility = View.VISIBLE + } else { + clearBtn.visibility = View.INVISIBLE + } + } + + override fun afterTextChanged(s: Editable?) { + + } + + }) + filterLayout.setOnClickListener { + KeyboardUtils.hideSoftInput(keywordInput) + } + + btnRefresh.setOnClickListener { + isRefresh = true + showLayoutLoading() + initData() + } + changeStatusBtn(0) + loadingLayout.setOnClickListener { + //do nothing + } + goPageOne.setOnClickListener { + showLayoutLoading() + initData() + } + } + + private fun showLayoutLoading(){ + loadingLayout.visibility = View.VISIBLE + } + + private fun hideLayoutLoading(){ + loadingLayout.visibility = View.GONE + } + + @SuppressLint("SetTextI18n") + private fun showCancelDialog() { + val dialogVacation = BaseDialog(act, R.style.BaseDialog, R.layout.dialog_vacation) + mCancelItem?.apply { + mVacation.id = id + mVacation.vacation_type = 2 + mVacation.vacation_attachment = "" + mVacation.vacation_remark = "电子屏人工销假" + mVacationAttachment.clear() + dialogVacation.find(R.id.leave_student_name).text = leave_student_name + dialogVacation.find(R.id.class_name).text = "${grade_name}${class_name}" + dialogVacation.find(R.id.add_time).text = + "${start_time.toTime()} - ${end_time.toTime()}" + val nowTime = (TimeUtils.getNowMills() / 1000).toInt() + dialogVacation.find(R.id.vacation_time).text = nowTime.toTime() + mVacation.vacation_time = nowTime.toLong() + dialogVacation.find(R.id.vacation_remark).setText(mVacation.vacation_remark) + dialogVacation.find(R.id.cameraBtn).setOnClickListener { onCameraBtnClick() } + mCancelFaceImg = dialogVacation.find(R.id.face_img) + dialogVacation.find(R.id.submitBtn).setOnClickListener { + postVacation() + } + dialogVacation.find(R.id.closeBtn).setOnClickListener { + dialogVacation.dismiss() + } + } + //处理弹窗显示 + dialogVacation.show() + dialogVacation.hideNavigationBar() + mDialogVacation = dialogVacation + } + + private fun postVacation() { + if (mVacationAttachment.id.isNotEmpty()) { + mVacation.vacation_attachment = GsonUtils.toJson(mutableListOf(mVacationAttachment)) + } + showLoading("销假中") + mPresenter?.postVacation(mVacation) + } + + private fun onCameraBtnClick() { + val isGranted = PermissionUtils.isGranted(Manifest.permission.CAMERA) + if (!isGranted) { + PermissionUtils.permission(Manifest.permission.CAMERA) + .callback { isAllGranted, granted, deniedForever, denied -> + if (!isAllGranted) { + val tipDialog = QMUIDialog.MessageDialogBuilder(activity) + .setTitle("温馨提示") + .setMessage("拍照权限被拒绝,请开启权限后重试") + .addAction("取消") { dialog, index -> + dialog.dismiss() + } + .addAction("确定") { dialog, index -> + dialog.dismiss() + PermissionUtils.launchAppDetailsSettings() + } + .create() + tipDialog.show() + tipDialog.hideNavigationBar() + } + } + .request() + } else { + openCamera() + } + } + + private fun openCamera() { + EasyPhotos.createCamera(this, true) + .setFileProviderAuthority("${activity?.packageName}.fileProvider") + .start(CAMER_REQUEST_CODE)//也可以选择链式调用写法 + } + + + private fun changeSwitchBtnTxt(isChecked: Boolean) { + if (isChecked) { + switchBtnTxt.setTextColor(ctx.resources.getColor(R.color.green2)) + } else { + switchBtnTxt.setTextColor(ctx.resources.getColor(R.color.black_3)) + } + } + + @SuppressLint("SetTextI18n") + private fun showLeaveDialog(detail: StuLeave) { + EventBus.getDefault().post(detail) + } + + private fun changeStatusBtn(idx: Int) { + statusBtnList.forEachIndexed { index, button -> + button.isSelected = index == idx + } + } + + private fun changeStatus(status: Int) { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + changeStatusBtn(status) + this.status = if (status == 0) { + "" + } else { + "${status}" + } + showLayoutLoading() + initData() + } + + override fun initData() { + + mPager.page_no = 1 + if (NetworkUtils.isConnected()) { + showEmpty(1) + isLoading = true + mPresenter?.getLeaveList(mPager.page_no, keyword, status) + } else { + showEmpty(2) + } + + } + + /** + * type 1 loading 2 neterror 3 empty + */ + private fun showEmpty(type: Int) { + when (type) { + 1 -> { + mAdapter.setEmptyView(R.layout.layout_loading) + mAdapter.emptyLayout?.apply { + this.QMUIEmptyView.setLoadingShowing(true) + this.QMUIEmptyView.setTitleText("数据加载中") + } + } + 2 -> { + mAdapter.setEmptyView(R.layout.layout_loading) + mAdapter.emptyLayout?.apply { + this.QMUIEmptyView.show(false, null, "网络连接异常,请检查", "去设置") { + NetworkUtils.openWirelessSettings() + } + } + } + 3 -> { + mAdapter.setEmptyView(R.layout.layout_empty) + } + } + + } + + private fun refreshData() { + if (isLoading) { + return + } + isLoading = true + mPresenter?.getLeaveList(mPager.page_no, keyword, status) + } + + private fun pre() { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + if (mPager.page_no <= 1) { + } else { + isLoading = true + showLayoutLoading() + mPresenter?.getLeaveList(mPager.page_no - 1, keyword, status) + } + } + + private fun next() { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + if (mPager.page_no >= mPager.total_pages) { + } else { + isLoading = true + showLayoutLoading() + mPresenter?.getLeaveList(mPager.page_no + 1, keyword, status) + } + } + + override fun initPresenter(): HomePresenter = HomePresenter(this) + + @SuppressLint("SetTextI18n") + override fun onLeaveListSuccess(list: MutableList, pager: Pager) { + pageTv?.apply { + if(isRefresh){ + toast("刷新成功!") + isRefresh = false + } + mAdapter.setList(list) + mPager = pager + pageTv.text = "${pager.page_no} / ${pager.total_pages}" + totalTv.text = "共${pager.total_count}条" + + val disabledColor = Color.parseColor("#666666") + val color = Color.parseColor("#3ca0e9") + if (pager.page_no <= 1) { + preTxtBtn.textColor = disabledColor + goPageOne.visibility = View.GONE + } else { + preTxtBtn.textColor = resources.getColor(R.color.s_app_color_blue) + goPageOne.visibility = View.VISIBLE + } + + if (pager.page_no >= pager.total_pages) { + nextTxtBtn.textColor = disabledColor + } else { + nextTxtBtn.textColor = resources.getColor(R.color.s_app_color_blue) + } + + isLoading = false + showEmpty(3) + hideLayoutLoading() + pageTv.postDelayed({ + refreshData() + }, 30 * 1000) + } + } + + override fun onStop() { + pageTv.removeCallbacks(refreshRun) + super.onStop() + EventBus.getDefault().unregister(this) + } + + override fun onLeaveListError(error: String) { + isLoading = false + hideLayoutLoading() + if(isRefresh){ + toast("刷新失败,请重试!") + isRefresh = false + } + showEmpty(3) + } + + override fun onLeaveDetailSuccess(detail: StuLeave) { + pageTv?.apply { + val item = mShowList.find { it.id == detail.id } + if (item != null) { + //替换新的数据 + val index = mShowList.indexOf(item) + mShowList[index] = detail + + //移除原本的dialog + val dialogIndex = mShowDialogList.indexOfFirst { it.getLeaveId() == item.id } + if (dialogIndex > -1) { + mShowDialogList[dialogIndex].hide() + mShowDialogList.removeAt(dialogIndex) + } + + } else { + mShowList.add(detail) + } + LogUtils.d("获取详情结束",TimeUtils.getNowMills(),detail.id) + hideLayoutLoading() + showLeaveDialog(detail) + } + } + + override fun onLeaveDetailError(error: String) { + hideLayoutLoading() + } + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: MessageEventAuto) { + val list = event.list.filter { it.type == 0 }.toMutableList() + if (list.isNotEmpty() && switchBtn.isChecked) { + onLeaveIDsSuccess(list) + } + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageRefreshEvent(event: RefreshTokenEvent) { + refreshData() + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: TimeShow) { + timeView.setTime(event) + } + + override fun onLeaveIDsSuccess(list: MutableList) { + + list.forEachIndexed { index, leaveID -> + pageTv.postDelayed({ + mPresenter?.getDetail(leaveID.id) + }, 500L * index) + } + } + + override fun postVacationSuccess(msg: String) { + showDialogToast(msg, 2000L) + hideLoading() + mDialogVacation?.apply { + dismiss() + refreshData() + } + } + + override fun postVacationError(msg: String) { + hideLoading() + showDialogToast(msg, 2000L, QMUITipDialog.Builder.ICON_TYPE_FAIL) + } + + override fun onDisconnected() { + + } + + override fun onConnected(networkType: NetworkUtils.NetworkType?) { + refreshData() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK) { + if (requestCode == CAMER_REQUEST_CODE) { + val photos = data?.getParcelableArrayListExtra(EasyPhotos.RESULT_PHOTOS) + LogUtils.d("photos", photos) + photos?.apply { + if (this.size > 0) { + mVacationAttachment.name = this[0].name + FileUpload.upload(this[0].path, this@HomeFragment) + } + } + + } + + } + super.onActivityResult(requestCode, resultCode, data) + } + + override fun onSuccess(identity: String, key: String) { + LogUtils.d(identity, key) + mCancelFaceImg?.setSrc(identity, key) + mVacationAttachment.identity = identity + mVacationAttachment.id = key + } + + override fun onError(msg: String) { + LogUtils.d(msg) + } +} + diff --git a/app/src/main/java/com/yzx/ebrand/fragment/MyFragment.kt b/app/src/main/java/com/yzx/ebrand/fragment/MyFragment.kt new file mode 100644 index 0000000..dfc8aa6 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/fragment/MyFragment.kt @@ -0,0 +1,174 @@ +package com.yzx.ebrand.fragment + +import android.text.InputType +import com.blankj.utilcode.util.KeyboardUtils +import com.blankj.utilcode.util.LogUtils +import com.blankj.utilcode.util.ScreenUtils +import com.qmuiteam.qmui.widget.dialog.QMUIDialog +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog +import com.yzx.ebrand.R +import com.yzx.ebrand.activity.WebActivity +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.fragment.base.BaseFragment +import com.yzx.ebrand.model.TeacherInfo +import com.yzx.ebrand.model.TimeShow +import com.yzx.ebrand.model.User +import com.yzx.ebrand.presenter.MyPresenter +import com.yzx.ebrand.presenter.MyView +import com.yzx.ebrand.utils.hideNavigationBar +import kotlinx.android.synthetic.main.fragment_my.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import kotlin.system.exitProcess + +class MyFragment : BaseFragment(), MyView { + + companion object { + + @JvmStatic + fun getNewInstance() = + MyFragment() + } + + private var count = 0 + private val run = Runnable { + count = 0 + } + + override val inflateId: Int + get() = R.layout.fragment_my + + override fun initView() { + sysExitBtn.setOnClickListener { + count++ + sysExitBtn.removeCallbacks(run) + sysExitBtn.postDelayed(run, 1000) + if (count >= 5) { + showExitDialog() + } + } + } + + private fun showExitDialog() { + val builder = QMUIDialog.EditTextDialogBuilder(activity) + + builder.setPlaceholder("输入密码") + .setTitle("请输入密码") + .setInputType(InputType.TYPE_NUMBER_VARIATION_PASSWORD or InputType.TYPE_CLASS_NUMBER) + .addAction( + "取消" + ) { dialog, index -> + KeyboardUtils.hideSoftInput(builder.editText) + dialog?.dismiss() + } + .addAction( + "确定" + ) { dialog, index -> + val text = builder.editText.text + LogUtils.d(text) + LogUtils.d("112233".equals(text)) + if ("112233" == text.toString()) { + activity?.finish() + exitProcess(0) + } else { +// ToastUtils.showShort("密码不正确") + showPwdErrorTip() + } + } + .setCancelable(false) + .setCanceledOnTouchOutside(false) + val dialog = builder.show() + + dialog.hideNavigationBar() + } + + private fun showPwdErrorTip() { + val tipDialog = QMUITipDialog.Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_FAIL) + .setTipWord("密码错误") + .create() + tipDialog.show() + tipDialog.hideNavigationBar() + sysExitBtn.postDelayed({ + tipDialog.dismiss() + }, 1500) + } + + override fun initData() { + + density.text = + "density:${ScreenUtils.getScreenDensity()},dpi:${ScreenUtils.getScreenDensityDpi()}" + + logoutBtn.setOnClickListener { + activity?.apply { + User.clearUserInfo() + WebActivity.active(this, "${Config.OA_URL}/login?logout=1") + finish() + } + } + } + + override fun onResume() { + super.onResume() + mPresenter?.getTeacherInfo(User.getUser().user_id) + } + + override fun initPresenter(): MyPresenter = MyPresenter(this) + override fun onUserInfoSuccess(info: TeacherInfo) { + userName.text = info.teacher_name + sex.text = when (info.sex) { + 1 -> "男" + 2 -> "女" + else -> "--" + } + phone.text = info.phone + idCard.text = info.card_no + + if (info.teacherUnits.isNotEmpty()) { + val unit = info.teacherUnits[0] + if (unit.teacherUnitGroups.isNotEmpty()) { + val group = unit.teacherUnitGroups[0] + unitName.text = unit.unit_name + groupName.text = group.group_name + jobType.text = if (group.job_type_name.isNotEmpty()) { + group.job_type_name + } else { + "-" + } + isLeader.text = if (group.is_leader == 0) { + "是" + } else { + "否" + } + jobName.text = group.job_name + } + + + } + + } + + override fun onUserInfoError(error: String) { + + } + + + override fun onStop() { + super.onStop() + EventBus.getDefault().unregister(this) + } + + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: TimeShow) { + timeView.setTime(event) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/fragment/VisitorFragment.kt b/app/src/main/java/com/yzx/ebrand/fragment/VisitorFragment.kt new file mode 100644 index 0000000..d7d3c8d --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/fragment/VisitorFragment.kt @@ -0,0 +1,449 @@ +package com.yzx.ebrand.fragment + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Intent +import android.graphics.Color +import android.text.Editable +import android.text.TextWatcher +import android.view.KeyEvent +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.blankj.utilcode.util.* +import com.qmuiteam.qmui.widget.roundwidget.QMUIRoundButton +import com.yzx.ebrand.R +import com.yzx.ebrand.adapter.VisitorListAdapter +import com.yzx.ebrand.fragment.base.BaseFragment +import com.yzx.ebrand.model.* +import com.yzx.ebrand.presenter.VisitorPresenter +import com.yzx.ebrand.presenter.VisitorView +import com.yzx.ebrand.utils.FileUploadCallBack +import com.yzx.ebrand.widget.BaseDialog +import kotlinx.android.synthetic.main.fragment_visitor.* +import kotlinx.android.synthetic.main.layout_loading.view.* +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.jetbrains.anko.support.v4.ctx +import org.jetbrains.anko.support.v4.toast +import org.jetbrains.anko.textColor + + +class VisitorFragment : BaseFragment(), VisitorView, + NetworkUtils.OnNetworkStatusChangedListener, FileUploadCallBack { + + companion object { + + val CAMER_REQUEST_CODE = 0x01 + + @JvmStatic + fun getNewInstance() = + VisitorFragment() + } + + private val mAdapter: VisitorListAdapter by lazy { + val list = mutableListOf() + VisitorListAdapter(list) + } + + private var mPager = Pager() + var list = mutableListOf() + private val statusBtnList = mutableListOf() + var keyword: String = "" + var status: String = "10" + private var isLoading = false + private val mShowList = mutableListOf() + private val mShowDialogList = mutableListOf() + private var isRefresh = false + private var mQrCode: QrCode? = null + + private val refreshRun = Runnable { + refreshData() + } + + override val inflateId: Int + get() = R.layout.fragment_visitor + + override fun initView() { + NetworkUtils.registerNetworkStatusChangedListener(this) + recyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + recyclerView.adapter = mAdapter + + preTxtBtn.setOnClickListener { pre() } + nextTxtBtn.setOnClickListener { next() } + allBtn.setOnClickListener { changeStatus(10, 0) } + status1Btn.setOnClickListener { changeStatus(0, 1) } + status2Btn.setOnClickListener { changeStatus(1, 2) } + status3Btn.setOnClickListener { changeStatus(2, 3) } + status4Btn.setOnClickListener { changeStatus(-1, 4) } + statusBtnList.add(allBtn) + statusBtnList.add(status1Btn) + statusBtnList.add(status2Btn) + statusBtnList.add(status3Btn) + statusBtnList.add(status4Btn) + keywordInput.setOnKeyListener { _, keyCode, _ -> + if (!isLoading) { + if (keyCode == KeyEvent.KEYCODE_ENTER) { + keyword = keywordInput.text.toString() + initData() + KeyboardUtils.hideSoftInput(keywordInput) + } + } + false + } + clearBtn.setOnClickListener { + keyword = "" + keywordInput.setText("") + KeyboardUtils.hideSoftInput(keywordInput) + showLayoutLoading() + initData() + } + var lastClickTime = TimeUtils.getNowMills() + mAdapter.setOnItemClickListener { adapter, view, position -> + val curr = TimeUtils.getNowMills() + if (curr - lastClickTime > 500) { + lastClickTime = curr + mPresenter?.getDetail(mAdapter.getItem(position).id) + } + } + + mAdapter.setOnItemChildClickListener { adapter, view, position -> + LogUtils.d("setOnItemChildClickListener", position) + val curr = TimeUtils.getNowMills() + if (curr - lastClickTime > 500) { + lastClickTime = curr + when (view.id) { + R.id.faceEmpty, R.id.nucleinEmpty, R.id.tripCodeEmpty, R.id.healthCodeEmpty -> { + mPresenter?.getDetail(mAdapter.getItem(position).id) + } + } + } + + } + btnRefresh.setOnClickListener { + isRefresh = true + showLayoutLoading() + initData() + } + + + switchBtn.setOnCheckedChangeListener { buttonView, isChecked -> + SPUtils.getInstance().put("auto_show_visitor", isChecked) + changeSwitchBtnTxt(isChecked) + EventBus.getDefault().post(AutoSwitchChange(2)) + } + val isAutoShowLeave = SPUtils.getInstance().getBoolean("auto_show_visitor", false) + switchBtn.isChecked = isAutoShowLeave + changeSwitchBtnTxt(isAutoShowLeave) + + switchBtnTxt.setOnClickListener { + switchBtn.isChecked = !switchBtn.isChecked + } + + keywordInput.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + if (s != null && s.isNotEmpty()) { + clearBtn.visibility = View.VISIBLE + } else { + clearBtn.visibility = View.INVISIBLE + } + } + + override fun afterTextChanged(s: Editable?) { + + } + + }) + filterLayout.setOnClickListener { + KeyboardUtils.hideSoftInput(keywordInput) + } + codeBtn.setOnClickListener { + showVisitorQRCode() + } + changeStatusBtn(0) + loadingLayout.setOnClickListener { + //do nothing + } + goPageOne.setOnClickListener { + showLayoutLoading() + initData() + } + } + + private fun showLayoutLoading(){ + loadingLayout.visibility = View.VISIBLE + } + + private fun hideLayoutLoading(){ + loadingLayout.visibility = View.GONE + } + + private fun showVisitorQRCode() { + if (mQrCode != null) { + mQrCode?.apply { + EventBus.getDefault().post(ViewImage(1, identity, key)) + } + } else { + mPresenter?.getQrcodeWithAccessToken() + } + } + + + private fun changeSwitchBtnTxt(isChecked: Boolean) { + if (isChecked) { + switchBtnTxt.setTextColor(ctx.resources.getColor(R.color.green2)) + } else { + switchBtnTxt.setTextColor(ctx.resources.getColor(R.color.black_3)) + } + } + + @SuppressLint("SetTextI18n") + private fun showLeaveDialog(detail: Visitor) { + EventBus.getDefault().post(detail) + } + + private fun changeStatusBtn(idx: Int) { + statusBtnList.forEachIndexed { index, button -> + button.isSelected = index == idx + } + } + + private fun changeStatus(status: Int, index: Int) { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + showLayoutLoading() + changeStatusBtn(index) + this.status = "${status}" + initData() + } + + override fun initData() { + + mPager.page_no = 1 + if (NetworkUtils.isConnected()) { + showEmpty(1) + isLoading = true + mPresenter?.getList(mPager.page_no, keyword, status) + } else { + showEmpty(2) + } + + } + + /** + * type 1 loading 2 neterror 3 empty + */ + private fun showEmpty(type: Int) { + when (type) { + 1 -> { + mAdapter.setEmptyView(R.layout.layout_loading) + mAdapter.emptyLayout?.apply { + this.QMUIEmptyView.setLoadingShowing(true) + this.QMUIEmptyView.setTitleText("数据加载中") + } + } + 2 -> { + mAdapter.setEmptyView(R.layout.layout_loading) + mAdapter.emptyLayout?.apply { + this.QMUIEmptyView.show(false, null, "网络连接异常,请检查", "去设置") { + NetworkUtils.openWirelessSettings() + } + } + } + 3 -> { + mAdapter.setEmptyView(R.layout.layout_empty) + } + } + + } + + private fun refreshData() { + if (isLoading) { + return + } + isLoading = true + mPresenter?.getList(mPager.page_no, keyword, status) + } + + private fun pre() { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + if (mPager.page_no <= 1) { + } else { + isLoading = true + hideLayoutLoading() + mPresenter?.getList(mPager.page_no - 1, keyword, status) + } + } + + private fun next() { + KeyboardUtils.hideSoftInput(keywordInput) + if (isLoading) { + return + } + if (mPager.page_no >= mPager.total_pages) { + } else { + isLoading = true + hideLayoutLoading() + mPresenter?.getList(mPager.page_no + 1, keyword, status) + } + } + + override fun initPresenter(): VisitorPresenter = VisitorPresenter(this) + + @SuppressLint("SetTextI18n") + override fun onListSuccess(list: MutableList, pager: Pager) { + pageTv?.apply { + if (isRefresh) { + toast("刷新成功!") + isRefresh = false + } + mAdapter.setList(list) + mPager = pager + pageTv.text = "${pager.page_no} / ${pager.total_pages}" + totalTv.text = "共${pager.total_count}条" + + val disabledColor = Color.parseColor("#666666") + val color = Color.parseColor("#3ca0e9") + if (pager.page_no <= 1) { + preTxtBtn.textColor = disabledColor + goPageOne.visibility = View.GONE + } else { + preTxtBtn.textColor = resources.getColor(R.color.s_app_color_blue) + goPageOne.visibility = View.VISIBLE + } + + if (pager.page_no >= pager.total_pages) { + nextTxtBtn.textColor = disabledColor + } else { + nextTxtBtn.textColor = resources.getColor(R.color.s_app_color_blue) + } + isLoading = false + showEmpty(3) + hideLayoutLoading() + pageTv.postDelayed({ + refreshData() + }, 30 * 1000) + } + } + + override fun onStop() { + pageTv.removeCallbacks(refreshRun) + super.onStop() + EventBus.getDefault().unregister(this) + } + + + override fun onStart() { + super.onStart() + EventBus.getDefault().register(this) + } + + override fun onListError(error: String) { + isLoading = false + if (isRefresh) { + toast("刷新失败,请重试!") + isRefresh = false + } + hideLayoutLoading() + showEmpty(3) + } + + override fun onDetailSuccess(detail: Visitor) { + pageTv?.apply { + val item = mShowList.find { it.id == detail.id } + if (item != null) { + //替换新的数据 + val index = mShowList.indexOf(item) + mShowList[index] = detail + + //移除原本的dialog + val dialogIndex = mShowDialogList.indexOfFirst { it.getLeaveId() == item.id } + if (dialogIndex > -1) { + mShowDialogList[dialogIndex].hide() + mShowDialogList.removeAt(dialogIndex) + } + + } else { + mShowList.add(detail) + } + showLeaveDialog(detail) + } + } + + override fun onDetailError(error: String) { + + } + + override fun onDisconnected() { + + } + + override fun onConnected(networkType: NetworkUtils.NetworkType?) { + refreshData() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (resultCode == Activity.RESULT_OK) { + + + } + super.onActivityResult(requestCode, resultCode, data) + } + + override fun onSuccess(identity: String, key: String) { + LogUtils.d(identity, key) + + } + + override fun onError(msg: String) { + LogUtils.d(msg) + + + } + + override fun onQrCodeSuccess(qrCode: QrCode) { + LogUtils.d(qrCode) + mQrCode = qrCode + EventBus.getDefault().post(ViewImage(1, qrCode.identity, qrCode.key)) + } + + override fun onQrCodeError(error: String) { + toast("二维码获取失败,请重试!") + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: MessageEventAuto) { + val list = event.list.filter { it.type == 1 }.toMutableList() + if (list.isNotEmpty() && switchBtn.isChecked) { + list.forEachIndexed { index, leaveID -> + pageTv.postDelayed({ + mPresenter?.getDetail(leaveID.id) + }, 500L * index) + } + } + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageRefreshEvent(event: RefreshTokenEvent) { + refreshData() + } + + //接收消息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onMessageEvent(event: TimeShow) { + timeView.setTime(event) + } +} + diff --git a/app/src/main/java/com/yzx/ebrand/fragment/base/BaseFragment.kt b/app/src/main/java/com/yzx/ebrand/fragment/base/BaseFragment.kt new file mode 100644 index 0000000..48413a0 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/fragment/base/BaseFragment.kt @@ -0,0 +1,105 @@ +package com.yzx.ebrand.fragment.base + + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.qmuiteam.qmui.widget.dialog.QMUITipDialog +import com.yzx.ebrand.presenter.base.BasePresenter +import com.yzx.ebrand.utils.hideNavigationBar + +/** + * fragment 基类 + */ +abstract class BaseFragment> : Fragment() { + + /** + * 当前页面需要加载的layoutId,等价setContentView + */ + abstract val inflateId: Int + + private var mLoadingDialog: QMUITipDialog? = null + + /** + * 初始化视图操作在这里执行,执行时机为onCreate之后 + */ + abstract fun initView(): Unit + + /** + * 数据初始化在这里执行,执行时机为initView之后 + */ + abstract fun initData(): Unit + + //kotlin 懒加载,在第一次使用Presenter时初始化,这种设计是针对一个View只针对一个Presenter。 + //多个Presenter的情况此处不应该使用泛型 + protected val mPresenter: P? by lazy { initPresenter() } + + abstract fun initPresenter(): P? + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(inflateId, null) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initView() + initData() + } + + override fun onStart() { + super.onStart() + + } + + override fun onStop() { + super.onStop() + + } + + + override fun onDestroy() { + super.onDestroy() + } + + fun showDialogToast( + msg: String, + duration: Long = 1500, + @QMUITipDialog.Builder.IconType icon: Int = QMUITipDialog.Builder.ICON_TYPE_SUCCESS + ) { + val tipDialog = QMUITipDialog.Builder(activity) + .setIconType(icon) + .setTipWord(msg) + .create() + tipDialog.show() + tipDialog.hideNavigationBar() + view?.postDelayed({ + tipDialog.dismiss() + }, duration) + } + + fun showLoading(msg: String = "加载中...") { + mLoadingDialog = QMUITipDialog.Builder(activity) + .setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING) + .setTipWord(msg) + .create() + mLoadingDialog?.apply { + show() + } + } + + fun hideLoading() { + mLoadingDialog?.apply { + if (isShowing) { + dismiss() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/BaseBean.kt b/app/src/main/java/com/yzx/ebrand/model/BaseBean.kt new file mode 100644 index 0000000..adec64c --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/BaseBean.kt @@ -0,0 +1,16 @@ +package com.yzx.ebrand.model + +data class BaseBean( + var code: Int, + var msg: String, + val data: T, + val list: MutableList, + val pager:Pager = Pager() +) + +data class Pager( + var page_no:Int = 1, + val page_size:Int = 0, + val total_pages:Int = 0, + val total_count:Int = 0 +) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/Book.kt b/app/src/main/java/com/yzx/ebrand/model/Book.kt new file mode 100644 index 0000000..91bca39 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/Book.kt @@ -0,0 +1,24 @@ +package com.yzx.ebrand.model + +class Book { + var book_name:String = "" + var file_type:String = "" + var book_file_identity:String = "" + var book_file_id:String = "" + var author:String = "" + var read_requires:String = "" + var read_progress:Float = 0f + var volumes:MutableList = mutableListOf() +} + +class Volumes{ + var id:String = "" + var title:String = "" + var sections:MutableList = mutableListOf() +} + +class Sections{ + var id:String = "" + var title:String = "" + var content:String = "" +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/CBClassInfo.kt b/app/src/main/java/com/yzx/ebrand/model/CBClassInfo.kt new file mode 100644 index 0000000..49cfb2b --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/CBClassInfo.kt @@ -0,0 +1,75 @@ +package com.yzx.ebrand.model + +import com.yzx.ebrand.utils.getImgUrl +import java.net.URLDecoder + +data class CBClassInfo( + val brushed_face_num: Int = 0, + val class_student_num: Int = 0, + val class_teacher: ClassTeacher = ClassTeacher(), + val leave_num: Int = 0, + val unbrushed_face_num: Int = 0, + val user_photo: UserPhoto = UserPhoto() +) + +data class ClassTeacher( + val user_id: Int = 0, + val user_name: String = "" +) + +data class UserPhoto( + val head_portrait: String = "", + val identity: String = "" +) + +data class ClassTeaInfo( + val subject_name: String = "", + val subject_id: String = "", + val user_name: String = "", + val user_id: String = "", + val type: Int = 0, +) + +data class TimeTable( + val lesson_no: Int = 0, + val lesson_name: String = "", + val subject_id: String = "", + val subject_name: String = "", +) + +data class ClassActiveInfo( + val add_time: Int = 0, + val user_name: String = "", + val content: String = "", + val attachments: MutableList = mutableListOf(), +){ + fun getNewContent():String{ + return URLDecoder.decode(content,"UTF-8") + } + + fun getImgUrls():MutableList{ + val list = mutableListOf() + attachments.forEach { + if (it.file_id?.isNotEmpty()) + list.add(it.file_identity.getImgUrl(it.file_id)) + } + return list + } +} + +data class ActiveAttachment( + val file_id: String = "", + val file_identity: String = "", +) + +data class ClassStylePic( + val identity: String = "", + val picture_id: String = "", +) + +data class HeadClassInfo( + val class_id: Int = 0, + val class_name: String = "", + val grade_id: Int = 0, + val grade_name: String = "", +) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/HomeItem.kt b/app/src/main/java/com/yzx/ebrand/model/HomeItem.kt new file mode 100644 index 0000000..afa7849 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/HomeItem.kt @@ -0,0 +1,7 @@ +package com.yzx.ebrand.model + +class HomeItem ( + var title:String, + var img:Int, + var url:String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/MessageEvent.kt b/app/src/main/java/com/yzx/ebrand/model/MessageEvent.kt new file mode 100644 index 0000000..5e36579 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/MessageEvent.kt @@ -0,0 +1,39 @@ +package com.yzx.ebrand.model + +import com.blankj.utilcode.util.TimeUtils +import com.yzx.ebrand.utils.zhCn + +data class MessageEventAuto( + var list: MutableList, + val type: Int = 0 +) + +data class AutoSwitchChange(val type: Int) + +data class RefreshTokenEvent(val token: String) + + +data class TimeShow( + var year: String = "", + var month: String = "", + var day: String = "", + var hour: String = "", + var min: String = "", + var sec: String = "", + var week: String = "" +) { + fun getNowObj(): TimeShow { + //yyyy-MM-dd HH:mm:ss + year = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("yyyy").zhCn()) + month = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("MM").zhCn()) + day = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("dd").zhCn()) + hour = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("HH").zhCn()) + min = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("mm").zhCn()) + sec = TimeUtils.getNowString(TimeUtils.getSafeDateFormat("ss").zhCn()) + week = TimeUtils.getChineseWeek(System.currentTimeMillis()).replace("周", "星期") + return this + } + +} + +data class UserLoginEvent(val isLogin: Boolean = true) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/Note.kt b/app/src/main/java/com/yzx/ebrand/model/Note.kt new file mode 100644 index 0000000..923e204 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/Note.kt @@ -0,0 +1,7 @@ +package com.yzx.ebrand.model + +class Note { + var key:String = "" + var identity:String = "" + var BGid:Int = 0 +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/QrCode.kt b/app/src/main/java/com/yzx/ebrand/model/QrCode.kt new file mode 100644 index 0000000..f068814 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/QrCode.kt @@ -0,0 +1,8 @@ +package com.yzx.ebrand.model +data class QrCode( + val identity: String = "", + val key: String = "" +) +data class AccessToken( + val access_token: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/ReToken.kt b/app/src/main/java/com/yzx/ebrand/model/ReToken.kt new file mode 100644 index 0000000..5219615 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/ReToken.kt @@ -0,0 +1,5 @@ +package com.yzx.ebrand.model + +class ReToken ( + val token:String +) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/StuChange.kt b/app/src/main/java/com/yzx/ebrand/model/StuChange.kt new file mode 100644 index 0000000..fa2bf80 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/StuChange.kt @@ -0,0 +1,209 @@ +package com.yzx.ebrand.model + +import com.yzx.ebrand.config.Config + +data class StuChangeType( + val id: Int = 0, + val label: String = "", + val shortLabel: String = "" +) { + fun getShortLabelVal(): String { + if (shortLabel.isNotEmpty()) { + return shortLabel + } + return label + } +} + +data class StuChange( + val activities: List = mutableListOf(), + val add_time: Int = 0, + val add_user_id: Int = 0, + val add_user_name: String = "", + val attachment: String = "", + val attachments: List = listOf(), + val can_reviewed: Int = 0, + val class_id: Int = 0, + val class_name: String = "", + val end_time: Int = 0, + val face_identity: String = "", + val face_key: String = "", + val grade_id: Int = 0, + val grade_name: String = "", + val headteacher_id: Int = 0, + val id: Int = 0, + val is_cancel_change: Int = 0, + val is_delete: Int = 0, + val is_resume_school: Int = 0, + val new_todo_list_id: Int = 0, + val school_id: Int = 0, + val school_name: String = "", + val sign_identity: String = "", + val sign_key: String = "", + val start_time: Int = 0, + val status: Int = 0, + val status_change_reason: String = "", + val status_change_student_id: Int = 0, + val status_change_student_name: String = "", + val status_change_type: Int = 0, + val status_change_type_name: String = "", + val sub_status: Int = 0, + val target_class_id: Int = 0, + val target_class_name: String = "", + val target_grade_id: Int = 0, + val target_grade_name: String = "", + val target_headteacher_id: Int = 0, + val target_school_id: Int = 0, + val target_school_name: String = "", + val target_status: Int = 0, + val todo_list_id: Int = 0, + val type: Int = 0 +) { + fun getStatusImg(): String { + return when { + getSubStatusName().isNotEmpty() -> { + "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/statuschange/${getSubStatusIcon()}.png" + } + status == 1 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_wait.png" + status == 2 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_pass.png" + status == 3 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_nopass.png" + else -> "" + } + } + + fun getSubStatusIcon( + changeType: Int = status_change_type, + subStatus: Int = sub_status + ): String { + if (is_resume_school == 1) { + return "resume_school" + } + return when (subStatus) { + 0 -> "change0" + else -> { + "${changeType}_${subStatus}" + } + } + } + + fun getSubStatusName( + changeType: Int = status_change_type, + subStatus: Int = sub_status + ): String { + if (status != 2) { + return "" + } + if (is_resume_school == 1) { + return "恢复上学" + } + //其他type 无子状态 + when (changeType) { + Config.STU_CHANGE_STATUS_LEAVE_SCHOOL -> { + return when (subStatus) { + 0 -> { + "未开始" + } + 1 -> { + "休学中" + } + else -> { + "休学结束" + } + } + } + Config.STU_CHANGE_STATUS_OUT_SCHOOL -> { + return when (subStatus) { + 0 -> { + "未开始" + } + else -> { + "已退学" + } + } + } + Config.STU_CHANGE_STATUS_INTROSPECTION -> { + return when (subStatus) { + 0 -> { + "未开始" + } + 1 -> { + "反省中" + } + else -> { + "反省结束" + } + } + } + Config.STU_CHANGE_STATUS_INTERNSHIP -> { + return when (subStatus) { + 0 -> { + "未开始" + } + 1 -> { + "实习中" + } + else -> { + "实习结束" + } + } + } + Config.STU_CHANGE_STATUS_DROP_OUT -> { + return when (subStatus) { + 0 -> { + "未开始" + } + else -> { + "已辍学" + } + } + } + Config.STU_CHANGE_STATUS_TRANSFER_OUT -> { + return when (subStatus) { + 0 -> { + "未开始" + } + else -> { + "已转出" + } + } + } + } + return "" + } + + fun getStep(): List { + return activities.reversed() + } + +} + +data class ChangeActivity( + val activity_name: String = "", + val add_time: Int = 0, + val add_user_id: Int = 0, + val add_user_name: String = "", + val add_user_type: Int = 0, + val approval_comments: String = "", + val approval_status: Int = 0, + val approve_node: Int = 0, + val approve_sort: Int = 0, + val approve_user_type: Int = 0, + val approve_way: Int = 0, + val id: Int = 0, + val is_approve: Int = 0, + val is_auto_pass: Int = 0, + val related_id: Int = 0, + val relation_id: Int = 0, + val report_end_date: Int = 0, + val report_start_date: Int = 0, + val role_type: Int = 0, + val school_name: String = "", + val sign_identity: String = "", + val sign_key: String? = "", + val status: Int = 0, + val sub_type: String = "", + val type: Int = 0, + val unit_id: Int = 0, + val unit_name: String = "", + val vacation_type: Int = 0 +) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/StuLeave.kt b/app/src/main/java/com/yzx/ebrand/model/StuLeave.kt new file mode 100644 index 0000000..269c2cd --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/StuLeave.kt @@ -0,0 +1,199 @@ +package com.yzx.ebrand.model + +import android.os.Parcelable +import com.yzx.ebrand.utils.durationStr +import kotlinx.android.parcel.Parcelize + +@Parcelize +data class StuLeave( + val activities: MutableList = mutableListOf(), + val add_time: Int = 0, + val add_user_id: Int = 0, + val add_user_name: String = "", + val add_user_type: Int = 0, + val approve_time: Int = 0, + val can_reviewed: Int = 0, + val class_id: Int = 0, + val class_name: String = "", + val copy_recipients: String = "", + val end_time: Int = 0, + val entry_flag: Int = 0, + val face_identity: String = "", + val face_key: String = "", + val ftime: Int = 0, + val grade_id: Int = 0, + val grade_name: String = "", + val headteacher_id: Int = 0, + val id: Int = 0, + val is_cancel_leave: Int = 0, + val leave_request_reason: String = "", + val leave_request_type: Int = 0, + val leave_request_type_name: String = "", + val leave_student_id: Int = 0, + val leave_student_name: String = "", + val relation_id: Int = 0, + val school_id: Int = 0, + val school_name: String = "", + val start_time: Int = 0, + val status: Int = 0, + val todo_list_id: Int = 0, + val todo_status: Int = 0 +) : Parcelable { + + fun getStep(): MutableList { + val logList = mutableListOf() + for (item in activities) { + if (item.child.isNotEmpty()) { + for (it in item.child) { + it.activity_name = when (it.approve_user_type) { + 0 -> "领导审批" + 1 -> "自选" + 2 -> if (it.role_type == 3) { + "班主任审批" + } else { + "任课老师审批" + } + 3 -> "专业部领导审批" + 4 -> "值班领导审批" + else -> "领导审批" + } + } + val approvedList = item.child.filter { + return@filter it.approval_status > 1 + } + if (approvedList.isNotEmpty()) { + if (item.approve_way == 2) { + logList.addAll(approvedList) + } else { + logList.addAll(item.child) + } + } else { + item.activity_name = when (item.approve_user_type) { + 0 -> "领导审批" + 1 -> "自选" + 2 -> if (item.role_type == 3) { + "班主任审批" + } else { + "任课老师审批" + } + 3 -> "专业部领导审批" + 4 -> "值班领导审批" + else -> "领导审批" + } + if (item.child.size > 1) { + item.activity_name += when (item.approve_way) { + 0 -> "(依次审批)" + 1 -> "(会签)" + 2 -> "(或签)" + else -> "" + } + } + item.add_user_name = item.child.map { + return@map it.add_user_name + }.joinToString(separator = "、") + + item.approval_status = 1 + item.is_approve = 1 + logList.add(item) + } + } else if (item.is_approve == 0) { //提交人 + if (item.activity_name.contains("并直接通过") || item.is_auto_pass == 1) { + item.activity_name = "提交申请(直接通过)" + } else { + item.activity_name = "提交申请" + } + if (item.add_user_type == 0) { + item.add_user_type_name = "老师" + } else if (item.add_user_type == 1) { + item.add_user_type_name = "学生家长" + } + logList.add(item) + } else if (item.is_approve == 2) { //学生返校销假 + if (item.vacation_type == 2) { //销假/返校类型(1自动销假 2老师操作销假) + val remark = item.approval_comments + item.approval_comments = "人工销假,销假操作人:${item.add_user_name}。" + if (item.add_time > end_time) { //超时 + item.approval_comments += "超出请假时长:${(item.add_time - end_time).durationStr()}。" + item.color = "#ff4040" + } + if (remark.isNotEmpty()) { + item.approval_comments += "备注:${remark}" + } + } else if (item.vacation_type == 1) { + item.approval_comments = "刷脸进校,自动销假。" + if (item.add_time > end_time) { //超时 + item.approval_comments += "超出请假时长:${(item.add_time - end_time).durationStr()}。" + item.color = "#ff4040" + } + }else if(item.vacation_type == 3){ + item.approval_comments = "系统自动销假。" + } + logList.add(item) + } + } + + return logList + } +} + +@Parcelize +data class LeaveID(var id: Int,var type:Int) : Parcelable +@Parcelize +data class LeaveActivity( + var activity_name: String = "", + var add_time: Int = 0, + var add_user_id: Int = 0, + var add_user_name: String = "", + var add_user_type: Int = 0, + var approval_comments: String = "", + var approval_status: Int = 0, + var approve_node: Int = 0, + var approve_sort: Int = 0, + var approve_user_type: Int = 0, + var approve_way: Int = 0, + var child: MutableList = mutableListOf(), + var id: Int = 0, + var is_approve: Int = 0, + var related_id: Int = 0, + var relation_id: Int = 0, + var report_end_date: Int = 0, + var report_start_date: Int = 0, + var role_type: Int = 0, + var school_name: String = "", + var sign_identity: String = "", + var sign_key: String = "", + var status: Int = 0, + var sub_type: Int = 0, + var type: Int = 0, + var unit_id: Int = 0, + var unit_name: String = "", + var add_user_type_name: String = "", + var is_auto_pass: Int = 0, + var vacation_type: Int = 0, + var color: String = "", + val face_infos: MutableList = mutableListOf() +) : Parcelable { + fun getInImg(): FaceInfo? { + val imgList = face_infos.filter { it.isImg() } + if (imgList.isNotEmpty()) { + return imgList[0] + } + return null + } +} +@Parcelize +data class FaceInfo( + var attachment_name: String = "", + var attachment_id: String = "", + var identity: String = "" +) : Parcelable { + fun isImg(): Boolean { + if (attachment_name.isNullOrBlank()) { + return false + } + if (attachment_name.endsWith(".jpg", true) || attachment_name.endsWith(".png", true)) { + return true + } + return false + } +} diff --git a/app/src/main/java/com/yzx/ebrand/model/TabEntity.kt b/app/src/main/java/com/yzx/ebrand/model/TabEntity.kt new file mode 100644 index 0000000..ac969e1 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/TabEntity.kt @@ -0,0 +1,21 @@ +package com.yzx.ebrand.model + +import com.flyco.tablayout.listener.CustomTabEntity + +data class TabEntity(var title: String, + var selectedIcon: Int, + var unSelectedIcon: Int) : + CustomTabEntity { + override fun getTabTitle(): String { + return title + } + + override fun getTabSelectedIcon(): Int { + return selectedIcon + } + + override fun getTabUnselectedIcon(): Int { + return unSelectedIcon + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/TeacherInfo.kt b/app/src/main/java/com/yzx/ebrand/model/TeacherInfo.kt new file mode 100644 index 0000000..a6ad1e2 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/TeacherInfo.kt @@ -0,0 +1,102 @@ +package com.yzx.ebrand.model + +data class TeacherInfo( + val academic_degree: Int = 0, + val academic_degree_describe: String = "", + val add_time: Int = 0, + val age: Int = 0, + val audit_remark: String = "", + val audit_status: Int = 0, + val audit_user_id: Int = 0, + val audit_user_name: String = "", + val birth_place: String = "", + val birth_place_json: String = "", + val birthday: String = "", + val card_no: String = "", + val card_no_type: Int = 0, + val degree_id: Int = 0, + val editing_time: Int = 0, + val face_add_time: Int = 0, + val face_identity: String = "", + val face_key: String = "", + val first_part: Int = 0, + val first_part_describe: Int = 0, + val first_part_time: Int = 0, + val head_portrait: String = "", + val is_commit: Int = 0, + val is_remind_commit: Int = 0, + val is_retire_time: Int = 0, + val is_show_btn: Int = 0, + val is_syn: Int = 0, + val marry_status_id: Int = 0, + val nation: Int = 0, + val native_place: String = "", + val native_place_json: String = "", + val nick_name: String = "", + val not_incumbency_time: Int = 0, + val people_identity: Int = 0, + val people_source_describe: Int = 0, + val people_source_type: Int = 0, + val people_type: Int = 0, + val phone: String = "", + val professional: String = "", + val retire_remark: String = "", + val retire_time: Long = 0, + val salary_unit_id: Int = 0, + val school_id: Int = 0, + val second_part: Int = 0, + val second_part_describe: Int = 0, + val second_part_time: Int = 0, + val sex: Int = 0, + val status: Int = 0, + val teach_curriculum: String = "", + val teach_interval_time: Int = 0, + val teach_period: Int = 0, + val teach_start_time: String = "", + val teach_years: Int = 0, + val teacherUnits: List = listOf(), + val teacher_id: Int = 0, + val teacher_name: String = "", + val teacher_school_status: Int = 0, + val urgent_phone: String = "", + val user_id: Int = 0, + val user_type: Int = 0, + val work_interval_time: Int = 0, + val work_start_time: String = "", + val work_years: Int = 0 +) + +data class TeacherUnit( + val add_time: Int = 0, + val id: Int = 0, + val into_unit_time: Int = 0, + val is_salary_unit: Int = 0, + val post_level: Int = 0, + val post_level_name: String = "", + val status: Int = 0, + val teacherUnitGroups: List = listOf(), + val title: Int = 0, + val title_name: String = "", + val unit_id: Int = 0, + val unit_main: Int = 0, + val unit_main_describe: Int = 0, + val unit_main_type: Int = 0, + val unit_name: String = "", + val user_id: Int = 0 +) + +data class TeacherUnitGroup( + val add_time: Int = 0, + val group_id: Int = 0, + val group_ids: String = "", + val group_name: String = "", + val id: Int = 0, + val is_leader: Int = 0, + val job_name: String = "", + val job_name_id: Int = 0, + val job_status: Int = 0, + val job_type: Int = 0, + val job_type_name: String = "", + val status: Int = 0, + val teacher_unit_id: Int = 0 +) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/UploadBean.kt b/app/src/main/java/com/yzx/ebrand/model/UploadBean.kt new file mode 100644 index 0000000..4072d8c --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/UploadBean.kt @@ -0,0 +1,13 @@ +package com.yzx.ebrand.model + +class UploadBean { + var code:Int = 0 + var msg:String = "" + var content:UploadContent = UploadContent() +} + +class UploadContent{ + var identity:String = "" + var key:String = "" + var file_size:String = "" +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/User.kt b/app/src/main/java/com/yzx/ebrand/model/User.kt new file mode 100644 index 0000000..37952e1 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/User.kt @@ -0,0 +1,105 @@ +package com.yzx.ebrand.model + +import com.blankj.utilcode.util.SPUtils +import com.blankj.utilcode.util.TimeUtils + +class BaseUser(var token: String, + var type:Int, + var role:String, + var user_id:Int, + var unit_id:Int, + var school_id:Int, + var unit_name:String, + var school_name:String, + var direct_login:Int, + var tmp_token:String, + var phone:String, +) + +class UserAvatar(val identity:String,val head_portrait:String) + +class WxQrTicket(val ticket:String) + +class User( + var user_name: String, + var user_id: Int, + var account_type: Int, + var role: String, + var token: String, + var school_id: Int, + var phone: String, + var ticket: String, + var loginTime: Long, + var unit_name:String, + var school_name:String, +) { + fun save() { + val sp = SPUtils.getInstance() + sp.put("user_name", user_name) + sp.put("user_id", user_id) + sp.put("token", token) + sp.put("school_id", school_id) + sp.put("phone", phone) + sp.put("ticket", ticket) + sp.put("account_type", account_type) + sp.put("role", role) + sp.put("loginTime", TimeUtils.getNowMills()) + sp.put("unit_name", if (unit_name.isNullOrBlank()){school_name}else{unit_name}) + } + + companion object { + fun getUser(): User { + val sp = SPUtils.getInstance() + return User( + sp.getString("user_name", ""), + sp.getInt("user_id", 0), + sp.getInt("account_type", 0), + sp.getString("role", ""), + sp.getString("token", ""), + sp.getInt("school_id", 0), + sp.getString("phone", ""), + sp.getString("ticket", ""), + sp.getLong("loginTime", 0), + sp.getString("unit_name", ""), + sp.getString("unit_name", ""), + ) + } + + fun isLogin(): Boolean { + val now = TimeUtils.getNowMills() + val user = getUser() + if (user.token.isNullOrBlank()) { + return false + } + if (now - user.loginTime > 24 * 60 * 60 * 1000) { + return false + } + return true + } + + fun getUnitCount(): Int = SPUtils.getInstance().getInt("unit_count", 1) + + fun saveUnitCount(count: Int) { + SPUtils.getInstance().put("unit_count", count); + } + + fun saveLastLoginTime(time:Long){ + val sp = SPUtils.getInstance() + sp.put("loginTime", time) + } + + fun clearUserInfo() { + val sp = SPUtils.getInstance() + sp.remove("user_name") + sp.remove("user_id") + sp.remove("account_type") + sp.remove("role") + sp.remove("token") + sp.remove("school_id") + sp.remove("phone") + sp.remove("ticket") + sp.remove("loginTime") + sp.remove("unit_name") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/Vacation.kt b/app/src/main/java/com/yzx/ebrand/model/Vacation.kt new file mode 100644 index 0000000..2c7f682 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/Vacation.kt @@ -0,0 +1,21 @@ +package com.yzx.ebrand.model + +data class Vacation( + var vacation_time: Long = 0, + var vacation_type: Int = 2, + var vacation_remark: String = "", + var vacation_attachment: String = "", + var id: Int = 0 +) + +data class Attachment( + var name: String, + var id: String, + var identity: String +){ + fun clear(){ + name ="" + id ="" + identity ="" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/Version.kt b/app/src/main/java/com/yzx/ebrand/model/Version.kt new file mode 100644 index 0000000..30bbd18 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/Version.kt @@ -0,0 +1,11 @@ +package com.yzx.ebrand.model + +class Version { + var version: String = "" + var version_code: Int = 0 + var id: Int = 0 + var type: Int = 0 + var explain: String = "" + var app_src: String = "" + var status: Int = 0 +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/ViewImage.kt b/app/src/main/java/com/yzx/ebrand/model/ViewImage.kt new file mode 100644 index 0000000..51baa2b --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/ViewImage.kt @@ -0,0 +1,7 @@ +package com.yzx.ebrand.model + +data class ViewImage( + val id: Int = 0, + val identity: String = "", + val key: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/Visitor.kt b/app/src/main/java/com/yzx/ebrand/model/Visitor.kt new file mode 100644 index 0000000..a5fdc7a --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/Visitor.kt @@ -0,0 +1,113 @@ +package com.yzx.ebrand.model + +import kotlin.math.abs + +data class Visitor( + val add_time: Int = 0, + val auditRecordOuts: MutableList = mutableListOf(), + val audit_status: Int = 0, + val car_in_time: Int = 0, + val car_out_time: Int = 0, + val card_no: String = "", + val end_time: Int = 0, + val face_identity: String = "", + val face_key: String = "", + val health_code_identity: String = "", + val health_code_key: String = "", + val health_code_status: Int = -1, + val history_num: Int = 0, + val id: Int = 0, + val in_out_num: Int = 0, + val is_drive: Int = 0, + val license_plate: String = "", + val positionNums: List = mutableListOf(), + val position_id: Int = 0, + val reception_user: String = "", + val reception_user_id: Int = 0, + val start_time: Int = 0, + val trip_code_identity: String = "", + val trip_code_key: String = "", + val user_id: Int = 0, + val user_name: String = "", + val user_phone: String = "", + val user_type: Int = 0, + val visit_reason: String = "", + val nuclein_file_key: String = "", + val nuclein_file_identity: String = "", + val nuclein_time: Int = 0, + val nuclein_result: Int = 0 +) { + fun getStatusImg(): String { + return when (audit_status) { + 0 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/v_status_0.png" + 1 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/v_status_1.png" + 2 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/v_status_2.png" + -1 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/v_status_-1.png" + else -> "--" + } + } + + fun getStep(): MutableList { + val list = mutableListOf() + list.add(AuditRecordOut(add_time = add_time, typeTxt = "发起申请")) + auditRecordOuts.forEach { + list.add(it.getCopyItem()) + } + return list + } + + fun getNucleinStatusObj(): NucleinStatusObj { + val time = abs(add_time - nuclein_time) + val nucleinResultName = if (nuclein_result == 2) { + "阳性" + } else { + "阴性" + } + var name = "" + var color = "#5DAD64" + when { + time < 24 * 60 * 60 -> { + name = "省内24小时:${nucleinResultName}" + color = "#5DAD64"; + } + time < 48 * 60 * 60 -> { + name = "省内48小时:${nucleinResultName}" + color = "#3c7ef6"; + } + time < 72 * 60 * 60 -> { + name = "省内72小时:${nucleinResultName}" + color = "#62D5FF"; + } + else -> { + name = "省内72小时以上:${nucleinResultName}" + color = "#999999"; + } + } + if (nuclein_result == 2) { + color = "#ff4040" + } + return NucleinStatusObj(name, color) + } +} + +data class NucleinStatusObj(val nuclein_name: String = "", + val nuclein_color: String = "#333333") +data class AuditRecordOut( + val add_time: Int = 0, + val audit_remark: String = "", + val audit_status: Int = 0, + val audit_user_name: String = "", + val typeTxt: String = "", + val id: Int = 0 +) { + fun getTitle(): String { + if (typeTxt.isNotEmpty()) { + return typeTxt + } + return "接待人审批" + } + + fun getCopyItem(): AuditRecordOut { + return AuditRecordOut(add_time, audit_remark, audit_status, audit_user_name, typeTxt, id) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/model/YzxClientInfo.kt b/app/src/main/java/com/yzx/ebrand/model/YzxClientInfo.kt new file mode 100644 index 0000000..52bb867 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/model/YzxClientInfo.kt @@ -0,0 +1,25 @@ +package com.yzx.ebrand.model + +import com.blankj.utilcode.util.TimeUtils + +class YzxClientInfo { + var type: Int = 0 + var user_id: String = "" + var unit_id: String = "" + var token: String = "" + var service_timestamp: Long = 0 + var data: MsgStu = MsgStu() +} + +data class MsgStu(val unit_id: Int = 0, val student_id: Int = 0) + + +data class YzxHeart( + val type: Int = 70, + val msg: String = "heart", + val timestamp: String = "" +) { + fun getYzxHeader(): YzxHeart { + return YzxHeart(timestamp = TimeUtils.getNowString()) + } +} diff --git a/app/src/main/java/com/yzx/ebrand/presenter/ChangePresenter.kt b/app/src/main/java/com/yzx/ebrand/presenter/ChangePresenter.kt new file mode 100644 index 0000000..7f763a6 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/ChangePresenter.kt @@ -0,0 +1,77 @@ +package com.yzx.ebrand.presenter + +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.model.* +import com.yzx.ebrand.presenter.base.* +import com.yzx.ebrand.config.YzxInterface + +class ChangePresenter(view: ChangeView) : BasePresenter(view) { + + + fun getList(pageNo: Int, keyword: String, status: String) { + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_STUDENT_GET_CHANGE_LIST}" + OkGo.post>(url) + .tag(this) + .params("keyword", keyword) + .params("status", status) + .params("page_size", 6) + .params("page_no", pageNo) + .execute(object : JsonCallBack>() { + + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onListSuccess(response.body().list, response.body().pager) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onListError(response?.body()?.msg ?: "") + } + }) + } + fun getDetail(id: Int) { + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_STUDENT_GET_CHANGE_DETAIL}" + OkGo.post>(url) + .tag(this) + .params("id", id) + .execute(object : JsonCallBack>() { + + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onDetailSuccess(response.body().data) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onDetailError(response?.body()?.msg ?: "") + } + }) + } + + + +} + +interface ChangeView : IView { + fun onListSuccess(list: MutableList, pager: Pager) + fun onListError(error: String) + fun onDetailSuccess(detail: StuChange) + fun onDetailError(error: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/presenter/ClassBrandPresenter.kt b/app/src/main/java/com/yzx/ebrand/presenter/ClassBrandPresenter.kt new file mode 100644 index 0000000..12b4992 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/ClassBrandPresenter.kt @@ -0,0 +1,176 @@ +package com.yzx.ebrand.presenter + +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.config.YzxInterface +import com.yzx.ebrand.model.CBClassInfo +import com.yzx.ebrand.model.ClassActiveInfo +import com.yzx.ebrand.model.ClassStylePic +import com.yzx.ebrand.model.ClassTeaInfo +import com.yzx.ebrand.model.HeadClassInfo +import com.yzx.ebrand.model.TimeTable +import com.yzx.ebrand.model.User +import com.yzx.ebrand.presenter.base.BasePresenter +import com.yzx.ebrand.presenter.base.IView +import com.yzx.ebrand.presenter.base.JsonCallBack +import com.yzx.ebrand.presenter.base.YzxResponse + +class ClassBrandPresenter(view: ClassBrandView) : BasePresenter(view) { + fun getHeadClassList(){ + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_GET_VOTE_TEA_CLASS}" + OkGo.post>(url) + .tag(this) + .execute(object : JsonCallBack>() { + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onHeadClassSuccess(response.body().list) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + } + }) + } + fun getClassInfo(class_id:String){ + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_CLASS_BRAND_CLASS_INFO}" + OkGo.post>(url) + .tag(this) + .params("class_id", class_id) + .execute(object : JsonCallBack>() { + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + val info = response.body().data + mView?.onAvatarSuccess(info.user_photo.identity,info.user_photo.head_portrait) + mView?.onClassInfoSuccess(response.body().data) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) +// mView?.onListError(response?.body()?.msg ?: "") + } + }) + } + + fun getTeaList(class_id: String){ + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_CLASS_BRAND_TEA_INFO}" + OkGo.post>(url) + .tag(this) + .params("class_id", class_id) + .execute(object : JsonCallBack>() { + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onTeaListSuccess(response.body().list) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) +// mView?.onListError(response?.body()?.msg ?: "") + } + }) + } + + fun getTimeTable(class_id: String){ + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_CLASS_BRAND_TIME_TABLE_INFO}" + OkGo.post>(url) + .tag(this) + .params("class_id", class_id) + .execute(object : JsonCallBack>() { + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onTimeTableSuccess(response.body().list) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + } + }) + } + + fun getActiveInfo(class_id:String){ + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_CLASS_BRAND_ACTIVE_INFO}" + OkGo.post>(url) + .tag(this) + .params("class_id", class_id) + .execute(object : JsonCallBack>() { + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onActiveInfoSuccess(response.body().list) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + } + }) + } + + fun getImageInfo(class_id: String){ + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_CLASS_BRAND_IMAGE_INFO}" + OkGo.post>(url) + .tag(this) + .params("class_id", class_id) + .execute(object : JsonCallBack>() { + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onImageInfoSuccess(response.body().list) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + } + }) + } +} + +interface ClassBrandView : IView { + fun onHeadClassSuccess(list:MutableList) + fun onAvatarSuccess(identity:String,head_portrait:String) + fun onClassInfoSuccess(info: CBClassInfo) + fun onTeaListSuccess(list:MutableList) + fun onTimeTableSuccess(list:MutableList) + fun onActiveInfoSuccess(list:MutableList) + fun onImageInfoSuccess(list: MutableList) +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/presenter/HomePresenter.kt b/app/src/main/java/com/yzx/ebrand/presenter/HomePresenter.kt new file mode 100644 index 0000000..a8a17a8 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/HomePresenter.kt @@ -0,0 +1,131 @@ +package com.yzx.ebrand.presenter + +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.model.* +import com.yzx.ebrand.presenter.base.* +import com.yzx.ebrand.config.YzxInterface + +class HomePresenter(view: HomeView) : BasePresenter(view) { + + + fun getLeaveList(pageNo: Int, keyword: String, status: String) { + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_GET_STU_LEAVE_LIST}" + OkGo.post>(url) + .tag(this) + .params("keyword", keyword) + .params("status", status) + .params("page_size", 6) + .params("page_no", pageNo) + .execute(object : JsonCallBack>() { + + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onLeaveListSuccess(response.body().list, response.body().pager) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onLeaveListError(response?.body()?.msg ?: "") + } + }) + } + fun getLeaveShowIds() { + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_STUDENT_GET_SHOW_BOX_LIST}" + OkGo.post>(url) + .tag(this) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + mView?.onLeaveIDsSuccess(response.body().list) + LogUtils.d("getLeaveShowIds",response.body().list) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onLeaveListError(response?.body()?.msg ?: "") + } + }) + } + + fun getDetail(id: Int) { + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_GET_STU_LEAVE_INFO_DETAIL}" + OkGo.post>(url) + .tag(this) + .params("id", id) + .execute(object : JsonCallBack>() { + + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onLeaveDetailSuccess(response.body().data) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onLeaveDetailError(response?.body()?.msg ?: "") + } + }) + } + + fun postVacation(data:Vacation){ + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_STUDENT_POST_LEAVE_VACATION}" + OkGo.post(url) + .tag(this) + .params("id", data.id) + .params("vacation_type", data.vacation_type) + .params("vacation_time", data.vacation_time) + .params("vacation_remark", data.vacation_remark) + .params("vacation_attachment", data.vacation_attachment) + .execute(object : JsonCallBack() { + + + override fun onSuccess(response: Response?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.postVacationSuccess("销假成功!") + } + } + + override fun onError(response: Response?) { + super.onError(response) + LogUtils.d(response) + mView?.postVacationError(response?.body()?.msg ?: "销假失败,请重试!") + } + }) + } + +} + +interface HomeView : IView { + fun onLeaveListSuccess(list: MutableList, pager: Pager) + fun onLeaveListError(error: String) + fun onLeaveDetailSuccess(detail: StuLeave) + fun onLeaveDetailError(error: String) + fun onLeaveIDsSuccess(list: MutableList) + fun postVacationSuccess(msg: String) + fun postVacationError(msg: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/presenter/LoginPresenter.kt b/app/src/main/java/com/yzx/ebrand/presenter/LoginPresenter.kt new file mode 100644 index 0000000..17c495d --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/LoginPresenter.kt @@ -0,0 +1,207 @@ +package com.yzx.ebrand.presenter + +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.config.YzxInterface +import com.yzx.ebrand.model.BaseUser +import com.yzx.ebrand.model.User +import com.yzx.ebrand.model.WxQrTicket +import com.yzx.ebrand.presenter.base.BasePresenter +import com.yzx.ebrand.presenter.base.IView +import com.yzx.ebrand.presenter.base.JsonCallBack +import com.yzx.ebrand.presenter.base.YzxResponse + +class LoginPresenter(view: LoginView) : BasePresenter(view) { + fun login(phone: String, psw: String) { + val url = Config.BASE_URL + YzxInterface.INTERFACE_LOGIN_ALL + OkGo.post>(url) + .tag(this) + .params("phone", phone) + .params("password", psw) + .params("original_password", psw) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + mView?.onLoginSuccess(response.body().data, response.body().list) + LogUtils.d("login", response.body().list) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onLoginError(response?.body()?.msg ?: "") + } + }) + } + + fun switchUser(token: String, user_id: Int, unit_id: Int) { + val url = Config.BASE_URL + YzxInterface.INTERFACE_USER_SWITCH + OkGo.post>(url) + .tag(this) + .params("token", token) + .params("user_id", user_id) + .params("unit_id", unit_id) + .params("type", 0) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + response.body().data.save() + getUserLoginInfo(response.body().data.token) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onLoginError(response?.body()?.msg ?: "") + } + }) + } + + fun switchUnit(user_id: Int, school_id: Int, tmp_token: String) { + val url = Config.BASE_URL + YzxInterface.INTERFACE_USER_SWITCH_UNIT + OkGo.post>(url) + .tag(this) + .params("school_id", school_id) + .params("user_id", user_id) + .params("tmp_token", tmp_token) + .params("client_id", 201) + .params("type", 0) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + getUserLoginInfo(response.body().data.token) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onLoginError(response?.body()?.msg ?: "") + } + }) + } + + fun getUserLoginInfo(token: String) { + val url = Config.BASE_URL + YzxInterface.INTERFACE_COMMON_LOGIN_BY_TOKEN + OkGo.post>(url) + .tag(this) + .params("token", token) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + response.body().data.save() + mView?.onUserInfoSuccess(response.body().data) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onLoginError(response?.body()?.msg ?: "") + } + }) + } + + fun getUserRoleInfoByPhone(phone: String, temp_token: String = "") { + val url = Config.BASE_URL + YzxInterface.INTERFACE_USER_ROLE_LIST_BY_PHONE + OkGo.post>(url) + .tag(this) + .params("phone", phone) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + val teaList = response.body().list.filter { return@filter it.role.toInt() == 0 } + .toMutableList() + teaList.forEach { + it.unit_name = it.school_name + it.unit_id = it.school_id + } + mView?.onUserListSuccess(teaList, temp_token) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onLoginError(response?.body()?.msg ?: "") + } + }) + } + + fun getUserRoleList(token: String) { + val url = Config.BASE_URL + YzxInterface.INTERFACE_USER_ROLE_LIST + OkGo.post>(url) + .tag(this) + .params("token", token) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + val teaList = response.body().list.filter { return@filter it.type == 0 } + .toMutableList() + mView?.onUserListSuccess(teaList, token) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onLoginError(response?.body()?.msg ?: "") + } + }) + } + + fun getWXQrCode() { + val url = Config.BASE_URL + YzxInterface.INTERFACE_GENERATE_WX_QR_TICKET + OkGo.post>(url) + .tag(this) + .params("mp_id", 4) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + val url = + "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=${response.body().data.ticket}" + mView?.onWxQrCodeSuccess(url, response.body().data.ticket) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + } + }) + } + + fun loginQuery(ticket: String) { + val url = Config.BASE_URL + YzxInterface.INTERFACE_WX_DO_LOGIN_QUERY + + OkGo.post>(url) + .tag(this) + .params("ticket", ticket) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + val res = response.body() + mView?.onLoginQuerySuccess(res.data, res.code) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + } + }) + } +} + +interface LoginView : IView { + fun onLoginSuccess(user: BaseUser, list: MutableList) + fun onLoginError(msg: String) + fun onUserInfoSuccess(user: User) + fun onUserListSuccess(list: MutableList, token: String) + fun onWxQrCodeSuccess(imgUrl: String, ticket: String) + fun onLoginQuerySuccess(user: BaseUser, code: Int) +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/presenter/MainPresenter.kt b/app/src/main/java/com/yzx/ebrand/presenter/MainPresenter.kt new file mode 100644 index 0000000..42f7fca --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/MainPresenter.kt @@ -0,0 +1,48 @@ +package com.yzx.ebrand.presenter + +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.config.YzxInterface +import com.yzx.ebrand.model.LeaveID +import com.yzx.ebrand.model.User +import com.yzx.ebrand.presenter.base.BasePresenter +import com.yzx.ebrand.presenter.base.IView +import com.yzx.ebrand.presenter.base.JsonCallBack +import com.yzx.ebrand.presenter.base.YzxResponse + +class MainPresenter(view: MainView) : BasePresenter(view) { + + + fun getLeaveShowIds(student_id: String = "") { + if (User.getUser().token.isEmpty()) { + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_STUDENT_GET_SHOW_BOX_LIST}" + OkGo.post>(url) + .tag(this) + .params("student_id", student_id) + .execute(object : JsonCallBack>() { + override fun onSuccess(response: Response>?) { + if (response?.isSuccessful == true) { + mView?.onLeaveIDsSuccess(response.body().list) + LogUtils.d("getLeaveShowIds", response.body().list) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onLeaveIDsError() + } + }) + } + + +} + +interface MainView : IView { + fun onLeaveIDsSuccess(list: MutableList) + fun onLeaveIDsError() +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/presenter/MyPresenter.kt b/app/src/main/java/com/yzx/ebrand/presenter/MyPresenter.kt new file mode 100644 index 0000000..b07996f --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/MyPresenter.kt @@ -0,0 +1,51 @@ +package com.yzx.ebrand.presenter + +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.model.TeacherInfo +import com.yzx.ebrand.model.User +import com.yzx.ebrand.config.YzxInterface +import com.yzx.ebrand.presenter.base.BasePresenter +import com.yzx.ebrand.presenter.base.IView +import com.yzx.ebrand.presenter.base.JsonCallBack +import com.yzx.ebrand.presenter.base.YzxResponse + +class MyPresenter(view: MyView) : BasePresenter(view) { + + + fun getTeacherInfo(user_id: Int) { + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_GET_TEACHER_INFO}" + OkGo.post>(url) + .tag(this) + .params("user_id", user_id) + .execute(object : JsonCallBack>() { + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onUserInfoSuccess(response.body().data) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onUserInfoError(response?.body()?.msg ?: "") + } + }) + } + + + + +} + +interface MyView : IView { + fun onUserInfoSuccess(info: TeacherInfo) + fun onUserInfoError(error:String) +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/presenter/VisitorPresenter.kt b/app/src/main/java/com/yzx/ebrand/presenter/VisitorPresenter.kt new file mode 100644 index 0000000..f8f48ac --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/VisitorPresenter.kt @@ -0,0 +1,140 @@ +package com.yzx.ebrand.presenter + +import com.blankj.utilcode.util.LogUtils +import com.lzy.okgo.OkGo +import com.lzy.okgo.model.Response +import com.yzx.ebrand.config.Config +import com.yzx.ebrand.config.YzxInterface +import com.yzx.ebrand.model.* +import com.yzx.ebrand.presenter.base.BasePresenter +import com.yzx.ebrand.presenter.base.IView +import com.yzx.ebrand.presenter.base.JsonCallBack +import com.yzx.ebrand.presenter.base.YzxResponse + +class VisitorPresenter(view: VisitorView) : BasePresenter(view) { + + + fun getList(pageNo: Int, keyword: String, status: String) { + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_ACCESS_CONTROL_GET_FACE_LIST}" + OkGo.post>(url) + .tag(this) + .params("keyword", keyword) + .params("audit_status", status) + .params("user_type", 3) + .params("page_size", 6) + .params("page_no", pageNo) + .execute(object : JsonCallBack>() { + + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onListSuccess(response.body().list, response.body().pager) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onListError(response?.body()?.msg ?: "") + } + }) + } + fun getDetail(id: Int) { + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_ACCESS_CONTROL_GET_FACE_INFO_DETAIL}" + OkGo.post>(url) + .tag(this) + .params("id", id) + .params("user_type", 3) + .execute(object : JsonCallBack>() { + + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onDetailSuccess(response.body().data) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onDetailError(response?.body()?.msg ?: "") + } + }) + } + + + fun getQrcodeWithAccessToken(){ + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_GET_ACCESS_TOKEN}" + OkGo.post>(url) + .tag(this) + .params("app_id", Config.MP_APPID) + .execute(object : JsonCallBack>() { + + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + getQrCode(response.body().data.access_token) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onQrCodeError(response?.body()?.msg ?: "") + } + }) + } + + fun getQrCode(accessToken:String){ + if(User.getUser().token.isEmpty()){ + return + } + val url = "${Config.BASE_URL}${YzxInterface.INTERFACE_GET_MINI_CODE}" + val unitId = User.getUser().school_id + OkGo.post>(url) + .tag(this) + .params("page_url", "pages/accesscontrol/apply/index") + .params("scene", "_${unitId}") + .params("access_token", accessToken) + .execute(object : JsonCallBack>() { + + + override fun onSuccess(response: Response>?) { + LogUtils.d(response) + if (response?.isSuccessful == true) { + mView?.onQrCodeSuccess(response.body().data) + } + } + + override fun onError(response: Response>?) { + super.onError(response) + LogUtils.d(response) + mView?.onQrCodeError(response?.body()?.msg ?: "") + } + }) + } + + + +} + +interface VisitorView : IView { + fun onListSuccess(list: MutableList, pager: Pager) + fun onListError(error: String) + fun onDetailSuccess(detail: Visitor) + fun onDetailError(error: String) + fun onQrCodeSuccess(qrCode: QrCode) + fun onQrCodeError(error: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/presenter/base/BasePresenter.kt b/app/src/main/java/com/yzx/ebrand/presenter/base/BasePresenter.kt new file mode 100644 index 0000000..8ce0194 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/base/BasePresenter.kt @@ -0,0 +1,19 @@ +package com.yzx.ebrand.presenter.base + +/** + * 类名:BasePresenter + * 作者:Yun.Lei + * 功能: + * 创建日期:2018-07-13 10:40 + * 修改人: + * 修改时间: + * 修改备注: + */ +abstract class BasePresenter(view: T) { + protected var mView: T? = view + + fun onDestroy() { + mView = null + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/presenter/base/Convert.java b/app/src/main/java/com/yzx/ebrand/presenter/base/Convert.java new file mode 100644 index 0000000..466154b --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/base/Convert.java @@ -0,0 +1,50 @@ +package com.yzx.ebrand.presenter.base; + +import com.google.gson.Gson; +import com.google.gson.JsonIOException; +import com.google.gson.JsonSyntaxException; +import com.google.gson.stream.JsonReader; + +import java.io.Reader; +import java.lang.reflect.Type; + +public class Convert { + + private static Gson create() { + return GsonHolder.gson; + } + + private static class GsonHolder { + private static Gson gson = new Gson(); + } + + public static T fromJson(String json, Class type) throws JsonIOException, JsonSyntaxException { + return create().fromJson(json, type); + } + + public static T fromJson(String json, Type type) { + return create().fromJson(json, type); + } + + public static T fromJson(JsonReader reader, Type typeOfT) throws JsonIOException, JsonSyntaxException { + return create().fromJson(reader, typeOfT); + } + + public static T fromJson(Reader json, Class classOfT) throws JsonSyntaxException, JsonIOException { + return create().fromJson(json, classOfT); + } + + public static T fromJson(Reader json, Type typeOfT) throws JsonIOException, JsonSyntaxException { + return create().fromJson(json, typeOfT); + } + + public static String toJson(Object src) { + return create().toJson(src); + } + + public static String toJson(Object src, Type typeOfSrc) { + return create().toJson(src, typeOfSrc); + } + + +} diff --git a/app/src/main/java/com/yzx/ebrand/presenter/base/IView.kt b/app/src/main/java/com/yzx/ebrand/presenter/base/IView.kt new file mode 100644 index 0000000..2720f52 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/base/IView.kt @@ -0,0 +1,12 @@ +package com.yzx.ebrand.presenter.base + +/** + * 类名:IView + * 作者:Yun.Lei + * 功能: + * 创建日期:2018-07-13 10:39 + * 修改人: + * 修改时间: + * 修改备注: + */ +interface IView \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/presenter/base/JsonCallBack.java b/app/src/main/java/com/yzx/ebrand/presenter/base/JsonCallBack.java new file mode 100644 index 0000000..8ecdef9 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/base/JsonCallBack.java @@ -0,0 +1,193 @@ +package com.yzx.ebrand.presenter.base; + +import android.content.Intent; + +import com.blankj.utilcode.util.ActivityUtils; +import com.blankj.utilcode.util.LogUtils; +import com.google.gson.stream.JsonReader; +import com.lzy.okgo.callback.AbsCallback; +import com.lzy.okgo.model.HttpHeaders; +import com.lzy.okgo.request.base.Request; +import com.yzx.ebrand.App; +import com.yzx.ebrand.MainActivity; +import com.yzx.ebrand.activity.LoginActivity; +import com.yzx.ebrand.config.RefreshToken; +import com.yzx.ebrand.model.User; +import com.yzx.ebrand.utils.Monitor; + +import org.json.JSONArray; +import org.json.JSONObject; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Date; + +import okhttp3.Response; +import okhttp3.ResponseBody; + +public abstract class JsonCallBack extends AbsCallback { + + private Type type; + private Class clazz; + private StringBuilder sb = new StringBuilder(); + + public JsonCallBack() { + + } + + public JsonCallBack(Type type) { + this.type = type; + } + + public JsonCallBack(Class clazz) { + this.clazz = clazz; + } + + @Override + public void onStart(Request request) { + super.onStart(request); + User user = User.Companion.getUser(); + HttpHeaders headers = new HttpHeaders(); + headers.put("phone", user.getPhone()); + headers.put("token", user.getToken()); +// headers.put("phone","18780170404"); +// headers.put("token","11c73fb160bd715654736e7196dc1b57"); + request.headers(headers); + + sb.append("url:").append(request.getUrl()).append("\n"); + sb.append("headers:").append(request.getHeaders().toString()).append("\n"); + sb.append("params:").append(request.getParams().toString()).append("\n"); + } + + @Override + public T convertResponse(Response response) throws Throwable { + + if (type == null) { + if (clazz == null) { + // 如果没有通过构造函数传进来,就自动解析父类泛型的真实类型(有局限性,继承后就无法解析到) + Type genType = getClass().getGenericSuperclass(); + type = ((ParameterizedType) genType).getActualTypeArguments()[0]; + } else { + return parseClass(response, clazz); + } + } + + if (type instanceof ParameterizedType) { + return parseParameterizedType(response, (ParameterizedType) type); + } else if (type instanceof Class) { + return parseClass(response, (Class) type); + } else { + return parseType(response, type); + } + } + + private T parseClass(Response response, Class rawType) throws Exception { + if (rawType == null) return null; + ResponseBody body = response.body(); + if (body == null) return null; + JsonReader jsonReader = new JsonReader(body.charStream()); + + if (rawType == String.class) { + //noinspection unchecked + return (T) body.string(); + } else if (rawType == JSONObject.class) { + //noinspection unchecked + return (T) new JSONObject(body.string()); + } else if (rawType == JSONArray.class) { + //noinspection unchecked + return (T) new JSONArray(body.string()); + } else { + T t = Convert.fromJson(jsonReader, rawType); + response.close(); + return t; + } + } + + private T parseType(Response response, Type type) throws Exception { + if (type == null) return null; + ResponseBody body = response.body(); + if (body == null) return null; + JsonReader jsonReader = new JsonReader(body.charStream()); + + // 泛型格式如下: new JsonCallback<任意JavaBean>(this) + T t = Convert.fromJson(jsonReader, type); + response.close(); + return t; + } + + private T parseParameterizedType(Response response, ParameterizedType type) throws Exception { + if (type == null) return null; + ResponseBody body = response.body(); + if (body == null) return null; + JsonReader jsonReader = new JsonReader(body.charStream()); + + Type rawType = type.getRawType(); // 泛型的实际类型 + Type typeArgument = type.getActualTypeArguments()[0]; // 泛型的参数 + if (rawType != YzxResponse.class) { + // 泛型格式如下: new JsonCallback<外层BaseBean<内层JavaBean>>(this) + T t = Convert.fromJson(jsonReader, type); + response.close(); + return t; + } else { + if (typeArgument == Void.class) { + // 泛型格式如下: new JsonCallback>(this) + SimpleResponse simpleResponse = Convert.fromJson(jsonReader, SimpleResponse.class); + response.close(); + //noinspection unchecked + return (T) simpleResponse.toYzxResponse(); + } else { + // 泛型格式如下: new JsonCallback>(this) + YzxResponse yzxResponse = Convert.fromJson(jsonReader, type); + response.close(); + int code = yzxResponse.code; + // 一般来说服务器会和客户端约定一个数表示成功,如200,其余的表示失败,如400,300等,这里根据实际情况罗列并抛出 + if (code == 0 || code == 451 || code == 452 || code == 453) { + //noinspection unchecked + return (T) yzxResponse; + } else if (code == 406) { + long currTime = new Date().getTime(); + User.Companion.saveLastLoginTime(currTime - 24*60*60*1000L); + RefreshToken.INSTANCE.refresh(new RefreshToken.RefreshCallback() { + @Override + public void onSuccess() { + LogUtils.d("onSuccess"); + Intent intent = new Intent(App.Companion.getContext(),MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ActivityUtils.finishActivity(MainActivity.class); + ActivityUtils.startActivity(intent); + } + + @Override + public void onError() { + LogUtils.d("onError"); + User.Companion.clearUserInfo(); + Intent intent = new Intent(App.Companion.getContext(), LoginActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// intent.putExtra("link", Config.INSTANCE.getOA_URL()+"/login?logout=1"); + ActivityUtils.startActivity(intent); + ActivityUtils.finishActivity(MainActivity.class); + } + }); + throw new IllegalStateException("错误代码:" + code + ",错误信息:" + yzxResponse.msg); + } else { + // 直接将服务端的错误信息抛出,onError中可以获取 + throw new IllegalStateException("错误代码:" + code + ",错误信息:" + yzxResponse.msg); + } + } + } + } + + @Override + public void onError(com.lzy.okgo.model.Response response) { + super.onError(response); + String msg = response.getException().getMessage(); + if(msg==null){ + msg = ""; + } + //登录相关信息不上报 + if(!msg.contains("错误代码:406") && !msg.contains("token信息不存在!")){ + sb.append("异常信息:").append(msg); + Monitor.INSTANCE.postNetError(sb); + } + } +} diff --git a/app/src/main/java/com/yzx/ebrand/presenter/base/SimpleResponse.java b/app/src/main/java/com/yzx/ebrand/presenter/base/SimpleResponse.java new file mode 100644 index 0000000..595b6a5 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/base/SimpleResponse.java @@ -0,0 +1,20 @@ +package com.yzx.ebrand.presenter.base; + + +import java.io.Serializable; + +public class SimpleResponse implements Serializable { + + private static final long serialVersionUID = -1477609349345966116L; + + public int code; + public String msg; + + public YzxResponse toYzxResponse() { + YzxResponse lzyResponse = new YzxResponse(); + lzyResponse.code = code; + lzyResponse.msg = msg; + return lzyResponse; + } +} + diff --git a/app/src/main/java/com/yzx/ebrand/presenter/base/YzxListResponse.java b/app/src/main/java/com/yzx/ebrand/presenter/base/YzxListResponse.java new file mode 100644 index 0000000..95ca909 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/base/YzxListResponse.java @@ -0,0 +1,27 @@ +package com.yzx.ebrand.presenter.base; + + +import com.yzx.ebrand.model.Pager; + +import java.io.Serializable; +import java.util.ArrayList; + +public class YzxListResponse implements Serializable { + + private static final long serialVersionUID = 5213230387175987834L; + + public int code = -1; + public String msg; + public ArrayList list; + public Pager pager; + + @Override + public String toString() { + return "YzxResponse{\n" +// + "\tcode=" + code + "\n" +// + "\tmsg='" + msg + "\'\n" +// + "\tlist=" + list + "\n" +// + "\tpager=" + pager + "\n" +// + '}'; + } +} diff --git a/app/src/main/java/com/yzx/ebrand/presenter/base/YzxResponse.java b/app/src/main/java/com/yzx/ebrand/presenter/base/YzxResponse.java new file mode 100644 index 0000000..2d1ff5b --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/presenter/base/YzxResponse.java @@ -0,0 +1,30 @@ +package com.yzx.ebrand.presenter.base; + + + +import com.yzx.ebrand.model.Pager; + +import java.io.Serializable; +import java.util.ArrayList; + +public class YzxResponse implements Serializable { + + private static final long serialVersionUID = 5213230387175987834L; + + public int code = -1; + public String msg; + public T data; + public ArrayList list; + public Pager pager; + + @Override + public String toString() { + return "YzxResponse{\n" +// + "\tcode=" + code + "\n" +// + "\tmsg='" + msg + "\'\n" +// + "\tdata=" + data + "\n" +// + "\tlist=" + list + "\n" +// + "\tpager=" + pager + "\n" +// + '}'; + } +} diff --git a/app/src/main/java/com/yzx/ebrand/receiver/BootReceiver.kt b/app/src/main/java/com/yzx/ebrand/receiver/BootReceiver.kt new file mode 100644 index 0000000..080c821 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/receiver/BootReceiver.kt @@ -0,0 +1,21 @@ +package com.yzx.ebrand.receiver + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.yzx.ebrand.MainActivity + + + + +class BootReceiver :BroadcastReceiver(){ + override fun onReceive(context: Context?, intent: Intent?) { + intent?.apply { + if (action.equals("android.intent.action.BOOT_COMPLETED")) { + val i = Intent(context, MainActivity::class.java) + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + context?.startActivity(i) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/utils/FileUpload.kt b/app/src/main/java/com/yzx/ebrand/utils/FileUpload.kt new file mode 100644 index 0000000..0655709 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/utils/FileUpload.kt @@ -0,0 +1,49 @@ +package com.yzx.ebrand.utils + +import com.lzy.okgo.OkGo +import com.lzy.okgo.callback.StringCallback +import com.lzy.okgo.model.Response +import com.yzx.ebrand.model.User +import com.yzx.ebrand.config.YzxInterface +import org.json.JSONObject +import java.io.File + +object FileUpload { + + fun upload(path: String, callBack: FileUploadCallBack) { + val user = User.getUser() + OkGo.post(YzxInterface.FILE_UPLOAD_URL) + .tag(this) + .params("token", user.token) + .params("user", user.user_id) + .params("file", File(path)) + .execute(object : StringCallback() { + override fun onSuccess(response: Response) { + try { + val noteJson = response.body() + val noteJsonObject = JSONObject(noteJson) + val noteContent = noteJsonObject.optString("content") + val noteContentObject = JSONObject(noteContent) + val noteKey = noteContentObject.optString("key") + val noteIdentity = noteContentObject.optString("identity") + callBack.onSuccess(noteIdentity, noteKey) + } catch (e: Exception) { + } + } + + override fun onError(response: Response) { + super.onError(response) + callBack.onError("上传失败") + } + + override fun onFinish() { + super.onFinish() + } + }) + } +} + +interface FileUploadCallBack { + fun onSuccess(identity: String, key: String) + fun onError(msg: String) +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/utils/KotlinX.kt b/app/src/main/java/com/yzx/ebrand/utils/KotlinX.kt new file mode 100644 index 0000000..5123966 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/utils/KotlinX.kt @@ -0,0 +1,117 @@ +package com.yzx.ebrand.utils + +import android.app.Dialog +import android.view.View +import android.widget.ImageView +import com.blankj.utilcode.util.TimeUtils +import com.bumptech.glide.Glide +import com.yzx.ebrand.R +import java.text.SimpleDateFormat +import java.util.TimeZone + +fun ImageView.setSrc(identity: String, key: String) { + val url = "https://${identity.ifEmpty { "filea" }}.oa.qbjjyyun.net/edufile/imageView?uniqueKey=${key}" + Glide.with(this) + .load(url) + .placeholder(R.color.gray_1) + .into(this) + this.setTag(R.id.image_src_tag,url) +} + +fun String.getImgUrl(key: String):String{ + return "https://${this.ifEmpty { "filea" }}.oa.qbjjyyun.net/edufile/imageView?uniqueKey=${key}" +} + +fun ImageView.setSrc(url: String) { + Glide.with(this) + .load(url) + .placeholder(R.color.gray_1) + .into(this) +} + +fun Int.toTime(format:String = "yyyy-MM-dd HH:mm"): String { + val format = TimeUtils.getSafeDateFormat(format) + format.timeZone = TimeZone.getTimeZone("GMT+8:00") + return TimeUtils.millis2String(this * 1000L, format) +} + +fun Int.toDay(): String { + return toTime("yyyy-MM-dd") +} + +fun Int.durationStr(): String { + val value = this + if (value <= 60) { + return "${value}秒" + } else if (value > 60 && value <= 60 * 60) { + var min = value / 60 + if (min == 60) { + return "1小时" + } + return "${min}分钟" + } else if (value > 60 * 60 && value <= 24 * 60 * 60) { + var hour = value / 3600.0 + + if (hour >= 23.5f && hour <25f) { + return "1天" + } + + return "${hour.toInt()}小时" + } else { + var day = value / (24 * 60 * 60) + var sub = value % (24 * 60 * 60); + var hour = sub / 3600f + if (hour >= 23.5f || hour <25f) { + return "${day + 1}天" + } + if (hour < 1) { + return "${day}天" + } + return "${day}天${hour.toInt()}小时" + } +} + +fun Dialog.hideNavigationBar(){ + val window = this.window + window?.apply { + val uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_FULLSCREEN or + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + window.decorView.systemUiVisibility = uiOptions + window.decorView.setOnSystemUiVisibilityChangeListener { + window.decorView.systemUiVisibility = uiOptions + } + } +} + +fun SimpleDateFormat.zhCn():SimpleDateFormat{ + timeZone = TimeZone.getTimeZone("GMT+8:00") + return this +} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/yzx/ebrand/utils/Monitor.kt b/app/src/main/java/com/yzx/ebrand/utils/Monitor.kt new file mode 100644 index 0000000..dddca5e --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/utils/Monitor.kt @@ -0,0 +1,130 @@ +package com.yzx.ebrand.utils + +import android.os.Build +import com.blankj.utilcode.util.AppUtils +import com.blankj.utilcode.util.LogUtils +import com.blankj.utilcode.util.SPUtils +import com.google.gson.Gson +import com.lzy.okgo.OkGo +import com.lzy.okgo.callback.StringCallback +import com.lzy.okgo.model.HttpHeaders +import com.lzy.okgo.model.Response +import com.yzx.ebrand.model.User +import java.text.SimpleDateFormat +import java.util.* + + +object Monitor { + val DT_URL = + "https://oapi.dingtalk.com/robot/send?access_token=886b2c609ddbcc1c8ff80abfd847e9c192bbde80815721204799b0b300cd7418" + + fun postDingTalkMsg() { + val monitorText = SPUtils.getInstance().getString("crashData") + if (!monitorText.isBlank()) { + val monitor = MonitorInfo("text", MonitorText(monitorText)) + val headers = HttpHeaders() + val json = Gson().toJson(monitor) + headers.put("content-type", "application/json") + OkGo.post(DT_URL) + .tag("") + .headers(headers) + .upJson(json) + .execute(object : StringCallback() { + override fun onSuccess(response: Response?) { + LogUtils.d(json) + LogUtils.d(response) + SPUtils.getInstance().remove("crashData") + } + + override fun onError(response: Response?) { + super.onError(response) + LogUtils.d(response) + Thread { + Thread.sleep(3000) + postDingTalkMsg() + } + } + }) + } + + } + + fun saveErrorInfo( + crashType: Int, + errorType: String?, + errorMessage: String?, + errorStack: String? + ) { + val monitorText = "crashType:${crashType}\n" + + "errorType:${errorType}\n" + + "errorMessage:${errorMessage}\n" + + "errorStack:\n${errorStack}" + val stringBuffer = StringBuffer() + stringBuffer.append("电子屏异常上报:").append("\n") + stringBuffer.append("系统信息:").append(AppUtils.getAppInfo().versionName).append("\n") + val user = User.getUser() + if (user.user_id > 0) { + stringBuffer.append("用户信息:").append("\n") + .append("user_name:${user.user_name}").append("\n") + .append("user_id:${user.user_id}").append("\n") + .append("phone:${user.phone}").append("\n") + .append("token:${user.token}").append("\n") + } + stringBuffer.append("崩溃时间:") + .append(SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())) + .append("\n") + stringBuffer.append("手机系统:").append(Build.VERSION.RELEASE).append("\n") + stringBuffer.append("手机型号:").append(Build.MODEL).append("\n") + stringBuffer.append("崩溃信息:").append("\n").append(monitorText) + SPUtils.getInstance().put("crashData", stringBuffer.toString()) + } + + fun postNetError(errorInfo:StringBuilder){ + val stringBuffer = StringBuffer() + stringBuffer.append("电子屏异常上报:").append("\n") + stringBuffer.append("异常类型:").append("接口异常").append("\n") + stringBuffer.append("系统信息:").append(AppUtils.getAppInfo().versionName).append("\n") + val user = User.getUser() + if (user.user_id > 0) { + stringBuffer.append("用户信息:").append("\n") + .append("user_name:${user.user_name}").append("\n") + .append("user_id:${user.user_id}").append("\n") + .append("phone:${user.phone}").append("\n") + .append("token:${user.token}").append("\n") + } + stringBuffer.append("请求时间:") + .append(SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date())) + .append("\n") + stringBuffer.append("手机系统:").append(Build.VERSION.RELEASE).append("\n") + stringBuffer.append("手机型号:").append(Build.MODEL).append("\n") + stringBuffer.append(errorInfo) + val monitor = MonitorInfo("text", MonitorText(stringBuffer.toString())) + val headers = HttpHeaders() + val json = Gson().toJson(monitor) + headers.put("content-type", "application/json") + OkGo.post(DT_URL) + .tag("") + .headers(headers) + .upJson(json) + .execute(object : StringCallback() { + override fun onSuccess(response: Response?) { + LogUtils.d(json) + LogUtils.d(response) + } + + override fun onError(response: Response?) { + super.onError(response) + LogUtils.d(response) + + } + }) + } +} + +class MonitorInfo( + val msgtype: String = "text", + val text: MonitorText = MonitorText("电子屏异常上报") +) + +class MonitorText(val content: String = "") + diff --git a/app/src/main/java/com/yzx/ebrand/utils/YzxFileProvider.kt b/app/src/main/java/com/yzx/ebrand/utils/YzxFileProvider.kt new file mode 100644 index 0000000..874fa50 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/utils/YzxFileProvider.kt @@ -0,0 +1,15 @@ +package com.yzx.ebrand.utils + +import androidx.core.content.FileProvider + + +/** + * 类名:YzxFileProvider + * 作者:Yun.Lei + * 功能: + * 创建日期:2020年5月6日14:09:27 + * 修改人: + * 修改时间: + * 修改备注: + */ +class YzxFileProvider: FileProvider() \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/widget/BaseDialog.kt b/app/src/main/java/com/yzx/ebrand/widget/BaseDialog.kt new file mode 100644 index 0000000..0f1862b --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/widget/BaseDialog.kt @@ -0,0 +1,39 @@ +package com.yzx.ebrand.widget + +import android.app.Dialog +import android.content.Context +import android.view.Window +import com.yzx.ebrand.utils.hideNavigationBar + +class BaseDialog(context: Context, themeResId: Int, res: Int) : Dialog(context, themeResId) { + private var res: Int = 0 + private var leaveId:Int = 0 + var showed = false + + init { + hideNavigationBar() + requestWindowFeature(Window.FEATURE_NO_TITLE) + setContentView(res) + this.res = res + setCanceledOnTouchOutside(false) + setCancelable(false) + } + + fun setLeaveId(id:Int){ + leaveId = id + } + + fun getLeaveId():Int{ + return leaveId + } + + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus) + hideNavigationBar() + } + + override fun show() { + hideNavigationBar() + super.show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/widget/ChangeDialog.kt b/app/src/main/java/com/yzx/ebrand/widget/ChangeDialog.kt new file mode 100644 index 0000000..2573b7a --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/widget/ChangeDialog.kt @@ -0,0 +1,122 @@ +package com.yzx.ebrand.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.yzx.ebrand.R +import com.yzx.ebrand.adapter.ChangeDialogStepAdapter +import com.yzx.ebrand.model.StuChange +import com.yzx.ebrand.model.ViewImage +import com.yzx.ebrand.utils.setSrc +import com.yzx.ebrand.utils.toDay +import org.greenrobot.eventbus.EventBus +import org.jetbrains.anko.find +import org.jetbrains.anko.textColor + +/** + * 展示学生请假 + */ +class ChangeDialog( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : + ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) { + + val adapter: ChangeDialogStepAdapter by lazy { + ChangeDialogStepAdapter(mutableListOf()) + } + var onCloseClick: (view:View) -> Unit = {} + + init { + val view = LayoutInflater.from(context).inflate(R.layout.dialog_change, null) + val layoutParams = LayoutParams(0, LayoutParams.WRAP_CONTENT) + layoutParams.matchConstraintPercentWidth = 0.8f + layoutParams.topToTop = LayoutParams.PARENT_ID + layoutParams.startToStart = LayoutParams.PARENT_ID + layoutParams.endToEnd = LayoutParams.PARENT_ID + layoutParams.bottomToBottom = LayoutParams.PARENT_ID + view.layoutParams = layoutParams + addView(view) + background = ContextCompat.getDrawable(context, R.color.dialog_bg) + setOnClickListener { } //阻止事件冒泡 + } + + @SuppressLint("SetTextI18n") + fun setData(detail: StuChange) { + //处理弹窗显示 + find(R.id.leave_student_name).text = detail.status_change_student_name + if (detail.face_key.isNotEmpty()) { + val img = find(R.id.face_img) + img.setSrc(detail.face_identity, detail.face_key) + img.visibility = View.VISIBLE + find(R.id.face_empty).visibility = View.GONE + } else { + find(R.id.face_empty).visibility = View.VISIBLE + find(R.id.face_img).visibility = View.GONE + } + find(R.id.face_img).setOnClickListener { + EventBus.getDefault().post(ViewImage(detail.id,detail.face_identity,detail.face_key)) + } + find(R.id.class_name).text = "${detail.grade_name}${detail.class_name}" + find(R.id.leave_request_type_name).text = detail.status_change_type_name + find(R.id.statusName).text = when (detail.status) { + 1 -> "待处理" + 2 -> "已确认" + 3 -> "已拒绝" + else -> "--" + } + find(R.id.statusName).textColor = when (detail.status) { + 1 -> Color.parseColor("#333333") + 2 -> Color.parseColor("#3c7ef6") + 3 -> Color.parseColor("#ff4040") + else -> Color.parseColor("#333333") + } + if (detail.getSubStatusName().isNotEmpty()) { + find(R.id.subStatusName).text = "(${detail.getSubStatusName()})" + find(R.id.subStatusName).textColor = when (detail.sub_status) { + 0, 2 -> Color.parseColor("#ff4040") + 1, 3 -> Color.parseColor("#07c160") + else -> Color.parseColor("#333333") + } + } else { + find(R.id.subStatusName).text = "" + } + var time = "--" + if (detail.start_time > 0) { + time = detail.start_time.toDay() + } + if (detail.end_time > 0) { + time = "$time -- ${detail.end_time.toDay()}" + } + find(R.id.add_time).text = time + if(detail.status_change_reason.isNotEmpty()){ + find(R.id.remarkLayout).visibility = View.VISIBLE + find(R.id.leave_request_reason).text = detail.status_change_reason + }else{ + find(R.id.remarkLayout).visibility = View.GONE + } + find(R.id.statusImg).setSrc(detail.getStatusImg()) + + find(R.id.stepRecycler) + val recyclerView = find(R.id.stepRecycler) + recyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + recyclerView.adapter = adapter + adapter.setList(detail.getStep()) + + find(R.id.closeBtn).setOnClickListener { + onCloseClick(this) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/widget/LeaveDialog.kt b/app/src/main/java/com/yzx/ebrand/widget/LeaveDialog.kt new file mode 100644 index 0000000..950ada1 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/widget/LeaveDialog.kt @@ -0,0 +1,100 @@ +package com.yzx.ebrand.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.yzx.ebrand.R +import com.yzx.ebrand.adapter.HomeDialogStepAdapter +import com.yzx.ebrand.model.StuLeave +import com.yzx.ebrand.model.ViewImage +import com.yzx.ebrand.utils.durationStr +import com.yzx.ebrand.utils.setSrc +import com.yzx.ebrand.utils.toTime +import kotlinx.android.synthetic.main.dialog_leave.view.* +import org.greenrobot.eventbus.EventBus +import org.jetbrains.anko.find + +/** + * 展示学生请假 + */ +class LeaveDialog( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : + ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) { + + val adapter: HomeDialogStepAdapter by lazy { + HomeDialogStepAdapter(mutableListOf()) + } + var onCloseClick: (view:View) -> Unit = {} + + init { + val view = LayoutInflater.from(context).inflate(R.layout.dialog_leave, null) + val layoutParams = LayoutParams(0, LayoutParams.WRAP_CONTENT) + layoutParams.matchConstraintPercentWidth = 0.8f + layoutParams.topToTop = LayoutParams.PARENT_ID + layoutParams.startToStart = LayoutParams.PARENT_ID + layoutParams.endToEnd = LayoutParams.PARENT_ID + layoutParams.bottomToBottom = LayoutParams.PARENT_ID + view.layoutParams = layoutParams + addView(view) + background = ContextCompat.getDrawable(context, R.color.dialog_bg) + setOnClickListener { } //阻止事件冒泡 + } + + @SuppressLint("SetTextI18n") + fun setData(detail: StuLeave) { + leave_student_name.text = detail.leave_student_name + if (detail.face_key.isNotEmpty()) { + val img = find(R.id.face_img) + img.setSrc(detail.face_identity, detail.face_key) + img.visibility = View.VISIBLE + find(R.id.face_empty).visibility = View.GONE + } else { + find(R.id.face_empty).visibility = View.VISIBLE + find(R.id.face_img).visibility = View.GONE + } + find(R.id.face_img).setOnClickListener { + EventBus.getDefault().post(ViewImage(detail.id,detail.face_identity,detail.face_key)) + } + find(R.id.class_name).text = "${detail.grade_name}${detail.class_name}" + find(R.id.leave_request_type_name).text = detail.leave_request_type_name + find(R.id.leave_duration_str).text = + (detail.end_time - detail.start_time).durationStr() + find(R.id.add_time).text = + "${detail.start_time.toTime()} - ${detail.end_time.toTime()}" + find(R.id.leave_request_reason).text = detail.leave_request_reason + find(R.id.statusImg).setSrc( + when (detail.status) { + 1 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_wait.png" + 2 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_pass.png" + 3 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/stutakeleave_nopass.png" + 4 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/cancellation.png" + 5 -> "https://oa-edu-1259243469.cos.ap-chengdu.myqcloud.com/public/mini/cancellation_overtime.png" + else -> "" + } + ) + + find(R.id.stepRecycler) + val recyclerView = find(R.id.stepRecycler) + val layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + recyclerView.layoutManager = layoutManager + + recyclerView.adapter = adapter + adapter.setList(detail.getStep()) + recyclerView.scrollToPosition(adapter.itemCount - 1) + find(R.id.closeBtn).setOnClickListener { + onCloseClick(this) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/widget/TimeView.kt b/app/src/main/java/com/yzx/ebrand/widget/TimeView.kt new file mode 100644 index 0000000..e01f998 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/widget/TimeView.kt @@ -0,0 +1,28 @@ +package com.yzx.ebrand.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import com.yzx.ebrand.R +import com.yzx.ebrand.model.TimeShow +import kotlinx.android.synthetic.main.view_time.view.* + +class TimeView(context: Context, attrs: AttributeSet) : + FrameLayout(context, attrs) { + + init { + val view = LayoutInflater.from(context).inflate(R.layout.view_time, null) + addView(view) + } + + @SuppressLint("SetTextI18n") + fun setTime(timeShow: TimeShow) { + hour.text = timeShow.hour + min.text = timeShow.min + sec.text = timeShow.sec + week.text = timeShow.week + year.text = "${timeShow.year}年${timeShow.month}月${timeShow.day}日" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/widget/ViewImageDialog.kt b/app/src/main/java/com/yzx/ebrand/widget/ViewImageDialog.kt new file mode 100644 index 0000000..eb9503a --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/widget/ViewImageDialog.kt @@ -0,0 +1,56 @@ +package com.yzx.ebrand.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import com.yzx.ebrand.R +import com.yzx.ebrand.model.ViewImage +import com.yzx.ebrand.utils.setSrc +import kotlinx.android.synthetic.main.dialog_view_img.view.* +import org.jetbrains.anko.find + +/** + * 展示大图 + */ +class ViewImageDialog( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : + ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) { + + var onCloseClick: (view: View) -> Unit = {} + init { + val view = LayoutInflater.from(context).inflate(R.layout.dialog_view_img, null) + val layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) + layoutParams.matchConstraintPercentWidth = 0.8f + layoutParams.topToTop = LayoutParams.PARENT_ID + layoutParams.startToStart = LayoutParams.PARENT_ID + layoutParams.endToEnd = LayoutParams.PARENT_ID + layoutParams.bottomToBottom = LayoutParams.PARENT_ID + view.layoutParams = layoutParams + addView(view) + background = ContextCompat.getDrawable(context, R.color.dialog_bg) + setOnClickListener { } //阻止事件冒泡 + + + } + + @SuppressLint("SetTextI18n") + fun setData(viewImg: ViewImage) { +// photo_view.setSrc(viewImg.identity,viewImg.key) +// photo_view.setImageResource(R.mipmap.empty) + val img = find(R.id.photo_view) + img.setSrc(viewImg.identity,viewImg.key) +// img.setSrc("https://fileb.oa.qbjjyyun.net/edufile/imageView?uniqueKey=125a4c591c91fbb9f186da8e54cd31aa") + photo_view.setOnClickListener { + onCloseClick(this) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/widget/VisitorDialog.kt b/app/src/main/java/com/yzx/ebrand/widget/VisitorDialog.kt new file mode 100644 index 0000000..c9df451 --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/widget/VisitorDialog.kt @@ -0,0 +1,190 @@ +package com.yzx.ebrand.widget + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.yzx.ebrand.R +import com.yzx.ebrand.adapter.VisitorDialogStepAdapter +import com.yzx.ebrand.model.ViewImage +import com.yzx.ebrand.model.Visitor +import com.yzx.ebrand.utils.setSrc +import com.yzx.ebrand.utils.toDay +import com.yzx.ebrand.utils.toTime +import kotlinx.android.synthetic.main.dialog_visitor.view.* +import org.greenrobot.eventbus.EventBus +import org.jetbrains.anko.find +import org.jetbrains.anko.textColor + +/** + * 展示访客信息 + */ +class VisitorDialog( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0, + defStyleRes: Int = 0 +) : + ConstraintLayout(context, attrs, defStyleAttr, defStyleRes) { + + val adapter: VisitorDialogStepAdapter by lazy { + VisitorDialogStepAdapter(mutableListOf()) + } + var onCloseClick: (view: View) -> Unit = {} + + init { + val view = LayoutInflater.from(context).inflate(R.layout.dialog_visitor, null) + val layoutParams = LayoutParams(0, LayoutParams.WRAP_CONTENT) + layoutParams.matchConstraintPercentWidth = 0.8f + layoutParams.topToTop = LayoutParams.PARENT_ID + layoutParams.startToStart = LayoutParams.PARENT_ID + layoutParams.endToEnd = LayoutParams.PARENT_ID + layoutParams.bottomToBottom = LayoutParams.PARENT_ID + view.layoutParams = layoutParams + addView(view) + background = ContextCompat.getDrawable(context, R.color.dialog_bg) + setOnClickListener { } //阻止事件冒泡 + } + + @SuppressLint("SetTextI18n", "Range") + fun setData(detail: Visitor) { + //处理弹窗显示 + find(R.id.userName).text = "${detail.user_name} ${detail.user_phone}" + find(R.id.id_card_num).text = "${detail.card_no}" + if (detail.face_key.isNotEmpty()) { + val img = find(R.id.face_img) + img.setSrc(detail.face_identity, detail.face_key) + img.visibility = View.VISIBLE + find(R.id.face_empty).visibility = View.GONE + } else { + find(R.id.face_empty).visibility = View.VISIBLE + find(R.id.face_img).visibility = View.GONE + } + find(R.id.face_img).setOnClickListener { + EventBus.getDefault().post(ViewImage(detail.id, detail.face_identity, detail.face_key)) + } + when { + detail.health_code_status >= 0 -> { + healthCodeStatusLayout.visibility = VISIBLE + health_empty.visibility = GONE + health_img.visibility = GONE + when (detail.health_code_status) { + 0 -> { + healthCodeStatus.text = "状态:绿码" + healthCodeStatus.textColor = Color.parseColor("#5DAD64") + } + 1 -> { + healthCodeStatus.text = "状态:黄码" + healthCodeStatus.textColor = Color.parseColor("#FCCF13") + } + 10 -> { + healthCodeStatus.text = "状态:红码" + healthCodeStatus.textColor = Color.parseColor("#FC0416") + } + } + } + detail.health_code_key.isNotEmpty() -> { + healthCodeStatusLayout.visibility = GONE + val img = find(R.id.health_img) + img.setSrc(detail.health_code_identity, detail.health_code_key) + img.visibility = View.VISIBLE + find(R.id.health_empty).visibility = View.GONE + } + else -> { + healthCodeStatusLayout.visibility = GONE + find(R.id.health_empty).visibility = View.VISIBLE + find(R.id.health_img).visibility = View.GONE + } + } + find(R.id.health_img).setOnClickListener { + EventBus.getDefault() + .post(ViewImage(detail.id, detail.health_code_identity, detail.health_code_key)) + } + if (detail.trip_code_key.isNotEmpty()) { + val img = find(R.id.trip_img) + img.setSrc(detail.trip_code_identity, detail.trip_code_key) + img.visibility = View.VISIBLE + find(R.id.trip_empty).visibility = View.GONE + } else { + find(R.id.trip_empty).visibility = View.VISIBLE + find(R.id.trip_img).visibility = View.GONE + } + if(detail.nuclein_file_key.isNullOrBlank()){ + nuclein_img.visibility = View.GONE + nuclein_empty.visibility = View.VISIBLE + }else{ + nuclein_img.visibility = View.VISIBLE + nuclein_empty.visibility = View.GONE + nuclein_img.setSrc(detail.nuclein_file_identity, detail.nuclein_file_key) + } + if(detail.nuclein_time>0){ + nucleinStatusLayout.visibility = VISIBLE + nucleinStatus.text = detail.getNucleinStatusObj().nuclein_name + nucleinStatus.setTextColor(Color.parseColor(detail.getNucleinStatusObj().nuclein_color)) + }else{ + nucleinStatusLayout.visibility = GONE + } + find(R.id.trip_img).setOnClickListener { + EventBus.getDefault() + .post(ViewImage(detail.id, detail.trip_code_identity, detail.trip_code_key)) + } + find(R.id.nuclein_img).setOnClickListener { + EventBus.getDefault() + .post(ViewImage(detail.id, detail.nuclein_file_identity, detail.nuclein_file_key)) + } + find(R.id.reception_user).text = "${detail.reception_user}" + find(R.id.visit_reason).text = "${detail.visit_reason}" + find(R.id.is_drive).text = when (detail.is_drive) { + 1 -> "是" + 0 -> "否" + else -> "--" + } + if (detail.is_drive == 1) { + find(R.id.carLayout).visibility = View.VISIBLE + find(R.id.doorLayout).visibility = View.GONE + find(R.id.license_plate).text = "${detail.license_plate}" + find(R.id.car_in_time).text = + "${detail.car_in_time.toTime()} - ${detail.car_out_time.toTime()}" + } else { + find(R.id.carLayout).visibility = View.GONE + find(R.id.doorLayout).visibility = View.VISIBLE + find(R.id.audit_status_str).text = when (detail.audit_status) { + 0 -> "待审核" + 1 -> "可通行" + 2 -> "审核拒绝" + -1 -> "已失效" + else -> "--" + } + find(R.id.audit_status_str).textColor = when (detail.audit_status) { + 0 -> Color.parseColor("#333333") + 1 -> Color.parseColor("#3c7ef6") + 2 -> Color.parseColor("#ff4040") + -1 -> Color.parseColor("#999999") + else -> Color.parseColor("#333333") + } + find(R.id.start_time).text = + "${detail.start_time.toDay()} - ${detail.end_time.toDay()} 可进出${detail.in_out_num}次" + } + + find(R.id.statusImg).setSrc(detail.getStatusImg()) + + find(R.id.stepRecycler) + val recyclerView = find(R.id.stepRecycler) + recyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + recyclerView.adapter = adapter + adapter.setList(detail.getStep()) + + find(R.id.closeBtn).setOnClickListener { + onCloseClick(this) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yzx/ebrand/widget/YzxPDFViewPager.kt b/app/src/main/java/com/yzx/ebrand/widget/YzxPDFViewPager.kt new file mode 100644 index 0000000..c909dea --- /dev/null +++ b/app/src/main/java/com/yzx/ebrand/widget/YzxPDFViewPager.kt @@ -0,0 +1,26 @@ +package com.yzx.ebrand.widget + +import android.content.Context +import android.view.MotionEvent +import es.voghdev.pdfviewpager.library.PDFViewPager + +class YzxPDFViewPager(context:Context,path:String):PDFViewPager(context,path){ + + + override fun setCurrentItem(item: Int, smoothScroll: Boolean) { + super.setCurrentItem(item, false) + } + + override fun setCurrentItem(item: Int) { + super.setCurrentItem(item,false) + } + + override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean { + return false + } + + override fun onTouchEvent(ev: MotionEvent?): Boolean { + return false + } + +} \ No newline at end of file diff --git a/app/src/main/res/anim/rotate_0_to_180.xml b/app/src/main/res/anim/rotate_0_to_180.xml new file mode 100644 index 0000000..cc143e4 --- /dev/null +++ b/app/src/main/res/anim/rotate_0_to_180.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/rotate_180_to_360.xml b/app/src/main/res/anim/rotate_180_to_360.xml new file mode 100644 index 0000000..1e2668b --- /dev/null +++ b/app/src/main/res/anim/rotate_180_to_360.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_bottom_in.xml b/app/src/main/res/anim/slide_bottom_in.xml new file mode 100644 index 0000000..1dd6c09 --- /dev/null +++ b/app/src/main/res/anim/slide_bottom_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_bottom_out.xml b/app/src/main/res/anim/slide_bottom_out.xml new file mode 100644 index 0000000..d333fb7 --- /dev/null +++ b/app/src/main/res/anim/slide_bottom_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_left_in.xml b/app/src/main/res/anim/slide_left_in.xml new file mode 100644 index 0000000..842a616 --- /dev/null +++ b/app/src/main/res/anim/slide_left_in.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_left_out.xml b/app/src/main/res/anim/slide_left_out.xml new file mode 100644 index 0000000..d9c3bd9 --- /dev/null +++ b/app/src/main/res/anim/slide_left_out.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_right_in.xml b/app/src/main/res/anim/slide_right_in.xml new file mode 100644 index 0000000..c3ccec1 --- /dev/null +++ b/app/src/main/res/anim/slide_right_in.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_right_out.xml b/app/src/main/res/anim/slide_right_out.xml new file mode 100644 index 0000000..77ee771 --- /dev/null +++ b/app/src/main/res/anim/slide_right_out.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_top_in.xml b/app/src/main/res/anim/slide_top_in.xml new file mode 100644 index 0000000..177e700 --- /dev/null +++ b/app/src/main/res/anim/slide_top_in.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_top_out.xml b/app/src/main/res/anim/slide_top_out.xml new file mode 100644 index 0000000..7b51c98 --- /dev/null +++ b/app/src/main/res/anim/slide_top_out.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/color/s_app_color_blue.xml b/app/src/main/res/color/s_app_color_blue.xml new file mode 100644 index 0000000..67a1661 --- /dev/null +++ b/app/src/main/res/color/s_app_color_blue.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/s_app_color_gray2_to_blue.xml b/app/src/main/res/color/s_app_color_gray2_to_blue.xml new file mode 100644 index 0000000..467de3c --- /dev/null +++ b/app/src/main/res/color/s_app_color_gray2_to_blue.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/s_app_color_gray_to_blue.xml b/app/src/main/res/color/s_app_color_gray_to_blue.xml new file mode 100644 index 0000000..297e5d1 --- /dev/null +++ b/app/src/main/res/color/s_app_color_gray_to_blue.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/s_app_color_status_bg.xml b/app/src/main/res/color/s_app_color_status_bg.xml new file mode 100644 index 0000000..4459290 --- /dev/null +++ b/app/src/main/res/color/s_app_color_status_bg.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/s_app_color_status_border.xml b/app/src/main/res/color/s_app_color_status_border.xml new file mode 100644 index 0000000..859d7c1 --- /dev/null +++ b/app/src/main/res/color/s_app_color_status_border.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/s_app_color_status_text.xml b/app/src/main/res/color/s_app_color_status_text.xml new file mode 100644 index 0000000..8d58d8e --- /dev/null +++ b/app/src/main/res/color/s_app_color_status_text.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_btn_read_setting.xml b/app/src/main/res/color/selector_btn_read_setting.xml new file mode 100644 index 0000000..ba77f4b --- /dev/null +++ b/app/src/main/res/color/selector_btn_read_setting.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_chapter.xml b/app/src/main/res/color/selector_chapter.xml new file mode 100644 index 0000000..b0ef349 --- /dev/null +++ b/app/src/main/res/color/selector_chapter.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..c7bd21d --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable-v24/progress_horizontal.xml b/app/src/main/res/drawable-v24/progress_horizontal.xml new file mode 100644 index 0000000..d489a6d --- /dev/null +++ b/app/src/main/res/drawable-v24/progress_horizontal.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/background0.png b/app/src/main/res/drawable/background0.png new file mode 100644 index 0000000000000000000000000000000000000000..08bf0dd392d2d2d568b894690b0d2d2a1cd15557 GIT binary patch literal 14612 zcmeI3F-t;W6o!wLX^L`fNva{EB^nwUYATf*Dv^i<(ULj21O-AgG+a`mrdrzk0}ToO zfr=<-YA%|hmO!YnA)#~N{)EP7ki&N`*WvT|-t%y{o|cNaSY$LJBC$f=EsF#XMM9QvN?WgfiT@2JRs~M5bS@gFW)b-F_ezPtTzqe1|VkSN&vT#{&GwTOi z-RDk19Jx(*Z{{K^kG=VqRK3!#4~h46wP95jYd?Kf-Q=|uNgU5wNjKl3R-G!hZ6DYc za8L|5C8PtX$T6TvT2n+0a3;k7SHzJm4sc`~Suwzoab(2+IY15+1LOcXPz;a*=Bb7O za)2Bt2FL+&pco(r$boeQCI?Io6a(Y{IZzCc1LQz4Kn{=t#Q-^Aa$p!B2gre9fE*wP ziUD$f99UQQx5+_kzw6m6*VXgh+Ut8GXz8(|5vvFp#O8Q1oNCHJy8~zd1@_x#+gD G+ed$2Y!`8~PDPmd+th^~& zOr^X2P*hf#bDD{ZSldOoNr6)nKd|N06}sk6-`PH+%Uu{_>s-C_eVK#vp7WgNdCq&g zw4^8|Dk+K(5>tFyc$N^Bijas>_6~Zds^Nx!5H2Ye=9ek7j?dk9n)5iU{LCp%YWm~J z_|(~QA_#kQw0dC7CF(Vs(&(=cqMzu9+y)<#!Yg2DV82a(m0PgDf>q5?d5;g`F@^=x z0m~rp=uqhyZZ*nQ^Nm9#dO8q~VCo-uV|Zf$a^b*svAEKx+I9VQxCFb*E?@83 zgpxqmE-O;o-7DOi7m51NP@JPC`{|iAqTwd=lpT4J#YR?u>JZgoNRZ>{<>tcn>Q0?i z%+Q*Ntik7TK66*Cl#KGc_dH>_l>xYv*EAUoD<@^e>jMkf2KbZgYQ$p<3&C{2GWfd; zRt;C*SDSU#>n1>v2IshvlK-6YA&AUk%47@~cW_DU4DMw+A&FLa3lI`L0LcuJnV?Q& zwLKxW*4$?m-Q&|ZLp#4p=W1szGn$;&BpSnETOl}rY=w>kk~k!zqv$k1-`~H7QS}v>Gki*PDQ6b2 zWk~KAaP|LUXQl(@HKXCcqt3OxS-Q z54OJl(El{_ddy<~RIAd-qf{Tgwy*MqZs`xHQJDEg-%QDXGbO+DCyv^n^sx4D@(OA2 dPtkHu3va#XS(Bnj@IVMZR(z^N*jaF)@i!hQ_OSo} literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/background10.png b/app/src/main/res/drawable/background10.png new file mode 100644 index 0000000000000000000000000000000000000000..ddc0c74a13445b707caf0aff9a964b556c1d2502 GIT binary patch literal 14642 zcmeAS@N?(olHy`uVBq!ia0y~yV69i670)eH@l^5RS&h6%?$5XB(aqz|GTS{{Jq1r&dP zrCmm)M}vidVStju?+L}{@_+O{|CvAg|28;L_A?L4{pbFH6%;)k0yT^vT8SkdL^W_6 z6bI1?PNUMGa2O4i(c}P32BW!Tv~(CP6-TqdXe9}%6h|8eqirT&G8kj;Bo5%EfAN^5P%G43m*bkX9-S_VeC=O45IUDxGI^ z&UbW~ET|3`o%0=?^93e@(K+AIIbUEh7@hMSkU8Jc)kpNMi8{{TtCs%!eckJ-`sB4& z>n>{iKAX1x=DXi@^Z(nNum7*@R#d-v=l+{_?&rMA*V}GB`)}Ij`#Il!%Rw6rhty?( oE*@PtH@eqoz_(y&SoA$+JohZR>wJ~wAyAt1boFyt=akR{0K)y%yZ`_I literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/background11.jpg b/app/src/main/res/drawable/background11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3bf240d830a7174cbe65536079dd9a0b1014ef46 GIT binary patch literal 53313 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/background3.png b/app/src/main/res/drawable/background3.png new file mode 100644 index 0000000000000000000000000000000000000000..ce8f367f451c413393ddd902af20b0a239a3b64e GIT binary patch literal 16321 zcmeHOc~Db#9*>Fw3Md1v6cn&p_Nag?w4i_yMX0MF;{_rRH7i(-fS??bgNj?|mcv~; zLP3qQbfJzIKt;en0tHD~3@lQ)LI}tuLP!81fn583@0jg&c2+`nx9#)|f4t2Wmi#)NQl z$uV!!l(x90KkVuG^XpYIomG3ykM0dl-FheD@V-~Sxm73Cy&CkXSHaXdCv%nC{&8oVWlHfBG9Bg0dV1D`OyY!8mRuk^10$90?K%fS)9{I6y? ze@{S%KGLm_@;ukN@ zxLPV?ByTho_1$`4U*VQsTmbU)b?2dY78(G{=MG-j8P&;}m2fRP0wbI=tE#JuOZ31M z>XUh@nz+!BSvinA+Hw=Uo&1%!FY0fG2ngbqUs7&2od3#$lPse+uK;!)knR`cP}pQpqOugJzX0qn-mIIB+x^X)#ap))D!agosg&Gdh#xdeav^ zOQO%8Me!#$hAn$g9~dDngt3Gghu71kFg6&~FU^LdR!y89YMQHGOB@2ABH}W*7^uvT zGQSHdYc1WnD7}?`!a?PGX3qK!R%GdMG|HJ)G(XBZ%*)14 z8+ILqo41s1itusyCZjYZ(aad>@@%B%;64y1@rxrk8-KZRC~d7(ydyx6Q(4Kf$*9f} zQmZ5xa22PK>FN8Nx4|XpdIW+<0UvtlUAXb`o5@jgM)hgAWtM$PU&In_yG_ym}MTjiJa%kT;S83IrD z#ijfIMd^Ur)TDn30YO1QkvuXn?ca5&eZEEQImC3c^YsurXJg@iMNlL7%mQhNO%fj( zf=K_K<>lul_QAALF(<}o<;%7L@d!U31{CM$z6lh&*IMl|rM_!Pq`RH=0aor`W7E*r zY7}v=JRc@fQvMWPPJv;xRj7bc^Ww>;m>w|JUL+6;DrNwi@%Q(~0=?)E(`(`qTxq>f zLStuV_h_(;p}FXZRFK@-f++9<2)H=8C{Y%OlU77}FDgz#_!2J;)TqZ#-z$%A&uwmQ zUic%hX088?)=^DCv@qR*lQ7xajoxn4J1H#e{ZE!x^7=Nt`rvuwGBbCdODUUo%UxY` zLJc+-=($`TTImemMfv~h8jmXIB^?IF8bVy=#kj^0IjsOrtOM&eW_Q!1$# zoD73=~)V=ckh*jViBtLLwsb8V2O=9?tE2LN%Y<(wj2 zY@j<2k^bk%xR3{FHaQx#!k#NJt&>4-u#|9UG-Xp7b@Erk#bSHK;Nald2i-&5I#Xm* z;?ycU8??!Wbn!Obd5G;}c5iBGioI~*v%UntOg{WOoy$a2XfinT@c>MC{YG&~4Fo?f0Q?A8!J`Kohu8^{p87<-jPxe+_>r2S% zPfkjzLc>=+JMK^KV^#)FwBN@ zdRsx1>nD^(GxB?eJrbE?u|CKW<&%M!fOxi$$;ikZ`BK2PU7k# zRn3V77|!#ut>%NB$r)vNtMt(x>Dskx!!KX{N@ZAxoFQDqdnB!UB#510J<`*atGh=qm+~gW7_hgsjRJcw%iGSb=UZqPigfE z^UM;jnRW8;-;b_ckP>&xir?YhYl;sawf6LY)4(+6` zuP^KZCXA9OKjST%-`94204%v7xw_mfts4& zmX;RS0VEO$a{xI*$r{f+eE{kB3KK3|cvw81r#5Iu$=FW(ITQd(Z!Fi^4P0;zq>WJ< zDA!Y|iHTiL!G}_kf=DEL9*;LhE7Ip2I&>%>9je%qIC`A*&`vD#>@jd-|EAe4Md&7S z1|NB>fq_5Pu%uP`E`ID)E?w1wT3@N0kK5ty?gLj%sGUWt=AcBxoe%DGXzV%&4^BX5 zOXreyQO{|b#ZCyi+-||O1rV8w)fPYrC542%kJ1%rfY?mw^!>}Y89B1hgGg8AqFOzp zS17bqsMIQ}ErnGB3g{^;J~CGER>ezx+m1d~g(LZr77l*w0|0wyG@1~Fqzs2?HjDhR?MfKma{Joa+U~O=790ie{{qC%{(ZiltUaeL{{v3apZEX( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/background4.png b/app/src/main/res/drawable/background4.png new file mode 100644 index 0000000000000000000000000000000000000000..960c26a77ccdffb3e87989f6ae8fecd8c26a9def GIT binary patch literal 15934 zcmeHNZ%kWN6u&TVh%2zk92qUFTQn+BY>ZgOpXvZ7Mse!0D9adGU5Kd+YePqA%bGeZ z+pugg@lVpUiHVtJYdaPZhqRQy=#nY@pi;(MTX>5v@l{_LLQ4w7cOSQ3;SdZ&+l(D z1#by26Hn#V488rhD}PJL-^YG(?0zNv!gA{SzwnCH4=X!;im`=M<~0x?mu64G1>ot6 z;pMrLfd}9^4 z64(4c)Px+g8iCv;O7owl`jz4b;WLrpte!AcL7J|^tOH!0nRoKx0w)QS95u?eYozK^ z9t35=tuosQ@tyFo%^Et|fIyaR8tR+ww+Y75;4{mYs)9@Ho>KBMn_NQ*%_Pj;IIYB3 z#v&-VqcWrDmYYdRY+Q64O!G&bpCOR*szTQ9Z8F2tDGY8pNiat}$gtU!ix5Vz$hUk4 z?EupjW^=|3;-zcse%uBQW^j%RXUyOn*B+R`o_ zFf3hH5!y`OaFs8-Gy(7Fw0!r>cIj>U*3L+ScMjQpEKT>Ho-IF)+QLT+6VaIlnbnQk z!Vt5&IF{DKv=6%<#}2gkXXtELD?t+ow|rnUZ$aIc;q37cUIo0%s2n4 z+RtxIaa3-soIk2OwJYr~JZI@T2N~6+lXkOG)F2@?dh=Fv*8MhQla4(WIbb5M41WP% zaBX9B*4^QHS;Yak1s%p$Z?cP>=m#@~w!!_5J)v}X?aa}zqRgbZJ>6n34A9XY_N${} zBk|1Wiq6_bA=~GQOy^co_1AlkK!8G58J#uZ7_aZ%3b#57@iW_~(6mznN|&uDrWopqbNcU;OkV1SH#%Qo+l)+1v; z#v*Z<5w1s_g{+$YQa2%Pkan>;YpTBh*-Fm`4l)AltR}W6e3;Q$OMEix+?%XVM@lQ3 z+3{P_h4#OJ#2F99TfA|F-H+SA!3++#EiN#Fb6k6129GyKVrE$jvm`lcdM`DXEwBG% T?>84ca}dAUn!0M+o<{vY{vQ2{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/background5.png b/app/src/main/res/drawable/background5.png new file mode 100644 index 0000000000000000000000000000000000000000..af2f576fb5879874afb705838a74afa41a096409 GIT binary patch literal 15274 zcmeHO|5MXt9RC1HI z{eHdQujgEP>Oo)P4kCtOzDaK|Gce4Xk71kB2|nPRj|Alj7#4&jG4~%i-C&v?NTTfz zNc>$~oks}%@EK|20+pGTBL6I5vM`^_&H9EDbsGKJvzU@$CYvDs{MDEam-VZ_9>w&%?uBIEM%a&gyStfv0ewXA9y z>!6KY*REb73W=2QF|D3qwV>!i83NgD5(kuJSH-X11DN z6y>qTj0f+{&d&0p8&kIUykDyv2SQfDB0BYHlW<>Q!H8dA7!bc8egQCW1Aake^g}6v zcn$H|lWMXOrd52cUu%+VUvJ4&o2pJb)9$!p{a>1y+M%-R}}noKK;ZY|C?`zzEI(y)P61KkK@N3-$$XTXZC*X zfvOAC+W<6#dOE0=g^KKrvkfX|?RMEa%G7b7ab2ZavC(4Dh?P21i0EdR(A9Q@p#W+4 z`*n4zwVvvx?jf6(eMS|^y1?ooTkh~Y?{ao_Hc+g8*C@xQfMU%gIzQ>1<^o|`5_r@} z%z3va*ZE~}yrjjrbm9;rNEV=)t5G_pGRC)-{Rs!h?$l^U^W?QZG-daw62qR$gX;=UQG$?ZS zK~a@NB00V#24~|b)k8TYQm2cXhJRcbpaNR7bo?!<78e^v8(?O@Y?e0Kc^#>|M6q8! z&3)b5YsKYiEG;c<{%1K>u2Ad%ey1>DdpGbq$pUP%r@OO6Bp-Wht8JUAQ);yBS>i=c z9Hw5#B<2((<9u$YsUjiY3*HxT4dNOAgU7f=*T;%^`67kr8FEh<)gF1c{?6rA&Y)At9Y? zex*vgRcy!uZeypS#n{sfJjeNykBn_CdL!DEF5YH^?=2#{G3J8Tek zn9&5`e04|N)8vz4gEq$XuV+q2GJX=ch&AED+Pda>5=kTYK~pn)8^R*#wN$3`0O#y~ DG|=E0 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/background6.png b/app/src/main/res/drawable/background6.png new file mode 100644 index 0000000000000000000000000000000000000000..189c2d3fbac97314793b770053dcab8a4fec59f2 GIT binary patch literal 15216 zcmeAS@N?(olHy`uVBq!ia0y~yV69NCrRh5;N{i+f5kXxo5=7+CepU#u~etjx4&=(9Q9Q!~NgJ6?Bh;nFozzw1W6n`** zXqQoGP%w-J%V=@{rGwF2LW|O2d+zON{hXli{qVc;A;gBl=m)($>{HE9Q+cA~u$LbYO#iNB4DDXy8=V;vpN(Q5K_TXvC6yDyJ`*Q{; zRv7lr7l$^rwr`y#zOU!T_rEsJEcnFFJ%yHM$z5v=PeO~ix+a+7(RLXq@J8FCqs??+ zG8k=#52AMXXtQm!rX4&r?PwnWR8Nlf0jSysxU(%c+D;7=t_R*fZ-pfGBe`pzw(2W? ztF`a9>^t0AY+0Q=X)mbZmXr+9xl_ZM5G!+HVFX1KJnBLnN))WUqZ~2rkh6&F78> z<&cJs=l5P8nl4!V{(bs6%Q}noo1twu&27Lr21wKH2kYo)94M?tlM(g`ZdWO@1_Oh% zHfSxtXp4We#ShFXB(}I{GJ0`j^R-=a!k~=%;Q!7KtRO~5#k;+FHIf^@|Eqg8=W+XI zD=eMY_=3@CRZv)sj_!?)?g5j*XcKzyHK9j4sH5FmP!T3@RqE_1h0DkF~Z4ROncwvC2UEy4u5ATVIA8zjEuCQz(qIR9qOFohuLNxPFH(2)Ch;*GX7N86gfWI$nsc%*dg)>dTO{2Ur|!}{w;7tN#Em& z|7R-a@tr#kUPA)h;~)|ZU0RZoU(-A~1px{*3WI;N$uK%P4@^a)tyfyK6YA|$g0Ds8 zot<&}?Xw#_JMX{m<9+fYKl#$bP0l+XkK@NFl1 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/background7.png b/app/src/main/res/drawable/background7.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9bb7eafa55ac360fc7b593eaf0c62a68b78e92 GIT binary patch literal 24050 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/background9.png b/app/src/main/res/drawable/background9.png new file mode 100644 index 0000000000000000000000000000000000000000..d21c0b689fc2ef88ae8a17d380c762838ef2a811 GIT binary patch literal 25494 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 + + + + diff --git a/app/src/main/res/drawable/btn_select.xml b/app/src/main/res/drawable/btn_select.xml new file mode 100644 index 0000000..69870e7 --- /dev/null +++ b/app/src/main/res/drawable/btn_select.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/custom_bg.png b/app/src/main/res/drawable/custom_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..cf24bd38409ccee9e64429f3808cccb6b860f5e9 GIT binary patch literal 19398 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 + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..2408e30 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_note_page_left_normal.png b/app/src/main/res/drawable/ic_note_page_left_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..a967b0a87a386fc6eb059ab0511abd341dbda638 GIT binary patch literal 791 zcmV+y1L*vTP)8nj)6o;RiDVZ{7<`dU7TvMhHk;whx4{?3yZ71qykAc3(_YW{z3*D;hx&{JS5@IL>%4y+w$Bk(DfRi`kw?gp^DVC&WcAB*a@6PSvw7l57t z>wqt<8bwvuSl~XesNjrN1K-+pq$;p6z$0K`2si{R8xB+@^~VAC3P5&-Uf@TW9$QA4 zpohS`5YRI+K}vzjC=>Jmm>)oPgayFwGK$I+^`va;=H>$a0p4T@QVG;fnIN}rRsh)< z7FSU-TnCu|JT3sKD4ts-ZcLDgfWLl5P$b-}tF`j5$ypsmkhSF;QF|qrik<`0LPRsM zuQnwMAZ)xY3QP$>uK_mI#+I14kU@!!}RN%a|*(x(JJTE`fvUo3M z^FwV&3Xl@S#4zio2B5yBM>VqYsXsGoPx*{gp^hA9jE>;3s8wd0njRG11lDv!$h}l# zF#>gCmFCaT8E{D*U@Jds1-u1l{~fJ%<|*(FFuOpZV?bjTlj0Y7n&0WtHs(seGGl># z(;hh|?A_h0EPj^V(=sq)33T9zerD#b0!jhP!UQ@qTKI7u@tJk_eK>_xV8&`S0J){k z_iceyVFE`3w+m`c;1=L(D}|lF640&^9o#b%_}>l2mpX;{uH(4Aw=yU(k-Qjwjtc9* zl0t#~A+YVvd-R9=^SUr&d4aI`Um~rz#`yO6+FS7 z0(~O!UqD9{K*8F83qW@RoCaL>oS|SEvw;&pw@CaaFax;c1+2lOC*dgU*bFAU#lYc&@NnQx9$*%j^wt486T(A)`&ofmVbWU<>_`X? z4F1}bnFl7ZEx_i4>QLZbGg@Al^mYMj6GhV-c+m)01SY*sV2uI(0|o$3>H&+wq<0{k z#n@^70)v5vDPS3x^p1qyXPrh%`q~1^!lb9JJ}2QceSudo&;usDW5K{z}p(o z3no1^S#|w*d3OKN@e2&- zN4Pt<+Lf}&5)=6ph}7F$jd(Y(%FIZPucdqJ*<$tpD-$4<_jAwYxgFSG1l2T$dB=iH zz}Cb+Zv`GSno-`;-w13=2xba8d0@+d{Rz+r;C7Z7WreK(_9X;I12^)3n%R{qZm$v4 zeR~XWD=(-KOs*hzh%HD5c7penNiPLTO*T(V2Cf#FQN2BrbIZYFkd{uMD`h}-8B_OZ znX0~DEDMTZy4ETu#4iN`&GdenXb-8#K1ock;?d<9ptxKc3YTgf+B?^wLQwC~?L$Mw spog+bUgiWF8}>_2fVy2)0@6(W14~tcF)16>UH||907*qoM6N<$g4P{TT>t<8 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/linearlayout_vertical_divider.xml b/app/src/main/res/drawable/linearlayout_vertical_divider.xml new file mode 100644 index 0000000..284d027 --- /dev/null +++ b/app/src/main/res/drawable/linearlayout_vertical_divider.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/login_bg.xml b/app/src/main/res/drawable/login_bg.xml new file mode 100644 index 0000000..1626ff9 --- /dev/null +++ b/app/src/main/res/drawable/login_bg.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/progress_horizontal.xml b/app/src/main/res/drawable/progress_horizontal.xml new file mode 100644 index 0000000..c0f0a14 --- /dev/null +++ b/app/src/main/res/drawable/progress_horizontal.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ripple_water.xml b/app/src/main/res/drawable/ripple_water.xml new file mode 100644 index 0000000..0fca801 --- /dev/null +++ b/app/src/main/res/drawable/ripple_water.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/s_app_btn_bule.xml b/app/src/main/res/drawable/s_app_btn_bule.xml new file mode 100644 index 0000000..5499b25 --- /dev/null +++ b/app/src/main/res/drawable/s_app_btn_bule.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/save_bg.xml b/app/src/main/res/drawable/save_bg.xml new file mode 100644 index 0000000..dcfd28c --- /dev/null +++ b/app/src/main/res/drawable/save_bg.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/seekbar_bg.xml b/app/src/main/res/drawable/seekbar_bg.xml new file mode 100644 index 0000000..538e724 --- /dev/null +++ b/app/src/main/res/drawable/seekbar_bg.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/seekbar_thumb.xml b/app/src/main/res/drawable/seekbar_thumb.xml new file mode 100644 index 0000000..af1fe8b --- /dev/null +++ b/app/src/main/res/drawable/seekbar_thumb.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_btn_read_setting.xml b/app/src/main/res/drawable/selector_btn_read_setting.xml new file mode 100644 index 0000000..27396b6 --- /dev/null +++ b/app/src/main/res/drawable/selector_btn_read_setting.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_category_load.xml b/app/src/main/res/drawable/selector_category_load.xml new file mode 100644 index 0000000..b86093c --- /dev/null +++ b/app/src/main/res/drawable/selector_category_load.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_category_unload.xml b/app/src/main/res/drawable/selector_category_unload.xml new file mode 100644 index 0000000..bf8af91 --- /dev/null +++ b/app/src/main/res/drawable/selector_category_unload.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_b_a_round.xml b/app/src/main/res/drawable/shape_b_a_round.xml new file mode 100644 index 0000000..18e7ce8 --- /dev/null +++ b/app/src/main/res/drawable/shape_b_a_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_blue.xml b/app/src/main/res/drawable/shape_blue.xml new file mode 100644 index 0000000..7412a01 --- /dev/null +++ b/app/src/main/res/drawable/shape_blue.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_btn_read_setting_checked.xml b/app/src/main/res/drawable/shape_btn_read_setting_checked.xml new file mode 100644 index 0000000..a7650e0 --- /dev/null +++ b/app/src/main/res/drawable/shape_btn_read_setting_checked.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_btn_read_setting_normal.xml b/app/src/main/res/drawable/shape_btn_read_setting_normal.xml new file mode 100644 index 0000000..0703ec3 --- /dev/null +++ b/app/src/main/res/drawable/shape_btn_read_setting_normal.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_corner.xml b/app/src/main/res/drawable/shape_corner.xml new file mode 100644 index 0000000..2090f7e --- /dev/null +++ b/app/src/main/res/drawable/shape_corner.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_corner_plain.xml b/app/src/main/res/drawable/shape_corner_plain.xml new file mode 100644 index 0000000..b8f78db --- /dev/null +++ b/app/src/main/res/drawable/shape_corner_plain.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_dialog.xml b/app/src/main/res/drawable/shape_dialog.xml new file mode 100644 index 0000000..3cf2978 --- /dev/null +++ b/app/src/main/res/drawable/shape_dialog.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_green.xml b/app/src/main/res/drawable/shape_green.xml new file mode 100644 index 0000000..43b14c3 --- /dev/null +++ b/app/src/main/res/drawable/shape_green.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_login_form.xml b/app/src/main/res/drawable/shape_login_form.xml new file mode 100644 index 0000000..415fd77 --- /dev/null +++ b/app/src/main/res/drawable/shape_login_form.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_login_round.xml b/app/src/main/res/drawable/shape_login_round.xml new file mode 100644 index 0000000..92d635d --- /dev/null +++ b/app/src/main/res/drawable/shape_login_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_purple.xml b/app/src/main/res/drawable/shape_purple.xml new file mode 100644 index 0000000..6926878 --- /dev/null +++ b/app/src/main/res/drawable/shape_purple.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_red.xml b/app/src/main/res/drawable/shape_red.xml new file mode 100644 index 0000000..d0650bb --- /dev/null +++ b/app/src/main/res/drawable/shape_red.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_school_name.xml b/app/src/main/res/drawable/shape_school_name.xml new file mode 100644 index 0000000..024fd00 --- /dev/null +++ b/app/src/main/res/drawable/shape_school_name.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_select.xml b/app/src/main/res/drawable/shape_select.xml new file mode 100644 index 0000000..d1f8c7d --- /dev/null +++ b/app/src/main/res/drawable/shape_select.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_switch_btn.xml b/app/src/main/res/drawable/shape_switch_btn.xml new file mode 100644 index 0000000..24236b5 --- /dev/null +++ b/app/src/main/res/drawable/shape_switch_btn.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_w_round.xml b/app/src/main/res/drawable/shape_w_round.xml new file mode 100644 index 0000000..de879bc --- /dev/null +++ b/app/src/main/res/drawable/shape_w_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_ios_thumb.xml b/app/src/main/res/drawable/switch_ios_thumb.xml new file mode 100644 index 0000000..4de058c --- /dev/null +++ b/app/src/main/res/drawable/switch_ios_thumb.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_ios_track_off.xml b/app/src/main/res/drawable/switch_ios_track_off.xml new file mode 100644 index 0000000..940ef79 --- /dev/null +++ b/app/src/main/res/drawable/switch_ios_track_off.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_ios_track_on.xml b/app/src/main/res/drawable/switch_ios_track_on.xml new file mode 100644 index 0000000..637dfdd --- /dev/null +++ b/app/src/main/res/drawable/switch_ios_track_on.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_ios_track_selector.xml b/app/src/main/res/drawable/switch_ios_track_selector.xml new file mode 100644 index 0000000..e443d65 --- /dev/null +++ b/app/src/main/res/drawable/switch_ios_track_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_base_weex.xml b/app/src/main/res/layout/activity_base_weex.xml new file mode 100644 index 0000000..ae71c41 --- /dev/null +++ b/app/src/main/res/layout/activity_base_weex.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_camera.xml b/app/src/main/res/layout/activity_camera.xml new file mode 100644 index 0000000..97d6aa3 --- /dev/null +++ b/app/src/main/res/layout/activity_camera.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml new file mode 100644 index 0000000..b6ee42a --- /dev/null +++ b/app/src/main/res/layout/activity_home.xml @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml new file mode 100644 index 0000000..f3a5ffd --- /dev/null +++ b/app/src/main/res/layout/activity_login.xml @@ -0,0 +1,181 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..dab163a --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pdf_view.xml b/app/src/main/res/layout/activity_pdf_view.xml new file mode 100644 index 0000000..2bfe1b3 --- /dev/null +++ b/app/src/main/res/layout/activity_pdf_view.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_read.xml b/app/src/main/res/layout/activity_read.xml new file mode 100644 index 0000000..d5435bd --- /dev/null +++ b/app/src/main/res/layout/activity_read.xml @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_web.xml b/app/src/main/res/layout/activity_web.xml new file mode 100644 index 0000000..6539c06 --- /dev/null +++ b/app/src/main/res/layout/activity_web.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_change.xml b/app/src/main/res/layout/dialog_change.xml new file mode 100644 index 0000000..cdb10c1 --- /dev/null +++ b/app/src/main/res/layout/dialog_change.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_leave.xml b/app/src/main/res/layout/dialog_leave.xml new file mode 100644 index 0000000..62c300d --- /dev/null +++ b/app/src/main/res/layout/dialog_leave.xml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_read_setting.xml b/app/src/main/res/layout/dialog_read_setting.xml new file mode 100644 index 0000000..8e82382 --- /dev/null +++ b/app/src/main/res/layout/dialog_read_setting.xml @@ -0,0 +1,329 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/dialog_test.xml b/app/src/main/res/layout/dialog_test.xml new file mode 100644 index 0000000..706a2af --- /dev/null +++ b/app/src/main/res/layout/dialog_test.xml @@ -0,0 +1,41 @@ + + + + + +