From 8a60755b60c1f41b54b807c70fc72d9006f7d7d0 Mon Sep 17 00:00:00 2001 From: zhanglei <350328959@qq.com> Date: Mon, 30 Jun 2025 14:12:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 26 + README.md | 10 + app/.gitignore | 18 + app/build.gradle | 133 ++ app/key/yxjkExpert.jks | Bin 0 -> 2612 bytes app/proguard-rules.pro | 229 ++ app/release/output-metadata.json | 20 + app/src/main/AndroidManifest.xml | 228 ++ app/src/main/assets/tab.json | 23 + .../yxjk/healthexpertclient/MyApplication.kt | 210 ++ .../healthexpertclient/base/BaseActivity.kt | 95 + .../healthexpertclient/base/BaseFragment.kt | 81 + .../healthexpertclient/bean/AppUpdateBean.kt | 16 + .../bean/CommonSettingMenuBean.kt | 14 + .../yxjk/healthexpertclient/bean/ImageBean.kt | 6 + .../bean/UploadFileResultBean.kt | 5 + .../healthexpertclient/bean/UserInfoBean.kt | 43 + .../bean/im/IMAssistantBean.kt | 11 + .../healthexpertclient/bean/im/IMInfoBean.kt | 7 + .../bean/login/LoginResultBean.kt | 8 + .../bean/mine/BillRecordBean.kt | 34 + .../bean/mine/CommonSettingMenuBean.kt | 13 + .../bean/mine/ConsultStatisticsBean.kt | 7 + .../bean/mine/ConsultTypeBean.kt | 8 + .../bean/mine/DiseaseBean.kt | 15 + .../bean/mine/DoctorBean.kt | 54 + .../bean/mine/PageManagerBean.kt | 9 + .../bean/mine/SchedulingBean.kt | 17 + .../bean/mine/SchedulingResultBean.kt | 8 + .../bean/mine/SuspensionServiceBean.kt | 24 + .../bean/other/UserListBean.java | 1577 ++++++++++++++ .../bean/workbench/AppointmentBean.kt | 46 + .../bean/workbench/ArchivesBean.kt | 24 + .../workbench/ArchivesDetailResultBean.kt | 12 + .../bean/workbench/AudioVideoCallBean.kt | 15 + .../bean/workbench/CallTimeBean.kt | 15 + .../workbench/CheckItemBySfzhTotalBean.java | 522 +++++ .../workbench/CheckRecordUserInfoBean.java | 167 ++ .../bean/workbench/CheckUpDetailListBean.java | 190 ++ .../bean/workbench/ConsultDetailBean.kt | 15 + .../bean/workbench/ConsultInfoBean.kt | 19 + .../bean/workbench/ConsultRecordBean.kt | 31 + .../bean/workbench/HealthInfoBean.kt | 10 + .../bean/workbench/MessageBean.kt | 21 + .../PhysicalExaminationReportBean.kt | 18 + .../bean/workbench/RefuseReasonBean.kt | 6 + .../bean/workbench/ResultItemListBean.java | 178 ++ .../bean/workbench/WorkBenchConsultNumBean.kt | 19 + .../yxjk/healthexpertclient/data/api/IMApi.kt | 14 + .../healthexpertclient/data/api/LoginApi.kt | 37 + .../healthexpertclient/data/api/MineApi.kt | 126 ++ .../healthexpertclient/data/api/OtherApi.kt | 58 + .../data/api/WorkbenchApi.kt | 139 ++ .../data/repository/IMRepository.kt | 17 + .../data/repository/LoginRepository.kt | 53 + .../data/repository/MineRepository.kt | 150 ++ .../data/repository/OtherRepository.kt | 74 + .../data/repository/WorkbenchRepository.kt | 193 ++ .../event/AddGoodAtDiseaseEvent.kt | 11 + .../event/ConsultRecordEvent.kt | 9 + .../healthexpertclient/event/DoctorEvent.kt | 9 + .../healthexpertclient/event/GlobalEvent.java | 14 + .../event/SuspensionServiceEvent.kt | 9 + .../event/WorkbenchEvent.kt | 9 + .../healthexpertclient/ext/DatimeEntityExt.kt | 25 + .../yxjk/healthexpertclient/ext/IMManager.kt | 161 ++ .../ext/StartActivityManager.kt | 262 +++ .../ui/im/IMMainActivity.java | 581 +++++ .../ui/im/MainMinimalistActivity.java | 446 ++++ .../ui/im/SelectLocationActivity.kt | 152 ++ .../ui/im/ViewLocationActivity.kt | 118 ++ .../ui/im/adapter/FragmentAdapter.java | 46 + .../ui/im/utils/IMInputActionSettingUtils.kt | 29 + .../healthexpertclient/ui/im/view/Menu.java | 172 ++ .../im/viewmodel/SelectLocationViewModel.kt | 14 + .../ui/im/viewmodel/ViewLocationViewModel.kt | 14 + .../ui/login/ChangePassWordActivity.kt | 117 + .../ui/login/LoginActivity.kt | 276 +++ .../ui/login/RetrievePassWordActivity.kt | 165 ++ .../ui/login/viewmodel/LoginViewModel.kt | 75 + .../viewmodel/RetrievePassWordViewModel.kt | 54 + .../ui/main/MainActivity.kt | 154 ++ .../healthexpertclient/ui/main/WebActivity.kt | 69 + .../ui/main/adapter/ImageAdapter.kt | 128 ++ .../ui/main/viewmodel/AppViewModel.kt | 84 + .../ui/main/viewmodel/MainViewModel.kt | 30 + .../ui/main/viewmodel/WebViewModel.kt | 8 + .../mine/AddSuspensionAnnouncementActivity.kt | 173 ++ .../ui/mine/BillRecordActivity.kt | 109 + .../ui/mine/ConsultStatisticsActivity.kt | 191 ++ .../ui/mine/CustomSchedulingActivity.kt | 119 ++ .../ui/mine/EditPasswordActivity.kt | 78 + .../ui/mine/GoodAtDiseaseActivity.kt | 82 + .../ui/mine/PersonInfoActivity.kt | 172 ++ .../ui/mine/SchedulingActivity.kt | 72 + .../ui/mine/SettingActivity.kt | 125 ++ .../ui/mine/SuspensionServiceActivity.kt | 141 ++ .../ui/mine/WithDrawActivity.kt | 31 + .../ui/mine/adapter/AddDiseaseAdapter.kt | 34 + .../ui/mine/adapter/BillRecordAdapter.kt | 21 + .../mine/adapter/CustomSchedulingAdapter.kt | 23 + .../ui/mine/adapter/DiseaseAdapter.kt | 22 + .../ui/mine/adapter/NewSchedulingAdapter.kt | 39 + .../ui/mine/adapter/SchedulingAdapter.kt | 79 + .../ui/mine/adapter/SuspensionCauseAdapter.kt | 22 + .../mine/adapter/SuspensionServiceAdapter.kt | 84 + .../ui/mine/fragment/BillRecordFragment.kt | 146 ++ .../ui/mine/fragment/MineFragment.kt | 135 ++ .../mine/utils/ConsultStatisticsFormatter.kt | 19 + .../AddSuspensionAnnouncementViewModel.kt | 88 + .../viewmodel/BillRecordFragmentViewModel.kt | 54 + .../ui/mine/viewmodel/BillRecordViewModel.kt | 11 + .../viewmodel/ConsultStatisticsViewModel.kt | 55 + .../viewmodel/CustomSchedulingViewModel.kt | 68 + .../mine/viewmodel/EditPasswordViewModel.kt | 60 + .../mine/viewmodel/GoodAtDiseaseViewModel.kt | 38 + .../ui/mine/viewmodel/MineViewModel.kt | 28 + .../ui/mine/viewmodel/PersonInfoViewModel.kt | 89 + .../ui/mine/viewmodel/SchedulingViewModel.kt | 92 + .../ui/mine/viewmodel/SettingViewModel.kt | 14 + .../viewmodel/SuspensionServiceViewModel.kt | 55 + .../ui/mine/viewmodel/WithDrawViewModel.kt | 28 + .../ui/other/SimulateUserActivity.kt | 144 ++ .../ui/other/SimulateUserViewModel.kt | 104 + .../ui/other/UserListAdapter.kt | 34 + .../ui/workbench/ArchivesDetailActivity.kt | 142 ++ .../ui/workbench/AudioVideoConsultActivity.kt | 254 +++ .../BaseHealthyInformationActivity.kt | 44 + .../ui/workbench/BigImageActivity.kt | 36 + .../ui/workbench/CheckUpDetailActivity.kt | 172 ++ .../ui/workbench/ConsultFinishActivity.kt | 49 + .../ui/workbench/ConsultHistoryActivity.kt | 81 + .../ui/workbench/ConsultRecordActivity.kt | 95 + .../ui/workbench/ConsultWaitStartActivity.kt | 76 + .../ImageTextConsultDetailActivity.kt | 47 + .../ui/workbench/MessageListActivity.kt | 94 + .../workbench/adapter/CheckUpDetailAdapter.kt | 172 ++ .../adapter/ConsultHistoryAdapter.kt | 34 + .../workbench/adapter/ConsultRecordAdapter.kt | 44 + .../ui/workbench/adapter/HealthInfoAdapter.kt | 30 + .../workbench/adapter/MessageListAdapter.kt | 28 + .../fragment/ConsultRecordFragment.kt | 191 ++ .../fragment/ConsultRecordGroupFragment.kt | 88 + .../workbench/fragment/WorkbenchFragment.kt | 176 ++ .../viewmodel/ArchivesDetailViewModel.kt | 54 + .../viewmodel/AudioVideoConsultViewModel.kt | 118 ++ .../BaseHealthyInformationViewModel.kt | 24 + .../workbench/viewmodel/BigImageViewModel.kt | 13 + .../viewmodel/CheckUpDetailViewModel.kt | 100 + .../viewmodel/ConsultFinishViewModel.kt | 25 + .../viewmodel/ConsultHistoryViewModel.kt | 38 + .../viewmodel/ConsultRecordViewModel.kt | 267 +++ .../viewmodel/ConsultWaitStartViewModel.kt | 31 + .../viewmodel/ImageTextConsultViewModel.kt | 27 + .../viewmodel/MessageListViewModel.kt | 53 + .../workbench/viewmodel/WorkbenchViewModel.kt | 124 ++ .../utils/AndroidBug5497Workaround.kt | 58 + .../utils/AuthCodeCountDownTimer.kt | 97 + .../healthexpertclient/utils/BrandUtil.java | 84 + .../healthexpertclient/utils/CommonUtils.kt | 154 ++ .../healthexpertclient/utils/ConstantUtils.kt | 265 +++ .../utils/CustomActivityManager.java | 120 ++ .../utils/DebuggerUtils.java | 103 + .../utils/DevicesInfoUtils.java | 39 + .../utils/GenerateTestUserSig.java | 257 +++ .../healthexpertclient/utils/KotlinHelp.java | 10 + .../utils/NineGridViewImageLoader.kt | 24 + .../healthexpertclient/utils/StatusbarUtil.kt | 103 + .../healthexpertclient/utils/StringExt.kt | 53 + .../healthexpertclient/utils/StringUtils.java | 217 ++ .../utils/SystemHelper.java | 80 + .../utils/TUIKitConstants.java | 40 + .../healthexpertclient/utils/TUIUtils.java | 84 + .../utils/pictureSelector/GlideEngine.java | 109 + .../ImageFileCompressEngine.kt | 37 + .../pictureSelector/ImageFileCropEngine.kt | 71 + .../updateplugin/CheckUpdateAppVersion.kt | 34 + .../utils/updateplugin/CustomFileChecker.kt | 114 + .../utils/updateplugin/CustomFileCreator.kt | 34 + .../view/AddDiseaseDialog.kt | 73 + .../view/BaseHealthyInformationView.kt | 34 + .../view/ConsultInformationView.kt | 360 ++++ .../view/CustomDownloadNotifier.java | 100 + .../view/CustomInstallNotifier.java | 63 + .../view/CustomPasswordView.kt | 55 + .../view/CustomRichTextView.kt | 134 ++ .../view/CustomSearchView.kt | 53 + .../view/CustomUpdateNotifier.java | 63 + .../view/DateTimeRangePicker.kt | 152 ++ .../view/LoadingProgressDialog.java | 110 + .../view/PopupWindowRecycleView.kt | 22 + .../healthexpertclient/view/PrivacyDialog.kt | 88 + .../view/ProgressDrawable.java | 116 + .../view/RefuseExplainDialog.kt | 112 + .../view/SpaceItemDecoration.kt | 121 ++ .../SuspensionAnnouncementAffirmDialog.kt | 74 + .../healthexpertclient/view/TextViewDialog.kt | 88 + .../view/bottomtab/HomeBottomTabLayout.kt | 349 +++ .../view/bottomtab/TabConfig.kt | 25 + .../view/bottomtab/TabFragmentPageAdapter.kt | 24 + .../view/bottomtab/TabUtils.kt | 119 ++ .../view/viewpager/ViewPagerAdapter.kt | 53 + .../layout/activity_select_location.xml | 27 + .../res-im/layout/activity_view_location.xml | 28 + app/src/main/res-im/layout/im_activity.xml | 174 ++ .../res-im/layout/overseas_main_activity.xml | 148 ++ .../res-login/drawable-xxhdpi/ic_icon.png | Bin 0 -> 17550 bytes .../res-login/drawable-xxhdpi/ic_icon_2.png | Bin 0 -> 105664 bytes .../res-login/drawable-xxhdpi/ic_login_bg.png | Bin 0 -> 1046693 bytes .../drawable-xxhdpi/ic_login_green_select.png | Bin 0 -> 1692 bytes .../drawable-xxhdpi/ic_login_name.png | Bin 0 -> 11373 bytes .../drawable-xxhdpi/ic_login_no_select.png | Bin 0 -> 1354 bytes .../bg_grey_background_shap_radius23.xml | 14 + .../drawable/bg_login_green_to_white.xml | 10 + ...e_bottom_right_angle_background_shap20.xml | 18 + .../main/res-login/layout/activity_login.xml | 134 ++ .../layout/activity_retrieve_password.xml | 273 +++ .../res-login/layout/custom_password_view.xml | 37 + app/src/main/res-login/values/strings.xml | 14 + .../drawable-xxhdpi/icon_mine_about_us.webp | Bin 0 -> 1732 bytes .../icon_mine_account_security.webp | Bin 0 -> 1528 bytes .../drawable-xxhdpi/icon_mine_assistant.webp | Bin 0 -> 5812 bytes .../icon_mine_personal_info.webp | Bin 0 -> 1834 bytes .../drawable-xxhdpi/icon_mine_scheduling.webp | Bin 0 -> 8516 bytes .../drawable-xxhdpi/icon_mine_statistics.webp | Bin 0 -> 8596 bytes .../icon_mine_suspension_service.webp | Bin 0 -> 5296 bytes .../activity_add_suspension_announcement.xml | 167 ++ .../res-mine/layout/activity_bill_record.xml | 36 + .../layout/activity_consult_statistics.xml | 315 +++ .../layout/activity_custom_scheduling.xml | 96 + .../layout/activity_edit_password.xml | 72 + .../layout/activity_good_at_disease.xml | 24 + .../res-mine/layout/activity_person_info.xml | 196 ++ .../res-mine/layout/activity_scheduling.xml | 108 + .../main/res-mine/layout/activity_setting.xml | 130 ++ .../layout/activity_suspension_service.xml | 35 + .../res-mine/layout/activity_with_draw.xml | 117 + .../res-mine/layout/dialog_add_disease.xml | 80 + .../dialog_suspension_announcement_affirm.xml | 156 ++ .../res-mine/layout/fragment_bill_list.xml | 20 + .../main/res-mine/layout/fragment_mine.xml | 237 +++ .../layout/item_recycle_add_disease.xml | 44 + .../layout/item_recycle_bill_record.xml | 54 + .../res-mine/layout/item_recycle_cause.xml | 27 + .../layout/item_recycle_custom_scheduling.xml | 25 + .../res-mine/layout/item_recycle_disease.xml | 28 + .../layout/item_recycle_new_scheduling.xml | 129 ++ .../layout/item_recycle_scheduling.xml | 68 + .../item_recycle_suspension_service.xml | 102 + ...item_recycle_suspension_service_header.xml | 23 + .../lay_audio_video_consult_setting.xml | 125 ++ .../layout/view_footer_suspension_service.xml | 32 + .../res-mine/layout/view_input_password.xml | 63 + .../res-mine/layout/view_person_info_item.xml | 46 + .../layout/view_with_draw_detail_item.xml | 37 + .../main/res-mine/menu/menu_bill_record.xml | 11 + app/src/main/res-mine/values/strings.xml | 122 ++ .../res-other/layout/activity_sumilate.xml | 51 + .../main/res-other/layout/item_user_list.xml | 92 + .../drawable-xxhdpi/bg_operate_time.9.png | Bin 0 -> 2743 bytes .../drawable-xxhdpi/ic_rich_down.png | Bin 0 -> 798 bytes .../drawable-xxhdpi/ic_rich_up.png | Bin 0 -> 798 bytes .../drawable-xxhdpi/icon_close.webp | Bin 0 -> 952 bytes .../icon_consult_assistant.webp | Bin 0 -> 5352 bytes .../drawable-xxhdpi/icon_consult_image.png | Bin 0 -> 5061 bytes .../drawable-xxhdpi/icon_consult_info.webp | Bin 0 -> 1996 bytes .../drawable-xxhdpi/icon_consult_video.png | Bin 0 -> 4578 bytes .../drawable-xxhdpi/icon_expansion.webp | Bin 0 -> 828 bytes .../drawable-xxhdpi/icon_time.webp | Bin 0 -> 1684 bytes .../bg_blue_background_shap_radius20.xml | 14 + .../res-workbench/drawable/bg_form_line.xml | 31 + .../layout/activity_archives_detail.xml | 254 +++ .../activity_base_healthy_information.xml | 28 + .../layout/activity_big_image.xml | 25 + .../layout/activity_check_up_detail.xml | 158 ++ .../layout/activity_consult_detail.xml | 50 + .../layout/activity_consult_finish.xml | 50 + .../layout/activity_consult_history.xml | 33 + .../layout/activity_consult_record.xml | 38 + .../layout/activity_consult_wait_confirm.xml | 116 + .../layout/activity_consult_wait_start.xml | 68 + .../layout/activity_message_list.xml | 29 + .../layout/dialog_header_date_time_range.xml | 112 + .../layout/dialog_refuse_explain.xml | 145 ++ .../layout/fragment_consult_record.xml | 23 + .../layout/fragment_group_consult_record.xml | 35 + .../layout/fragment_workbench.xml | 406 ++++ .../layout/item_check_up_detail.xml | 127 ++ .../layout/item_check_up_detail_chaild.xml | 73 + .../layout/item_recycle_consult_history.xml | 75 + .../layout/item_recycle_consult_record.xml | 55 + .../layout/item_recycle_health_info.xml | 25 + .../layout/item_recycle_message.xml | 44 + .../layout/item_spinner_dropdown.xml | 15 + .../layout/item_tablayout_group_title.xml | 13 + .../layout/lay_workbench_status.xml | 137 ++ .../layout/popupwindow_recycle_view.xml | 14 + .../layout/view_base_healthy_information.xml | 122 ++ .../layout/view_choice_question.xml | 41 + .../layout/view_consult_information.xml | 336 +++ .../layout/view_custom_rich_text_view.xml | 72 + .../layout/view_image_question.xml | 50 + .../layout/view_text_question.xml | 47 + app/src/main/res-workbench/values/strings.xml | 113 + .../res/color/color_child_tab_layout_text.xml | 6 + .../color_custom_scheduling_item_text.xml | 5 + .../main/res/color/color_state_menu_navi.xml | 5 + .../res/color/color_state_menu_navi_text.xml | 5 + .../color_suspension_cause_item_text.xml | 5 + .../main/res/color/color_tab_layout_text.xml | 6 + .../drawable-v24/ic_launcher_foreground.xml | 30 + .../bg_green_to_light_green.webp | Bin 0 -> 453210 bytes .../main/res/drawable-xxhdpi/ic_close.webp | Bin 0 -> 1130 bytes .../drawable-xxhdpi/ic_consult_num_tag.webp | Bin 0 -> 1906 bytes .../ic_default_archives_image.webp | Bin 0 -> 18546 bytes .../main/res/drawable-xxhdpi/ic_delete.webp | Bin 0 -> 2862 bytes .../main/res/drawable-xxhdpi/ic_message.png | Bin 0 -> 1562 bytes .../drawable-xxhdpi/ic_month_statistics.webp | Bin 0 -> 1308 bytes .../res/drawable-xxhdpi/ic_my_location.png | Bin 0 -> 2874 bytes .../main/res/drawable-xxhdpi/ic_search.webp | Bin 0 -> 1746 bytes .../drawable-xxhdpi/ic_select_location.png | Bin 0 -> 1161 bytes .../main/res/drawable-xxhdpi/ic_selected.webp | Bin 0 -> 1022 bytes .../res/drawable-xxhdpi/ic_unselected.webp | Bin 0 -> 890 bytes .../main/res/drawable-xxhdpi/icon_back.webp | Bin 0 -> 1192 bytes .../res/drawable-xxhdpi/icon_image_add.webp | Bin 0 -> 1912 bytes .../drawable-xxhdpi/icon_main_mine_normal.png | Bin 0 -> 1766 bytes .../icon_main_mine_selected.webp | Bin 0 -> 1478 bytes .../icon_main_workbench_normal.webp | Bin 0 -> 1440 bytes .../icon_main_workbench_selected.png | Bin 0 -> 1293 bytes .../drawable-xxhdpi/icon_more_small_gray.webp | Bin 0 -> 1076 bytes .../drawable/bg_80_white_background_shap.xml | 14 + .../res/drawable/bg_blue_background_shap.xml | 14 + .../bg_blue_background_shap_radius4.xml | 14 + .../res/drawable/bg_bottom_radius_card.xml | 81 + app/src/main/res/drawable/bg_card.xml | 72 + app/src/main/res/drawable/bg_card_bottom.xml | 71 + app/src/main/res/drawable/bg_card_top.xml | 71 + .../res/drawable/bg_child_tab_layout_item.xml | 8 + .../drawable/bg_custom_scheduling_item.xml | 7 + .../res/drawable/bg_date_time_range_text.xml | 9 + app/src/main/res/drawable/bg_frame.xml | 11 + app/src/main/res/drawable/bg_frame_blue.xml | 11 + .../main/res/drawable/bg_green_to_white.xml | 9 + app/src/main/res/drawable/bg_grey.xml | 14 + app/src/main/res/drawable/bg_line_1.xml | 44 + app/src/main/res/drawable/bg_line_all.xml | 44 + app/src/main/res/drawable/bg_loading_shap.xml | 9 + .../drawable/bg_orange_background_shap.xml | 14 + .../res/drawable/bg_red_background_shap.xml | 14 + app/src/main/res/drawable/bg_red_to_white.xml | 9 + .../res/drawable/bg_search_shap_radius23.xml | 14 + app/src/main/res/drawable/bg_spinner.xml | 29 + .../res/drawable/bg_spinner_transparent.xml | 21 + .../res/drawable/bg_suspension_cause_item.xml | 8 + app/src/main/res/drawable/bg_toast_shape.xml | 14 + app/src/main/res/drawable/bg_toolbar.xml | 16 + app/src/main/res/drawable/bg_transparent.xml | 8 + .../res/drawable/bg_white_background_shap.xml | 14 + .../bg_white_background_shap_radius14.xml | 14 + .../bg_white_background_shap_radius23.xml | 14 + .../drawable/bg_white_bottom_gray_line.xml | 16 + ...ite_bottom_right_angle_background_shap.xml | 18 + app/src/main/res/drawable/bg_white_line.xml | 9 + .../bg_white_right_angle_background_shap.xml | 13 + app/src/main/res/drawable/bg_white_round.xml | 11 + app/src/main/res/drawable/bg_white_stroke.xml | 15 + ..._white_top_right_angle_background_shap.xml | 18 + .../res/drawable/bottom_tab_red_point_bg.xml | 5 + .../main/res/drawable/check_theme_style.xml | 9 + ...mo_overseas_main_tab_contact_normal_bg.png | Bin 0 -> 1576 bytes ..._overseas_main_tab_contact_selected_bg.png | Bin 0 -> 1080 bytes ..._overseas_main_tab_conversation_normal.png | Bin 0 -> 1874 bytes ...verseas_main_tab_conversation_selected.png | Bin 0 -> 1531 bytes ...o_overseas_main_tab_settings_normal_bg.png | Bin 0 -> 2403 bytes ...overseas_main_tab_settings_selected_bg.png | Bin 0 -> 1745 bytes .../main/res/drawable/dotted_line_shape.xml | 17 + .../main/res/drawable/ic_health_guidance.png | Bin 0 -> 1907 bytes .../res/drawable/ic_home_emergency_doctor.png | Bin 0 -> 1949 bytes .../res/drawable/ic_home_health_checkup.png | Bin 0 -> 2406 bytes .../res/drawable/ic_home_health_report.png | Bin 0 -> 1459 bytes .../rectangle_bottom_gray_stroke_white.xml | 21 + .../rectangle_gray_stroke_transparent.xml | 13 + .../rectangle_grey_left_stroke_dark_grey.xml | 17 + .../rectangle_round_bottom_corner10_white.xml | 9 + ...rectangle_round_corner10_alpha94_theme.xml | 8 + ...ectangle_round_corner10_green_gradient.xml | 12 + .../rectangle_round_corner10_grey.xml | 8 + .../rectangle_round_corner10_white.xml | 8 + .../rectangle_round_corner20_dark_grey.xml | 8 + ...round_corner20_gray_stroke_transparent.xml | 14 + .../rectangle_round_corner20_grey.xml | 8 + .../rectangle_round_corner20_theme.xml | 8 + ...ngle_round_corner20_theme_stroke_white.xml | 14 + ...rectangle_round_corner3_green_gradient.xml | 12 + .../rectangle_round_corner5_dark_grey.xml | 8 + .../drawable/rectangle_round_corner5_grey.xml | 8 + ...tangle_round_corner5_grey_stroke_white.xml | 14 + .../rectangle_round_corner5_theme.xml | 8 + ...angle_round_corner5_theme_stroke_white.xml | 14 + ...rectangle_round_top_left_corner8_white.xml | 11 + app/src/main/res/drawable/rectangle_theme.xml | 7 + .../rectangle_top_round_corner20_white.xml | 14 + .../res/layout/activity_change_password.xml | 149 ++ app/src/main/res/layout/activity_main.xml | 38 + app/src/main/res/layout/activity_web.xml | 22 + .../res/layout/bottom_tab_item_layout.xml | 58 + .../main/res/layout/custom_search_view.xml | 56 + .../res/layout/dialog_privacy_text_view.xml | 116 + app/src/main/res/layout/dialog_text_view.xml | 109 + .../main/res/layout/item_recycle_image.xml | 37 + app/src/main/res/layout/lay_cut_off_rule.xml | 10 + app/src/main/res/layout/view_tips_loading.xml | 43 + app/src/main/res/layout/view_toolbar_lay.xml | 72 + app/src/main/res/menu/menu_bottom_nav.xml | 13 + .../res/mipmap-xhdpi/ic_guidance_doctor.png | Bin 0 -> 1189 bytes .../mipmap-xhdpi/ic_guidance_my_guidance.png | Bin 0 -> 828 bytes .../res/mipmap-xhdpi/ic_guidance_second.png | Bin 0 -> 828 bytes .../main/res/mipmap-xhdpi/ic_home_head_bg.png | Bin 0 -> 229574 bytes .../main/res/mipmap-xhdpi/ic_latest_news.png | Bin 0 -> 6064 bytes .../main/res/mipmap-xhdpi/ic_more_info.png | Bin 0 -> 921 bytes .../res/mipmap-xhdpi/ic_notice_no_read.png | Bin 0 -> 1652 bytes .../main/res/mipmap-xhdpi/ic_notice_read.png | Bin 0 -> 1532 bytes .../res/mipmap-xhdpi/ic_number_add_able.webp | Bin 0 -> 538 bytes .../mipmap-xhdpi/ic_number_lessen_able.webp | Bin 0 -> 722 bytes .../res/mipmap-xhdpi/ic_password_hind.png | Bin 0 -> 868 bytes .../res/mipmap-xhdpi/ic_password_show.png | Bin 0 -> 783 bytes .../main/res/mipmap-xhdpi/ic_right_more.png | Bin 0 -> 322 bytes .../main/res/mipmap-xhdpi/ic_search_icon.webp | Bin 0 -> 176 bytes .../main/res/mipmap-xhdpi/ic_user_head.png | Bin 0 -> 8082 bytes .../main/res/mipmap-xhdpi/img_arrow_down.png | Bin 0 -> 970 bytes .../main/res/mipmap-xhdpi/img_arrow_right.png | Bin 0 -> 1021 bytes .../main/res/mipmap-xhdpi/img_eye_close.png | Bin 0 -> 894 bytes .../main/res/mipmap-xhdpi/img_eye_open.png | Bin 0 -> 1155 bytes app/src/main/res/mipmap-xhdpi/login_img1.png | Bin 0 -> 1347091 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 59692 bytes app/src/main/res/values/attrs.xml | 27 + app/src/main/res/values/colors.xml | 125 ++ app/src/main/res/values/light_colors.xml | 8 + app/src/main/res/values/strings.xml | 267 +++ app/src/main/res/values/style.xml | 21 + app/src/main/res/values/styles.xml | 18 + app/src/main/res/values/themes.xml | 47 + .../main/res/xml/network_security_config.xml | 13 + build.gradle | 20 + config.gradle | 194 ++ gradle.properties | 21 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++ gradlew.bat | 89 + keystore.properties | 4 + lib_base/.gitignore | 1 + lib_base/build.gradle | 70 + lib_base/proguard-rules.pro | 148 ++ .../btpj/lib_base/ExampleInstrumentedTest.kt | 22 + lib_base/src/main/AndroidManifest.xml | 8 + .../main/java/com/btpj/lib_base/BaseApp.kt | 50 + .../com/btpj/lib_base/base/BaseVMBActivity.kt | 296 +++ .../com/btpj/lib_base/base/BaseVMBFragment.kt | 229 ++ .../com/btpj/lib_base/base/BaseViewModel.kt | 28 + .../adapter/BaseCheckRecycleViewAdapter.kt | 206 ++ .../base/adapter/BaseDataBindingAdapter.kt | 24 + .../btpj/lib_base/data/bean/ApiResponse.kt | 16 + .../btpj/lib_base/data/bean/PageResponse.kt | 16 + .../lib_base/data/local/DataStoreManager.kt | 221 ++ .../com/btpj/lib_base/data/local/IpManager.kt | 119 ++ .../lib_base/data/network/OtherRepository.kt | 71 + .../com/btpj/lib_base/event/LoginEvent.kt | 5 + .../com/btpj/lib_base/ext/BaseViewModelExt.kt | 80 + .../com/btpj/lib_base/ext/BindingViewExt.kt | 34 + .../java/com/btpj/lib_base/ext/StringExt.kt | 42 + .../java/com/btpj/lib_base/ext/ViewExt.kt | 365 ++++ .../com/btpj/lib_base/http/BaseRepository.kt | 18 + .../com/btpj/lib_base/http/RetrofitManager.kt | 94 + .../com/btpj/lib_base/http/api/OtherAPi.kt | 86 + .../http/factory/GsonConverterFactory.java | 78 + .../factory/GsonRequestBodyConverter.java | 38 + .../factory/GsonResponseBodyConverter.java | 39 + .../BaseCustomDynamicInterceptor.kt | 228 ++ .../http/interceptor/CacheInterceptor.kt | 39 + .../http/interceptor/CustomSignInterceptor.kt | 82 + .../http/interceptor/LogInterceptor.kt | 16 + .../java/com/btpj/lib_base/utils/AppUtil.kt | 27 + .../java/com/btpj/lib_base/utils/CacheUtil.kt | 117 + .../com/btpj/lib_base/utils/CommonUtil.kt | 31 + .../com/btpj/lib_base/utils/DataStoreUtils.kt | 272 +++ .../java/com/btpj/lib_base/utils/DateUtil.kt | 741 +++++++ .../btpj/lib_base/utils/DeviceInfoUtils.kt | 257 +++ .../java/com/btpj/lib_base/utils/GsonUtil.kt | 31 + .../com/btpj/lib_base/utils/KeyboardUtil.kt | 161 ++ .../java/com/btpj/lib_base/utils/LogUtil.kt | 139 ++ .../java/com/btpj/lib_base/utils/MacUtil.kt | 107 + .../com/btpj/lib_base/utils/NetworkUtil.kt | 47 + .../com/btpj/lib_base/utils/ScreenUtil.kt | 110 + .../com/btpj/lib_base/utils/StatusBarUtil.kt | 84 + .../java/com/btpj/lib_base/utils/ToastUtil.kt | 69 + .../com/btpj/lib_base/widgets/FlowLayout.kt | 421 ++++ .../com/btpj/lib_base/widgets/TitleLayout.kt | 259 +++ .../main/res/drawable-xxhdpi/ic_default.jpg | Bin 0 -> 18959 bytes .../drawable-xxhdpi/ic_default_head_img.webp | Bin 0 -> 7830 bytes .../main/res/drawable-xxhdpi/icon_back.webp | Bin 0 -> 1192 bytes .../drawable-xxhdpi/image_default_empty.webp | Bin 0 -> 100674 bytes .../src/main/res/drawable/bg_circle_red.xml | 12 + lib_base/src/main/res/drawable/ic_back.xml | 9 + .../src/main/res/drawable/ic_default_img.xml | 9 + .../src/main/res/drawable/ic_list_empty.xml | 15 + .../src/main/res/layout/dialog_loading.xml | 35 + lib_base/src/main/res/layout/layout_empty.xml | 23 + lib_base/src/main/res/layout/layout_title.xml | 94 + lib_base/src/main/res/values/attrs.xml | 27 + lib_base/src/main/res/values/colors.xml | 36 + lib_base/src/main/res/values/dimens.xml | 9 + lib_base/src/main/res/values/ids.xml | 6 + lib_base/src/main/res/values/strings.xml | 7 + lib_base/src/main/res/values/styles.xml | 3 + .../java/com/btpj/lib_base/ExampleUnitTest.kt | 20 + ninegridview/.gitignore | 1 + ninegridview/build.gradle | 27 + ninegridview/proguard-rules.pro | 17 + ninegridview/src/main/AndroidManifest.xml | 15 + .../main/java/com/lzy/ninegrid/ImageInfo.java | 86 + .../java/com/lzy/ninegrid/NineGridView.java | 252 +++ .../com/lzy/ninegrid/NineGridViewAdapter.java | 51 + .../com/lzy/ninegrid/NineGridViewWrapper.java | 138 ++ .../lzy/ninegrid/preview/HackyViewPager.java | 39 + .../preview/ImagePreviewActivity.java | 233 ++ .../ninegrid/preview/ImagePreviewAdapter.java | 128 ++ .../preview/NineGridViewClickAdapter.java | 77 + .../main/res/drawable/ic_default_color.xml | 5 + .../src/main/res/layout/activity_preview.xml | 23 + .../src/main/res/layout/item_photoview.xml | 18 + ninegridview/src/main/res/values/attrs.xml | 13 + ninegridview/src/main/res/values/colors.xml | 4 + ninegridview/src/main/res/values/strings.xml | 4 + rsalibrary/.gitignore | 1 + rsalibrary/build.gradle | 30 + rsalibrary/proguard-rules.pro | 25 + .../rsalibrary/ExampleInstrumentedTest.java | 24 + rsalibrary/src/main/AndroidManifest.xml | 13 + .../rsalibrary/AESCipherStrategy.java | 222 ++ .../java/com/baileren/rsalibrary/Base64.java | 254 +++ .../baileren/rsalibrary/CipherStrategy.java | 75 + .../rsalibrary/RSACipherStrategy.java | 145 ++ .../com/baileren/rsalibrary/RSAUtils.java | 328 +++ rsalibrary/src/main/res/values/strings.xml | 3 + .../baileren/rsalibrary/ExampleUnitTest.java | 21 + settings.gradle | 57 + system/base_resource/.gitignore | 1 + system/base_resource/build.gradle | 36 + system/base_resource/consumer-rules.pro | 0 system/base_resource/proguard-rules.pro | 21 + .../src/main/AndroidManifest.xml | 5 + .../src/main/res/drawable/dialog_update.xml | 6 + .../src/main/res/drawable/dialog_waiting.xml | 6 + .../main/res/drawable/shape_bottom_line.xml | 15 + .../src/main/res/values/colors.xml | 14 + .../src/main/res/values/dimens.xml | 428 ++++ .../src/main/res/values/strings.xml | 3 + .../src/main/res/values/styles.xml | 15 + .../src/main/res/xml/file_paths.xml | 22 + .../main/res/xml/network_security_config.xml | 4 + system/basic/.gitignore | 1 + system/basic/build.gradle | 41 + system/basic/consumer-rules.pro | 0 system/basic/proguard-rules.pro | 21 + system/basic/src/main/AndroidManifest.xml | 5 + .../src/main/res/drawable/dialog_update.xml | 6 + .../src/main/res/drawable/dialog_waiting.xml | 6 + .../main/res/drawable/shape_bottom_line.xml | 15 + .../src/main/res/values-sw1024dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw1280dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw1365dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw240dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw320dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw384dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw392dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw400dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw410dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw411dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw432dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw480dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw533dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw592dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw600dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw640dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw662dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw720dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw768dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw800dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw811dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw820dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw960dp/dimens.xml | 839 ++++++++ .../src/main/res/values-sw961dp/dimens.xml | 839 ++++++++ system/basic/src/main/res/values/colors.xml | 14 + system/basic/src/main/res/values/dimens.xml | 428 ++++ system/basic/src/main/res/values/strings.xml | 3 + system/basic/src/main/res/values/styles.xml | 15 + system/basic/src/main/res/xml/file_paths.xml | 22 + .../main/res/xml/network_security_config.xml | 4 + system/tuicallkit-7.3.4358/build.gradle | 50 + system/tuicallkit-7.3.4358/proguard-rules.pro | 21 + .../src/main/AndroidManifest.xml | 51 + .../qcloud/tuikit/tuicallkit/TUICallKit.java | 98 + .../tuikit/tuicallkit/TUICallKitImpl.java | 840 ++++++++ .../tuicallkit/base/BaseCallActivity.java | 100 + .../tuicallkit/base/CallingUserModel.java | 38 + .../tuikit/tuicallkit/base/Constants.java | 30 + .../tuicallkit/base/TUICallingAction.java | 149 ++ .../base/TUICallingStatusManager.java | 153 ++ .../tuikit/tuicallkit/base/UserLayout.java | 119 ++ .../tuicallkit/base/UserLayoutEntity.java | 7 + .../config/OfflinePushInfoConfig.java | 34 + .../extensions/CallingBellFeature.java | 133 ++ .../extensions/CallingKeepAliveFeature.java | 32 + .../CallingScreenSensorFeature.java | 72 + .../inviteuser/GroupMemberInfo.java | 8 + .../inviteuser/SelectGroupMemberActivity.java | 132 ++ .../inviteuser/SelectGroupMemberAdapter.java | 81 + .../recents/RecentCallsFragment.java | 310 +++ .../recents/RecentCallsItemHolder.java | 120 ++ .../recents/RecentCallsListAdapter.java | 207 ++ .../recents/RecentCallsViewModel.java | 99 + .../extensions/recents/RecordsIconView.java | 76 + .../interfaces/ICallRecordItemListener.java | 13 + .../internal/ServiceInitializer.java | 120 ++ .../TUIAudioMessageRecordService.java | 337 +++ .../internal/TUICallingService.java | 391 ++++ .../tuicallkit/service/TUICallService.java | 80 + .../tuikit/tuicallkit/utils/DeviceUtils.java | 79 + .../tuikit/tuicallkit/utils/DisplayUtils.java | 214 ++ .../tuikit/tuicallkit/utils/ImageLoader.java | 107 + .../tuicallkit/utils/PermissionRequest.java | 119 ++ .../tuicallkit/utils/UserInfoUtils.java | 112 + .../view/TUICallingViewManager.java | 898 ++++++++ .../tuicallkit/view/UserLayoutFactory.java | 49 + .../view/common/RoundCornerImageView.java | 132 ++ .../view/common/SlideRecyclerView.java | 226 ++ .../view/common/gridimage/GridImageData.java | 93 + .../gridimage/GridImageSynthesizer.java | 317 +++ .../view/common/gridimage/ThreadUtils.java | 26 + .../view/component/BaseUserView.java | 18 + .../TUICallingSingleVideoUserView.java | 43 + .../view/component/TUICallingUserView.java | 42 + .../view/floatwindow/FloatCallView.java | 171 ++ .../view/floatwindow/FloatWindowService.java | 202 ++ .../view/floatwindow/HomeWatcher.java | 71 + .../view/function/BaseFunctionView.java | 73 + .../function/TUICallingAudioFunctionView.java | 94 + .../function/TUICallingSwitchAudioView.java | 33 + .../function/TUICallingVideoFunctionView.java | 131 ++ .../TUICallingVideoInviteFunctionView.java | 48 + .../function/TUICallingWaitFunctionView.java | 52 + .../tuicallkit/view/root/BaseCallView.java | 77 + .../view/root/TUICallingGroupView.java | 318 +++ .../view/root/TUICallingImageView.java | 107 + .../view/root/TUICallingSingleView.java | 283 +++ .../tuicalling_ic_add_user_black.png | Bin 0 -> 696 bytes .../tuicalling_ic_add_user_white.png | Bin 0 -> 749 bytes .../tuicalling_ic_audio_call.png | Bin 0 -> 4130 bytes .../drawable-xxhdpi/tuicalling_ic_avatar.png | Bin 0 -> 62337 bytes .../tuicalling_ic_camera_disable.png | Bin 0 -> 3041 bytes .../tuicalling_ic_camera_enable.png | Bin 0 -> 2972 bytes .../drawable-xxhdpi/tuicalling_ic_dialing.png | Bin 0 -> 10443 bytes .../tuicalling_ic_dialing_pressed.png | Bin 0 -> 10609 bytes .../drawable-xxhdpi/tuicalling_ic_float.png | Bin 0 -> 698 bytes .../tuicalling_ic_handsfree_disable.png | Bin 0 -> 2720 bytes .../tuicalling_ic_handsfree_enable.png | Bin 0 -> 3305 bytes .../drawable-xxhdpi/tuicalling_ic_hangup.png | Bin 0 -> 9546 bytes .../tuicalling_ic_hangup_pressed.png | Bin 0 -> 9730 bytes .../tuicalling_ic_mic_mute.png | Bin 0 -> 3246 bytes .../tuicalling_ic_mic_unmute.png | Bin 0 -> 3823 bytes .../tuicalling_ic_move_back_black.png | Bin 0 -> 642 bytes .../tuicalling_ic_move_back_white.png | Bin 0 -> 654 bytes .../tuicalling_ic_switch_camera.png | Bin 0 -> 1891 bytes .../tuicalling_ic_switch_to_audio_call.png | Bin 0 -> 1238 bytes .../tuicalling_ic_video_call.png | Bin 0 -> 3113 bytes .../drawable-xxhdpi/tuicalling_loading.gif | Bin 0 -> 64539 bytes ...t_title_bar_minimalist_audio_call_icon.png | Bin 0 -> 1666 bytes ...t_title_bar_minimalist_video_call_icon.png | Bin 0 -> 1243 bytes .../tuicallkit_check_box_group_selected.png | Bin 0 -> 2928 bytes .../tuicallkit_check_box_group_unselected.png | Bin 0 -> 2576 bytes .../tuicallkit_checkbox_selected.png | Bin 0 -> 647 bytes .../tuicallkit_group_select_disable.png | Bin 0 -> 1108 bytes .../tuicallkit_ic_audio_call.png | Bin 0 -> 630 bytes .../drawable-xxhdpi/tuicallkit_ic_back.png | Bin 0 -> 537 bytes .../drawable-xxhdpi/tuicallkit_ic_delete.png | Bin 0 -> 489 bytes .../drawable-xxhdpi/tuicallkit_ic_edit.png | Bin 0 -> 571 bytes .../tuicallkit_ic_more_info.png | Bin 0 -> 811 bytes .../tuicallkit_ic_start_call.png | Bin 0 -> 1563 bytes ...icallkit_profile_minimalist_audio_icon.png | Bin 0 -> 1610 bytes ...icallkit_profile_minimalist_video_icon.png | Bin 0 -> 1326 bytes .../tuicallkit_record_ic_video_call.png | Bin 0 -> 556 bytes .../res/drawable/tuicalling_bg_camera.xml | 5 + .../res/drawable/tuicalling_bg_dialing.xml | 5 + .../drawable/tuicalling_bg_floatwindow.xml | 6 + .../tuicalling_bg_floatwindow_left.xml | 8 + .../tuicalling_bg_floatwindow_right.xml | 8 + .../res/drawable/tuicalling_bg_handsfree.xml | 5 + .../res/drawable/tuicalling_bg_hangup.xml | 5 + .../res/drawable/tuicalling_bg_mute_mic.xml | 5 + .../res/drawable/tuicallkit_dialog_cancel.xml | 5 + .../res/drawable/tuicallkit_dialog_sure.xml | 5 + .../tuicallkit_group_checkbox_selector.xml | 9 + .../drawable/tuicallkit_tab_item_selector.xml | 16 + .../res/drawable/tuicallkit_tab_selector.xml | 5 + .../tuicalling_background_group_view.xml | 72 + .../tuicalling_background_image_view.xml | 87 + .../tuicalling_background_single_view.xml | 74 + .../res/layout/tuicalling_base_activity.xml | 11 + .../layout/tuicalling_floatwindow_layout.xml | 59 + .../tuicalling_funcation_view_audio.xml | 92 + ...uicalling_funcation_view_audio_waiting.xml | 64 + .../tuicalling_funcation_view_video.xml | 132 ++ ...icalling_funcation_view_video_inviting.xml | 46 + .../layout/tuicalling_group_user_layout.xml | 58 + .../tuicalling_single_video_user_view.xml | 44 + .../layout/tuicalling_switch_audio_view.xml | 34 + .../main/res/layout/tuicalling_user_view.xml | 30 + .../layout/tuicallkit_activity_group_user.xml | 49 + .../tuicallkit_group_user_list_item.xml | 66 + .../res/layout/tuicallkit_item_head_view.xml | 17 + .../tuicallkit_layout_call_list_item.xml | 93 + .../tuicallkit_layout_call_list_item_sub.xml | 99 + .../res/layout/tuicallkit_record_dialog.xml | 35 + .../tuicallkit_record_fragment_main.xml | 110 + .../src/main/res/raw/phone_dialing.mp3 | Bin 0 -> 1153611 bytes .../src/main/res/raw/phone_hangup.mp3 | Bin 0 -> 70679 bytes .../src/main/res/raw/phone_ringing.mp3 | Bin 0 -> 926945 bytes .../src/main/res/values-en/strings.xml | 68 + .../src/main/res/values-zh/strings.xml | 68 + .../src/main/res/values/attrs.xml | 17 + .../src/main/res/values/colors.xml | 15 + .../src/main/res/values/dimens.xml | 6 + .../src/main/res/values/strings.xml | 68 + .../src/main/res/values/styles.xml | 21 + system/tuicallkit/.gitignore | 1 + system/tuicallkit/build.gradle | 50 + system/tuicallkit/proguard-rules.pro | 21 + .../tuicallkit/src/main/AndroidManifest.xml | 43 + .../qcloud/tuikit/tuicallkit/TUICallKit.java | 98 + .../tuikit/tuicallkit/TUICallKitImpl.java | 846 ++++++++ .../tuicallkit/base/BaseCallActivity.java | 111 + .../tuicallkit/base/CallingUserModel.java | 38 + .../tuikit/tuicallkit/base/Constants.java | 31 + .../tuicallkit/base/TUICallingAction.java | 149 ++ .../base/TUICallingStatusManager.java | 156 ++ .../tuikit/tuicallkit/base/UserLayout.java | 122 ++ .../tuicallkit/base/UserLayoutEntity.java | 7 + .../config/OfflinePushInfoConfig.java | 25 + .../tuikit/tuicallkit/event/CallBackEvent.kt | 15 + .../extensions/CallingBellFeature.java | 154 ++ .../extensions/CallingKeepAliveFeature.java | 32 + .../CallingScreenSensorFeature.java | 75 + .../internal/ServiceInitializer.java | 120 ++ .../TUIAudioMessageRecordService.java | 335 +++ .../internal/TUICallingService.java | 183 ++ .../tuicallkit/service/TUICallService.java | 88 + .../tuikit/tuicallkit/utils/DeviceUtils.java | 79 + .../tuikit/tuicallkit/utils/DisplayUtils.java | 216 ++ .../tuikit/tuicallkit/utils/ImageLoader.java | 135 ++ .../tuicallkit/utils/PermissionRequest.java | 208 ++ .../tuicallkit/utils/UserInfoUtils.java | 112 + .../view/TUICallingViewManager.java | 888 ++++++++ .../tuicallkit/view/UserLayoutFactory.java | 49 + .../view/component/BaseUserView.java | 18 + .../TUICallingSingleVideoUserView.java | 43 + .../view/component/TUICallingUserView.java | 42 + .../view/floatwindow/FloatCallView.java | 171 ++ .../view/floatwindow/FloatWindowService.java | 201 ++ .../view/floatwindow/HomeWatcher.java | 71 + .../view/function/BaseFunctionView.java | 73 + .../function/TUICallingAudioFunctionView.java | 94 + .../function/TUICallingSwitchAudioView.java | 32 + .../function/TUICallingVideoFunctionView.java | 142 ++ .../TUICallingVideoInviteFunctionView.java | 48 + .../function/TUICallingWaitFunctionView.java | 52 + .../tuicallkit/view/root/BaseCallView.java | 77 + .../view/root/TUICallingGroupView.java | 351 +++ .../view/root/TUICallingImageView.java | 107 + .../view/root/TUICallingSingleView.java | 291 +++ .../tuicalling_ic_add_user_black.png | Bin 0 -> 696 bytes .../tuicalling_ic_add_user_white.png | Bin 0 -> 749 bytes .../tuicalling_ic_audio_call.png | Bin 0 -> 4130 bytes .../drawable-xxhdpi/tuicalling_ic_avatar.png | Bin 0 -> 30403 bytes .../tuicalling_ic_camera_disable.png | Bin 0 -> 3041 bytes .../tuicalling_ic_camera_enable.png | Bin 0 -> 2972 bytes .../drawable-xxhdpi/tuicalling_ic_dialing.png | Bin 0 -> 10443 bytes .../tuicalling_ic_dialing_pressed.png | Bin 0 -> 10609 bytes .../drawable-xxhdpi/tuicalling_ic_float.png | Bin 0 -> 698 bytes .../tuicalling_ic_handsfree_disable.png | Bin 0 -> 2720 bytes .../tuicalling_ic_handsfree_enable.png | Bin 0 -> 3305 bytes .../drawable-xxhdpi/tuicalling_ic_hangup.png | Bin 0 -> 9546 bytes .../tuicalling_ic_hangup_pressed.png | Bin 0 -> 9730 bytes .../tuicalling_ic_mic_mute.png | Bin 0 -> 3246 bytes .../tuicalling_ic_mic_unmute.png | Bin 0 -> 3823 bytes .../tuicalling_ic_move_back_black.png | Bin 0 -> 642 bytes .../tuicalling_ic_move_back_white.png | Bin 0 -> 654 bytes .../tuicalling_ic_switch_camera.png | Bin 0 -> 1891 bytes .../tuicalling_ic_switch_to_audio_call.png | Bin 0 -> 1238 bytes .../tuicalling_ic_video_call.png | Bin 0 -> 3113 bytes .../drawable-xxhdpi/tuicalling_loading.gif | Bin 0 -> 64539 bytes .../res/drawable/tuicalling_bg_camera.xml | 5 + .../res/drawable/tuicalling_bg_dialing.xml | 5 + .../drawable/tuicalling_bg_floatwindow.xml | 6 + .../tuicalling_bg_floatwindow_left.xml | 8 + .../tuicalling_bg_floatwindow_right.xml | 8 + .../res/drawable/tuicalling_bg_handsfree.xml | 5 + .../res/drawable/tuicalling_bg_hangup.xml | 5 + .../res/drawable/tuicalling_bg_mute_mic.xml | 5 + .../res/layout/chat_input_more_action.xml | 30 + .../tuicalling_background_group_view.xml | 72 + .../tuicalling_background_image_view.xml | 87 + .../tuicalling_background_single_view.xml | 74 + .../res/layout/tuicalling_base_activity.xml | 11 + .../layout/tuicalling_floatwindow_layout.xml | 59 + .../tuicalling_funcation_view_audio.xml | 92 + ...uicalling_funcation_view_audio_waiting.xml | 64 + .../tuicalling_funcation_view_video.xml | 132 ++ ...icalling_funcation_view_video_inviting.xml | 46 + .../layout/tuicalling_group_user_layout.xml | 51 + .../tuicalling_single_video_user_view.xml | 44 + .../layout/tuicalling_switch_audio_view.xml | 34 + .../main/res/layout/tuicalling_user_view.xml | 30 + .../src/main/res/raw/phone_dialing.mp3 | Bin 0 -> 1153611 bytes .../src/main/res/raw/phone_hangup.mp3 | Bin 0 -> 70679 bytes .../src/main/res/raw/phone_ringing.mp3 | Bin 0 -> 926945 bytes .../src/main/res/values-en/strings.xml | 50 + .../src/main/res/values-zh/strings.xml | 50 + .../tuicallkit/src/main/res/values/attrs.xml | 4 + .../tuicallkit/src/main/res/values/colors.xml | 12 + .../tuicallkit/src/main/res/values/dimens.xml | 6 + .../src/main/res/values/strings.xml | 50 + .../tuicallkit/src/main/res/values/styles.xml | 4 + system/tuichat/.gitignore | 1 + system/tuichat/build.gradle | 67 + system/tuichat/src/main/AndroidManifest.xml | 106 + .../tuichat/src/main/assets/emoji/[NO]@2x.png | Bin 0 -> 1271 bytes .../tuichat/src/main/assets/emoji/[OK]@2x.png | Bin 0 -> 1509 bytes .../src/main/assets/emoji/[下雨]@2x.png | Bin 0 -> 1351 bytes .../src/main/assets/emoji/[么么哒]@2x.png | Bin 0 -> 1961 bytes .../src/main/assets/emoji/[乒乓]@2x.png | Bin 0 -> 1414 bytes .../src/main/assets/emoji/[便便]@2x.png | Bin 0 -> 1766 bytes .../src/main/assets/emoji/[信封]@2x.png | Bin 0 -> 581 bytes .../src/main/assets/emoji/[偷笑]@2x.png | Bin 0 -> 2147 bytes .../src/main/assets/emoji/[傲慢]@2x.png | Bin 0 -> 2005 bytes .../src/main/assets/emoji/[再见]@2x.png | Bin 0 -> 1790 bytes .../src/main/assets/emoji/[冷汗]@2x.png | Bin 0 -> 2091 bytes .../src/main/assets/emoji/[凋谢]@2x.png | Bin 0 -> 947 bytes .../tuichat/src/main/assets/emoji/[刀]@2x.png | Bin 0 -> 1068 bytes .../src/main/assets/emoji/[删除]@2x.png | Bin 0 -> 301 bytes .../src/main/assets/emoji/[勾引]@2x.png | Bin 0 -> 1356 bytes .../src/main/assets/emoji/[发呆]@2x.png | Bin 0 -> 2057 bytes .../src/main/assets/emoji/[发抖]@2x.png | Bin 0 -> 2190 bytes .../src/main/assets/emoji/[可怜]@2x.png | Bin 0 -> 2296 bytes .../src/main/assets/emoji/[可爱]@2x.png | Bin 0 -> 1957 bytes .../src/main/assets/emoji/[右哼哼]@2x.png | Bin 0 -> 1480 bytes .../src/main/assets/emoji/[右太极]@2x.png | Bin 0 -> 1875 bytes .../src/main/assets/emoji/[右车头]@2x.png | Bin 0 -> 1144 bytes .../tuichat/src/main/assets/emoji/[吐]@2x.png | Bin 0 -> 2246 bytes .../tuichat/src/main/assets/emoji/[吓]@2x.png | Bin 0 -> 1902 bytes .../src/main/assets/emoji/[咒骂]@2x.png | Bin 0 -> 2089 bytes .../src/main/assets/emoji/[咖啡]@2x.png | Bin 0 -> 1934 bytes .../src/main/assets/emoji/[啤酒]@2x.png | Bin 0 -> 2028 bytes .../tuichat/src/main/assets/emoji/[嘘]@2x.png | Bin 0 -> 2101 bytes .../src/main/assets/emoji/[回头]@2x.png | Bin 0 -> 1615 bytes .../tuichat/src/main/assets/emoji/[困]@2x.png | Bin 0 -> 2156 bytes .../src/main/assets/emoji/[坏笑]@2x.png | Bin 0 -> 1885 bytes .../src/main/assets/emoji/[多云]@2x.png | Bin 0 -> 975 bytes .../src/main/assets/emoji/[大兵]@2x.png | Bin 0 -> 1963 bytes .../src/main/assets/emoji/[大哭]@2x.png | Bin 0 -> 1794 bytes .../src/main/assets/emoji/[太阳]@2x.png | Bin 0 -> 2101 bytes .../src/main/assets/emoji/[奋斗]@2x.png | Bin 0 -> 1749 bytes .../src/main/assets/emoji/[奶瓶]@2x.png | Bin 0 -> 1654 bytes .../src/main/assets/emoji/[委屈]@2x.png | Bin 0 -> 2136 bytes .../src/main/assets/emoji/[害羞]@2x.png | Bin 0 -> 1982 bytes .../src/main/assets/emoji/[尴尬]@2x.png | Bin 0 -> 1770 bytes .../src/main/assets/emoji/[左哼哼]@2x.png | Bin 0 -> 1846 bytes .../src/main/assets/emoji/[左太极]@2x.png | Bin 0 -> 1933 bytes .../src/main/assets/emoji/[左车头]@2x.png | Bin 0 -> 1112 bytes .../src/main/assets/emoji/[差劲]@2x.png | Bin 0 -> 1361 bytes .../tuichat/src/main/assets/emoji/[弱]@2x.png | Bin 0 -> 1277 bytes .../tuichat/src/main/assets/emoji/[强]@2x.png | Bin 0 -> 1314 bytes .../src/main/assets/emoji/[彩带]@2x.png | Bin 0 -> 2681 bytes .../src/main/assets/emoji/[彩球]@2x.png | Bin 0 -> 1454 bytes .../src/main/assets/emoji/[得意]@2x.png | Bin 0 -> 1924 bytes .../src/main/assets/emoji/[微笑]@2x.png | Bin 0 -> 1920 bytes .../src/main/assets/emoji/[心碎了]@2x.png | Bin 0 -> 1402 bytes .../src/main/assets/emoji/[快哭了]@2x.png | Bin 0 -> 1958 bytes .../src/main/assets/emoji/[怄火]@2x.png | Bin 0 -> 1940 bytes .../tuichat/src/main/assets/emoji/[怒]@2x.png | Bin 0 -> 2069 bytes .../src/main/assets/emoji/[惊恐]@2x.png | Bin 0 -> 1948 bytes .../src/main/assets/emoji/[惊讶]@2x.png | Bin 0 -> 1972 bytes .../src/main/assets/emoji/[憨笑]@2x.png | Bin 0 -> 2026 bytes .../src/main/assets/emoji/[手枪]@2x.png | Bin 0 -> 1145 bytes .../src/main/assets/emoji/[打哈欠]@2x.png | Bin 0 -> 2285 bytes .../src/main/assets/emoji/[抓狂]@2x.png | Bin 0 -> 2221 bytes .../src/main/assets/emoji/[折磨]@2x.png | Bin 0 -> 2244 bytes .../src/main/assets/emoji/[抠鼻]@2x.png | Bin 0 -> 2036 bytes .../src/main/assets/emoji/[抱抱]@2x.png | Bin 0 -> 1730 bytes .../src/main/assets/emoji/[抱拳]@2x.png | Bin 0 -> 1445 bytes .../src/main/assets/emoji/[拳头]@2x.png | Bin 0 -> 1334 bytes .../src/main/assets/emoji/[挥手]@2x.png | Bin 0 -> 1960 bytes .../src/main/assets/emoji/[握手]@2x.png | Bin 0 -> 1445 bytes .../src/main/assets/emoji/[撇嘴]@2x.png | Bin 0 -> 2083 bytes .../src/main/assets/emoji/[擦汗]@2x.png | Bin 0 -> 2203 bytes .../src/main/assets/emoji/[敲打]@2x.png | Bin 0 -> 1997 bytes .../tuichat/src/main/assets/emoji/[晕]@2x.png | Bin 0 -> 2095 bytes .../src/main/assets/emoji/[月亮]@2x.png | Bin 0 -> 2144 bytes .../src/main/assets/emoji/[棒棒糖]@2x.png | Bin 0 -> 2415 bytes .../src/main/assets/emoji/[汽车]@2x.png | Bin 0 -> 1759 bytes .../src/main/assets/emoji/[沙发]@2x.png | Bin 0 -> 1406 bytes .../src/main/assets/emoji/[流汗]@2x.png | Bin 0 -> 1914 bytes .../src/main/assets/emoji/[流泪]@2x.png | Bin 0 -> 2115 bytes .../src/main/assets/emoji/[激动]@2x.png | Bin 0 -> 2252 bytes .../src/main/assets/emoji/[灯泡]@2x.png | Bin 0 -> 1926 bytes .../src/main/assets/emoji/[炸弹]@2x.png | Bin 0 -> 1149 bytes .../src/main/assets/emoji/[熊猫]@2x.png | Bin 0 -> 1398 bytes .../src/main/assets/emoji/[爆筋]@2x.png | Bin 0 -> 508 bytes .../src/main/assets/emoji/[爱你]@2x.png | Bin 0 -> 1385 bytes .../src/main/assets/emoji/[爱心]@2x.png | Bin 0 -> 1384 bytes .../src/main/assets/emoji/[爱情]@2x.png | Bin 0 -> 2152 bytes .../src/main/assets/emoji/[猪头]@2x.png | Bin 0 -> 2056 bytes .../src/main/assets/emoji/[猫咪]@2x.png | Bin 0 -> 2596 bytes .../src/main/assets/emoji/[献吻]@2x.png | Bin 0 -> 1735 bytes .../src/main/assets/emoji/[玫瑰]@2x.png | Bin 0 -> 1054 bytes .../src/main/assets/emoji/[瓢虫]@2x.png | Bin 0 -> 1734 bytes .../src/main/assets/emoji/[疑问]@2x.png | Bin 0 -> 2286 bytes .../src/main/assets/emoji/[白眼]@2x.png | Bin 0 -> 1935 bytes .../src/main/assets/emoji/[皮球]@2x.png | Bin 0 -> 1461 bytes .../src/main/assets/emoji/[睡觉]@2x.png | Bin 0 -> 1886 bytes .../src/main/assets/emoji/[磕头]@2x.png | Bin 0 -> 1734 bytes .../src/main/assets/emoji/[示爱]@2x.png | Bin 0 -> 1367 bytes .../src/main/assets/emoji/[礼品袋]@2x.png | Bin 0 -> 1130 bytes .../src/main/assets/emoji/[礼物]@2x.png | Bin 0 -> 2149 bytes .../src/main/assets/emoji/[篮球]@2x.png | Bin 0 -> 1708 bytes .../src/main/assets/emoji/[米饭]@2x.png | Bin 0 -> 1725 bytes .../src/main/assets/emoji/[糗大了]@2x.png | Bin 0 -> 2165 bytes .../src/main/assets/emoji/[红双喜]@2x.png | Bin 0 -> 1122 bytes .../src/main/assets/emoji/[红灯笼]@2x.png | Bin 0 -> 2100 bytes .../src/main/assets/emoji/[纸巾]@2x.png | Bin 0 -> 1792 bytes .../src/main/assets/emoji/[胜利]@2x.png | Bin 0 -> 1807 bytes .../tuichat/src/main/assets/emoji/[色]@2x.png | Bin 0 -> 2079 bytes .../tuichat/src/main/assets/emoji/[药]@2x.png | Bin 0 -> 910 bytes .../src/main/assets/emoji/[菜刀]@2x.png | Bin 0 -> 1148 bytes .../src/main/assets/emoji/[蛋糕]@2x.png | Bin 0 -> 1919 bytes .../src/main/assets/emoji/[蜡烛]@2x.png | Bin 0 -> 920 bytes .../src/main/assets/emoji/[街舞]@2x.png | Bin 0 -> 1996 bytes .../tuichat/src/main/assets/emoji/[衰]@2x.png | Bin 0 -> 1600 bytes .../src/main/assets/emoji/[西瓜]@2x.png | Bin 0 -> 1805 bytes .../src/main/assets/emoji/[调皮]@2x.png | Bin 0 -> 2082 bytes .../src/main/assets/emoji/[象棋]@2x.png | Bin 0 -> 2261 bytes .../src/main/assets/emoji/[跳绳]@2x.png | Bin 0 -> 2034 bytes .../src/main/assets/emoji/[跳跳]@2x.png | Bin 0 -> 1600 bytes .../src/main/assets/emoji/[车厢]@2x.png | Bin 0 -> 873 bytes .../src/main/assets/emoji/[转圈]@2x.png | Bin 0 -> 1680 bytes .../src/main/assets/emoji/[鄙视]@2x.png | Bin 0 -> 2185 bytes .../tuichat/src/main/assets/emoji/[酷]@2x.png | Bin 0 -> 2017 bytes .../src/main/assets/emoji/[钞票]@2x.png | Bin 0 -> 1174 bytes .../src/main/assets/emoji/[钻戒]@2x.png | Bin 0 -> 2236 bytes .../src/main/assets/emoji/[闪电]@2x.png | Bin 0 -> 793 bytes .../src/main/assets/emoji/[闭嘴]@2x.png | Bin 0 -> 1817 bytes .../src/main/assets/emoji/[闹钟]@2x.png | Bin 0 -> 1783 bytes .../src/main/assets/emoji/[阴险]@2x.png | Bin 0 -> 1964 bytes .../src/main/assets/emoji/[难过]@2x.png | Bin 0 -> 1944 bytes .../src/main/assets/emoji/[雨伞]@2x.png | Bin 0 -> 1395 bytes .../src/main/assets/emoji/[青蛙]@2x.png | Bin 0 -> 2634 bytes .../src/main/assets/emoji/[面条]@2x.png | Bin 0 -> 2456 bytes .../src/main/assets/emoji/[鞭炮]@2x.png | Bin 0 -> 2049 bytes .../src/main/assets/emoji/[风车]@2x.png | Bin 0 -> 2211 bytes .../src/main/assets/emoji/[飞吻]@2x.png | Bin 0 -> 1493 bytes .../src/main/assets/emoji/[飞机]@2x.png | Bin 0 -> 2301 bytes .../src/main/assets/emoji/[饥饿]@2x.png | Bin 0 -> 2138 bytes .../src/main/assets/emoji/[香蕉]@2x.png | Bin 0 -> 1335 bytes .../src/main/assets/emoji/[骷髅]@2x.png | Bin 0 -> 1608 bytes .../src/main/assets/emoji/[麦克风]@2x.png | Bin 0 -> 1396 bytes .../src/main/assets/emoji/[麻将]@2x.png | Bin 0 -> 1163 bytes .../src/main/assets/emoji/[鼓掌]@2x.png | Bin 0 -> 2132 bytes .../src/main/assets/emoji/[龇牙]@2x.png | Bin 0 -> 2221 bytes .../tuikit/tuichat/ITUIChatService.java | 62 + .../tuikit/tuichat/TUIChatConstants.java | 115 + .../qcloud/tuikit/tuichat/TUIChatService.java | 622 ++++++ .../qcloud/tuikit/tuichat/bean/CallModel.java | 288 +++ .../qcloud/tuikit/tuichat/bean/ChatInfo.java | 197 ++ .../tuichat/bean/CustomHelloMessage.java | 17 + .../qcloud/tuikit/tuichat/bean/DraftInfo.java | 32 + .../tuikit/tuichat/bean/GroupApplyInfo.java | 60 + .../qcloud/tuikit/tuichat/bean/GroupInfo.java | 226 ++ .../tuikit/tuichat/bean/GroupMemberInfo.java | 158 ++ .../tuichat/bean/InputMoreActionUnit.java | 116 + .../tuikit/tuichat/bean/MessageCustom.java | 11 + .../tuikit/tuichat/bean/MessageFeature.java | 33 + .../tuikit/tuichat/bean/MessageReactBean.java | 67 + .../tuichat/bean/MessageReceiptInfo.java | 55 + .../tuichat/bean/MessageRepliesBean.java | 115 + .../tuikit/tuichat/bean/MessageTyping.java | 35 + .../tuichat/bean/OfflineMessageBean.java | 37 + .../bean/OfflineMessageContainerBean.java | 36 + .../tuikit/tuichat/bean/OfflinePushInfo.java | 219 ++ .../tuikit/tuichat/bean/ReactUserBean.java | 65 + .../tuikit/tuichat/bean/ReplyPreviewBean.java | 103 + .../tuikit/tuichat/bean/UserStatusBean.java | 30 + .../qcloud/tuikit/tuichat/bean/WorkBean.kt | 8 + .../bean/message/ArchivesMessageBean.java | 93 + .../bean/message/BusinessCardMessageBean.java | 91 + .../bean/message/CallingMessageBean.java | 47 + .../message/CustomEvaluationMessageBean.java | 72 + .../bean/message/CustomLinkMessageBean.java | 59 + .../bean/message/CustomOrderMessageBean.java | 97 + .../tuichat/bean/message/FaceMessageBean.java | 50 + .../tuichat/bean/message/FileMessageBean.java | 157 ++ .../message/GroupMessageReadMembersInfo.java | 37 + .../bean/message/ImageMessageBean.java | 278 +++ .../bean/message/LocationMessageBean.java | 51 + .../MedicalExaminationReportMessageBean.java | 124 ++ .../bean/message/MergeMessageBean.java | 57 + .../bean/message/MessageTypingBean.java | 40 + .../bean/message/QuoteMessageBean.java | 128 ++ .../bean/message/ReplyMessageBean.java | 18 + .../bean/message/SoundMessageBean.java | 163 ++ .../bean/message/SystemMessageBean.java | 75 + .../tuichat/bean/message/TUIMessageBean.java | 506 +++++ .../bean/message/TextAtMessageBean.java | 4 + .../tuichat/bean/message/TextMessageBean.java | 35 + .../tuichat/bean/message/TipsMessageBean.java | 231 ++ .../bean/message/VideoMessageBean.java | 237 +++ ...CustomEvaluationMessageReplyQuoteBean.java | 14 + .../reply/CustomLinkReplyQuoteBean.java | 14 + .../CustomOrderMessageReplyQuoteBean.java | 14 + .../message/reply/FaceReplyQuoteBean.java | 29 + .../message/reply/FileReplyQuoteBean.java | 19 + .../message/reply/ImageReplyQuoteBean.java | 11 + .../message/reply/LocationReplyQuoteBean.java | 10 + .../message/reply/MergeReplyQuoteBean.java | 10 + .../message/reply/ReplyReplyQuoteBean.java | 15 + .../message/reply/SoundReplyQuoteBean.java | 26 + .../bean/message/reply/TUIReplyQuoteBean.java | 38 + .../message/reply/TextReplyQuoteBean.java | 24 + .../message/reply/VideoReplyQuoteBean.java | 11 + .../tuichat/classicui/ClassicUIService.java | 173 ++ .../component/BeginnerGuidePage.java | 182 ++ .../component/EmojiIndicatorView.java | 169 ++ .../component/MessageProperties.java | 224 ++ .../component/camera/CameraActivity.java | 183 ++ .../camera/listener/CaptureListener.java | 16 + .../camera/listener/ClickListener.java | 6 + .../camera/listener/ErrorListener.java | 8 + .../camera/listener/JCameraListener.java | 11 + .../camera/listener/ReturnListener.java | 5 + .../camera/listener/TypeListener.java | 7 + .../camera/state/BorrowPictureState.java | 82 + .../camera/state/BorrowVideoState.java | 82 + .../component/camera/state/CameraMachine.java | 119 ++ .../component/camera/state/PreviewState.java | 103 + .../component/camera/state/State.java | 33 + .../camera/view/CameraInterface.java | 737 +++++++ .../component/camera/view/CameraView.java | 22 + .../component/camera/view/CaptureButton.java | 346 +++ .../component/camera/view/CaptureLayout.java | 351 +++ .../component/camera/view/FoucsView.java | 57 + .../component/camera/view/JCameraView.java | 551 +++++ .../component/camera/view/ReturnButton.java | 53 + .../component/camera/view/TypeButton.java | 109 + .../component/noticelayout/INoticeLayout.java | 65 + .../component/noticelayout/NoticeLayout.java | 77 + .../noticelayout/NoticeLayoutConfig.java | 25 + .../photoview/listener/OnGestureListener.java | 27 + .../listener/OnMatrixChangedListener.java | 18 + .../listener/OnOutsidePhotoTapListener.java | 14 + .../listener/OnPhotoTapListener.java | 22 + .../listener/OnScaleChangedListener.java | 17 + .../listener/OnSingleFlingListener.java | 21 + .../listener/OnViewDragListener.java | 16 + .../photoview/listener/OnViewTapListener.java | 16 + .../component/photoview/view/Compat.java | 24 + .../photoview/view/CustomGestureDetector.java | 188 ++ .../component/photoview/view/PhotoView.java | 249 +++ .../photoview/view/PhotoViewAttacher.java | 793 +++++++ .../photoview/view/PhotoViewUtil.java | 37 + .../component/popmenu/ChatPopMenu.java | 710 +++++++ .../component/video/UIKitVideoView.java | 368 ++++ .../video/listener/ResultListener.java | 5 + .../component/video/proxy/IPlayer.java | 73 + .../video/proxy/MediaPlayerProxy.java | 121 ++ .../video/proxy/SystemMediaPlayerWrapper.java | 155 ++ .../component/video/util/AudioUtil.java | 17 + .../classicui/interfaces/IChatLayout.java | 87 + .../interfaces/ICommonMessageAdapter.java | 8 + .../classicui/interfaces/IMessageLayout.java | 54 + .../interfaces/IMessageProperties.java | 353 +++ .../interfaces/OnItemClickListener.java | 32 + .../page/MessageReceiptDetailActivity.java | 402 ++++ .../page/MessageReplyDetailActivity.java | 181 ++ .../classicui/page/TUIBaseChatActivity.java | 146 ++ .../classicui/page/TUIBaseChatFragment.java | 420 ++++ .../classicui/page/TUIC2CChatActivity.java | 35 + .../classicui/page/TUIC2CChatFragment.java | 75 + .../page/TUIForwardChatActivity.java | 98 + .../classicui/page/TUIGroupChatActivity.java | 39 + .../classicui/page/TUIGroupChatFragment.java | 138 ++ .../classicui/setting/ChatLayoutSetting.java | 424 ++++ .../classicui/setting/InputActionSetting.java | 87 + .../classicui/widget/ArchivesImageView.java | 118 ++ .../tuichat/classicui/widget/ChatView.java | 1345 ++++++++++++ .../widget/input/BaseInputFragment.java | 18 + .../classicui/widget/input/InputView.java | 1538 ++++++++++++++ .../widget/input/ReplyPreviewBar.java | 28 + .../widget/input/TIMMentionEditText.java | 301 +++ .../widget/input/face/FaceFragment.java | 341 +++ .../widget/input/face/FaceGroupIcon.java | 45 + .../inputmore/ActionsGridViewAdapter.java | 67 + .../input/inputmore/ActionsPagerAdapter.java | 106 + .../input/inputmore/InputMoreFragment.java | 60 + .../input/inputmore/InputMoreLayout.java | 45 + .../widget/message/ArchivesImageAdapter.java | 24 + .../widget/message/MaxWidthFrameLayout.java | 45 + .../widget/message/MaxWidthLinearLayout.java | 45 + .../widget/message/MessageAdapter.java | 446 ++++ .../widget/message/MessageRecyclerView.java | 904 ++++++++ .../widget/message/SelectTextHelper.java | 937 ++++++++ .../message/reply/ChatFlowReactView.java | 256 +++ .../message/reply/FaceReplyQuoteView.java | 39 + .../message/reply/FileReplyQuoteView.java | 46 + .../message/reply/ImageReplyQuoteView.java | 128 ++ .../message/reply/LocationReplyQuoteView.java | 21 + .../message/reply/MergeReplyQuoteView.java | 63 + .../message/reply/ReplyDetailsView.java | 143 ++ .../message/reply/SoundReplyQuoteView.java | 45 + .../message/reply/TUIReplyQuoteView.java | 32 + .../message/reply/TextReplyQuoteView.java | 41 + .../message/reply/VideoReplyQuoteView.java | 61 + .../viewholder/ArchivesMessageHolder.java | 64 + .../viewholder/BusinessCardMessageHolder.java | 60 + .../viewholder/CallingMessageHolder.java | 67 + .../CustomEvaluationMessageHolder.java | 49 + .../viewholder/CustomLinkMessageHolder.java | 65 + .../viewholder/CustomOrderMessageHolder.java | 89 + .../message/viewholder/FaceMessageHolder.java | 77 + .../message/viewholder/FileMessageHolder.java | 390 ++++ .../viewholder/ImageMessageHolder.java | 201 ++ .../viewholder/LocationMessageHolder.java | 67 + .../MedicalExaminationReportHolder.java | 69 + .../viewholder/MergeMessageHolder.java | 109 + .../message/viewholder/MessageBaseHolder.java | 177 ++ .../viewholder/MessageContentHolder.java | 623 ++++++ .../viewholder/MessageHeaderHolder.java | 42 + .../viewholder/MessageViewHolderFactory.java | 67 + .../viewholder/QuoteMessageHolder.java | 337 +++ .../viewholder/ReplyMessageHolder.java | 188 ++ .../viewholder/SoundMessageHolder.java | 152 ++ .../viewholder/SystemMessageHolder.java | 50 + .../message/viewholder/TextMessageHolder.java | 87 + .../message/viewholder/TipsMessageHolder.java | 81 + .../viewholder/VideoMessageHolder.java | 179 ++ .../tuikit/tuichat/component/AudioPlayer.java | 85 + .../tuichat/component/AudioRecorder.java | 299 +++ .../tuichat/component/face/ChatFace.java | 51 + .../tuichat/component/face/CustomFace.java | 18 + .../tuikit/tuichat/component/face/Emoji.java | 14 + .../tuichat/component/face/FaceGroup.java | 90 + .../tuichat/component/face/FaceManager.java | 459 ++++ .../component/face/RecentEmojiManager.java | 58 + .../ImageVideoScanActivity.java | 128 ++ .../imagevideoscan/ImageVideoScanAdapter.java | 819 +++++++ .../ImageVideoScanPresenter.java | 265 +++ .../ImageVideoScanProvider.java | 149 ++ .../imagevideoscan/OnViewPagerListener.java | 7 + .../ViewPagerLayoutManager.java | 127 ++ .../component/progress/ProgressPresenter.java | 83 + .../tuikit/tuichat/config/GeneralConfig.java | 282 +++ .../tuikit/tuichat/config/TUIChatConfigs.java | 79 + .../interfaces/AudioRecordEventListener.java | 10 + .../interfaces/C2CChatEventListener.java | 22 + .../interfaces/GroupChatEventListener.java | 24 + .../interfaces/IBaseMessageSender.java | 17 + .../interfaces/IMInputViewActionListener.java | 9 + .../tuichat/interfaces/IMessageAdapter.java | 12 + .../interfaces/IMessageRecyclerView.java | 25 + .../interfaces/IReplyMessageHandler.java | 11 + .../interfaces/NetworkConnectionListener.java | 5 + .../interfaces/TotalUnreadCountListener.java | 5 + .../minimalistui/MinimalistUIService.java | 162 ++ .../component/BeginnerGuidePage.java | 182 ++ .../component/EmojiIndicatorView.java | 169 ++ .../component/MessageProperties.java | 224 ++ .../component/camera/CameraActivity.java | 183 ++ .../camera/listener/CaptureListener.java | 16 + .../camera/listener/ClickListener.java | 6 + .../camera/listener/ErrorListener.java | 8 + .../camera/listener/JCameraListener.java | 11 + .../camera/listener/ReturnListener.java | 5 + .../camera/listener/TypeListener.java | 7 + .../camera/state/BorrowPictureState.java | 82 + .../camera/state/BorrowVideoState.java | 82 + .../component/camera/state/CameraMachine.java | 119 ++ .../component/camera/state/PreviewState.java | 103 + .../component/camera/state/State.java | 33 + .../camera/view/CameraInterface.java | 738 +++++++ .../component/camera/view/CameraView.java | 22 + .../component/camera/view/CaptureButton.java | 346 +++ .../component/camera/view/CaptureLayout.java | 351 +++ .../component/camera/view/FoucsView.java | 57 + .../component/camera/view/JCameraView.java | 551 +++++ .../component/camera/view/ReturnButton.java | 53 + .../component/camera/view/TypeButton.java | 109 + .../dialog/ChatBottomSelectSheet.java | 93 + .../component/noticelayout/INoticeLayout.java | 65 + .../component/noticelayout/NoticeLayout.java | 77 + .../noticelayout/NoticeLayoutConfig.java | 25 + .../photoview/listener/OnGestureListener.java | 27 + .../listener/OnMatrixChangedListener.java | 18 + .../listener/OnOutsidePhotoTapListener.java | 14 + .../listener/OnPhotoTapListener.java | 22 + .../listener/OnScaleChangedListener.java | 17 + .../listener/OnSingleFlingListener.java | 21 + .../listener/OnViewDragListener.java | 16 + .../photoview/listener/OnViewTapListener.java | 16 + .../component/photoview/view/Compat.java | 24 + .../photoview/view/CustomGestureDetector.java | 188 ++ .../component/photoview/view/PhotoView.java | 249 +++ .../photoview/view/PhotoViewAttacher.java | 793 +++++++ .../photoview/view/PhotoViewUtil.java | 37 + .../component/video/UIKitVideoView.java | 368 ++++ .../video/listener/ResultListener.java | 5 + .../component/video/proxy/IPlayer.java | 73 + .../video/proxy/MediaPlayerProxy.java | 121 ++ .../video/proxy/SystemMediaPlayerWrapper.java | 155 ++ .../component/video/util/AudioUtil.java | 17 + .../minimalistui/interfaces/IChatLayout.java | 84 + .../interfaces/ICommonMessageAdapter.java | 8 + .../interfaces/IMessageLayout.java | 52 + .../interfaces/IMessageProperties.java | 353 +++ .../interfaces/OnItemClickListener.java | 32 + .../page/MessageDetailMinimalistActivity.java | 336 +++ .../page/TUIBaseChatMinimalistActivity.java | 140 ++ .../page/TUIBaseChatMinimalistFragment.java | 504 +++++ .../page/TUIC2CChatMinimalistActivity.java | 35 + .../page/TUIC2CChatMinimalistFragment.java | 74 + .../TUIForwardChatMinimalistActivity.java | 91 + .../page/TUIGroupChatMinimalistActivity.java | 39 + .../page/TUIGroupChatMinimalistFragment.java | 141 ++ .../setting/ChatLayoutSetting.java | 259 +++ .../tuichat/minimalistui/widget/ChatView.java | 1396 ++++++++++++ .../widget/input/BaseInputFragment.java | 18 + .../minimalistui/widget/input/InputView.java | 1806 ++++++++++++++++ .../widget/input/TIMMentionEditText.java | 287 +++ .../widget/input/face/FaceFragment.java | 434 ++++ .../inputmore/InputMoreDialogFragment.java | 177 ++ .../widget/input/waveview/VoiceWaveView.kt | 308 +++ .../widget/input/waveview/WaveMode.kt | 9 + .../message/ChatReactDialogFragment.java | 327 +++ .../message/ChatReplyDialogFragment.java | 136 ++ .../widget/message/MaxWidthFrameLayout.java | 45 + .../widget/message/MaxWidthLinearLayout.java | 45 + .../widget/message/MessageAdapter.java | 479 +++++ .../widget/message/MessageRecyclerView.java | 939 ++++++++ .../widget/message/MessageStatusTimeView.java | 63 + .../message/MinimalistMessageLayout.java | 165 ++ .../widget/message/SelectTextHelper.java | 937 ++++++++ .../widget/message/TimeInLineTextLayout.java | 135 ++ .../widget/message/reply/ChatReactView.java | 118 ++ .../message/reply/FaceReplyQuoteView.java | 39 + .../message/reply/FileReplyQuoteView.java | 46 + .../message/reply/ImageReplyQuoteView.java | 128 ++ .../message/reply/LocationReplyQuoteView.java | 21 + .../message/reply/MergeReplyQuoteView.java | 63 + .../message/reply/ReplyDetailsView.java | 177 ++ .../message/reply/ReplyPreviewView.java | 162 ++ .../message/reply/SoundReplyQuoteView.java | 45 + .../message/reply/TUIReplyQuoteView.java | 32 + .../message/reply/TextReplyQuoteView.java | 41 + .../message/reply/VideoReplyQuoteView.java | 61 + .../viewholder/CallingMessageHolder.java | 89 + .../CustomEvaluationMessageHolder.java | 43 + .../viewholder/CustomLinkMessageHolder.java | 66 + .../viewholder/CustomOrderMessageHolder.java | 89 + .../message/viewholder/FaceMessageHolder.java | 74 + .../message/viewholder/FileMessageHolder.java | 217 ++ .../viewholder/ImageMessageHolder.java | 216 ++ .../viewholder/LocationMessageHolder.java | 23 + .../viewholder/MergeMessageHolder.java | 106 + .../message/viewholder/MessageBaseHolder.java | 183 ++ .../viewholder/MessageContentHolder.java | 667 ++++++ .../viewholder/MessageHeaderHolder.java | 42 + .../viewholder/MessageViewHolderFactory.java | 67 + .../viewholder/QuoteMessageHolder.java | 327 +++ .../viewholder/ReplyMessageHolder.java | 143 ++ .../viewholder/SoundMessageHolder.java | 150 ++ .../message/viewholder/TextMessageHolder.java | 60 + .../message/viewholder/TipsMessageHolder.java | 81 + .../viewholder/VideoMessageHolder.java | 134 ++ .../messagepopmenu/ChatPopActivity.java | 545 +++++ .../messagepopmenu/ChatPopDataHolder.java | 90 + .../ChatPopMenuEmojiDialogFragment.java | 174 ++ .../model/AIDenoiseSignatureManager.java | 63 + .../tuikit/tuichat/model/ChatProvider.java | 928 ++++++++ .../tuichat/presenter/C2CChatPresenter.java | 302 +++ .../presenter/ChatModifyMessageHelper.java | 114 + .../tuichat/presenter/ChatPresenter.java | 1883 +++++++++++++++++ .../tuichat/presenter/ForwardPresenter.java | 111 + .../tuichat/presenter/GroupChatPresenter.java | 302 +++ .../presenter/MessageReceiptPresenter.java | 72 + .../tuichat/presenter/ReactPresenter.java | 99 + .../tuichat/presenter/ReplyPresenter.java | 229 ++ .../tuikit/tuichat/util/ActionIdConstant.java | 14 + .../qcloud/tuikit/tuichat/util/AngleUtil.java | 59 + .../qcloud/tuikit/tuichat/util/BlurUtils.java | 33 + .../tuikit/tuichat/util/CameraParamUtil.java | 150 ++ .../tuichat/util/ChatMessageBuilder.java | 364 ++++ .../tuichat/util/ChatMessageParser.java | 612 ++++++ .../tuikit/tuichat/util/CheckPermission.java | 99 + .../tuikit/tuichat/util/DataStoreUtil.java | 114 + .../tuikit/tuichat/util/DeviceUtil.java | 44 + .../qcloud/tuikit/tuichat/util/FileUtil.java | 245 +++ .../tuichat/util/OfflinePushInfoUtils.java | 24 + .../tuikit/tuichat/util/PermissionHelper.java | 89 + .../tuikit/tuichat/util/StringUtils.java | 30 + .../tuikit/tuichat/util/TUIChatLog.java | 85 + .../tuikit/tuichat/util/TUIChatUtils.java | 245 +++ .../chat_ic_arrow_down_light.png | Bin 0 -> 1025 bytes .../chat_ic_arrow_up_light.png | Bin 0 -> 1013 bytes .../drawable-xxhdpi/chat_reply_icon_light.png | Bin 0 -> 1142 bytes .../chat_title_bar_more_menu_light.png | Bin 0 -> 786 bytes .../drawable/chat_bubble_other_bg_light.xml | 18 + .../drawable/chat_bubble_self_bg_light.xml | 17 + .../main/res-light/values/light_colors.xml | 36 + .../main/res-light/values/light_styles.xml | 44 + .../chat_ic_arrow_down_lively.png | Bin 0 -> 2833 bytes .../chat_ic_arrow_up_lively.png | Bin 0 -> 2803 bytes .../chat_reply_icon_lively.png | Bin 0 -> 1172 bytes .../chat_title_bar_more_menu_lively.png | Bin 0 -> 1202 bytes .../drawable/chat_bubble_other_bg_lively.xml | 22 + .../drawable/chat_bubble_self_bg_lively.xml | 17 + .../main/res-lively/values/lively_colors.xml | 37 + .../main/res-lively/values/lively_styles.xml | 46 + .../anim/chat_bottom_select_sheet_enter.xml | 8 + .../anim/chat_bottom_select_sheet_exit.xml | 8 + .../drawable/chat_audio_play_btn_ic.png | Bin 0 -> 524 bytes .../drawable/chat_audio_stop_btn_ic.png | Bin 0 -> 307 bytes .../drawable/chat_bottom_sheet_border.xml | 5 + .../chat_bottom_sheet_dialog_border.xml | 5 + .../drawable/chat_bottom_sheet_hide.png | Bin 0 -> 542 bytes ...hat_face_group_list_item_select_border.xml | 7 + .../drawable/chat_file_type_icon_image.png | Bin 0 -> 1888 bytes .../drawable/chat_file_type_icon_none.png | Bin 0 -> 1584 bytes .../drawable/chat_file_type_icon_pdf.png | Bin 0 -> 2853 bytes .../drawable/chat_file_type_icon_ppt.png | Bin 0 -> 1102 bytes .../drawable/chat_file_type_icon_text.png | Bin 0 -> 1045 bytes .../drawable/chat_file_type_icon_word.png | Bin 0 -> 2484 bytes .../drawable/chat_file_type_icon_xls.png | Bin 0 -> 2117 bytes .../drawable/chat_file_type_icon_zip.png | Bin 0 -> 1287 bytes .../drawable/chat_gray_round_rect_bg.xml | 8 + .../chat_message_popup_fill_border.xml | 8 + .../chat_message_popup_fill_border_right.xml | 8 + .../chat_message_popup_stroke_border.xml | 9 + .../chat_message_popup_stroke_border_left.xml | 9 + ...chat_message_popup_stroke_border_right.xml | 9 + .../chat_minimalist_anim_loading00.png | Bin 0 -> 6618 bytes .../chat_minimalist_anim_loading01.png | Bin 0 -> 490 bytes .../chat_minimalist_anim_loading02.png | Bin 0 -> 474 bytes .../chat_minimalist_anim_loading03.png | Bin 0 -> 476 bytes .../chat_minimalist_anim_loading04.png | Bin 0 -> 493 bytes .../chat_minimalist_anim_loading05.png | Bin 0 -> 494 bytes .../chat_minimalist_anim_loading06.png | Bin 0 -> 496 bytes .../chat_minimalist_anim_loading07.png | Bin 0 -> 495 bytes .../chat_minimalist_anim_loading08.png | Bin 0 -> 490 bytes .../chat_minimalist_anim_loading09.png | Bin 0 -> 491 bytes .../chat_minimalist_anim_loading10.png | Bin 0 -> 485 bytes .../chat_minimalist_anim_loading11.png | Bin 0 -> 488 bytes .../chat_minimalist_anim_loading12.png | Bin 0 -> 487 bytes .../chat_minimalist_anim_loading13.png | Bin 0 -> 485 bytes .../chat_minimalist_anim_loading14.png | Bin 0 -> 488 bytes .../chat_minimalist_anim_loading15.png | Bin 0 -> 490 bytes .../chat_minimalist_anim_loading16.png | Bin 0 -> 486 bytes .../chat_minimalist_anim_loading17.png | Bin 0 -> 490 bytes .../chat_minimalist_anim_loading18.png | Bin 0 -> 489 bytes .../chat_minimalist_anim_loading19.png | Bin 0 -> 488 bytes .../chat_minimalist_anim_loading20.png | Bin 0 -> 493 bytes .../chat_minimalist_anim_loading21.png | Bin 0 -> 491 bytes .../chat_minimalist_anim_loading22.png | Bin 0 -> 487 bytes .../chat_minimalist_anim_loading23.png | Bin 0 -> 488 bytes .../chat_minimalist_anim_loading24.png | Bin 0 -> 487 bytes .../chat_minimalist_anim_loading25.png | Bin 0 -> 486 bytes .../chat_minimalist_anim_loading26.png | Bin 0 -> 495 bytes .../chat_minimalist_anim_loading27.png | Bin 0 -> 490 bytes .../chat_minimalist_anim_loading28.png | Bin 0 -> 496 bytes .../chat_minimalist_anim_loading29.png | Bin 0 -> 487 bytes .../chat_minimalist_anim_loading30.png | Bin 0 -> 485 bytes .../chat_minimalist_anim_loading31.png | Bin 0 -> 492 bytes .../chat_minimalist_anim_loading32.png | Bin 0 -> 485 bytes .../chat_minimalist_anim_loading33.png | Bin 0 -> 488 bytes .../chat_minimalist_anim_loading34.png | Bin 0 -> 485 bytes .../chat_minimalist_anim_loading35.png | Bin 0 -> 467 bytes .../chat_minimalist_anim_loading36.png | Bin 0 -> 483 bytes .../chat_minimalist_anim_loading37.png | Bin 0 -> 489 bytes .../chat_minimalist_anim_loading38.png | Bin 0 -> 480 bytes .../chat_minimalist_anim_loading39.png | Bin 0 -> 486 bytes .../chat_minimalist_anim_loading40.png | Bin 0 -> 490 bytes .../chat_minimalist_anim_loading41.png | Bin 0 -> 486 bytes .../chat_minimalist_anim_loading42.png | Bin 0 -> 498 bytes .../chat_minimalist_anim_loading43.png | Bin 0 -> 493 bytes .../chat_minimalist_anim_loading44.png | Bin 0 -> 490 bytes .../drawable/chat_minimalist_arrow_left.png | Bin 0 -> 561 bytes .../drawable/chat_minimalist_delete_icon.png | Bin 0 -> 555 bytes .../chat_minimalist_file_download_icon.png | Bin 0 -> 985 bytes .../drawable/chat_minimalist_forward_icon.png | Bin 0 -> 906 bytes .../chat_minimalist_input_add_icon.png | Bin 0 -> 478 bytes .../chat_minimalist_input_camera_icon.png | Bin 0 -> 1184 bytes .../chat_minimalist_input_edittext_border.xml | 9 + .../chat_minimalist_input_face_icon.png | Bin 0 -> 3338 bytes .../chat_minimalist_input_voice_icon.png | Bin 0 -> 1486 bytes .../drawable/chat_minimalist_jump_at_icon.png | Bin 0 -> 2258 bytes .../chat_minimalist_jump_down_icon.png | Bin 0 -> 1755 bytes ...chat_minimalist_menu_emoji_list_border.xml | 8 + .../chat_minimalist_menu_popup_border.xml | 8 + .../chat_minimalist_merge_message_border.xml | 6 + ...minimalist_message_deatail_read_border.xml | 8 + ...inimalist_message_status_send_all_read.png | Bin 0 -> 560 bytes ..._minimalist_message_status_send_failed.png | Bin 0 -> 926 bytes ...minimalist_message_status_send_no_read.png | Bin 0 -> 474 bytes ...nimalist_message_status_send_part_read.png | Bin 0 -> 572 bytes ...chat_minimalist_message_status_sending.png | Bin 0 -> 954 bytes ...hat_minimalist_more_action_camera_icon.png | Bin 0 -> 1576 bytes ...hat_minimalist_more_action_custom_icon.png | Bin 0 -> 1089 bytes .../chat_minimalist_more_action_file_icon.png | Bin 0 -> 703 bytes ...at_minimalist_more_action_picture_icon.png | Bin 0 -> 1161 bytes ...hat_minimalist_more_action_record_icon.png | Bin 0 -> 860 bytes .../drawable/chat_minimalist_play_icon.png | Bin 0 -> 11473 bytes .../chat_minimalist_pop_menu_copy.png | Bin 0 -> 769 bytes .../chat_minimalist_pop_menu_delete.png | Bin 0 -> 670 bytes .../chat_minimalist_pop_menu_forward.png | Bin 0 -> 1228 bytes .../chat_minimalist_pop_menu_info.png | Bin 0 -> 1360 bytes .../chat_minimalist_pop_menu_more.png | Bin 0 -> 396 bytes .../chat_minimalist_pop_menu_multi_select.png | Bin 0 -> 238 bytes .../chat_minimalist_pop_menu_quote.png | Bin 0 -> 690 bytes .../chat_minimalist_pop_menu_reply.png | Bin 0 -> 1296 bytes .../chat_minimalist_pop_menu_revoke.png | Bin 0 -> 823 bytes .../chat_minimalist_pop_menu_translation.png | Bin 0 -> 1108 bytes .../chat_minimalist_status_loading_anim.xml | 94 + .../chat_minimalist_video_call_icon.png | Bin 0 -> 1243 bytes .../chat_minimalist_voice_call_icon.png | Bin 0 -> 1666 bytes .../drawable/chat_pop_menu_add_icon.png | Bin 0 -> 1475 bytes .../drawable/chat_reply_more_icon.png | Bin 0 -> 714 bytes .../drawable/chat_voice_sound_waves.png | Bin 0 -> 1147 bytes .../drawable/gray_round_rect_border.xml | 8 + .../drawable/minimalist_corner_bg_blue.xml | 8 + .../drawable/minimalist_corner_bg_red.xml | 8 + .../drawable/minimalist_delete_icon.png | Bin 0 -> 789 bytes .../drawable/minimalist_delete_start_icon.png | Bin 0 -> 2150 bytes .../minimalist_selector_face_text.xml | 13 + .../drawable/white_round_rect_border.xml | 8 + .../chat_minimalist_bottom_select_sheet.xml | 29 + .../chat_minimalist_bottom_sheet_item.xml | 15 + .../chat_minimalist_face_view_pager_item.xml | 20 + .../layout/chat_minimalist_forward_layout.xml | 78 + .../layout/chat_minimalist_fragment.xml | 11 + ...t_minimalist_group_receipt_member_item.xml | 36 + .../layout/chat_minimalist_header_layout.xml | 87 + .../chat_minimalist_input_camera_view.xml | 54 + .../layout/chat_minimalist_input_layout.xml | 218 ++ .../layout/chat_minimalist_layout.xml | 189 ++ ...malist_message_adapter_content_calling.xml | 32 + ...inimalist_message_adapter_content_text.xml | 13 + .../chat_minimalist_message_detail_layout.xml | 148 ++ ..._minimalist_pop_menu_action_item_layou.xml | 27 + .../chat_minimalist_pop_menu_layout.xml | 110 + .../chat_minimalist_react_item_layout.xml | 15 + .../chat_minimalist_react_preview_layout.xml | 35 + ...t_minimalist_reply_details_item_layout.xml | 51 + .../chat_minimalist_reply_preview_layout.xml | 53 + .../layout/chat_minimalist_text_layout.xml | 11 + .../chat_minimalist_text_status_layout.xml | 29 + .../chat_pop_menu_emoji_item_layout.xml | 12 + .../chat_popmenu_emoji_dialog_layout.xml | 26 + .../layout/chat_react_dialog_layout.xml | 49 + .../layout/chat_reply_dialog_layout.xml | 85 + .../layout/minimalist_activity_camera.xml | 18 + .../layout/minimalist_face_group_icon.xml | 22 + ...minimalist_face_message_content_layout.xml | 22 + .../layout/minimalist_forward_msg_holder.xml | 73 + .../layout/minimalist_fragment_face.xml | 44 + .../layout/minimalist_input_more.xml | 31 + .../layout/minimalist_input_more_item.xml | 40 + ...nimalist_message_adapter_content_audio.xml | 51 + ...inimalist_message_adapter_content_file.xml | 69 + ...nimalist_message_adapter_content_image.xml | 31 + ...nimalist_message_adapter_content_reply.xml | 69 + ...inimalist_message_adapter_item_content.xml | 193 ++ .../minimalist_message_react_detail.xml | 30 + .../minimalist_message_reply_detail.xml | 30 + ...inimalist_quote_message_content_layout.xml | 85 + .../minimalist_react_category_layout.xml | 32 + .../minimalist_react_details_layout.xml | 48 + .../minimalist_react_view_pager_layout.xml | 11 + .../values-zh-rCN/mininmalist_strings.xml | 9 + .../main/res-minimalistui/values/attrs.xml | 21 + .../main/res-minimalistui/values/colors.xml | 7 + .../main/res-minimalistui/values/dimens.xml | 9 + .../values/minimalist_strings.xml | 9 + .../values/minimalist_styles.xml | 43 + .../chat_ic_arrow_down_serious.png | Bin 0 -> 2562 bytes .../chat_ic_arrow_up_serious.png | Bin 0 -> 2516 bytes .../chat_reply_icon_serious.png | Bin 0 -> 1142 bytes .../chat_title_bar_more_menu_serious.png | Bin 0 -> 1202 bytes .../drawable/chat_bubble_other_bg_serious.xml | 22 + .../drawable/chat_bubble_self_bg_serious.xml | 17 + .../res-serious/values/serious_colors.xml | 35 + .../res-serious/values/serious_styles.xml | 46 + .../main/res/anim/beginner_guide_in_anim.xml | 7 + .../main/res/anim/beginner_guide_out_anim.xml | 7 + .../main/res/anim/chat_pop_menu_in_anim.xml | 7 + .../main/res/anim/chat_pop_menu_out_anim.xml | 7 + .../src/main/res/anim/translate_dialog_in.xml | 8 + .../main/res/anim/translate_dialog_out.xml | 8 + .../src/main/res/drawable-hdpi/alert_bg.9.png | Bin 0 -> 421 bytes .../drawable-hdpi/indicator_point_nomal.png | Bin 0 -> 137 bytes .../drawable-hdpi/indicator_point_select.png | Bin 0 -> 137 bytes .../res/drawable-hdpi/message_send_fail.png | Bin 0 -> 1719 bytes .../src/main/res/drawable-hdpi/trans_bg.png | Bin 0 -> 141 bytes .../res/drawable-hdpi/voice_msg_playing_1.png | Bin 0 -> 449 bytes .../res/drawable-hdpi/voice_msg_playing_2.png | Bin 0 -> 529 bytes .../res/drawable-hdpi/voice_msg_playing_3.png | Bin 0 -> 616 bytes .../main/res/drawable-xxhdpi/chat_back.png | Bin 0 -> 1544 bytes .../chat_camera_switchcamera.png | Bin 0 -> 2344 bytes .../res/drawable-xxhdpi/chat_input_face.png | Bin 0 -> 6980 bytes .../drawable-xxhdpi/chat_input_keyboard.png | Bin 0 -> 7360 bytes .../res/drawable-xxhdpi/chat_input_more.png | Bin 0 -> 5989 bytes .../res/drawable-xxhdpi/chat_input_voice.png | Bin 0 -> 7587 bytes .../chat_menu_face_hide_more.png | Bin 0 -> 2981 bytes .../chat_menu_face_show_more.png | Bin 0 -> 1915 bytes .../res/drawable-xxhdpi/chat_other_bg.9.png | Bin 0 -> 1027 bytes .../chat_permission_icon_camera.png | Bin 0 -> 3507 bytes .../chat_permission_icon_file.png | Bin 0 -> 2209 bytes .../chat_permission_icon_mic.png | Bin 0 -> 3678 bytes .../res/drawable-xxhdpi/chat_quote_guide.png | Bin 0 -> 557818 bytes .../res/drawable-xxhdpi/chat_reply_guide.png | Bin 0 -> 531072 bytes .../chat_right_live_group_bg.9.png | Bin 0 -> 1058 bytes .../drawable-xxhdpi/chat_unselected_icon.png | Bin 0 -> 3010 bytes .../drawable-xxhdpi/check_box_selected.png | Bin 0 -> 2928 bytes .../src/main/res/drawable-xxhdpi/custom.png | Bin 0 -> 3836 bytes .../res/drawable-xxhdpi/emoji_default.png | Bin 0 -> 1957 bytes .../main/res/drawable-xxhdpi/face_delete.png | Bin 0 -> 996 bytes .../main/res/drawable-xxhdpi/file_icon.png | Bin 0 -> 1865 bytes .../res/drawable-xxhdpi/ic_chat_play_icon.png | Bin 0 -> 5348 bytes .../drawable-xxhdpi/ic_default_head_img.webp | Bin 0 -> 7830 bytes .../ic_default_user_head_icon.png | Bin 0 -> 11706 bytes .../res/drawable-xxhdpi/ic_more_archives.png | Bin 0 -> 3927 bytes .../res/drawable-xxhdpi/ic_more_camera.png | Bin 0 -> 4628 bytes .../ic_more_end_consultation.png | Bin 0 -> 4976 bytes .../main/res/drawable-xxhdpi/ic_more_file.png | Bin 0 -> 2851 bytes .../res/drawable-xxhdpi/ic_more_location.png | Bin 0 -> 4930 bytes .../ic_more_medical_examination_report.png | Bin 0 -> 4416 bytes .../res/drawable-xxhdpi/ic_more_picture.png | Bin 0 -> 4244 bytes .../res/drawable-xxhdpi/ic_more_video.png | Bin 0 -> 4112 bytes .../res/drawable-xxhdpi/ic_my_location.png | Bin 0 -> 2874 bytes .../drawable-xxhdpi/ic_personal_member.png | Bin 0 -> 3205 bytes .../drawable-xxhdpi/ic_translate_support.png | Bin 0 -> 532 bytes .../main/res/drawable-xxhdpi/ic_volume_1.png | Bin 0 -> 2755 bytes .../main/res/drawable-xxhdpi/ic_volume_2.png | Bin 0 -> 2815 bytes .../main/res/drawable-xxhdpi/ic_volume_3.png | Bin 0 -> 2876 bytes .../main/res/drawable-xxhdpi/ic_volume_4.png | Bin 0 -> 2917 bytes .../main/res/drawable-xxhdpi/ic_volume_5.png | Bin 0 -> 2954 bytes .../main/res/drawable-xxhdpi/ic_volume_6.png | Bin 0 -> 2996 bytes .../main/res/drawable-xxhdpi/ic_volume_7.png | Bin 0 -> 3036 bytes .../main/res/drawable-xxhdpi/ic_volume_8.png | Bin 0 -> 3074 bytes .../drawable-xxhdpi/ic_volume_dialog_bg.9.png | Bin 0 -> 267 bytes .../ic_volume_dialog_cancel.png | Bin 0 -> 1858 bytes .../ic_volume_dialog_length_short.png | Bin 0 -> 1749 bytes .../drawable-xxhdpi/live_ic_group_live.png | Bin 0 -> 487 bytes .../drawable-xxhdpi/multi_select_delete.png | Bin 0 -> 6456 bytes .../multi_select_forward_merge.png | Bin 0 -> 7805 bytes .../multi_select_forward_one.png | Bin 0 -> 8104 bytes .../res/drawable-xxhdpi/pop_menu_copy.png | Bin 0 -> 1291 bytes .../res/drawable-xxhdpi/pop_menu_delete.png | Bin 0 -> 1511 bytes .../res/drawable-xxhdpi/pop_menu_forward.png | Bin 0 -> 3781 bytes .../res/drawable-xxhdpi/pop_menu_hide.png | Bin 0 -> 1635 bytes .../drawable-xxhdpi/pop_menu_multi_select.png | Bin 0 -> 2812 bytes .../res/drawable-xxhdpi/pop_menu_quote.png | Bin 0 -> 1640 bytes .../res/drawable-xxhdpi/pop_menu_reply.png | Bin 0 -> 2058 bytes .../res/drawable-xxhdpi/pop_menu_revoke.png | Bin 0 -> 2607 bytes .../res/drawable-xxhdpi/reply_close_btn.png | Bin 0 -> 2952 bytes .../indicator_point_nomal.png | Bin 0 -> 244 bytes .../indicator_point_select.png | Bin 0 -> 254 bytes .../res/drawable/action_audio_selector.xml | 7 + .../res/drawable/action_face_selector.xml | 7 + .../res/drawable/action_more_selector.xml | 7 + .../chat_bubble_button_bg_serious.xml | 11 + .../chat_bubble_custom_message_bg_serious.xml | 12 + .../chat_bubble_custom_other_bg_serious.xml | 22 + .../chat_bubble_custom_self_bg_serious.xml | 17 + .../drawable/chat_bubble_other_cavity_bg.xml | 19 + .../drawable/chat_bubble_self_cavity_bg.xml | 18 + .../res/drawable/chat_checkbox_selector.xml | 8 + .../main/res/drawable/chat_divide_line.xml | 11 + .../main/res/drawable/chat_pop_item_bg.xml | 13 + .../res/drawable/chat_pop_menu_divider.xml | 11 + .../src/main/res/drawable/chat_react_bg.xml | 8 + .../main/res/drawable/chat_time_border.xml | 6 + .../drawable/group_msg_receipt_line_bg.xml | 9 + .../src/main/res/drawable/ic_audio_call.xml | 10 + .../tuichat/src/main/res/drawable/ic_back.xml | 9 + .../src/main/res/drawable/ic_camera.xml | 9 + .../src/main/res/drawable/ic_close_button.xml | 14 + .../main/res/drawable/ic_download_button.xml | 14 + .../main/res/drawable/ic_other_video_call.xml | 10 + .../src/main/res/drawable/ic_pause_center.xml | 16 + .../src/main/res/drawable/ic_pause_icon.xml | 14 + .../src/main/res/drawable/ic_photo.xml | 9 + .../src/main/res/drawable/ic_play_icon.xml | 14 + .../main/res/drawable/ic_self_video_call.xml | 10 + .../res/drawable/layer_live_rating_bar.xml | 16 + .../src/main/res/drawable/layer_progress.xml | 26 + .../main/res/drawable/message_send_border.xml | 6 + .../minimalist_translation_area_bg.xml | 9 + .../main/res/drawable/msg_editor_border.xml | 8 + .../src/main/res/drawable/my_cursor.xml | 5 + .../main/res/drawable/play_voice_message.xml | 7 + .../main/res/drawable/pop_menu_translate.png | Bin 0 -> 662 bytes .../res/drawable/quote_message_area_bg.xml | 9 + .../main/res/drawable/ratingbar_opreview.png | Bin 0 -> 2073 bytes .../res/drawable/ratingbar_opreview_grey.png | Bin 0 -> 883 bytes .../main/res/drawable/recording_volume.xml | 28 + .../main/res/drawable/selector_face_text.xml | 13 + .../src/main/res/drawable/shape_circle.xml | 14 + .../src/main/res/drawable/shape_dialog.xml | 7 + .../main/res/drawable/translation_area_bg.xml | 9 + .../main/res/drawable/translation_loading.png | Bin 0 -> 1048 bytes .../drawable/view_original_image_border.xml | 8 + .../main/res/drawable/voice_btn_selector.xml | 18 + .../src/main/res/layout/activity_camera.xml | 18 + .../layout/activity_message_reply_detail.xml | 37 + .../src/main/res/layout/chat_activity.xml | 13 + .../layout/chat_flow_react_item_layout.xml | 39 + .../src/main/res/layout/chat_fragment.xml | 23 + .../res/layout/chat_input_camera_view.xml | 54 + .../src/main/res/layout/chat_input_layout.xml | 110 + .../res/layout/chat_input_layout_actoin.xml | 31 + .../res/layout/chat_inputmore_fragment.xml | 12 + .../main/res/layout/chat_inputmore_layout.xml | 22 + .../src/main/res/layout/chat_layout.xml | 230 ++ .../res/layout/chat_menu_face_item_layout.xml | 12 + .../chat_menu_recent_face_item_layout.xml | 12 + .../res/layout/chat_pop_menu_item_layout.xml | 29 + .../main/res/layout/chat_pop_menu_layout.xml | 60 + .../res/layout/chat_profile_icon_view.xml | 16 + .../layout/chat_reply_details_item_layout.xml | 90 + .../layout/chat_reply_quote_face_layout.xml | 9 + .../layout/chat_reply_quote_file_layout.xml | 30 + .../layout/chat_reply_quote_image_layout.xml | 27 + .../layout/chat_reply_quote_merge_layout.xml | 32 + .../layout/chat_reply_quote_sound_layout.xml | 30 + .../layout/chat_reply_quote_text_layout.xml | 17 + .../layout/custom_order_message_layout.xml | 78 + .../src/main/res/layout/face_group_icon.xml | 16 + .../main/res/layout/forward_chat_layout.xml | 28 + .../main/res/layout/forward_dialog_layout.xml | 47 + .../main/res/layout/forward_msg_holder.xml | 48 + .../src/main/res/layout/fragment_face.xml | 37 + .../res/layout/group_receipt_member_item.xml | 50 + .../main/res/layout/image_video_scan_item.xml | 162 ++ .../res/layout/image_video_scan_layout.xml | 24 + .../tuichat/src/main/res/layout/item_face.xml | 12 + .../main/res/layout/layout_beginner_guide.xml | 15 + .../res/layout/layout_beginner_guide_item.xml | 15 + .../src/main/res/layout/layout_face_grid.xml | 11 + .../main/res/layout/loading_progress_bar.xml | 13 + .../message_adapter_content_archives.xml | 64 + .../layout/message_adapter_content_audio.xml | 30 + .../message_adapter_content_business_card.xml | 69 + .../message_adapter_content_calling.xml | 38 + .../message_adapter_content_evaluation.xml | 50 + .../layout/message_adapter_content_file.xml | 71 + .../layout/message_adapter_content_image.xml | 33 + .../message_adapter_content_location.xml | 25 + ...ge_adapter_content_medical_examination.xml | 34 + .../layout/message_adapter_content_reply.xml | 69 + .../layout/message_adapter_content_system.xml | 60 + .../layout/message_adapter_content_text.xml | 20 + .../layout/message_adapter_content_tips.xml | 33 + .../layout/message_adapter_content_trtc.xml | 56 + .../layout/message_adapter_item_content.xml | 237 +++ .../res/layout/message_adapter_item_empty.xml | 29 + .../res/layout/message_content_layout.xml | 6 + .../res/layout/msg_receipt_detail_layout.xml | 212 ++ .../src/main/res/layout/notice_layout.xml | 30 + .../layout/quote_message_content_layout.xml | 78 + .../main/res/layout/reply_preview_layout.xml | 35 + .../test_chat_input_custom_fragment.xml | 18 + .../layout/test_custom_message_layout1.xml | 34 + .../res/layout/translation_contant_layout.xml | 59 + .../main/res/values-zh-rCN/strings-emoji.xml | 143 ++ .../src/main/res/values-zh-rCN/strings.xml | 265 +++ system/tuichat/src/main/res/values/arrays.xml | 287 +++ system/tuichat/src/main/res/values/attrs.xml | 36 + system/tuichat/src/main/res/values/colors.xml | 62 + system/tuichat/src/main/res/values/dimens.xml | 67 + .../src/main/res/values/strings-emoji.xml | 143 ++ .../tuichat/src/main/res/values/strings.xml | 266 +++ system/tuichat/src/main/res/values/styles.xml | 27 + .../src/main/res/values/tui_theme_attrs.xml | 44 + system/tuicontact/.gitignore | 1 + system/tuicontact/build.gradle | 50 + system/tuicontact/libs/tinypinyin-2.0.1.jar | Bin 0 -> 96412 bytes .../tuicontact/src/main/AndroidManifest.xml | 104 + .../tuikit/tuicontact/ITUIContactService.java | 27 + .../tuicontact/TUIContactConstants.java | 71 + .../tuikit/tuicontact/TUIContactService.java | 228 ++ .../tuikit/tuicontact/bean/ChatInfo.java | 138 ++ .../bean/ContactGroupApplyInfo.java | 45 + .../tuicontact/bean/ContactItemBean.java | 216 ++ .../tuicontact/bean/ConversationBean.java | 72 + .../tuicontact/bean/ConversationInfo.java | 235 ++ .../bean/FriendApplicationBean.java | 130 ++ .../tuikit/tuicontact/bean/GroupInfo.java | 239 +++ .../tuicontact/bean/GroupMemberInfo.java | 143 ++ .../tuikit/tuicontact/bean/MessageCustom.java | 11 + .../classicui/interfaces/IContactLayout.java | 10 + .../classicui/pages/AddMoreActivity.java | 216 ++ .../classicui/pages/BlackListActivity.java | 74 + .../classicui/pages/CreateGroupActivity.java | 456 ++++ .../pages/ForwardSelectGroupActivity.java | 279 +++ .../pages/FriendProfileActivity.java | 135 ++ .../classicui/pages/GroupListActivity.java | 91 + .../pages/GroupTypeSelectActivity.java | 167 ++ .../classicui/pages/NewFriendActivity.java | 97 + .../classicui/pages/StartC2CChatActivity.java | 98 + .../pages/StartGroupChatActivity.java | 334 +++ .../pages/StartGroupMemberSelectActivity.java | 224 ++ .../classicui/pages/TUIContactFragment.java | 75 + .../classicui/util/ContactStartChatUtils.java | 39 + .../classicui/widget/ContactAdapter.java | 237 +++ .../classicui/widget/ContactLayout.java | 68 + .../classicui/widget/ContactListView.java | 187 ++ .../widget/ForwardContactSelectorAdapter.java | 74 + .../classicui/widget/FriendProfileLayout.java | 660 ++++++ .../widget/NewFriendListAdapter.java | 154 ++ .../indexlib/IndexBar/bean/BaseIndexBean.java | 35 + .../IndexBar/bean/BaseIndexPinyinBean.java | 24 + .../IndexBar/helper/IIndexBarDataHelper.java | 39 + .../helper/IndexBarDataHelperImpl.java | 120 ++ .../indexlib/IndexBar/widget/IndexBar.java | 378 ++++ .../suspension/ISuspensionInterface.java | 13 + .../suspension/SuspensionDecoration.java | 205 ++ .../tuicontact/config/TUIContactConfig.java | 29 + .../interfaces/ContactEventListener.java | 111 + .../interfaces/IAddMoreActivity.java | 6 + .../interfaces/IContactListView.java | 21 + .../interfaces/IFriendProfileLayout.java | 8 + .../interfaces/INewFriendActivity.java | 10 + .../interfaces/IContactLayout.java | 10 + .../pages/AddMoreMinimalistActivity.java | 216 ++ .../pages/BlackListMinimalistActivity.java | 73 + .../pages/CreateGroupMinimalistActivity.java | 455 ++++ .../ForwardSelectGroupMinimalistActivity.java | 279 +++ .../FriendProfileMinimalistActivity.java | 135 ++ .../pages/GroupListMinimalistActivity.java | 91 + .../GroupTypeSelectMinimalistActivity.java | 167 ++ .../pages/NewFriendMinimalistActivity.java | 97 + .../pages/StartC2CChatMinimalistActivity.java | 98 + .../StartGroupChatMinimalistActivity.java | 334 +++ ...rtGroupMemberSelectMinimalistActivity.java | 227 ++ .../pages/TUIContactMinimalistFragment.java | 74 + .../util/ContactStartChatUtils.java | 34 + .../minimalistui/widget/ContactAdapter.java | 240 +++ .../minimalistui/widget/ContactLayout.java | 126 ++ .../minimalistui/widget/ContactListView.java | 187 ++ .../widget/ForwardContactSelectorAdapter.java | 74 + .../widget/FriendProfileLayout.java | 662 ++++++ .../tuicontact/minimalistui/widget/Menu.java | 173 ++ .../widget/NewFriendListAdapter.java | 154 ++ .../tuicontact/model/ContactProvider.java | 660 ++++++ .../presenter/AddMorePresenter.java | 126 ++ .../presenter/ContactPresenter.java | 392 ++++ .../presenter/FriendProfilePresenter.java | 334 +++ .../presenter/GetUserStatusHelper.java | 123 ++ .../presenter/NewFriendPresenter.java | 133 ++ .../tuikit/tuicontact/util/ContactUtils.java | 39 + .../tuikit/tuicontact/util/TUIContactLog.java | 85 + .../contact_black_list_icon_light.png | Bin 0 -> 1682 bytes .../contact_group_list_icon_light.png | Bin 0 -> 2448 bytes .../contact_new_friend_icon_light.png | Bin 0 -> 2344 bytes .../main/res-light/values/light_colors.xml | 3 + .../main/res-light/values/light_styles.xml | 9 + .../contact_black_list_icon_lively.png | Bin 0 -> 5366 bytes .../contact_group_list_icon_lively.png | Bin 0 -> 5752 bytes .../contact_new_friend_icon_lively.png | Bin 0 -> 6293 bytes .../main/res-lively/values/lively_colors.xml | 3 + .../main/res-lively/values/lively_styles.xml | 10 + .../drawable/contact_add_friend.png | Bin 0 -> 3068 bytes .../drawable/contact_add_group.png | Bin 0 -> 1210 bytes .../contact_minimalist_create_icon.png | Bin 0 -> 1886 bytes .../contact_minimalist_header_view_layout.xml | 30 + ...minimalist_start_group_select_activity.xml | 65 + .../minimalist_contact_blacklist_activity.xml | 17 + .../layout/minimalist_contact_fragment.xml | 12 + ...malist_contact_friend_profile_activity.xml | 14 + ...nimalist_contact_friend_profile_layout.xml | 353 +++ .../layout/minimalist_contact_layout.xml | 17 + .../layout/minimalist_contact_list.xml | 58 + ...inimalist_forward_select_group_contact.xml | 60 + .../layout/minimalist_group_list_activity.xml | 17 + ...nimalist_popup_start_c2c_chat_activity.xml | 22 + ...malist_popup_start_group_chat_activity.xml | 74 + .../values-zh-rCN/minimalist_strings.xml | 6 + .../values/minimalist_strings.xml | 6 + .../contact_black_list_icon_serious.png | Bin 0 -> 5219 bytes .../contact_group_list_icon_serious.png | Bin 0 -> 5919 bytes .../contact_new_friend_icon_serious.png | Bin 0 -> 6037 bytes .../res-serious/values/serious_colors.xml | 3 + .../res-serious/values/serious_styles.xml | 10 + .../src/main/res/color/bg_negative_btn.xml | 5 + .../src/main/res/color/bg_positive_btn.xml | 17 + .../src/main/res/color/negative_text.xml | 5 + .../src/main/res/color/positive_text.xml | 5 + .../drawable-xxhdpi/check_box_selected.png | Bin 0 -> 2928 bytes .../drawable-xxhdpi/check_box_unselected.png | Bin 0 -> 2576 bytes .../res/drawable-xxhdpi/conversation_more.png | Bin 0 -> 1242 bytes .../main/res/drawable-xxhdpi/create_c2c.png | Bin 0 -> 1389 bytes .../main/res/drawable-xxhdpi/group_icon.png | Bin 0 -> 2228 bytes .../drawable-xxhdpi/ic_contact_join_group.png | Bin 0 -> 2327 bytes .../src/main/res/drawable/agree_btn_bg.xml | 11 + .../src/main/res/drawable/btn_bg_color.xml | 6 + .../drawable/contact_checkbox_selector.xml | 9 + .../drawable/contact_confirm_button_bg.xml | 6 + .../res/drawable/contact_select_disable.png | Bin 0 -> 1108 bytes .../res/drawable/contact_shape_search.xml | 21 + .../src/main/res/drawable/my_cursor.xml | 5 + .../src/main/res/drawable/reject_btn_bg.xml | 15 + .../main/res/drawable/shape_side_bar_bg.xml | 4 + .../main/res/layout/contact_add_activity.xml | 175 ++ .../res/layout/contact_blacklist_activity.xml | 17 + .../src/main/res/layout/contact_fragment.xml | 12 + .../contact_friend_profile_activity.xml | 14 + .../layout/contact_friend_profile_layout.xml | 352 +++ .../src/main/res/layout/contact_layout.xml | 13 + .../src/main/res/layout/contact_list.xml | 58 + .../layout/contact_new_friend_activity.xml | 31 + .../res/layout/contact_new_friend_item.xml | 78 + .../layout/contact_selecable_adapter_item.xml | 97 + .../main/res/layout/create_group_layout.xml | 142 ++ .../layout/forward_contact_selector_item.xml | 22 + .../layout/forward_select_group_contact.xml | 60 + .../main/res/layout/group_list_activity.xml | 17 + .../src/main/res/layout/group_type_item.xml | 54 + .../res/layout/group_type_select_layout.xml | 29 + .../layout/popup_start_c2c_chat_activity.xml | 22 + .../popup_start_group_chat_activity.xml | 74 + .../popup_start_group_select_activity.xml | 66 + .../src/main/res/values-zh-rCN/strings.xml | 146 ++ .../tuicontact/src/main/res/values/arrays.xml | 15 + .../tuicontact/src/main/res/values/colors.xml | 49 + .../tuicontact/src/main/res/values/dimens.xml | 60 + .../src/main/res/values/strings.xml | 144 ++ .../src/main/res/values/tui_theme_attrs.xml | 7 + system/tuiconversation/.gitignore | 1 + system/tuiconversation/build.gradle | 44 + .../src/main/AndroidManifest.xml | 39 + .../ITUIConversationService.java | 81 + .../TUIConversationConstants.java | 43 + .../TUIConversationService.java | 370 ++++ .../bean/ConversationInfo.java | 347 +++ .../tuiconversation/bean/DraftInfo.java | 32 + .../interfaces/IConversationLayout.java | 38 + .../interfaces/IConversationListLayout.java | 62 + .../interfaces/IConversationProvider.java | 62 + .../OnConversationAdapterListener.java | 13 + .../page/TUIConversationFragment.java | 238 +++ .../page/TUIFoldedConversationActivity.java | 22 + .../page/TUIFoldedConversationFragment.java | 217 ++ .../page/TUIForwardSelectActivity.java | 42 + .../page/TUIForwardSelectFragment.java | 332 +++ .../setting/ConversationLayoutSetting.java | 42 + .../classicui/util/TUIConversationUtils.java | 34 + .../widget/ConversationBaseHolder.java | 25 + .../widget/ConversationCommonHolder.java | 251 +++ .../widget/ConversationCustomHolder.java | 68 + .../widget/ConversationIconView.java | 171 ++ .../classicui/widget/ConversationLayout.java | 143 ++ .../widget/ConversationListAdapter.java | 540 +++++ .../widget/ConversationListLayout.java | 142 ++ .../widget/FoldedConversationLayout.java | 112 + .../widget/FoldedConversationListLayout.java | 114 + .../ForwardConversationSelectorAdapter.java | 85 + .../classicui/widget/ForwardSelectLayout.java | 106 + .../commonutil/ConversationUtils.java | 207 ++ .../commonutil/TUIConversationLog.java | 37 + .../commonutil/TUIConversationUtils.java | 25 + .../config/TUIConversationConfig.java | 23 + .../interfaces/ConversationEventListener.java | 25 + .../interfaces/IConversationListAdapter.java | 33 + .../interfaces/IConversationLayout.java | 38 + .../interfaces/IConversationListLayout.java | 63 + .../interfaces/IConversationProvider.java | 62 + .../OnConversationAdapterListener.java | 17 + .../page/ConversationMinimalistFragment.java | 642 ++++++ ...IFoldedConversationMinimalistActivity.java | 24 + ...IFoldedConversationMinimalistFragment.java | 241 +++ .../TUIForwardSelectMinimalistActivity.java | 42 + .../TUIForwardSelectMinimalistFragment.java | 352 +++ .../setting/ConversationLayoutSetting.java | 39 + .../util/TUIConversationUtils.java | 36 + .../widget/ConversationBaseHolder.java | 25 + .../widget/ConversationCommonHolder.java | 261 +++ .../widget/ConversationCustomHolder.java | 68 + .../widget/ConversationIconView.java | 169 ++ .../widget/ConversationLayout.java | 249 +++ .../widget/ConversationListAdapter.java | 654 ++++++ .../widget/ConversationListLayout.java | 142 ++ .../widget/FoldedConversationLayout.java | 112 + .../widget/FoldedConversationListLayout.java | 114 + .../ForwardConversationSelectorAdapter.java | 85 + .../widget/ForwardSelectLayout.java | 106 + .../minimalistui/widget/Menu.java | 172 ++ .../minimalistui/widget/swipe/Attributes.java | 9 + .../widget/swipe/RecyclerSwipeAdapter.java | 84 + .../widget/swipe/SimpleSwipeListener.java | 28 + .../widget/swipe/SwipeAdapterInterface.java | 9 + .../widget/swipe/SwipeItemMangerImpl.java | 213 ++ .../swipe/SwipeItemMangerInterface.java | 28 + .../widget/swipe/SwipeLayout.java | 1662 +++++++++++++++ .../model/ConversationProvider.java | 487 +++++ .../presenter/ConversationFoldPresenter.java | 462 ++++ .../presenter/ConversationIconPresenter.java | 19 + .../presenter/ConversationPresenter.java | 1197 +++++++++++ .../conversation_minimalist_create_icon.png | Bin 0 -> 1886 bytes .../conversation_minimalist_edit_icon.png | Bin 0 -> 1139 bytes ...inimalist_message_status_send_all_read.png | Bin 0 -> 419 bytes ...minimalist_message_status_send_no_read.png | Bin 0 -> 314 bytes .../conversation_minimalist_more_icon.png | Bin 0 -> 1116 bytes ...nversation_minimalist_not_disturb_icon.png | Bin 0 -> 682 bytes .../conversation_minimalist_online_icon.png | Bin 0 -> 547 bytes .../conversation_minimalist_search_border.xml | 7 + .../conversation_minimalist_search_icon.png | Bin 0 -> 1463 bytes .../layout/minimalist_bottom_bar.xml | 64 + ...list_conversation_list_item_sub_layout.xml | 176 ++ .../layout/minimalist_folded_fragment.xml | 12 + .../layout/minimalist_folded_layout.xml | 16 + ...ist_forward_conversation_selector_item.xml | 17 + .../layout/minimalist_forward_fragment.xml | 41 + .../layout/minimalist_forward_layout.xml | 16 + .../layout/minimalist_header_view_layout.xml | 40 + .../layout/minimalist_more_dialog.xml | 88 + .../minimalistui_conversation_fragment.xml | 17 + .../minimalistui_conversation_layout.xml | 46 + ...malistui_conversation_list_item_layout.xml | 120 ++ .../values-zh-rCN/minimalist_strings.xml | 11 + .../values/minimalist_attrs.xml | 25 + .../values/minimalist_colors.xml | 9 + .../values/minimalist_strings.xml | 11 + .../src/main/res/color/bg_positive_btn.xml | 17 + .../drawable-xxhdpi/check_box_selected.png | Bin 0 -> 2928 bytes .../drawable-xxhdpi/check_box_unselected.png | Bin 0 -> 2576 bytes .../res/drawable-xxhdpi/conversation_more.png | Bin 0 -> 1242 bytes .../main/res/drawable-xxhdpi/create_c2c.png | Bin 0 -> 1389 bytes .../main/res/drawable-xxhdpi/group_icon.png | Bin 0 -> 2228 bytes .../drawable-xxhdpi/ic_contact_join_group.png | Bin 0 -> 2327 bytes .../src/main/res/drawable-xxhdpi/ic_fold.png | Bin 0 -> 8184 bytes .../drawable-xxhdpi/ic_personal_member.png | Bin 0 -> 3205 bytes .../main/res/drawable/checkbox_selector.xml | 8 + .../src/main/res/drawable/ic_disturb.xml | 12 + .../src/main/res/drawable/ic_send_failed.xml | 14 + .../main/res/drawable/ic_sending_status.xml | 10 + .../src/main/res/drawable/my_cursor.xml | 5 + .../src/main/res/drawable/popu_dialog_bg.xml | 13 + .../src/main/res/drawable/shape_search.xml | 21 + .../layout/conversation_custom_adapter.xml | 70 + .../conversation_forward_label_adapter.xml | 22 + .../conversation_forward_select_adapter.xml | 34 + .../main/res/layout/conversation_fragment.xml | 12 + .../main/res/layout/conversation_layout.xml | 11 + .../layout/conversation_list_item_layout.xml | 177 ++ .../layout/conversation_pop_menu_layout.xml | 20 + .../src/main/res/layout/folded_activity.xml | 12 + .../src/main/res/layout/folded_fragment.xml | 12 + .../src/main/res/layout/folded_layout.xml | 16 + .../src/main/res/layout/forward_activity.xml | 13 + .../forward_conversation_selector_item.xml | 17 + .../src/main/res/layout/forward_fragment.xml | 41 + .../src/main/res/layout/forward_layout.xml | 16 + .../main/res/layout/loading_progress_bar.xml | 13 + .../src/main/res/values-zh-rCN/strings.xml | 24 + .../src/main/res/values/attrs.xml | 20 + .../src/main/res/values/colors.xml | 38 + .../src/main/res/values/dimens.xml | 27 + .../src/main/res/values/strings.xml | 25 + .../src/main/res/xml/file_paths_public.xml | 27 + system/tuicore-7.3.4358/build.gradle | 51 + .../src/main/AndroidManifest.xml | 28 + .../tencent/qcloud/tuicore/EventManager.java | 91 + .../qcloud/tuicore/ExtensionManager.java | 108 + .../tencent/qcloud/tuicore/ObjectManager.java | 56 + .../qcloud/tuicore/ServiceInitializer.java | 96 + .../qcloud/tuicore/ServiceManager.java | 75 + .../com/tencent/qcloud/tuicore/TUIConfig.java | 373 ++++ .../tencent/qcloud/tuicore/TUIConstants.java | 732 +++++++ .../com/tencent/qcloud/tuicore/TUICore.java | 232 ++ .../com/tencent/qcloud/tuicore/TUILogin.java | 485 +++++ .../com/tencent/qcloud/tuicore/TUIRouter.java | 523 +++++ .../qcloud/tuicore/TUIThemeManager.java | 326 +++ .../tuicore/interfaces/ITUIExtension.java | 21 + .../tuicore/interfaces/ITUINotification.java | 7 + .../tuicore/interfaces/ITUIObjectFactory.java | 7 + .../tuicore/interfaces/ITUIService.java | 13 + .../tuicore/interfaces/TUICallback.java | 19 + .../interfaces/TUIExtensionEventListener.java | 13 + .../tuicore/interfaces/TUIExtensionInfo.java | 58 + .../tuicore/interfaces/TUILogListener.java | 5 + .../tuicore/interfaces/TUILoginConfig.java | 64 + .../tuicore/interfaces/TUILoginListener.java | 40 + .../interfaces/TUIServiceCallback.java | 7 + .../tuicore/interfaces/TUIValueCallback.java | 19 + .../permission/PermissionActivity.java | 232 ++ .../permission/PermissionCallback.java | 9 + .../permission/PermissionRequester.java | 322 +++ .../qcloud/tuicore/util/BackgroundTasks.java | 23 + .../qcloud/tuicore/util/DateTimeUtil.java | 154 ++ .../tuicore/util/ErrorMessageConverter.java | 428 ++++ .../tuicore/util/PermissionRequester.java | 611 ++++++ .../tencent/qcloud/tuicore/util/SPUtils.java | 197 ++ .../qcloud/tuicore/util/ScreenUtil.java | 83 + .../tencent/qcloud/tuicore/util/TUIBuild.java | 187 ++ .../qcloud/tuicore/util/ToastUtil.java | 48 + .../main/res-light/values/light_colors.xml | 28 + .../main/res-light/values/light_styles.xml | 30 + .../main/res-lively/values/lively_colors.xml | 28 + .../main/res-lively/values/lively_styles.xml | 29 + .../res-serious/values/serious_colors.xml | 28 + .../res-serious/values/serious_styles.xml | 30 + .../main/res/drawable/core_list_divider.xml | 11 + .../drawable/core_permission_dialog_bg.xml | 7 + .../res/layout/permission_activity_layout.xml | 37 + .../main/res/layout/permission_tip_layout.xml | 80 + .../main/res/values-zh-rCN/im_error_msg.xml | 292 +++ .../src/main/res/values-zh-rCN/strings.xml | 17 + .../src/main/res/values/attrs.xml | 90 + .../src/main/res/values/colors.xml | 8 + .../src/main/res/values/im_error_msg.xml | 291 +++ .../src/main/res/values/strings.xml | 16 + .../src/main/res/values/styles.xml | 20 + .../src/main/res/values/tui_theme_attrs.xml | 27 + system/tuicore/.gitignore | 1 + system/tuicore/build.gradle | 53 + system/tuicore/src/main/AndroidManifest.xml | 43 + .../tencent/qcloud/tuicore/EventManager.java | 95 + .../qcloud/tuicore/ExtensionManager.java | 74 + .../qcloud/tuicore/ServiceInitializer.java | 97 + .../qcloud/tuicore/ServiceManager.java | 63 + .../com/tencent/qcloud/tuicore/TUIConfig.java | 346 +++ .../tencent/qcloud/tuicore/TUIConstants.java | 429 ++++ .../com/tencent/qcloud/tuicore/TUICore.java | 148 ++ .../com/tencent/qcloud/tuicore/TUILogin.java | 464 ++++ .../com/tencent/qcloud/tuicore/TUIRouter.java | 356 ++++ .../qcloud/tuicore/TUIThemeManager.java | 310 +++ .../component/CustomLinearLayoutManager.java | 36 + .../tuicore/component/LineControllerView.java | 130 ++ .../component/RoundCornerImageView.java | 126 ++ .../tuicore/component/RoundFrameLayout.java | 83 + .../tuicore/component/TitleBarLayout.java | 175 ++ .../component/UnreadCountTextView.java | 85 + .../action/PopActionClickListener.java | 6 + .../component/action/PopDialogAdapter.java | 65 + .../component/action/PopMenuAction.java | 44 + .../component/action/PopMenuAdapter.java | 88 + .../activities/BaseLightActivity.java | 48 + .../BaseMinimalistLightActivity.java | 48 + .../activities/ImageSelectActivity.java | 444 ++++ .../activities/SelectionActivity.java | 243 +++ .../component/dialog/TUIKitDialog.java | 337 +++ .../component/fragments/BaseFragment.java | 34 + .../component/gatherimage/MultiImageData.java | 100 + .../component/gatherimage/ShadeImageView.java | 95 + .../gatherimage/SynthesizedImageView.java | 90 + .../component/gatherimage/Synthesizer.java | 14 + .../gatherimage/TeamHeadSynthesizer.java | 330 +++ .../component/gatherimage/UserIconView.java | 67 + .../imageEngine/impl/CornerTransform.java | 135 ++ .../imageEngine/impl/GlideEngine.java | 167 ++ .../tuicore/component/interfaces/ILayout.java | 20 + .../component/interfaces/ITitleBarLayout.java | 153 ++ .../component/interfaces/IUIKitCallback.java | 13 + .../component/popupcard/PopupInputCard.java | 284 +++ .../tuicore/interfaces/ITUIExtension.java | 7 + .../tuicore/interfaces/ITUINotification.java | 7 + .../tuicore/interfaces/ITUIService.java | 7 + .../tuicore/interfaces/TUICallback.java | 19 + .../tuicore/interfaces/TUILogListener.java | 5 + .../tuicore/interfaces/TUILoginConfig.java | 64 + .../tuicore/interfaces/TUILoginListener.java | 44 + .../permission/PermissionActivity.java | 232 ++ .../permission/PermissionCallback.java | 6 + .../permission/PermissionRequester.java | 320 +++ .../qcloud/tuicore/util/BackgroundTasks.java | 25 + .../qcloud/tuicore/util/DateTimeUtil.java | 152 ++ .../tuicore/util/ErrorMessageConverter.java | 733 +++++++ .../tencent/qcloud/tuicore/util/FileUtil.java | 497 +++++ .../qcloud/tuicore/util/ImageUtil.java | 477 +++++ .../tuicore/util/PermissionRequester.java | 623 ++++++ .../qcloud/tuicore/util/PopWindowUtil.java | 45 + .../tencent/qcloud/tuicore/util/SPUtils.java | 203 ++ .../qcloud/tuicore/util/ScreenUtil.java | 85 + .../qcloud/tuicore/util/SoftKeyBoardUtil.java | 63 + .../tencent/qcloud/tuicore/util/TUIBuild.java | 188 ++ .../qcloud/tuicore/util/TUIFileProvider.java | 6 + .../tencent/qcloud/tuicore/util/TUIUtil.java | 57 + .../qcloud/tuicore/util/ThreadHelper.java | 47 + .../qcloud/tuicore/util/ToastUtil.java | 44 + ...ore_default_group_icon_community_light.png | Bin 0 -> 5871 bytes .../core_default_group_icon_meeting_light.png | Bin 0 -> 3318 bytes .../core_default_group_icon_public_light.png | Bin 0 -> 3628 bytes .../core_default_group_icon_work_light.png | Bin 0 -> 4142 bytes .../core_default_user_icon_light.png | Bin 0 -> 21503 bytes .../core_online_status_light.png | Bin 0 -> 2014 bytes .../core_selected_icon_light.png | Bin 0 -> 5117 bytes .../core_title_bar_back_light.png | Bin 0 -> 1299 bytes .../drawable/core_title_bar_bg_light.xml | 9 + .../main/res-light/values/light_colors.xml | 29 + .../main/res-light/values/light_styles.xml | 41 + ...re_default_group_icon_community_lively.png | Bin 0 -> 5389 bytes ...core_default_group_icon_meeting_lively.png | Bin 0 -> 2973 bytes .../core_default_group_icon_public_lively.png | Bin 0 -> 3652 bytes .../core_default_group_icon_work_lively.png | Bin 0 -> 3817 bytes .../core_default_user_icon_lively.png | Bin 0 -> 21503 bytes .../core_online_status_lively.png | Bin 0 -> 2014 bytes .../core_selected_icon_lively.png | Bin 0 -> 5096 bytes .../core_title_bar_back_lively.png | Bin 0 -> 1677 bytes .../drawable/core_title_bar_bg_lively.xml | 8 + .../main/res-lively/values/lively_colors.xml | 29 + .../main/res-lively/values/lively_styles.xml | 40 + ...e_default_group_icon_community_serious.png | Bin 0 -> 6023 bytes ...ore_default_group_icon_meeting_serious.png | Bin 0 -> 3260 bytes ...core_default_group_icon_public_serious.png | Bin 0 -> 3894 bytes .../core_default_group_icon_work_serious.png | Bin 0 -> 4171 bytes .../core_default_user_icon_serious.png | Bin 0 -> 11706 bytes .../core_online_status_serious.png | Bin 0 -> 2012 bytes .../core_selected_icon_serious.png | Bin 0 -> 5224 bytes .../core_title_bar_back_serious.png | Bin 0 -> 1677 bytes .../drawable/core_title_bar_bg_serious.xml | 9 + .../res-serious/values/serious_colors.xml | 29 + .../res-serious/values/serious_styles.xml | 42 + .../src/main/res/anim/core_popup_in_anim.xml | 8 + .../src/main/res/anim/core_popup_out_anim.xml | 8 + .../main/res/drawable-xxhdpi/arrow_right.png | Bin 0 -> 1467 bytes .../res/drawable-xxhdpi/core_close_icon.png | Bin 0 -> 1013 bytes .../core_default_group_icon_community.png | Bin 0 -> 17948 bytes .../res/drawable-xxhdpi/core_delete_icon.png | Bin 0 -> 12884 bytes .../core_icon_offline_status.png | Bin 0 -> 1909 bytes .../res/drawable-xxhdpi/core_search_icon.png | Bin 0 -> 3462 bytes .../src/main/res/drawable/alert_bg.9.png | Bin 0 -> 421 bytes .../main/res/drawable/core_edit_cursor.xml | 6 + .../main/res/drawable/core_edit_text_bg.xml | 5 + .../main/res/drawable/core_list_divider.xml | 11 + .../drawable/core_permission_dialog_bg.xml | 7 + .../res/drawable/core_positive_btn_bg.xml | 7 + .../drawable/core_positive_btn_disable_bg.xml | 11 + .../drawable/core_positive_btn_normal_bg.xml | 11 + .../drawable/core_positive_btn_pressed_bg.xml | 11 + .../src/main/res/drawable/popup_card_bg.xml | 13 + .../src/main/res/drawable/selected_border.xml | 9 + .../src/main/res/drawable/switch_thumb.xml | 5 + .../main/res/drawable/switch_thumb_blue.xml | 14 + .../main/res/drawable/switch_thumb_gray.xml | 16 + .../src/main/res/drawable/switch_track.xml | 5 + .../main/res/drawable/switch_track_blue.xml | 13 + .../main/res/drawable/switch_track_gray.xml | 16 + .../src/main/res/drawable/trans_bg.png | Bin 0 -> 141 bytes .../core_activity_image_select_layout.xml | 25 + .../src/main/res/layout/core_pop_menu.xml | 16 + .../layout/core_select_image_item_layout.xml | 63 + .../res/layout/core_select_item_layout.xml | 31 + .../src/main/res/layout/layout_popup_card.xml | 83 + .../main/res/layout/line_controller_view.xml | 93 + .../res/layout/permission_activity_layout.xml | 37 + .../main/res/layout/permission_tip_layout.xml | 80 + .../main/res/layout/pop_dialog_adapter.xml | 17 + .../src/main/res/layout/pop_menu_adapter.xml | 21 + .../src/main/res/layout/profile_icon_view.xml | 16 + .../src/main/res/layout/title_bar_layout.xml | 92 + .../res/layout/tuicore_selection_activity.xml | 29 + .../src/main/res/layout/view_dialog.xml | 71 + .../main/res/values-zh-rCN/im_error_msg.xml | 291 +++ .../src/main/res/values-zh-rCN/strings.xml | 23 + system/tuicore/src/main/res/values/attrs.xml | 68 + system/tuicore/src/main/res/values/colors.xml | 28 + system/tuicore/src/main/res/values/dimens.xml | 43 + .../src/main/res/values/im_error_msg.xml | 290 +++ .../tuicore/src/main/res/values/strings.xml | 23 + system/tuicore/src/main/res/values/styles.xml | 37 + .../src/main/res/values/tui_theme_attrs.xml | 40 + .../src/main/res/xml/file_paths_public.xml | 27 + system/tuigroup/.gitignore | 1 + system/tuigroup/build.gradle | 47 + system/tuigroup/src/main/AndroidManifest.xml | 51 + .../tuikit/tuigroup/ITUIGroupService.java | 12 + .../tuikit/tuigroup/TUIGroupConstants.java | 39 + .../tuikit/tuigroup/TUIGroupService.java | 232 ++ .../qcloud/tuikit/tuigroup/bean/ChatInfo.java | 157 ++ .../tuikit/tuigroup/bean/GroupApplyInfo.java | 60 + .../tuikit/tuigroup/bean/GroupInfo.java | 251 +++ .../tuikit/tuigroup/bean/GroupMemberInfo.java | 140 ++ .../IGroupMemberChangedCallback.java | 7 + .../interfaces/IGroupMemberListener.java | 16 + .../page/GroupApplyManagerActivity.java | 59 + .../classicui/page/GroupInfoActivity.java | 46 + .../classicui/page/GroupInfoFragment.java | 253 +++ .../classicui/page/GroupMemberActivity.java | 176 ++ .../classicui/page/GroupNoticeActivity.java | 152 ++ .../classicui/page/ManageGroupActivity.java | 318 +++ .../page/SetGroupManagerActivity.java | 288 +++ .../classicui/view/GroupApplyAdapter.java | 170 ++ .../view/GroupApplyManagerLayout.java | 110 + .../classicui/view/GroupInfoAdapter.java | 213 ++ .../classicui/view/GroupInfoLayout.java | 680 ++++++ .../classicui/view/GroupMemberAdapter.java | 238 +++ .../classicui/view/GroupMemberLayout.java | 299 +++ .../tuigroup/component/BottomSelectSheet.java | 93 + .../interfaces/GroupEventListener.java | 5 + .../interfaces/IGroupApplyLayout.java | 14 + .../interfaces/IGroupMemberLayout.java | 11 + .../IGroupMemberChangedCallback.java | 7 + .../interfaces/IGroupMemberListener.java | 16 + .../GroupApplyManagerMinimalistActivity.java | 59 + .../page/GroupInfoMinimalistActivity.java | 46 + .../page/GroupInfoMinimalistFragment.java | 253 +++ .../page/GroupMemberMinimalistActivity.java | 175 ++ .../page/GroupNoticeMinimalistActivity.java | 152 ++ .../page/ManageGroupMinimalistActivity.java | 319 +++ .../SetGroupManagerMinimalistActivity.java | 290 +++ .../minimalistui/view/GroupApplyAdapter.java | 170 ++ .../view/GroupApplyManagerLayout.java | 109 + .../minimalistui/view/GroupInfoAdapter.java | 216 ++ .../minimalistui/view/GroupInfoLayout.java | 682 ++++++ .../minimalistui/view/GroupMemberAdapter.java | 240 +++ .../minimalistui/view/GroupMemberLayout.java | 302 +++ .../tuigroup/model/GroupInfoProvider.java | 670 ++++++ .../presenter/GroupApplyPresenter.java | 71 + .../presenter/GroupInfoPresenter.java | 369 ++++ .../presenter/GroupManagerPresenter.java | 52 + .../tuikit/tuigroup/util/TUIGroupLog.java | 37 + .../tuikit/tuigroup/util/TUIGroupUtils.java | 96 + .../drawable-xxhdpi/group_add_icon_light.png | Bin 0 -> 5352 bytes .../main/res-light/values/light_colors.xml | 3 + .../main/res-light/values/light_styles.xml | 7 + .../drawable-xxhdpi/group_add_icon_lively.png | Bin 0 -> 5212 bytes .../main/res-lively/values/lively_colors.xml | 3 + .../main/res-lively/values/lively_styles.xml | 8 + .../drawable/group_minimalist_add_border.xml | 10 + ...roup_minimalist_apply_manager_activity.xml | 13 + .../layout/group_minimalist_info_fragment.xml | 13 + .../layout/group_minimalist_members_list.xml | 30 + .../group_add_icon_serious.png | Bin 0 -> 4865 bytes .../res-serious/values/serious_colors.xml | 3 + .../res-serious/values/serious_styles.xml | 8 + .../res/anim/bottom_select_sheet_enter.xml | 8 + .../res/anim/bottom_select_sheet_exit.xml | 8 + .../src/main/res/color/bg_negative_btn.xml | 17 + .../src/main/res/color/bg_positive_btn.xml | 17 + .../src/main/res/drawable-hdpi/alert_bg.9.png | Bin 0 -> 421 bytes .../src/main/res/drawable-hdpi/trans_bg.png | Bin 0 -> 141 bytes .../res/drawable-xxhdpi/add_group_member.png | Bin 0 -> 1271 bytes .../drawable-xxhdpi/check_box_selected.png | Bin 0 -> 2928 bytes .../drawable-xxhdpi/check_box_unselected.png | Bin 0 -> 2576 bytes .../res/drawable-xxhdpi/del_group_member.png | Bin 0 -> 1141 bytes .../drawable-xxhdpi/group_select_disable.png | Bin 0 -> 1108 bytes .../res/drawable/bottom_action_border.xml | 10 + .../main/res/drawable/bottom_sheet_border.xml | 5 + .../main/res/drawable/editor_border_gray.xml | 8 + .../src/main/res/drawable/gray_btn_bg.xml | 9 + .../res/drawable/group_checkbox_selector.xml | 9 + .../res/drawable/group_confirm_button_bg.xml | 6 + .../main/res/drawable/group_list_divider.xml | 11 + .../src/main/res/drawable/my_cursor.xml | 5 + .../src/main/res/drawable/popu_dialog_bg.xml | 13 + .../src/main/res/drawable/text_border.xml | 8 + .../res/layout/activity_group_manager.xml | 77 + .../main/res/layout/activity_group_notice.xml | 32 + .../res/layout/activity_set_group_manager.xml | 105 + .../main/res/layout/bottom_select_sheet.xml | 29 + .../src/main/res/layout/bottom_sheet_item.xml | 15 + .../layout/group_apply_manager_activity.xml | 15 + .../res/layout/group_apply_manager_layout.xml | 22 + .../main/res/layout/group_info_activity.xml | 13 + .../main/res/layout/group_info_fragment.xml | 15 + .../src/main/res/layout/group_info_layout.xml | 320 +++ .../main/res/layout/group_manager_item.xml | 40 + .../res/layout/group_manager_pop_menu.xml | 19 + .../res/layout/group_member_apply_adpater.xml | 60 + .../res/layout/group_member_item_layout.xml | 28 + .../main/res/layout/group_member_layout.xml | 64 + .../res/layout/group_member_list_item.xml | 53 + .../res/layout/group_member_selected_item.xml | 21 + .../main/res/layout/group_members_list.xml | 31 + .../res/layout/group_profile_icon_view.xml | 16 + .../src/main/res/layout/layout_dialog.xml | 76 + .../main/res/layout/layout_ensure_dialog.xml | 73 + .../src/main/res/values-zh-rCN/strings.xml | 105 + .../tuigroup/src/main/res/values/arrays.xml | 10 + .../tuigroup/src/main/res/values/colors.xml | 28 + .../tuigroup/src/main/res/values/dimens.xml | 27 + .../tuigroup/src/main/res/values/strings.xml | 107 + .../tuigroup/src/main/res/values/styles.xml | 18 + .../src/main/res/values/tui_theme_attrs.xml | 5 + .../src/main/res/xml/file_paths_public.xml | 27 + system/video/.gitignore | 1 + system/video/build.gradle | 26 + system/video/src/main/AndroidManifest.xml | 6 + .../src/main/java/cn/jzvd/JZDataSource.java | 88 + .../main/java/cn/jzvd/JZMediaInterface.java | 47 + .../src/main/java/cn/jzvd/JZMediaSystem.java | 202 ++ .../src/main/java/cn/jzvd/JZTextureView.java | 161 ++ .../video/src/main/java/cn/jzvd/JZUtils.java | 169 ++ system/video/src/main/java/cn/jzvd/Jzvd.java | 1073 ++++++++++ .../video/src/main/java/cn/jzvd/JzvdStd.java | 926 ++++++++ .../main/res/drawable-xhdpi/jz_add_volume.png | Bin 0 -> 1306 bytes .../res/drawable-xhdpi/jz_back_normal.png | Bin 0 -> 625 bytes .../res/drawable-xhdpi/jz_back_pressed.png | Bin 0 -> 378 bytes .../drawable-xhdpi/jz_back_tiny_normal.png | Bin 0 -> 531 bytes .../drawable-xhdpi/jz_back_tiny_pressed.png | Bin 0 -> 486 bytes .../res/drawable-xhdpi/jz_backward_icon.png | Bin 0 -> 1392 bytes .../drawable-xhdpi/jz_battery_level_10.png | Bin 0 -> 176 bytes .../drawable-xhdpi/jz_battery_level_100.png | Bin 0 -> 169 bytes .../drawable-xhdpi/jz_battery_level_30.png | Bin 0 -> 169 bytes .../drawable-xhdpi/jz_battery_level_50.png | Bin 0 -> 168 bytes .../drawable-xhdpi/jz_battery_level_70.png | Bin 0 -> 169 bytes .../drawable-xhdpi/jz_battery_level_90.png | Bin 0 -> 168 bytes .../drawable-xhdpi/jz_brightness_video.png | Bin 0 -> 1058 bytes .../jz_clarity_popwindow_bg.9.png | Bin 0 -> 469 bytes .../res/drawable-xhdpi/jz_close_volume.png | Bin 0 -> 717 bytes .../main/res/drawable-xhdpi/jz_enlarge.png | Bin 0 -> 164 bytes .../res/drawable-xhdpi/jz_forward_icon.png | Bin 0 -> 1381 bytes .../main/res/drawable-xhdpi/jz_loading_bg.png | Bin 0 -> 4400 bytes .../res/drawable-xhdpi/jz_pause_normal.png | Bin 0 -> 1092 bytes .../res/drawable-xhdpi/jz_pause_pressed.png | Bin 0 -> 958 bytes .../res/drawable-xhdpi/jz_play_normal.png | Bin 0 -> 1480 bytes .../res/drawable-xhdpi/jz_play_pressed.png | Bin 0 -> 1272 bytes .../res/drawable-xhdpi/jz_restart_normal.png | Bin 0 -> 1215 bytes .../res/drawable-xhdpi/jz_restart_pressed.png | Bin 0 -> 1118 bytes .../res/drawable-xhdpi/jz_share_normal.png | Bin 0 -> 4059 bytes .../res/drawable-xhdpi/jz_share_pressed.png | Bin 0 -> 4004 bytes .../src/main/res/drawable-xhdpi/jz_shrink.png | Bin 0 -> 224 bytes .../res/drawable-xhdpi/jz_volume_icon.png | Bin 0 -> 922 bytes .../src/main/res/drawable/jz_bottom_bg.9.png | Bin 0 -> 946 bytes .../main/res/drawable/jz_bottom_progress.xml | 28 + .../res/drawable/jz_bottom_seek_poster.xml | 5 + .../res/drawable/jz_bottom_seek_progress.xml | 28 + .../drawable/jz_clarity_popwindow_bg.9.png | Bin 0 -> 470 bytes .../res/drawable/jz_click_back_selector.xml | 5 + .../drawable/jz_click_back_tiny_selector.xml | 5 + .../res/drawable/jz_click_pause_selector.xml | 6 + .../res/drawable/jz_click_play_selector.xml | 5 + .../res/drawable/jz_click_replay_selector.xml | 5 + .../res/drawable/jz_click_share_selector.xml | 5 + .../main/res/drawable/jz_dialog_progress.xml | 17 + .../res/drawable/jz_dialog_progress_bg.xml | 9 + .../src/main/res/drawable/jz_loading.xml | 7 + .../video/src/main/res/drawable/jz_retry.xml | 7 + .../res/drawable/jz_seek_poster_normal.xml | 8 + .../res/drawable/jz_seek_poster_pressed.xml | 8 + .../src/main/res/drawable/jz_title_bg.9.png | Bin 0 -> 1314 bytes .../res/drawable/jz_volume_progress_bg.xml | 19 + .../main/res/layout/jz_dialog_brightness.xml | 43 + .../main/res/layout/jz_dialog_progress.xml | 56 + .../src/main/res/layout/jz_dialog_volume.xml | 43 + .../src/main/res/layout/jz_layout_clarity.xml | 9 + .../res/layout/jz_layout_clarity_item.xml | 13 + .../src/main/res/layout/jz_layout_std.xml | 245 +++ .../video/src/main/res/values-es/strings.xml | 10 + .../src/main/res/values-ja-rJP/strings.xml | 10 + .../src/main/res/values-ko-rKR/strings.xml | 10 + .../video/src/main/res/values-pt/strings.xml | 10 + .../video/src/main/res/values-tr/strings.xml | 10 + .../video/src/main/res/values-zh/strings.xml | 10 + system/video/src/main/res/values/dimens.xml | 4 + system/video/src/main/res/values/strings.xml | 10 + system/video/src/main/res/values/styles.xml | 17 + .../res/xml/jz_network_security_config.xml | 4 + 2374 files changed, 198527 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/key/yxjkExpert.jks create mode 100644 app/proguard-rules.pro create mode 100644 app/release/output-metadata.json create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/assets/tab.json create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/MyApplication.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/base/BaseActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/base/BaseFragment.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/AppUpdateBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/CommonSettingMenuBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/ImageBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/UploadFileResultBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/UserInfoBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/im/IMAssistantBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/im/IMInfoBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/login/LoginResultBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/mine/BillRecordBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/mine/CommonSettingMenuBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/mine/ConsultStatisticsBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/mine/ConsultTypeBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/mine/DiseaseBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/mine/DoctorBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/mine/PageManagerBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SchedulingBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SchedulingResultBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SuspensionServiceBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/other/UserListBean.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/AppointmentBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ArchivesBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ArchivesDetailResultBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/AudioVideoCallBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CallTimeBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckItemBySfzhTotalBean.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckRecordUserInfoBean.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckUpDetailListBean.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultDetailBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultInfoBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultRecordBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/HealthInfoBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/MessageBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/PhysicalExaminationReportBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/RefuseReasonBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ResultItemListBean.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/WorkBenchConsultNumBean.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/data/api/IMApi.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/data/api/LoginApi.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/data/api/MineApi.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/data/api/OtherApi.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/data/api/WorkbenchApi.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/data/repository/IMRepository.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/data/repository/LoginRepository.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/data/repository/MineRepository.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/data/repository/OtherRepository.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/data/repository/WorkbenchRepository.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/event/AddGoodAtDiseaseEvent.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/event/ConsultRecordEvent.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/event/DoctorEvent.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/event/GlobalEvent.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/event/SuspensionServiceEvent.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/event/WorkbenchEvent.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ext/DatimeEntityExt.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ext/IMManager.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ext/StartActivityManager.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/im/IMMainActivity.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/im/MainMinimalistActivity.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/im/SelectLocationActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/im/ViewLocationActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/im/adapter/FragmentAdapter.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/im/utils/IMInputActionSettingUtils.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/im/view/Menu.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/im/viewmodel/SelectLocationViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/im/viewmodel/ViewLocationViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/login/ChangePassWordActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/login/LoginActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/login/RetrievePassWordActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/login/viewmodel/LoginViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/login/viewmodel/RetrievePassWordViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/main/MainActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/main/WebActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/main/adapter/ImageAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/AppViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/MainViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/WebViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/AddSuspensionAnnouncementActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/BillRecordActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/ConsultStatisticsActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/CustomSchedulingActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/EditPasswordActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/GoodAtDiseaseActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/PersonInfoActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SchedulingActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SettingActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SuspensionServiceActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/WithDrawActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/AddDiseaseAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/BillRecordAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/CustomSchedulingAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/DiseaseAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/NewSchedulingAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SchedulingAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SuspensionCauseAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SuspensionServiceAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/fragment/BillRecordFragment.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/fragment/MineFragment.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/utils/ConsultStatisticsFormatter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/AddSuspensionAnnouncementViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/BillRecordFragmentViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/BillRecordViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/ConsultStatisticsViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/CustomSchedulingViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/EditPasswordViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/GoodAtDiseaseViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/MineViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/PersonInfoViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/SchedulingViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/SettingViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/SuspensionServiceViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/mine/viewmodel/WithDrawViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/other/SimulateUserActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/other/SimulateUserViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/other/UserListAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/ArchivesDetailActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/AudioVideoConsultActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/BaseHealthyInformationActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/BigImageActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/CheckUpDetailActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/ConsultFinishActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/ConsultHistoryActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/ConsultRecordActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/ConsultWaitStartActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/ImageTextConsultDetailActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/MessageListActivity.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/adapter/CheckUpDetailAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/adapter/ConsultHistoryAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/adapter/ConsultRecordAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/adapter/HealthInfoAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/adapter/MessageListAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/fragment/ConsultRecordFragment.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/fragment/ConsultRecordGroupFragment.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/fragment/WorkbenchFragment.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/ArchivesDetailViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/AudioVideoConsultViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/BaseHealthyInformationViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/BigImageViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/CheckUpDetailViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/ConsultFinishViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/ConsultHistoryViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/ConsultRecordViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/ConsultWaitStartViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/ImageTextConsultViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/MessageListViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/ui/workbench/viewmodel/WorkbenchViewModel.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/AndroidBug5497Workaround.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/AuthCodeCountDownTimer.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/BrandUtil.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/CommonUtils.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/ConstantUtils.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/CustomActivityManager.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/DebuggerUtils.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/DevicesInfoUtils.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/GenerateTestUserSig.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/KotlinHelp.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/NineGridViewImageLoader.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/StatusbarUtil.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/StringExt.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/StringUtils.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/SystemHelper.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/TUIKitConstants.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/TUIUtils.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/pictureSelector/GlideEngine.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/pictureSelector/ImageFileCompressEngine.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/pictureSelector/ImageFileCropEngine.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/updateplugin/CheckUpdateAppVersion.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/updateplugin/CustomFileChecker.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/utils/updateplugin/CustomFileCreator.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/AddDiseaseDialog.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/BaseHealthyInformationView.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/ConsultInformationView.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/CustomDownloadNotifier.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/CustomInstallNotifier.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/CustomPasswordView.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/CustomRichTextView.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/CustomSearchView.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/CustomUpdateNotifier.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/DateTimeRangePicker.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/LoadingProgressDialog.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/PopupWindowRecycleView.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/PrivacyDialog.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/ProgressDrawable.java create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/RefuseExplainDialog.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/SpaceItemDecoration.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/SuspensionAnnouncementAffirmDialog.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/TextViewDialog.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/bottomtab/HomeBottomTabLayout.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/bottomtab/TabConfig.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/bottomtab/TabFragmentPageAdapter.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/bottomtab/TabUtils.kt create mode 100644 app/src/main/java/com/yxjk/healthexpertclient/view/viewpager/ViewPagerAdapter.kt create mode 100644 app/src/main/res-im/layout/activity_select_location.xml create mode 100644 app/src/main/res-im/layout/activity_view_location.xml create mode 100644 app/src/main/res-im/layout/im_activity.xml create mode 100644 app/src/main/res-im/layout/overseas_main_activity.xml create mode 100644 app/src/main/res-login/drawable-xxhdpi/ic_icon.png create mode 100644 app/src/main/res-login/drawable-xxhdpi/ic_icon_2.png create mode 100644 app/src/main/res-login/drawable-xxhdpi/ic_login_bg.png create mode 100644 app/src/main/res-login/drawable-xxhdpi/ic_login_green_select.png create mode 100644 app/src/main/res-login/drawable-xxhdpi/ic_login_name.png create mode 100644 app/src/main/res-login/drawable-xxhdpi/ic_login_no_select.png create mode 100644 app/src/main/res-login/drawable/bg_grey_background_shap_radius23.xml create mode 100644 app/src/main/res-login/drawable/bg_login_green_to_white.xml create mode 100644 app/src/main/res-login/drawable/bg_white_bottom_right_angle_background_shap20.xml create mode 100644 app/src/main/res-login/layout/activity_login.xml create mode 100644 app/src/main/res-login/layout/activity_retrieve_password.xml create mode 100644 app/src/main/res-login/layout/custom_password_view.xml create mode 100644 app/src/main/res-login/values/strings.xml create mode 100644 app/src/main/res-mine/drawable-xxhdpi/icon_mine_about_us.webp create mode 100644 app/src/main/res-mine/drawable-xxhdpi/icon_mine_account_security.webp create mode 100644 app/src/main/res-mine/drawable-xxhdpi/icon_mine_assistant.webp create mode 100644 app/src/main/res-mine/drawable-xxhdpi/icon_mine_personal_info.webp create mode 100644 app/src/main/res-mine/drawable-xxhdpi/icon_mine_scheduling.webp create mode 100644 app/src/main/res-mine/drawable-xxhdpi/icon_mine_statistics.webp create mode 100644 app/src/main/res-mine/drawable-xxhdpi/icon_mine_suspension_service.webp create mode 100644 app/src/main/res-mine/layout/activity_add_suspension_announcement.xml create mode 100644 app/src/main/res-mine/layout/activity_bill_record.xml create mode 100644 app/src/main/res-mine/layout/activity_consult_statistics.xml create mode 100644 app/src/main/res-mine/layout/activity_custom_scheduling.xml create mode 100644 app/src/main/res-mine/layout/activity_edit_password.xml create mode 100644 app/src/main/res-mine/layout/activity_good_at_disease.xml create mode 100644 app/src/main/res-mine/layout/activity_person_info.xml create mode 100644 app/src/main/res-mine/layout/activity_scheduling.xml create mode 100644 app/src/main/res-mine/layout/activity_setting.xml create mode 100644 app/src/main/res-mine/layout/activity_suspension_service.xml create mode 100644 app/src/main/res-mine/layout/activity_with_draw.xml create mode 100644 app/src/main/res-mine/layout/dialog_add_disease.xml create mode 100644 app/src/main/res-mine/layout/dialog_suspension_announcement_affirm.xml create mode 100644 app/src/main/res-mine/layout/fragment_bill_list.xml create mode 100644 app/src/main/res-mine/layout/fragment_mine.xml create mode 100644 app/src/main/res-mine/layout/item_recycle_add_disease.xml create mode 100644 app/src/main/res-mine/layout/item_recycle_bill_record.xml create mode 100644 app/src/main/res-mine/layout/item_recycle_cause.xml create mode 100644 app/src/main/res-mine/layout/item_recycle_custom_scheduling.xml create mode 100644 app/src/main/res-mine/layout/item_recycle_disease.xml create mode 100644 app/src/main/res-mine/layout/item_recycle_new_scheduling.xml create mode 100644 app/src/main/res-mine/layout/item_recycle_scheduling.xml create mode 100644 app/src/main/res-mine/layout/item_recycle_suspension_service.xml create mode 100644 app/src/main/res-mine/layout/item_recycle_suspension_service_header.xml create mode 100644 app/src/main/res-mine/layout/lay_audio_video_consult_setting.xml create mode 100644 app/src/main/res-mine/layout/view_footer_suspension_service.xml create mode 100644 app/src/main/res-mine/layout/view_input_password.xml create mode 100644 app/src/main/res-mine/layout/view_person_info_item.xml create mode 100644 app/src/main/res-mine/layout/view_with_draw_detail_item.xml create mode 100644 app/src/main/res-mine/menu/menu_bill_record.xml create mode 100644 app/src/main/res-mine/values/strings.xml create mode 100644 app/src/main/res-other/layout/activity_sumilate.xml create mode 100644 app/src/main/res-other/layout/item_user_list.xml create mode 100644 app/src/main/res-workbench/drawable-xxhdpi/bg_operate_time.9.png create mode 100644 app/src/main/res-workbench/drawable-xxhdpi/ic_rich_down.png create mode 100644 app/src/main/res-workbench/drawable-xxhdpi/ic_rich_up.png create mode 100644 app/src/main/res-workbench/drawable-xxhdpi/icon_close.webp create mode 100644 app/src/main/res-workbench/drawable-xxhdpi/icon_consult_assistant.webp create mode 100644 app/src/main/res-workbench/drawable-xxhdpi/icon_consult_image.png create mode 100644 app/src/main/res-workbench/drawable-xxhdpi/icon_consult_info.webp create mode 100644 app/src/main/res-workbench/drawable-xxhdpi/icon_consult_video.png create mode 100644 app/src/main/res-workbench/drawable-xxhdpi/icon_expansion.webp create mode 100644 app/src/main/res-workbench/drawable-xxhdpi/icon_time.webp create mode 100644 app/src/main/res-workbench/drawable/bg_blue_background_shap_radius20.xml create mode 100644 app/src/main/res-workbench/drawable/bg_form_line.xml create mode 100644 app/src/main/res-workbench/layout/activity_archives_detail.xml create mode 100644 app/src/main/res-workbench/layout/activity_base_healthy_information.xml create mode 100644 app/src/main/res-workbench/layout/activity_big_image.xml create mode 100644 app/src/main/res-workbench/layout/activity_check_up_detail.xml create mode 100644 app/src/main/res-workbench/layout/activity_consult_detail.xml create mode 100644 app/src/main/res-workbench/layout/activity_consult_finish.xml create mode 100644 app/src/main/res-workbench/layout/activity_consult_history.xml create mode 100644 app/src/main/res-workbench/layout/activity_consult_record.xml create mode 100644 app/src/main/res-workbench/layout/activity_consult_wait_confirm.xml create mode 100644 app/src/main/res-workbench/layout/activity_consult_wait_start.xml create mode 100644 app/src/main/res-workbench/layout/activity_message_list.xml create mode 100644 app/src/main/res-workbench/layout/dialog_header_date_time_range.xml create mode 100644 app/src/main/res-workbench/layout/dialog_refuse_explain.xml create mode 100644 app/src/main/res-workbench/layout/fragment_consult_record.xml create mode 100644 app/src/main/res-workbench/layout/fragment_group_consult_record.xml create mode 100644 app/src/main/res-workbench/layout/fragment_workbench.xml create mode 100644 app/src/main/res-workbench/layout/item_check_up_detail.xml create mode 100644 app/src/main/res-workbench/layout/item_check_up_detail_chaild.xml create mode 100644 app/src/main/res-workbench/layout/item_recycle_consult_history.xml create mode 100644 app/src/main/res-workbench/layout/item_recycle_consult_record.xml create mode 100644 app/src/main/res-workbench/layout/item_recycle_health_info.xml create mode 100644 app/src/main/res-workbench/layout/item_recycle_message.xml create mode 100644 app/src/main/res-workbench/layout/item_spinner_dropdown.xml create mode 100644 app/src/main/res-workbench/layout/item_tablayout_group_title.xml create mode 100644 app/src/main/res-workbench/layout/lay_workbench_status.xml create mode 100644 app/src/main/res-workbench/layout/popupwindow_recycle_view.xml create mode 100644 app/src/main/res-workbench/layout/view_base_healthy_information.xml create mode 100644 app/src/main/res-workbench/layout/view_choice_question.xml create mode 100644 app/src/main/res-workbench/layout/view_consult_information.xml create mode 100644 app/src/main/res-workbench/layout/view_custom_rich_text_view.xml create mode 100644 app/src/main/res-workbench/layout/view_image_question.xml create mode 100644 app/src/main/res-workbench/layout/view_text_question.xml create mode 100644 app/src/main/res-workbench/values/strings.xml create mode 100644 app/src/main/res/color/color_child_tab_layout_text.xml create mode 100644 app/src/main/res/color/color_custom_scheduling_item_text.xml create mode 100644 app/src/main/res/color/color_state_menu_navi.xml create mode 100644 app/src/main/res/color/color_state_menu_navi_text.xml create mode 100644 app/src/main/res/color/color_suspension_cause_item_text.xml create mode 100644 app/src/main/res/color/color_tab_layout_text.xml create mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable-xxhdpi/bg_green_to_light_green.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_close.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_consult_num_tag.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_default_archives_image.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_delete.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_message.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_month_statistics.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_my_location.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_search.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_select_location.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_selected.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_unselected.webp create mode 100644 app/src/main/res/drawable-xxhdpi/icon_back.webp create mode 100644 app/src/main/res/drawable-xxhdpi/icon_image_add.webp create mode 100644 app/src/main/res/drawable-xxhdpi/icon_main_mine_normal.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_main_mine_selected.webp create mode 100644 app/src/main/res/drawable-xxhdpi/icon_main_workbench_normal.webp create mode 100644 app/src/main/res/drawable-xxhdpi/icon_main_workbench_selected.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_more_small_gray.webp create mode 100644 app/src/main/res/drawable/bg_80_white_background_shap.xml create mode 100644 app/src/main/res/drawable/bg_blue_background_shap.xml create mode 100644 app/src/main/res/drawable/bg_blue_background_shap_radius4.xml create mode 100644 app/src/main/res/drawable/bg_bottom_radius_card.xml create mode 100644 app/src/main/res/drawable/bg_card.xml create mode 100644 app/src/main/res/drawable/bg_card_bottom.xml create mode 100644 app/src/main/res/drawable/bg_card_top.xml create mode 100644 app/src/main/res/drawable/bg_child_tab_layout_item.xml create mode 100644 app/src/main/res/drawable/bg_custom_scheduling_item.xml create mode 100644 app/src/main/res/drawable/bg_date_time_range_text.xml create mode 100644 app/src/main/res/drawable/bg_frame.xml create mode 100644 app/src/main/res/drawable/bg_frame_blue.xml create mode 100644 app/src/main/res/drawable/bg_green_to_white.xml create mode 100644 app/src/main/res/drawable/bg_grey.xml create mode 100644 app/src/main/res/drawable/bg_line_1.xml create mode 100644 app/src/main/res/drawable/bg_line_all.xml create mode 100644 app/src/main/res/drawable/bg_loading_shap.xml create mode 100644 app/src/main/res/drawable/bg_orange_background_shap.xml create mode 100644 app/src/main/res/drawable/bg_red_background_shap.xml create mode 100644 app/src/main/res/drawable/bg_red_to_white.xml create mode 100644 app/src/main/res/drawable/bg_search_shap_radius23.xml create mode 100644 app/src/main/res/drawable/bg_spinner.xml create mode 100644 app/src/main/res/drawable/bg_spinner_transparent.xml create mode 100644 app/src/main/res/drawable/bg_suspension_cause_item.xml create mode 100644 app/src/main/res/drawable/bg_toast_shape.xml create mode 100644 app/src/main/res/drawable/bg_toolbar.xml create mode 100644 app/src/main/res/drawable/bg_transparent.xml create mode 100644 app/src/main/res/drawable/bg_white_background_shap.xml create mode 100644 app/src/main/res/drawable/bg_white_background_shap_radius14.xml create mode 100644 app/src/main/res/drawable/bg_white_background_shap_radius23.xml create mode 100644 app/src/main/res/drawable/bg_white_bottom_gray_line.xml create mode 100644 app/src/main/res/drawable/bg_white_bottom_right_angle_background_shap.xml create mode 100644 app/src/main/res/drawable/bg_white_line.xml create mode 100644 app/src/main/res/drawable/bg_white_right_angle_background_shap.xml create mode 100644 app/src/main/res/drawable/bg_white_round.xml create mode 100644 app/src/main/res/drawable/bg_white_stroke.xml create mode 100644 app/src/main/res/drawable/bg_white_top_right_angle_background_shap.xml create mode 100644 app/src/main/res/drawable/bottom_tab_red_point_bg.xml create mode 100644 app/src/main/res/drawable/check_theme_style.xml create mode 100644 app/src/main/res/drawable/demo_overseas_main_tab_contact_normal_bg.png create mode 100644 app/src/main/res/drawable/demo_overseas_main_tab_contact_selected_bg.png create mode 100644 app/src/main/res/drawable/demo_overseas_main_tab_conversation_normal.png create mode 100644 app/src/main/res/drawable/demo_overseas_main_tab_conversation_selected.png create mode 100644 app/src/main/res/drawable/demo_overseas_main_tab_settings_normal_bg.png create mode 100644 app/src/main/res/drawable/demo_overseas_main_tab_settings_selected_bg.png create mode 100644 app/src/main/res/drawable/dotted_line_shape.xml create mode 100644 app/src/main/res/drawable/ic_health_guidance.png create mode 100644 app/src/main/res/drawable/ic_home_emergency_doctor.png create mode 100644 app/src/main/res/drawable/ic_home_health_checkup.png create mode 100644 app/src/main/res/drawable/ic_home_health_report.png create mode 100644 app/src/main/res/drawable/rectangle_bottom_gray_stroke_white.xml create mode 100644 app/src/main/res/drawable/rectangle_gray_stroke_transparent.xml create mode 100644 app/src/main/res/drawable/rectangle_grey_left_stroke_dark_grey.xml create mode 100644 app/src/main/res/drawable/rectangle_round_bottom_corner10_white.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner10_alpha94_theme.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner10_green_gradient.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner10_grey.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner10_white.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner20_dark_grey.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner20_gray_stroke_transparent.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner20_grey.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner20_theme.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner20_theme_stroke_white.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner3_green_gradient.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner5_dark_grey.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner5_grey.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner5_grey_stroke_white.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner5_theme.xml create mode 100644 app/src/main/res/drawable/rectangle_round_corner5_theme_stroke_white.xml create mode 100644 app/src/main/res/drawable/rectangle_round_top_left_corner8_white.xml create mode 100644 app/src/main/res/drawable/rectangle_theme.xml create mode 100644 app/src/main/res/drawable/rectangle_top_round_corner20_white.xml create mode 100644 app/src/main/res/layout/activity_change_password.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/activity_web.xml create mode 100644 app/src/main/res/layout/bottom_tab_item_layout.xml create mode 100644 app/src/main/res/layout/custom_search_view.xml create mode 100644 app/src/main/res/layout/dialog_privacy_text_view.xml create mode 100644 app/src/main/res/layout/dialog_text_view.xml create mode 100644 app/src/main/res/layout/item_recycle_image.xml create mode 100644 app/src/main/res/layout/lay_cut_off_rule.xml create mode 100644 app/src/main/res/layout/view_tips_loading.xml create mode 100644 app/src/main/res/layout/view_toolbar_lay.xml create mode 100644 app/src/main/res/menu/menu_bottom_nav.xml create mode 100644 app/src/main/res/mipmap-xhdpi/ic_guidance_doctor.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_guidance_my_guidance.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_guidance_second.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_home_head_bg.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_latest_news.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_more_info.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_notice_no_read.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_notice_read.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_number_add_able.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_number_lessen_able.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_password_hind.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_password_show.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_right_more.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_search_icon.webp create mode 100644 app/src/main/res/mipmap-xhdpi/ic_user_head.png create mode 100644 app/src/main/res/mipmap-xhdpi/img_arrow_down.png create mode 100644 app/src/main/res/mipmap-xhdpi/img_arrow_right.png create mode 100644 app/src/main/res/mipmap-xhdpi/img_eye_close.png create mode 100644 app/src/main/res/mipmap-xhdpi/img_eye_open.png create mode 100644 app/src/main/res/mipmap-xhdpi/login_img1.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values/attrs.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/light_colors.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/style.xml create mode 100644 app/src/main/res/values/styles.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 app/src/main/res/xml/network_security_config.xml create mode 100644 build.gradle create mode 100644 config.gradle 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 keystore.properties create mode 100644 lib_base/.gitignore create mode 100644 lib_base/build.gradle create mode 100644 lib_base/proguard-rules.pro create mode 100644 lib_base/src/androidTest/java/com/btpj/lib_base/ExampleInstrumentedTest.kt create mode 100644 lib_base/src/main/AndroidManifest.xml create mode 100644 lib_base/src/main/java/com/btpj/lib_base/BaseApp.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/base/BaseVMBActivity.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/base/BaseVMBFragment.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/base/BaseViewModel.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/base/adapter/BaseCheckRecycleViewAdapter.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/base/adapter/BaseDataBindingAdapter.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/data/bean/ApiResponse.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/data/bean/PageResponse.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/data/local/DataStoreManager.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/data/local/IpManager.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/data/network/OtherRepository.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/event/LoginEvent.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/ext/BaseViewModelExt.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/ext/BindingViewExt.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/ext/StringExt.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/ext/ViewExt.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/http/BaseRepository.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/http/RetrofitManager.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/http/api/OtherAPi.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/http/factory/GsonConverterFactory.java create mode 100644 lib_base/src/main/java/com/btpj/lib_base/http/factory/GsonRequestBodyConverter.java create mode 100644 lib_base/src/main/java/com/btpj/lib_base/http/factory/GsonResponseBodyConverter.java create mode 100644 lib_base/src/main/java/com/btpj/lib_base/http/interceptor/BaseCustomDynamicInterceptor.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/http/interceptor/CacheInterceptor.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/http/interceptor/CustomSignInterceptor.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/http/interceptor/LogInterceptor.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/AppUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/CacheUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/CommonUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/DataStoreUtils.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/DateUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/DeviceInfoUtils.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/GsonUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/KeyboardUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/LogUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/MacUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/NetworkUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/ScreenUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/StatusBarUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/utils/ToastUtil.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/widgets/FlowLayout.kt create mode 100644 lib_base/src/main/java/com/btpj/lib_base/widgets/TitleLayout.kt create mode 100644 lib_base/src/main/res/drawable-xxhdpi/ic_default.jpg create mode 100644 lib_base/src/main/res/drawable-xxhdpi/ic_default_head_img.webp create mode 100644 lib_base/src/main/res/drawable-xxhdpi/icon_back.webp create mode 100644 lib_base/src/main/res/drawable-xxhdpi/image_default_empty.webp create mode 100644 lib_base/src/main/res/drawable/bg_circle_red.xml create mode 100644 lib_base/src/main/res/drawable/ic_back.xml create mode 100644 lib_base/src/main/res/drawable/ic_default_img.xml create mode 100644 lib_base/src/main/res/drawable/ic_list_empty.xml create mode 100644 lib_base/src/main/res/layout/dialog_loading.xml create mode 100644 lib_base/src/main/res/layout/layout_empty.xml create mode 100644 lib_base/src/main/res/layout/layout_title.xml create mode 100644 lib_base/src/main/res/values/attrs.xml create mode 100644 lib_base/src/main/res/values/colors.xml create mode 100644 lib_base/src/main/res/values/dimens.xml create mode 100644 lib_base/src/main/res/values/ids.xml create mode 100644 lib_base/src/main/res/values/strings.xml create mode 100644 lib_base/src/main/res/values/styles.xml create mode 100644 lib_base/src/test/java/com/btpj/lib_base/ExampleUnitTest.kt create mode 100644 ninegridview/.gitignore create mode 100644 ninegridview/build.gradle create mode 100644 ninegridview/proguard-rules.pro create mode 100644 ninegridview/src/main/AndroidManifest.xml create mode 100644 ninegridview/src/main/java/com/lzy/ninegrid/ImageInfo.java create mode 100644 ninegridview/src/main/java/com/lzy/ninegrid/NineGridView.java create mode 100644 ninegridview/src/main/java/com/lzy/ninegrid/NineGridViewAdapter.java create mode 100644 ninegridview/src/main/java/com/lzy/ninegrid/NineGridViewWrapper.java create mode 100644 ninegridview/src/main/java/com/lzy/ninegrid/preview/HackyViewPager.java create mode 100644 ninegridview/src/main/java/com/lzy/ninegrid/preview/ImagePreviewActivity.java create mode 100644 ninegridview/src/main/java/com/lzy/ninegrid/preview/ImagePreviewAdapter.java create mode 100644 ninegridview/src/main/java/com/lzy/ninegrid/preview/NineGridViewClickAdapter.java create mode 100644 ninegridview/src/main/res/drawable/ic_default_color.xml create mode 100644 ninegridview/src/main/res/layout/activity_preview.xml create mode 100644 ninegridview/src/main/res/layout/item_photoview.xml create mode 100644 ninegridview/src/main/res/values/attrs.xml create mode 100644 ninegridview/src/main/res/values/colors.xml create mode 100644 ninegridview/src/main/res/values/strings.xml create mode 100644 rsalibrary/.gitignore create mode 100644 rsalibrary/build.gradle create mode 100644 rsalibrary/proguard-rules.pro create mode 100644 rsalibrary/src/androidTest/java/com/baileren/rsalibrary/ExampleInstrumentedTest.java create mode 100644 rsalibrary/src/main/AndroidManifest.xml create mode 100644 rsalibrary/src/main/java/com/baileren/rsalibrary/AESCipherStrategy.java create mode 100644 rsalibrary/src/main/java/com/baileren/rsalibrary/Base64.java create mode 100644 rsalibrary/src/main/java/com/baileren/rsalibrary/CipherStrategy.java create mode 100644 rsalibrary/src/main/java/com/baileren/rsalibrary/RSACipherStrategy.java create mode 100644 rsalibrary/src/main/java/com/baileren/rsalibrary/RSAUtils.java create mode 100644 rsalibrary/src/main/res/values/strings.xml create mode 100644 rsalibrary/src/test/java/com/baileren/rsalibrary/ExampleUnitTest.java create mode 100644 settings.gradle create mode 100644 system/base_resource/.gitignore create mode 100644 system/base_resource/build.gradle create mode 100644 system/base_resource/consumer-rules.pro create mode 100644 system/base_resource/proguard-rules.pro create mode 100644 system/base_resource/src/main/AndroidManifest.xml create mode 100644 system/base_resource/src/main/res/drawable/dialog_update.xml create mode 100644 system/base_resource/src/main/res/drawable/dialog_waiting.xml create mode 100644 system/base_resource/src/main/res/drawable/shape_bottom_line.xml create mode 100644 system/base_resource/src/main/res/values/colors.xml create mode 100644 system/base_resource/src/main/res/values/dimens.xml create mode 100644 system/base_resource/src/main/res/values/strings.xml create mode 100644 system/base_resource/src/main/res/values/styles.xml create mode 100644 system/base_resource/src/main/res/xml/file_paths.xml create mode 100644 system/base_resource/src/main/res/xml/network_security_config.xml create mode 100644 system/basic/.gitignore create mode 100644 system/basic/build.gradle create mode 100644 system/basic/consumer-rules.pro create mode 100644 system/basic/proguard-rules.pro create mode 100644 system/basic/src/main/AndroidManifest.xml create mode 100644 system/basic/src/main/res/drawable/dialog_update.xml create mode 100644 system/basic/src/main/res/drawable/dialog_waiting.xml create mode 100644 system/basic/src/main/res/drawable/shape_bottom_line.xml create mode 100644 system/basic/src/main/res/values-sw1024dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw1280dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw1365dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw240dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw320dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw384dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw392dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw400dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw410dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw411dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw432dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw480dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw533dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw592dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw600dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw640dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw662dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw720dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw768dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw800dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw811dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw820dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw960dp/dimens.xml create mode 100644 system/basic/src/main/res/values-sw961dp/dimens.xml create mode 100644 system/basic/src/main/res/values/colors.xml create mode 100644 system/basic/src/main/res/values/dimens.xml create mode 100644 system/basic/src/main/res/values/strings.xml create mode 100644 system/basic/src/main/res/values/styles.xml create mode 100644 system/basic/src/main/res/xml/file_paths.xml create mode 100644 system/basic/src/main/res/xml/network_security_config.xml create mode 100644 system/tuicallkit-7.3.4358/build.gradle create mode 100644 system/tuicallkit-7.3.4358/proguard-rules.pro create mode 100644 system/tuicallkit-7.3.4358/src/main/AndroidManifest.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/TUICallKit.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/TUICallKitImpl.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/BaseCallActivity.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/CallingUserModel.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/Constants.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/TUICallingAction.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/TUICallingStatusManager.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/UserLayout.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/UserLayoutEntity.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/config/OfflinePushInfoConfig.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/CallingBellFeature.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/CallingKeepAliveFeature.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/CallingScreenSensorFeature.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/inviteuser/GroupMemberInfo.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/inviteuser/SelectGroupMemberActivity.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/inviteuser/SelectGroupMemberAdapter.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/recents/RecentCallsFragment.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/recents/RecentCallsItemHolder.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/recents/RecentCallsListAdapter.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/recents/RecentCallsViewModel.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/recents/RecordsIconView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/recents/interfaces/ICallRecordItemListener.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/internal/ServiceInitializer.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/internal/TUIAudioMessageRecordService.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/internal/TUICallingService.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/service/TUICallService.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/DeviceUtils.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/DisplayUtils.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/ImageLoader.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/PermissionRequest.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/UserInfoUtils.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/TUICallingViewManager.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/UserLayoutFactory.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/common/RoundCornerImageView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/common/SlideRecyclerView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/common/gridimage/GridImageData.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/common/gridimage/GridImageSynthesizer.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/common/gridimage/ThreadUtils.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/BaseUserView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/TUICallingSingleVideoUserView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/TUICallingUserView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/floatwindow/FloatCallView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/floatwindow/FloatWindowService.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/floatwindow/HomeWatcher.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/BaseFunctionView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/TUICallingAudioFunctionView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/TUICallingSwitchAudioView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/TUICallingVideoFunctionView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/TUICallingVideoInviteFunctionView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/TUICallingWaitFunctionView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/root/BaseCallView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/root/TUICallingGroupView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/root/TUICallingImageView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/root/TUICallingSingleView.java create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_add_user_black.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_add_user_white.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_audio_call.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_avatar.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_camera_disable.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_camera_enable.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_dialing.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_dialing_pressed.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_float.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_handsfree_disable.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_handsfree_enable.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_hangup.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_hangup_pressed.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_mic_mute.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_mic_unmute.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_move_back_black.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_move_back_white.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_switch_camera.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_switch_to_audio_call.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_ic_video_call.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicalling_loading.gif create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_chat_title_bar_minimalist_audio_call_icon.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_chat_title_bar_minimalist_video_call_icon.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_check_box_group_selected.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_check_box_group_unselected.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_checkbox_selected.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_group_select_disable.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_ic_audio_call.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_ic_back.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_ic_delete.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_ic_edit.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_ic_more_info.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_ic_start_call.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_profile_minimalist_audio_icon.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_profile_minimalist_video_icon.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable-xxhdpi/tuicallkit_record_ic_video_call.png create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicalling_bg_camera.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicalling_bg_dialing.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicalling_bg_floatwindow.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicalling_bg_floatwindow_left.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicalling_bg_floatwindow_right.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicalling_bg_handsfree.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicalling_bg_hangup.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicalling_bg_mute_mic.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicallkit_dialog_cancel.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicallkit_dialog_sure.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicallkit_group_checkbox_selector.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicallkit_tab_item_selector.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/drawable/tuicallkit_tab_selector.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_background_group_view.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_background_image_view.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_background_single_view.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_base_activity.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_floatwindow_layout.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_funcation_view_audio.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_funcation_view_audio_waiting.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_funcation_view_video.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_funcation_view_video_inviting.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_group_user_layout.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_single_video_user_view.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_switch_audio_view.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicalling_user_view.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicallkit_activity_group_user.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicallkit_group_user_list_item.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicallkit_item_head_view.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicallkit_layout_call_list_item.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicallkit_layout_call_list_item_sub.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicallkit_record_dialog.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/layout/tuicallkit_record_fragment_main.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/raw/phone_dialing.mp3 create mode 100644 system/tuicallkit-7.3.4358/src/main/res/raw/phone_hangup.mp3 create mode 100644 system/tuicallkit-7.3.4358/src/main/res/raw/phone_ringing.mp3 create mode 100644 system/tuicallkit-7.3.4358/src/main/res/values-en/strings.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/values-zh/strings.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/values/attrs.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/values/colors.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/values/dimens.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/values/strings.xml create mode 100644 system/tuicallkit-7.3.4358/src/main/res/values/styles.xml create mode 100644 system/tuicallkit/.gitignore create mode 100644 system/tuicallkit/build.gradle create mode 100644 system/tuicallkit/proguard-rules.pro create mode 100644 system/tuicallkit/src/main/AndroidManifest.xml create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/TUICallKit.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/TUICallKitImpl.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/BaseCallActivity.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/CallingUserModel.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/Constants.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/TUICallingAction.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/TUICallingStatusManager.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/UserLayout.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/base/UserLayoutEntity.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/config/OfflinePushInfoConfig.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/event/CallBackEvent.kt create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/CallingBellFeature.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/CallingKeepAliveFeature.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/extensions/CallingScreenSensorFeature.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/internal/ServiceInitializer.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/internal/TUIAudioMessageRecordService.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/internal/TUICallingService.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/service/TUICallService.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/DeviceUtils.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/DisplayUtils.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/ImageLoader.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/PermissionRequest.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/utils/UserInfoUtils.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/TUICallingViewManager.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/UserLayoutFactory.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/BaseUserView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/TUICallingSingleVideoUserView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/component/TUICallingUserView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/floatwindow/FloatCallView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/floatwindow/FloatWindowService.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/floatwindow/HomeWatcher.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/BaseFunctionView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/TUICallingAudioFunctionView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/TUICallingSwitchAudioView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/TUICallingVideoFunctionView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/TUICallingVideoInviteFunctionView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/function/TUICallingWaitFunctionView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/root/BaseCallView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/root/TUICallingGroupView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/root/TUICallingImageView.java create mode 100644 system/tuicallkit/src/main/java/com/tencent/qcloud/tuikit/tuicallkit/view/root/TUICallingSingleView.java create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_add_user_black.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_add_user_white.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_audio_call.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_avatar.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_camera_disable.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_camera_enable.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_dialing.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_dialing_pressed.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_float.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_handsfree_disable.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_handsfree_enable.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_hangup.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_hangup_pressed.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_mic_mute.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_mic_unmute.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_move_back_black.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_move_back_white.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_switch_camera.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_switch_to_audio_call.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_ic_video_call.png create mode 100644 system/tuicallkit/src/main/res/drawable-xxhdpi/tuicalling_loading.gif create mode 100644 system/tuicallkit/src/main/res/drawable/tuicalling_bg_camera.xml create mode 100644 system/tuicallkit/src/main/res/drawable/tuicalling_bg_dialing.xml create mode 100644 system/tuicallkit/src/main/res/drawable/tuicalling_bg_floatwindow.xml create mode 100644 system/tuicallkit/src/main/res/drawable/tuicalling_bg_floatwindow_left.xml create mode 100644 system/tuicallkit/src/main/res/drawable/tuicalling_bg_floatwindow_right.xml create mode 100644 system/tuicallkit/src/main/res/drawable/tuicalling_bg_handsfree.xml create mode 100644 system/tuicallkit/src/main/res/drawable/tuicalling_bg_hangup.xml create mode 100644 system/tuicallkit/src/main/res/drawable/tuicalling_bg_mute_mic.xml create mode 100644 system/tuicallkit/src/main/res/layout/chat_input_more_action.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_background_group_view.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_background_image_view.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_background_single_view.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_base_activity.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_floatwindow_layout.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_funcation_view_audio.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_funcation_view_audio_waiting.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_funcation_view_video.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_funcation_view_video_inviting.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_group_user_layout.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_single_video_user_view.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_switch_audio_view.xml create mode 100644 system/tuicallkit/src/main/res/layout/tuicalling_user_view.xml create mode 100644 system/tuicallkit/src/main/res/raw/phone_dialing.mp3 create mode 100644 system/tuicallkit/src/main/res/raw/phone_hangup.mp3 create mode 100644 system/tuicallkit/src/main/res/raw/phone_ringing.mp3 create mode 100644 system/tuicallkit/src/main/res/values-en/strings.xml create mode 100644 system/tuicallkit/src/main/res/values-zh/strings.xml create mode 100644 system/tuicallkit/src/main/res/values/attrs.xml create mode 100644 system/tuicallkit/src/main/res/values/colors.xml create mode 100644 system/tuicallkit/src/main/res/values/dimens.xml create mode 100644 system/tuicallkit/src/main/res/values/strings.xml create mode 100644 system/tuicallkit/src/main/res/values/styles.xml create mode 100644 system/tuichat/.gitignore create mode 100644 system/tuichat/build.gradle create mode 100644 system/tuichat/src/main/AndroidManifest.xml create mode 100644 system/tuichat/src/main/assets/emoji/[NO]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[OK]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[下雨]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[么么哒]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[乒乓]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[便便]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[信封]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[偷笑]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[傲慢]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[再见]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[冷汗]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[凋谢]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[刀]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[删除]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[勾引]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[发呆]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[发抖]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[可怜]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[可爱]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[右哼哼]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[右太极]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[右车头]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[吐]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[吓]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[咒骂]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[咖啡]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[啤酒]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[嘘]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[回头]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[困]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[坏笑]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[多云]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[大兵]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[大哭]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[太阳]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[奋斗]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[奶瓶]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[委屈]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[害羞]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[尴尬]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[左哼哼]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[左太极]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[左车头]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[差劲]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[弱]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[强]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[彩带]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[彩球]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[得意]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[微笑]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[心碎了]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[快哭了]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[怄火]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[怒]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[惊恐]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[惊讶]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[憨笑]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[手枪]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[打哈欠]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[抓狂]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[折磨]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[抠鼻]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[抱抱]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[抱拳]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[拳头]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[挥手]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[握手]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[撇嘴]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[擦汗]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[敲打]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[晕]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[月亮]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[棒棒糖]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[汽车]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[沙发]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[流汗]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[流泪]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[激动]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[灯泡]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[炸弹]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[熊猫]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[爆筋]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[爱你]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[爱心]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[爱情]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[猪头]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[猫咪]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[献吻]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[玫瑰]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[瓢虫]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[疑问]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[白眼]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[皮球]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[睡觉]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[磕头]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[示爱]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[礼品袋]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[礼物]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[篮球]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[米饭]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[糗大了]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[红双喜]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[红灯笼]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[纸巾]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[胜利]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[色]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[药]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[菜刀]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[蛋糕]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[蜡烛]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[街舞]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[衰]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[西瓜]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[调皮]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[象棋]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[跳绳]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[跳跳]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[车厢]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[转圈]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[鄙视]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[酷]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[钞票]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[钻戒]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[闪电]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[闭嘴]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[闹钟]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[阴险]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[难过]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[雨伞]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[青蛙]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[面条]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[鞭炮]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[风车]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[飞吻]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[飞机]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[饥饿]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[香蕉]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[骷髅]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[麦克风]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[麻将]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[鼓掌]@2x.png create mode 100644 system/tuichat/src/main/assets/emoji/[龇牙]@2x.png create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/ITUIChatService.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/TUIChatConstants.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/TUIChatService.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/CallModel.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/ChatInfo.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/CustomHelloMessage.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/DraftInfo.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/GroupApplyInfo.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/GroupInfo.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/GroupMemberInfo.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/InputMoreActionUnit.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/MessageCustom.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/MessageFeature.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/MessageReactBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/MessageReceiptInfo.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/MessageRepliesBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/MessageTyping.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/OfflineMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/OfflineMessageContainerBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/OfflinePushInfo.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/ReactUserBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/ReplyPreviewBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/UserStatusBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/WorkBean.kt create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/ArchivesMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/BusinessCardMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/CallingMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/CustomEvaluationMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/CustomLinkMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/CustomOrderMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/FaceMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/FileMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/GroupMessageReadMembersInfo.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/ImageMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/LocationMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/MedicalExaminationReportMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/MergeMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/MessageTypingBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/QuoteMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/ReplyMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/SoundMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/SystemMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/TUIMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/TextAtMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/TextMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/TipsMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/VideoMessageBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/CustomEvaluationMessageReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/CustomLinkReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/CustomOrderMessageReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/FaceReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/FileReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/ImageReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/LocationReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/MergeReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/ReplyReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/SoundReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/TUIReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/TextReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/bean/message/reply/VideoReplyQuoteBean.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/ClassicUIService.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/BeginnerGuidePage.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/EmojiIndicatorView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/MessageProperties.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/CameraActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/listener/CaptureListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/listener/ClickListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/listener/ErrorListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/listener/JCameraListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/listener/ReturnListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/listener/TypeListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/state/BorrowPictureState.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/state/BorrowVideoState.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/state/CameraMachine.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/state/PreviewState.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/state/State.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/view/CameraInterface.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/view/CameraView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/view/CaptureButton.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/view/CaptureLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/view/FoucsView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/view/JCameraView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/view/ReturnButton.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/camera/view/TypeButton.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/noticelayout/INoticeLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/noticelayout/NoticeLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/noticelayout/NoticeLayoutConfig.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/listener/OnGestureListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/listener/OnMatrixChangedListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/listener/OnOutsidePhotoTapListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/listener/OnPhotoTapListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/listener/OnScaleChangedListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/listener/OnSingleFlingListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/listener/OnViewDragListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/listener/OnViewTapListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/view/Compat.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/view/CustomGestureDetector.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/view/PhotoView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/view/PhotoViewAttacher.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/photoview/view/PhotoViewUtil.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/popmenu/ChatPopMenu.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/video/UIKitVideoView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/video/listener/ResultListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/video/proxy/IPlayer.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/video/proxy/MediaPlayerProxy.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/video/proxy/SystemMediaPlayerWrapper.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/component/video/util/AudioUtil.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/interfaces/IChatLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/interfaces/ICommonMessageAdapter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/interfaces/IMessageLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/interfaces/IMessageProperties.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/interfaces/OnItemClickListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/page/MessageReceiptDetailActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/page/MessageReplyDetailActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/page/TUIBaseChatActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/page/TUIBaseChatFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/page/TUIC2CChatActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/page/TUIC2CChatFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/page/TUIForwardChatActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/page/TUIGroupChatActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/page/TUIGroupChatFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/setting/ChatLayoutSetting.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/setting/InputActionSetting.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/ArchivesImageView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/ChatView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/BaseInputFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/InputView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/ReplyPreviewBar.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/TIMMentionEditText.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/face/FaceFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/face/FaceGroupIcon.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/inputmore/ActionsGridViewAdapter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/inputmore/ActionsPagerAdapter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/inputmore/InputMoreFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/inputmore/InputMoreLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/ArchivesImageAdapter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/MaxWidthFrameLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/MaxWidthLinearLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/MessageAdapter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/MessageRecyclerView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/SelectTextHelper.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/ChatFlowReactView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/FaceReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/FileReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/ImageReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/LocationReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/MergeReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/ReplyDetailsView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/SoundReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/TUIReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/TextReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/reply/VideoReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/ArchivesMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/BusinessCardMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/CallingMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/CustomEvaluationMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/CustomLinkMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/CustomOrderMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/FaceMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/FileMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/ImageMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/LocationMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/MedicalExaminationReportHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/MergeMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/MessageBaseHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/MessageContentHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/MessageHeaderHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/MessageViewHolderFactory.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/QuoteMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/ReplyMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/SoundMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/SystemMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/TextMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/TipsMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/VideoMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/AudioPlayer.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/AudioRecorder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/face/ChatFace.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/face/CustomFace.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/face/Emoji.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/face/FaceGroup.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/face/FaceManager.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/face/RecentEmojiManager.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/imagevideoscan/ImageVideoScanActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/imagevideoscan/ImageVideoScanAdapter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/imagevideoscan/ImageVideoScanPresenter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/imagevideoscan/ImageVideoScanProvider.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/imagevideoscan/OnViewPagerListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/imagevideoscan/ViewPagerLayoutManager.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/component/progress/ProgressPresenter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/config/GeneralConfig.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/config/TUIChatConfigs.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/interfaces/AudioRecordEventListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/interfaces/C2CChatEventListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/interfaces/GroupChatEventListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/interfaces/IBaseMessageSender.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/interfaces/IMInputViewActionListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/interfaces/IMessageAdapter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/interfaces/IMessageRecyclerView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/interfaces/IReplyMessageHandler.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/interfaces/NetworkConnectionListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/interfaces/TotalUnreadCountListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/MinimalistUIService.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/BeginnerGuidePage.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/EmojiIndicatorView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/MessageProperties.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/CameraActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/listener/CaptureListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/listener/ClickListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/listener/ErrorListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/listener/JCameraListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/listener/ReturnListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/listener/TypeListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/state/BorrowPictureState.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/state/BorrowVideoState.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/state/CameraMachine.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/state/PreviewState.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/state/State.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/view/CameraInterface.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/view/CameraView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/view/CaptureButton.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/view/CaptureLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/view/FoucsView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/view/JCameraView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/view/ReturnButton.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/camera/view/TypeButton.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/dialog/ChatBottomSelectSheet.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/noticelayout/INoticeLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/noticelayout/NoticeLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/noticelayout/NoticeLayoutConfig.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/listener/OnGestureListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/listener/OnMatrixChangedListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/listener/OnOutsidePhotoTapListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/listener/OnPhotoTapListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/listener/OnScaleChangedListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/listener/OnSingleFlingListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/listener/OnViewDragListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/listener/OnViewTapListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/view/Compat.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/view/CustomGestureDetector.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/view/PhotoView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/view/PhotoViewAttacher.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/photoview/view/PhotoViewUtil.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/video/UIKitVideoView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/video/listener/ResultListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/video/proxy/IPlayer.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/video/proxy/MediaPlayerProxy.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/video/proxy/SystemMediaPlayerWrapper.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/component/video/util/AudioUtil.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/interfaces/IChatLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/interfaces/ICommonMessageAdapter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/interfaces/IMessageLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/interfaces/IMessageProperties.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/interfaces/OnItemClickListener.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/MessageDetailMinimalistActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/TUIBaseChatMinimalistActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/TUIBaseChatMinimalistFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/TUIC2CChatMinimalistActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/TUIC2CChatMinimalistFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/TUIForwardChatMinimalistActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/TUIGroupChatMinimalistActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/TUIGroupChatMinimalistFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/setting/ChatLayoutSetting.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/ChatView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/input/BaseInputFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/input/InputView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/input/TIMMentionEditText.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/input/face/FaceFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/input/inputmore/InputMoreDialogFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/input/waveview/VoiceWaveView.kt create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/input/waveview/WaveMode.kt create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/ChatReactDialogFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/ChatReplyDialogFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/MaxWidthFrameLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/MaxWidthLinearLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/MessageAdapter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/MessageRecyclerView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/MessageStatusTimeView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/MinimalistMessageLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/SelectTextHelper.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/TimeInLineTextLayout.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/ChatReactView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/FaceReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/FileReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/ImageReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/LocationReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/MergeReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/ReplyDetailsView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/ReplyPreviewView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/SoundReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/TUIReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/TextReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/reply/VideoReplyQuoteView.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/CallingMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/CustomEvaluationMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/CustomLinkMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/CustomOrderMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/FaceMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/FileMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/ImageMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/LocationMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/MergeMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/MessageBaseHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/MessageContentHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/MessageHeaderHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/MessageViewHolderFactory.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/QuoteMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/ReplyMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/SoundMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/TextMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/TipsMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/VideoMessageHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/messagepopmenu/ChatPopActivity.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/messagepopmenu/ChatPopDataHolder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/messagepopmenu/ChatPopMenuEmojiDialogFragment.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/model/AIDenoiseSignatureManager.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/model/ChatProvider.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/presenter/C2CChatPresenter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/presenter/ChatModifyMessageHelper.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/presenter/ChatPresenter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/presenter/ForwardPresenter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/presenter/GroupChatPresenter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/presenter/MessageReceiptPresenter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/presenter/ReactPresenter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/presenter/ReplyPresenter.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/ActionIdConstant.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/AngleUtil.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/BlurUtils.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/CameraParamUtil.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/ChatMessageBuilder.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/ChatMessageParser.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/CheckPermission.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/DataStoreUtil.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/DeviceUtil.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/FileUtil.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/OfflinePushInfoUtils.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/PermissionHelper.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/StringUtils.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/TUIChatLog.java create mode 100644 system/tuichat/src/main/java/com/tencent/qcloud/tuikit/tuichat/util/TUIChatUtils.java create mode 100644 system/tuichat/src/main/res-light/drawable-xxhdpi/chat_ic_arrow_down_light.png create mode 100644 system/tuichat/src/main/res-light/drawable-xxhdpi/chat_ic_arrow_up_light.png create mode 100644 system/tuichat/src/main/res-light/drawable-xxhdpi/chat_reply_icon_light.png create mode 100644 system/tuichat/src/main/res-light/drawable-xxhdpi/chat_title_bar_more_menu_light.png create mode 100644 system/tuichat/src/main/res-light/drawable/chat_bubble_other_bg_light.xml create mode 100644 system/tuichat/src/main/res-light/drawable/chat_bubble_self_bg_light.xml create mode 100644 system/tuichat/src/main/res-light/values/light_colors.xml create mode 100644 system/tuichat/src/main/res-light/values/light_styles.xml create mode 100644 system/tuichat/src/main/res-lively/drawable-xxhdpi/chat_ic_arrow_down_lively.png create mode 100644 system/tuichat/src/main/res-lively/drawable-xxhdpi/chat_ic_arrow_up_lively.png create mode 100644 system/tuichat/src/main/res-lively/drawable-xxhdpi/chat_reply_icon_lively.png create mode 100644 system/tuichat/src/main/res-lively/drawable-xxhdpi/chat_title_bar_more_menu_lively.png create mode 100644 system/tuichat/src/main/res-lively/drawable/chat_bubble_other_bg_lively.xml create mode 100644 system/tuichat/src/main/res-lively/drawable/chat_bubble_self_bg_lively.xml create mode 100644 system/tuichat/src/main/res-lively/values/lively_colors.xml create mode 100644 system/tuichat/src/main/res-lively/values/lively_styles.xml create mode 100644 system/tuichat/src/main/res-minimalistui/anim/chat_bottom_select_sheet_enter.xml create mode 100644 system/tuichat/src/main/res-minimalistui/anim/chat_bottom_select_sheet_exit.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_audio_play_btn_ic.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_audio_stop_btn_ic.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_bottom_sheet_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_bottom_sheet_dialog_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_bottom_sheet_hide.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_face_group_list_item_select_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_file_type_icon_image.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_file_type_icon_none.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_file_type_icon_pdf.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_file_type_icon_ppt.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_file_type_icon_text.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_file_type_icon_word.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_file_type_icon_xls.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_file_type_icon_zip.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_gray_round_rect_bg.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_message_popup_fill_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_message_popup_fill_border_right.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_message_popup_stroke_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_message_popup_stroke_border_left.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_message_popup_stroke_border_right.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading00.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading01.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading02.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading03.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading04.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading05.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading06.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading07.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading08.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading09.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading10.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading11.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading12.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading13.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading14.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading15.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading16.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading17.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading18.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading19.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading20.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading21.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading22.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading23.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading24.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading25.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading26.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading27.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading28.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading29.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading30.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading31.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading32.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading33.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading34.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading35.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading36.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading37.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading38.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading39.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading40.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading41.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading42.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading43.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_anim_loading44.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_arrow_left.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_delete_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_file_download_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_forward_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_input_add_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_input_camera_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_input_edittext_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_input_face_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_input_voice_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_jump_at_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_jump_down_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_menu_emoji_list_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_menu_popup_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_merge_message_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_message_deatail_read_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_message_status_send_all_read.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_message_status_send_failed.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_message_status_send_no_read.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_message_status_send_part_read.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_message_status_sending.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_more_action_camera_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_more_action_custom_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_more_action_file_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_more_action_picture_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_more_action_record_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_play_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_pop_menu_copy.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_pop_menu_delete.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_pop_menu_forward.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_pop_menu_info.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_pop_menu_more.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_pop_menu_multi_select.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_pop_menu_quote.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_pop_menu_reply.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_pop_menu_revoke.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_pop_menu_translation.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_status_loading_anim.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_video_call_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_minimalist_voice_call_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_pop_menu_add_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_reply_more_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/chat_voice_sound_waves.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/gray_round_rect_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/minimalist_corner_bg_blue.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/minimalist_corner_bg_red.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/minimalist_delete_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/minimalist_delete_start_icon.png create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/minimalist_selector_face_text.xml create mode 100644 system/tuichat/src/main/res-minimalistui/drawable/white_round_rect_border.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_bottom_select_sheet.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_bottom_sheet_item.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_face_view_pager_item.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_forward_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_fragment.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_group_receipt_member_item.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_header_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_input_camera_view.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_input_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_message_adapter_content_calling.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_message_adapter_content_text.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_message_detail_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_pop_menu_action_item_layou.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_pop_menu_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_react_item_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_react_preview_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_reply_details_item_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_reply_preview_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_text_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_minimalist_text_status_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_pop_menu_emoji_item_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_popmenu_emoji_dialog_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_react_dialog_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/chat_reply_dialog_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_activity_camera.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_face_group_icon.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_face_message_content_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_forward_msg_holder.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_fragment_face.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_input_more.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_input_more_item.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_message_adapter_content_audio.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_message_adapter_content_file.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_message_adapter_content_image.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_message_adapter_content_reply.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_message_adapter_item_content.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_message_react_detail.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_message_reply_detail.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_quote_message_content_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_react_category_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_react_details_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/layout/minimalist_react_view_pager_layout.xml create mode 100644 system/tuichat/src/main/res-minimalistui/values-zh-rCN/mininmalist_strings.xml create mode 100644 system/tuichat/src/main/res-minimalistui/values/attrs.xml create mode 100644 system/tuichat/src/main/res-minimalistui/values/colors.xml create mode 100644 system/tuichat/src/main/res-minimalistui/values/dimens.xml create mode 100644 system/tuichat/src/main/res-minimalistui/values/minimalist_strings.xml create mode 100644 system/tuichat/src/main/res-minimalistui/values/minimalist_styles.xml create mode 100644 system/tuichat/src/main/res-serious/drawable-xxhdpi/chat_ic_arrow_down_serious.png create mode 100644 system/tuichat/src/main/res-serious/drawable-xxhdpi/chat_ic_arrow_up_serious.png create mode 100644 system/tuichat/src/main/res-serious/drawable-xxhdpi/chat_reply_icon_serious.png create mode 100644 system/tuichat/src/main/res-serious/drawable-xxhdpi/chat_title_bar_more_menu_serious.png create mode 100644 system/tuichat/src/main/res-serious/drawable/chat_bubble_other_bg_serious.xml create mode 100644 system/tuichat/src/main/res-serious/drawable/chat_bubble_self_bg_serious.xml create mode 100644 system/tuichat/src/main/res-serious/values/serious_colors.xml create mode 100644 system/tuichat/src/main/res-serious/values/serious_styles.xml create mode 100644 system/tuichat/src/main/res/anim/beginner_guide_in_anim.xml create mode 100644 system/tuichat/src/main/res/anim/beginner_guide_out_anim.xml create mode 100644 system/tuichat/src/main/res/anim/chat_pop_menu_in_anim.xml create mode 100644 system/tuichat/src/main/res/anim/chat_pop_menu_out_anim.xml create mode 100644 system/tuichat/src/main/res/anim/translate_dialog_in.xml create mode 100644 system/tuichat/src/main/res/anim/translate_dialog_out.xml create mode 100644 system/tuichat/src/main/res/drawable-hdpi/alert_bg.9.png create mode 100644 system/tuichat/src/main/res/drawable-hdpi/indicator_point_nomal.png create mode 100644 system/tuichat/src/main/res/drawable-hdpi/indicator_point_select.png create mode 100644 system/tuichat/src/main/res/drawable-hdpi/message_send_fail.png create mode 100644 system/tuichat/src/main/res/drawable-hdpi/trans_bg.png create mode 100644 system/tuichat/src/main/res/drawable-hdpi/voice_msg_playing_1.png create mode 100644 system/tuichat/src/main/res/drawable-hdpi/voice_msg_playing_2.png create mode 100644 system/tuichat/src/main/res/drawable-hdpi/voice_msg_playing_3.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_back.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_camera_switchcamera.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_input_face.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_input_keyboard.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_input_more.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_input_voice.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_menu_face_hide_more.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_menu_face_show_more.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_other_bg.9.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_permission_icon_camera.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_permission_icon_file.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_permission_icon_mic.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_quote_guide.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_reply_guide.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_right_live_group_bg.9.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/chat_unselected_icon.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/check_box_selected.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/custom.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/emoji_default.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/face_delete.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/file_icon.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_chat_play_icon.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_default_head_img.webp create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_default_user_head_icon.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_more_archives.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_more_camera.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_more_end_consultation.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_more_file.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_more_location.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_more_medical_examination_report.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_more_picture.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_more_video.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_my_location.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_personal_member.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_translate_support.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_1.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_2.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_3.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_4.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_5.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_6.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_7.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_8.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_dialog_bg.9.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_dialog_cancel.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/ic_volume_dialog_length_short.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/live_ic_group_live.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/multi_select_delete.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/multi_select_forward_merge.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/multi_select_forward_one.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/pop_menu_copy.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/pop_menu_delete.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/pop_menu_forward.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/pop_menu_hide.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/pop_menu_multi_select.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/pop_menu_quote.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/pop_menu_reply.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/pop_menu_revoke.png create mode 100644 system/tuichat/src/main/res/drawable-xxhdpi/reply_close_btn.png create mode 100644 system/tuichat/src/main/res/drawable-xxxhdpi/indicator_point_nomal.png create mode 100644 system/tuichat/src/main/res/drawable-xxxhdpi/indicator_point_select.png create mode 100644 system/tuichat/src/main/res/drawable/action_audio_selector.xml create mode 100644 system/tuichat/src/main/res/drawable/action_face_selector.xml create mode 100644 system/tuichat/src/main/res/drawable/action_more_selector.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_bubble_button_bg_serious.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_bubble_custom_message_bg_serious.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_bubble_custom_other_bg_serious.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_bubble_custom_self_bg_serious.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_bubble_other_cavity_bg.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_bubble_self_cavity_bg.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_checkbox_selector.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_divide_line.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_pop_item_bg.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_pop_menu_divider.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_react_bg.xml create mode 100644 system/tuichat/src/main/res/drawable/chat_time_border.xml create mode 100644 system/tuichat/src/main/res/drawable/group_msg_receipt_line_bg.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_audio_call.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_back.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_camera.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_close_button.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_download_button.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_other_video_call.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_pause_center.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_pause_icon.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_photo.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_play_icon.xml create mode 100644 system/tuichat/src/main/res/drawable/ic_self_video_call.xml create mode 100644 system/tuichat/src/main/res/drawable/layer_live_rating_bar.xml create mode 100644 system/tuichat/src/main/res/drawable/layer_progress.xml create mode 100644 system/tuichat/src/main/res/drawable/message_send_border.xml create mode 100644 system/tuichat/src/main/res/drawable/minimalist_translation_area_bg.xml create mode 100644 system/tuichat/src/main/res/drawable/msg_editor_border.xml create mode 100644 system/tuichat/src/main/res/drawable/my_cursor.xml create mode 100644 system/tuichat/src/main/res/drawable/play_voice_message.xml create mode 100644 system/tuichat/src/main/res/drawable/pop_menu_translate.png create mode 100644 system/tuichat/src/main/res/drawable/quote_message_area_bg.xml create mode 100644 system/tuichat/src/main/res/drawable/ratingbar_opreview.png create mode 100644 system/tuichat/src/main/res/drawable/ratingbar_opreview_grey.png create mode 100644 system/tuichat/src/main/res/drawable/recording_volume.xml create mode 100644 system/tuichat/src/main/res/drawable/selector_face_text.xml create mode 100644 system/tuichat/src/main/res/drawable/shape_circle.xml create mode 100644 system/tuichat/src/main/res/drawable/shape_dialog.xml create mode 100644 system/tuichat/src/main/res/drawable/translation_area_bg.xml create mode 100644 system/tuichat/src/main/res/drawable/translation_loading.png create mode 100644 system/tuichat/src/main/res/drawable/view_original_image_border.xml create mode 100644 system/tuichat/src/main/res/drawable/voice_btn_selector.xml create mode 100644 system/tuichat/src/main/res/layout/activity_camera.xml create mode 100644 system/tuichat/src/main/res/layout/activity_message_reply_detail.xml create mode 100644 system/tuichat/src/main/res/layout/chat_activity.xml create mode 100644 system/tuichat/src/main/res/layout/chat_flow_react_item_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_fragment.xml create mode 100644 system/tuichat/src/main/res/layout/chat_input_camera_view.xml create mode 100644 system/tuichat/src/main/res/layout/chat_input_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_input_layout_actoin.xml create mode 100644 system/tuichat/src/main/res/layout/chat_inputmore_fragment.xml create mode 100644 system/tuichat/src/main/res/layout/chat_inputmore_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_menu_face_item_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_menu_recent_face_item_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_pop_menu_item_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_pop_menu_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_profile_icon_view.xml create mode 100644 system/tuichat/src/main/res/layout/chat_reply_details_item_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_reply_quote_face_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_reply_quote_file_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_reply_quote_image_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_reply_quote_merge_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_reply_quote_sound_layout.xml create mode 100644 system/tuichat/src/main/res/layout/chat_reply_quote_text_layout.xml create mode 100644 system/tuichat/src/main/res/layout/custom_order_message_layout.xml create mode 100644 system/tuichat/src/main/res/layout/face_group_icon.xml create mode 100644 system/tuichat/src/main/res/layout/forward_chat_layout.xml create mode 100644 system/tuichat/src/main/res/layout/forward_dialog_layout.xml create mode 100644 system/tuichat/src/main/res/layout/forward_msg_holder.xml create mode 100644 system/tuichat/src/main/res/layout/fragment_face.xml create mode 100644 system/tuichat/src/main/res/layout/group_receipt_member_item.xml create mode 100644 system/tuichat/src/main/res/layout/image_video_scan_item.xml create mode 100644 system/tuichat/src/main/res/layout/image_video_scan_layout.xml create mode 100644 system/tuichat/src/main/res/layout/item_face.xml create mode 100644 system/tuichat/src/main/res/layout/layout_beginner_guide.xml create mode 100644 system/tuichat/src/main/res/layout/layout_beginner_guide_item.xml create mode 100644 system/tuichat/src/main/res/layout/layout_face_grid.xml create mode 100644 system/tuichat/src/main/res/layout/loading_progress_bar.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_archives.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_audio.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_business_card.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_calling.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_evaluation.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_file.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_image.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_location.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_medical_examination.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_reply.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_system.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_text.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_tips.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_content_trtc.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_item_content.xml create mode 100644 system/tuichat/src/main/res/layout/message_adapter_item_empty.xml create mode 100644 system/tuichat/src/main/res/layout/message_content_layout.xml create mode 100644 system/tuichat/src/main/res/layout/msg_receipt_detail_layout.xml create mode 100644 system/tuichat/src/main/res/layout/notice_layout.xml create mode 100644 system/tuichat/src/main/res/layout/quote_message_content_layout.xml create mode 100644 system/tuichat/src/main/res/layout/reply_preview_layout.xml create mode 100644 system/tuichat/src/main/res/layout/test_chat_input_custom_fragment.xml create mode 100644 system/tuichat/src/main/res/layout/test_custom_message_layout1.xml create mode 100644 system/tuichat/src/main/res/layout/translation_contant_layout.xml create mode 100644 system/tuichat/src/main/res/values-zh-rCN/strings-emoji.xml create mode 100644 system/tuichat/src/main/res/values-zh-rCN/strings.xml create mode 100644 system/tuichat/src/main/res/values/arrays.xml create mode 100644 system/tuichat/src/main/res/values/attrs.xml create mode 100644 system/tuichat/src/main/res/values/colors.xml create mode 100644 system/tuichat/src/main/res/values/dimens.xml create mode 100644 system/tuichat/src/main/res/values/strings-emoji.xml create mode 100644 system/tuichat/src/main/res/values/strings.xml create mode 100644 system/tuichat/src/main/res/values/styles.xml create mode 100644 system/tuichat/src/main/res/values/tui_theme_attrs.xml create mode 100644 system/tuicontact/.gitignore create mode 100644 system/tuicontact/build.gradle create mode 100644 system/tuicontact/libs/tinypinyin-2.0.1.jar create mode 100644 system/tuicontact/src/main/AndroidManifest.xml create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/ITUIContactService.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/TUIContactConstants.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/TUIContactService.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/bean/ChatInfo.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/bean/ContactGroupApplyInfo.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/bean/ContactItemBean.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/bean/ConversationBean.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/bean/ConversationInfo.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/bean/FriendApplicationBean.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/bean/GroupInfo.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/bean/GroupMemberInfo.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/bean/MessageCustom.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/interfaces/IContactLayout.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/AddMoreActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/BlackListActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/CreateGroupActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/ForwardSelectGroupActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/FriendProfileActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/GroupListActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/GroupTypeSelectActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/NewFriendActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/StartC2CChatActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/StartGroupChatActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/StartGroupMemberSelectActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/pages/TUIContactFragment.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/util/ContactStartChatUtils.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/widget/ContactAdapter.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/widget/ContactLayout.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/widget/ContactListView.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/widget/ForwardContactSelectorAdapter.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/widget/FriendProfileLayout.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/classicui/widget/NewFriendListAdapter.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/component/indexlib/IndexBar/bean/BaseIndexBean.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/component/indexlib/IndexBar/bean/BaseIndexPinyinBean.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/component/indexlib/IndexBar/helper/IIndexBarDataHelper.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/component/indexlib/IndexBar/helper/IndexBarDataHelperImpl.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/component/indexlib/IndexBar/widget/IndexBar.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/component/indexlib/suspension/ISuspensionInterface.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/component/indexlib/suspension/SuspensionDecoration.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/config/TUIContactConfig.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/interfaces/ContactEventListener.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/interfaces/IAddMoreActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/interfaces/IContactListView.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/interfaces/IFriendProfileLayout.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/interfaces/INewFriendActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/interfaces/IContactLayout.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/AddMoreMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/BlackListMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/CreateGroupMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/ForwardSelectGroupMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/FriendProfileMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/GroupListMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/GroupTypeSelectMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/NewFriendMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/StartC2CChatMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/StartGroupChatMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/StartGroupMemberSelectMinimalistActivity.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/pages/TUIContactMinimalistFragment.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/util/ContactStartChatUtils.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/widget/ContactAdapter.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/widget/ContactLayout.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/widget/ContactListView.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/widget/ForwardContactSelectorAdapter.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/widget/FriendProfileLayout.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/widget/Menu.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/minimalistui/widget/NewFriendListAdapter.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/model/ContactProvider.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/presenter/AddMorePresenter.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/presenter/ContactPresenter.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/presenter/FriendProfilePresenter.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/presenter/GetUserStatusHelper.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/presenter/NewFriendPresenter.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/util/ContactUtils.java create mode 100644 system/tuicontact/src/main/java/com/tencent/qcloud/tuikit/tuicontact/util/TUIContactLog.java create mode 100644 system/tuicontact/src/main/res-light/drawable-xxhdpi/contact_black_list_icon_light.png create mode 100644 system/tuicontact/src/main/res-light/drawable-xxhdpi/contact_group_list_icon_light.png create mode 100644 system/tuicontact/src/main/res-light/drawable-xxhdpi/contact_new_friend_icon_light.png create mode 100644 system/tuicontact/src/main/res-light/values/light_colors.xml create mode 100644 system/tuicontact/src/main/res-light/values/light_styles.xml create mode 100644 system/tuicontact/src/main/res-lively/drawable-xxhdpi/contact_black_list_icon_lively.png create mode 100644 system/tuicontact/src/main/res-lively/drawable-xxhdpi/contact_group_list_icon_lively.png create mode 100644 system/tuicontact/src/main/res-lively/drawable-xxhdpi/contact_new_friend_icon_lively.png create mode 100644 system/tuicontact/src/main/res-lively/values/lively_colors.xml create mode 100644 system/tuicontact/src/main/res-lively/values/lively_styles.xml create mode 100644 system/tuicontact/src/main/res-minimalist/drawable/contact_add_friend.png create mode 100644 system/tuicontact/src/main/res-minimalist/drawable/contact_add_group.png create mode 100644 system/tuicontact/src/main/res-minimalist/drawable/contact_minimalist_create_icon.png create mode 100644 system/tuicontact/src/main/res-minimalist/layout/contact_minimalist_header_view_layout.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/contact_minimalist_start_group_select_activity.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/minimalist_contact_blacklist_activity.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/minimalist_contact_fragment.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/minimalist_contact_friend_profile_activity.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/minimalist_contact_friend_profile_layout.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/minimalist_contact_layout.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/minimalist_contact_list.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/minimalist_forward_select_group_contact.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/minimalist_group_list_activity.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/minimalist_popup_start_c2c_chat_activity.xml create mode 100644 system/tuicontact/src/main/res-minimalist/layout/minimalist_popup_start_group_chat_activity.xml create mode 100644 system/tuicontact/src/main/res-minimalist/values-zh-rCN/minimalist_strings.xml create mode 100644 system/tuicontact/src/main/res-minimalist/values/minimalist_strings.xml create mode 100644 system/tuicontact/src/main/res-serious/drawable-xxhdpi/contact_black_list_icon_serious.png create mode 100644 system/tuicontact/src/main/res-serious/drawable-xxhdpi/contact_group_list_icon_serious.png create mode 100644 system/tuicontact/src/main/res-serious/drawable-xxhdpi/contact_new_friend_icon_serious.png create mode 100644 system/tuicontact/src/main/res-serious/values/serious_colors.xml create mode 100644 system/tuicontact/src/main/res-serious/values/serious_styles.xml create mode 100644 system/tuicontact/src/main/res/color/bg_negative_btn.xml create mode 100644 system/tuicontact/src/main/res/color/bg_positive_btn.xml create mode 100644 system/tuicontact/src/main/res/color/negative_text.xml create mode 100644 system/tuicontact/src/main/res/color/positive_text.xml create mode 100644 system/tuicontact/src/main/res/drawable-xxhdpi/check_box_selected.png create mode 100644 system/tuicontact/src/main/res/drawable-xxhdpi/check_box_unselected.png create mode 100644 system/tuicontact/src/main/res/drawable-xxhdpi/conversation_more.png create mode 100644 system/tuicontact/src/main/res/drawable-xxhdpi/create_c2c.png create mode 100644 system/tuicontact/src/main/res/drawable-xxhdpi/group_icon.png create mode 100644 system/tuicontact/src/main/res/drawable-xxhdpi/ic_contact_join_group.png create mode 100644 system/tuicontact/src/main/res/drawable/agree_btn_bg.xml create mode 100644 system/tuicontact/src/main/res/drawable/btn_bg_color.xml create mode 100644 system/tuicontact/src/main/res/drawable/contact_checkbox_selector.xml create mode 100644 system/tuicontact/src/main/res/drawable/contact_confirm_button_bg.xml create mode 100644 system/tuicontact/src/main/res/drawable/contact_select_disable.png create mode 100644 system/tuicontact/src/main/res/drawable/contact_shape_search.xml create mode 100644 system/tuicontact/src/main/res/drawable/my_cursor.xml create mode 100644 system/tuicontact/src/main/res/drawable/reject_btn_bg.xml create mode 100644 system/tuicontact/src/main/res/drawable/shape_side_bar_bg.xml create mode 100644 system/tuicontact/src/main/res/layout/contact_add_activity.xml create mode 100644 system/tuicontact/src/main/res/layout/contact_blacklist_activity.xml create mode 100644 system/tuicontact/src/main/res/layout/contact_fragment.xml create mode 100644 system/tuicontact/src/main/res/layout/contact_friend_profile_activity.xml create mode 100644 system/tuicontact/src/main/res/layout/contact_friend_profile_layout.xml create mode 100644 system/tuicontact/src/main/res/layout/contact_layout.xml create mode 100644 system/tuicontact/src/main/res/layout/contact_list.xml create mode 100644 system/tuicontact/src/main/res/layout/contact_new_friend_activity.xml create mode 100644 system/tuicontact/src/main/res/layout/contact_new_friend_item.xml create mode 100644 system/tuicontact/src/main/res/layout/contact_selecable_adapter_item.xml create mode 100644 system/tuicontact/src/main/res/layout/create_group_layout.xml create mode 100644 system/tuicontact/src/main/res/layout/forward_contact_selector_item.xml create mode 100644 system/tuicontact/src/main/res/layout/forward_select_group_contact.xml create mode 100644 system/tuicontact/src/main/res/layout/group_list_activity.xml create mode 100644 system/tuicontact/src/main/res/layout/group_type_item.xml create mode 100644 system/tuicontact/src/main/res/layout/group_type_select_layout.xml create mode 100644 system/tuicontact/src/main/res/layout/popup_start_c2c_chat_activity.xml create mode 100644 system/tuicontact/src/main/res/layout/popup_start_group_chat_activity.xml create mode 100644 system/tuicontact/src/main/res/layout/popup_start_group_select_activity.xml create mode 100644 system/tuicontact/src/main/res/values-zh-rCN/strings.xml create mode 100644 system/tuicontact/src/main/res/values/arrays.xml create mode 100644 system/tuicontact/src/main/res/values/colors.xml create mode 100644 system/tuicontact/src/main/res/values/dimens.xml create mode 100644 system/tuicontact/src/main/res/values/strings.xml create mode 100644 system/tuicontact/src/main/res/values/tui_theme_attrs.xml create mode 100644 system/tuiconversation/.gitignore create mode 100644 system/tuiconversation/build.gradle create mode 100644 system/tuiconversation/src/main/AndroidManifest.xml create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/ITUIConversationService.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/TUIConversationConstants.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/TUIConversationService.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/bean/ConversationInfo.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/bean/DraftInfo.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/interfaces/IConversationLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/interfaces/IConversationListLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/interfaces/IConversationProvider.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/interfaces/OnConversationAdapterListener.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/page/TUIConversationFragment.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/page/TUIFoldedConversationActivity.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/page/TUIFoldedConversationFragment.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/page/TUIForwardSelectActivity.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/page/TUIForwardSelectFragment.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/setting/ConversationLayoutSetting.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/util/TUIConversationUtils.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationBaseHolder.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationCommonHolder.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationCustomHolder.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationIconView.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationListAdapter.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationListLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/FoldedConversationLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/FoldedConversationListLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ForwardConversationSelectorAdapter.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ForwardSelectLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/commonutil/ConversationUtils.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/commonutil/TUIConversationLog.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/commonutil/TUIConversationUtils.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/config/TUIConversationConfig.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/interfaces/ConversationEventListener.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/interfaces/IConversationListAdapter.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/interfaces/IConversationLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/interfaces/IConversationListLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/interfaces/IConversationProvider.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/interfaces/OnConversationAdapterListener.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/page/ConversationMinimalistFragment.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/page/TUIFoldedConversationMinimalistActivity.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/page/TUIFoldedConversationMinimalistFragment.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/page/TUIForwardSelectMinimalistActivity.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/page/TUIForwardSelectMinimalistFragment.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/setting/ConversationLayoutSetting.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/util/TUIConversationUtils.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ConversationBaseHolder.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ConversationCommonHolder.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ConversationCustomHolder.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ConversationIconView.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ConversationLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ConversationListAdapter.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ConversationListLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/FoldedConversationLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/FoldedConversationListLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ForwardConversationSelectorAdapter.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ForwardSelectLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/Menu.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/swipe/Attributes.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/swipe/RecyclerSwipeAdapter.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/swipe/SimpleSwipeListener.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/swipe/SwipeAdapterInterface.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/swipe/SwipeItemMangerImpl.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/swipe/SwipeItemMangerInterface.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/swipe/SwipeLayout.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/model/ConversationProvider.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/presenter/ConversationFoldPresenter.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/presenter/ConversationIconPresenter.java create mode 100644 system/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/presenter/ConversationPresenter.java create mode 100644 system/tuiconversation/src/main/res-minimalistui/drawable/conversation_minimalist_create_icon.png create mode 100644 system/tuiconversation/src/main/res-minimalistui/drawable/conversation_minimalist_edit_icon.png create mode 100644 system/tuiconversation/src/main/res-minimalistui/drawable/conversation_minimalist_message_status_send_all_read.png create mode 100644 system/tuiconversation/src/main/res-minimalistui/drawable/conversation_minimalist_message_status_send_no_read.png create mode 100644 system/tuiconversation/src/main/res-minimalistui/drawable/conversation_minimalist_more_icon.png create mode 100644 system/tuiconversation/src/main/res-minimalistui/drawable/conversation_minimalist_not_disturb_icon.png create mode 100644 system/tuiconversation/src/main/res-minimalistui/drawable/conversation_minimalist_online_icon.png create mode 100644 system/tuiconversation/src/main/res-minimalistui/drawable/conversation_minimalist_search_border.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/drawable/conversation_minimalist_search_icon.png create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalist_bottom_bar.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalist_conversation_list_item_sub_layout.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalist_folded_fragment.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalist_folded_layout.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalist_forward_conversation_selector_item.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalist_forward_fragment.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalist_forward_layout.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalist_header_view_layout.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalist_more_dialog.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalistui_conversation_fragment.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalistui_conversation_layout.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/layout/minimalistui_conversation_list_item_layout.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/values-zh-rCN/minimalist_strings.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/values/minimalist_attrs.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/values/minimalist_colors.xml create mode 100644 system/tuiconversation/src/main/res-minimalistui/values/minimalist_strings.xml create mode 100644 system/tuiconversation/src/main/res/color/bg_positive_btn.xml create mode 100644 system/tuiconversation/src/main/res/drawable-xxhdpi/check_box_selected.png create mode 100644 system/tuiconversation/src/main/res/drawable-xxhdpi/check_box_unselected.png create mode 100644 system/tuiconversation/src/main/res/drawable-xxhdpi/conversation_more.png create mode 100644 system/tuiconversation/src/main/res/drawable-xxhdpi/create_c2c.png create mode 100644 system/tuiconversation/src/main/res/drawable-xxhdpi/group_icon.png create mode 100644 system/tuiconversation/src/main/res/drawable-xxhdpi/ic_contact_join_group.png create mode 100644 system/tuiconversation/src/main/res/drawable-xxhdpi/ic_fold.png create mode 100644 system/tuiconversation/src/main/res/drawable-xxhdpi/ic_personal_member.png create mode 100644 system/tuiconversation/src/main/res/drawable/checkbox_selector.xml create mode 100644 system/tuiconversation/src/main/res/drawable/ic_disturb.xml create mode 100644 system/tuiconversation/src/main/res/drawable/ic_send_failed.xml create mode 100644 system/tuiconversation/src/main/res/drawable/ic_sending_status.xml create mode 100644 system/tuiconversation/src/main/res/drawable/my_cursor.xml create mode 100644 system/tuiconversation/src/main/res/drawable/popu_dialog_bg.xml create mode 100644 system/tuiconversation/src/main/res/drawable/shape_search.xml create mode 100644 system/tuiconversation/src/main/res/layout/conversation_custom_adapter.xml create mode 100644 system/tuiconversation/src/main/res/layout/conversation_forward_label_adapter.xml create mode 100644 system/tuiconversation/src/main/res/layout/conversation_forward_select_adapter.xml create mode 100644 system/tuiconversation/src/main/res/layout/conversation_fragment.xml create mode 100644 system/tuiconversation/src/main/res/layout/conversation_layout.xml create mode 100644 system/tuiconversation/src/main/res/layout/conversation_list_item_layout.xml create mode 100644 system/tuiconversation/src/main/res/layout/conversation_pop_menu_layout.xml create mode 100644 system/tuiconversation/src/main/res/layout/folded_activity.xml create mode 100644 system/tuiconversation/src/main/res/layout/folded_fragment.xml create mode 100644 system/tuiconversation/src/main/res/layout/folded_layout.xml create mode 100644 system/tuiconversation/src/main/res/layout/forward_activity.xml create mode 100644 system/tuiconversation/src/main/res/layout/forward_conversation_selector_item.xml create mode 100644 system/tuiconversation/src/main/res/layout/forward_fragment.xml create mode 100644 system/tuiconversation/src/main/res/layout/forward_layout.xml create mode 100644 system/tuiconversation/src/main/res/layout/loading_progress_bar.xml create mode 100644 system/tuiconversation/src/main/res/values-zh-rCN/strings.xml create mode 100644 system/tuiconversation/src/main/res/values/attrs.xml create mode 100644 system/tuiconversation/src/main/res/values/colors.xml create mode 100644 system/tuiconversation/src/main/res/values/dimens.xml create mode 100644 system/tuiconversation/src/main/res/values/strings.xml create mode 100644 system/tuiconversation/src/main/res/xml/file_paths_public.xml create mode 100644 system/tuicore-7.3.4358/build.gradle create mode 100644 system/tuicore-7.3.4358/src/main/AndroidManifest.xml create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/EventManager.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/ExtensionManager.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/ObjectManager.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/ServiceInitializer.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/ServiceManager.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/TUIConfig.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/TUIConstants.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/TUICore.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/TUILogin.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/TUIRouter.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/TUIThemeManager.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/ITUIExtension.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/ITUINotification.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/ITUIObjectFactory.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/ITUIService.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUICallback.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUIExtensionEventListener.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUIExtensionInfo.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUILogListener.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUILoginConfig.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUILoginListener.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUIServiceCallback.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUIValueCallback.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/permission/PermissionActivity.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/permission/PermissionCallback.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/permission/PermissionRequester.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/util/BackgroundTasks.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/util/DateTimeUtil.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/util/ErrorMessageConverter.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/util/PermissionRequester.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/util/SPUtils.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/util/ScreenUtil.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/util/TUIBuild.java create mode 100644 system/tuicore-7.3.4358/src/main/java/com/tencent/qcloud/tuicore/util/ToastUtil.java create mode 100644 system/tuicore-7.3.4358/src/main/res-light/values/light_colors.xml create mode 100644 system/tuicore-7.3.4358/src/main/res-light/values/light_styles.xml create mode 100644 system/tuicore-7.3.4358/src/main/res-lively/values/lively_colors.xml create mode 100644 system/tuicore-7.3.4358/src/main/res-lively/values/lively_styles.xml create mode 100644 system/tuicore-7.3.4358/src/main/res-serious/values/serious_colors.xml create mode 100644 system/tuicore-7.3.4358/src/main/res-serious/values/serious_styles.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/drawable/core_list_divider.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/drawable/core_permission_dialog_bg.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/layout/permission_activity_layout.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/layout/permission_tip_layout.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/values-zh-rCN/im_error_msg.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/values-zh-rCN/strings.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/values/attrs.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/values/colors.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/values/im_error_msg.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/values/strings.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/values/styles.xml create mode 100644 system/tuicore-7.3.4358/src/main/res/values/tui_theme_attrs.xml create mode 100644 system/tuicore/.gitignore create mode 100644 system/tuicore/build.gradle create mode 100644 system/tuicore/src/main/AndroidManifest.xml create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/EventManager.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/ExtensionManager.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/ServiceInitializer.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/ServiceManager.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/TUIConfig.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/TUIConstants.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/TUICore.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/TUILogin.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/TUIRouter.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/TUIThemeManager.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/CustomLinearLayoutManager.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/LineControllerView.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/RoundCornerImageView.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/RoundFrameLayout.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/TitleBarLayout.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/UnreadCountTextView.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/action/PopActionClickListener.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/action/PopDialogAdapter.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/action/PopMenuAction.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/action/PopMenuAdapter.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/activities/BaseLightActivity.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/activities/BaseMinimalistLightActivity.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/activities/ImageSelectActivity.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/activities/SelectionActivity.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/dialog/TUIKitDialog.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/fragments/BaseFragment.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/gatherimage/MultiImageData.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/gatherimage/ShadeImageView.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/gatherimage/SynthesizedImageView.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/gatherimage/Synthesizer.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/gatherimage/TeamHeadSynthesizer.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/gatherimage/UserIconView.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/imageEngine/impl/CornerTransform.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/imageEngine/impl/GlideEngine.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/interfaces/ILayout.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/interfaces/ITitleBarLayout.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/interfaces/IUIKitCallback.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/component/popupcard/PopupInputCard.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/interfaces/ITUIExtension.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/interfaces/ITUINotification.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/interfaces/ITUIService.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUICallback.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUILogListener.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUILoginConfig.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/interfaces/TUILoginListener.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/permission/PermissionActivity.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/permission/PermissionCallback.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/permission/PermissionRequester.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/BackgroundTasks.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/DateTimeUtil.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/ErrorMessageConverter.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/FileUtil.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/ImageUtil.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/PermissionRequester.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/PopWindowUtil.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/SPUtils.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/ScreenUtil.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/SoftKeyBoardUtil.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/TUIBuild.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/TUIFileProvider.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/TUIUtil.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/ThreadHelper.java create mode 100644 system/tuicore/src/main/java/com/tencent/qcloud/tuicore/util/ToastUtil.java create mode 100644 system/tuicore/src/main/res-light/drawable-xxhdpi/core_default_group_icon_community_light.png create mode 100644 system/tuicore/src/main/res-light/drawable-xxhdpi/core_default_group_icon_meeting_light.png create mode 100644 system/tuicore/src/main/res-light/drawable-xxhdpi/core_default_group_icon_public_light.png create mode 100644 system/tuicore/src/main/res-light/drawable-xxhdpi/core_default_group_icon_work_light.png create mode 100644 system/tuicore/src/main/res-light/drawable-xxhdpi/core_default_user_icon_light.png create mode 100644 system/tuicore/src/main/res-light/drawable-xxhdpi/core_online_status_light.png create mode 100644 system/tuicore/src/main/res-light/drawable-xxhdpi/core_selected_icon_light.png create mode 100644 system/tuicore/src/main/res-light/drawable-xxhdpi/core_title_bar_back_light.png create mode 100644 system/tuicore/src/main/res-light/drawable/core_title_bar_bg_light.xml create mode 100644 system/tuicore/src/main/res-light/values/light_colors.xml create mode 100644 system/tuicore/src/main/res-light/values/light_styles.xml create mode 100644 system/tuicore/src/main/res-lively/drawable-xxhdpi/core_default_group_icon_community_lively.png create mode 100644 system/tuicore/src/main/res-lively/drawable-xxhdpi/core_default_group_icon_meeting_lively.png create mode 100644 system/tuicore/src/main/res-lively/drawable-xxhdpi/core_default_group_icon_public_lively.png create mode 100644 system/tuicore/src/main/res-lively/drawable-xxhdpi/core_default_group_icon_work_lively.png create mode 100644 system/tuicore/src/main/res-lively/drawable-xxhdpi/core_default_user_icon_lively.png create mode 100644 system/tuicore/src/main/res-lively/drawable-xxhdpi/core_online_status_lively.png create mode 100644 system/tuicore/src/main/res-lively/drawable-xxhdpi/core_selected_icon_lively.png create mode 100644 system/tuicore/src/main/res-lively/drawable-xxhdpi/core_title_bar_back_lively.png create mode 100644 system/tuicore/src/main/res-lively/drawable/core_title_bar_bg_lively.xml create mode 100644 system/tuicore/src/main/res-lively/values/lively_colors.xml create mode 100644 system/tuicore/src/main/res-lively/values/lively_styles.xml create mode 100644 system/tuicore/src/main/res-serious/drawable-xxhdpi/core_default_group_icon_community_serious.png create mode 100644 system/tuicore/src/main/res-serious/drawable-xxhdpi/core_default_group_icon_meeting_serious.png create mode 100644 system/tuicore/src/main/res-serious/drawable-xxhdpi/core_default_group_icon_public_serious.png create mode 100644 system/tuicore/src/main/res-serious/drawable-xxhdpi/core_default_group_icon_work_serious.png create mode 100644 system/tuicore/src/main/res-serious/drawable-xxhdpi/core_default_user_icon_serious.png create mode 100644 system/tuicore/src/main/res-serious/drawable-xxhdpi/core_online_status_serious.png create mode 100644 system/tuicore/src/main/res-serious/drawable-xxhdpi/core_selected_icon_serious.png create mode 100644 system/tuicore/src/main/res-serious/drawable-xxhdpi/core_title_bar_back_serious.png create mode 100644 system/tuicore/src/main/res-serious/drawable/core_title_bar_bg_serious.xml create mode 100644 system/tuicore/src/main/res-serious/values/serious_colors.xml create mode 100644 system/tuicore/src/main/res-serious/values/serious_styles.xml create mode 100644 system/tuicore/src/main/res/anim/core_popup_in_anim.xml create mode 100644 system/tuicore/src/main/res/anim/core_popup_out_anim.xml create mode 100644 system/tuicore/src/main/res/drawable-xxhdpi/arrow_right.png create mode 100644 system/tuicore/src/main/res/drawable-xxhdpi/core_close_icon.png create mode 100644 system/tuicore/src/main/res/drawable-xxhdpi/core_default_group_icon_community.png create mode 100644 system/tuicore/src/main/res/drawable-xxhdpi/core_delete_icon.png create mode 100644 system/tuicore/src/main/res/drawable-xxhdpi/core_icon_offline_status.png create mode 100644 system/tuicore/src/main/res/drawable-xxhdpi/core_search_icon.png create mode 100644 system/tuicore/src/main/res/drawable/alert_bg.9.png create mode 100644 system/tuicore/src/main/res/drawable/core_edit_cursor.xml create mode 100644 system/tuicore/src/main/res/drawable/core_edit_text_bg.xml create mode 100644 system/tuicore/src/main/res/drawable/core_list_divider.xml create mode 100644 system/tuicore/src/main/res/drawable/core_permission_dialog_bg.xml create mode 100644 system/tuicore/src/main/res/drawable/core_positive_btn_bg.xml create mode 100644 system/tuicore/src/main/res/drawable/core_positive_btn_disable_bg.xml create mode 100644 system/tuicore/src/main/res/drawable/core_positive_btn_normal_bg.xml create mode 100644 system/tuicore/src/main/res/drawable/core_positive_btn_pressed_bg.xml create mode 100644 system/tuicore/src/main/res/drawable/popup_card_bg.xml create mode 100644 system/tuicore/src/main/res/drawable/selected_border.xml create mode 100644 system/tuicore/src/main/res/drawable/switch_thumb.xml create mode 100644 system/tuicore/src/main/res/drawable/switch_thumb_blue.xml create mode 100644 system/tuicore/src/main/res/drawable/switch_thumb_gray.xml create mode 100644 system/tuicore/src/main/res/drawable/switch_track.xml create mode 100644 system/tuicore/src/main/res/drawable/switch_track_blue.xml create mode 100644 system/tuicore/src/main/res/drawable/switch_track_gray.xml create mode 100644 system/tuicore/src/main/res/drawable/trans_bg.png create mode 100644 system/tuicore/src/main/res/layout/core_activity_image_select_layout.xml create mode 100644 system/tuicore/src/main/res/layout/core_pop_menu.xml create mode 100644 system/tuicore/src/main/res/layout/core_select_image_item_layout.xml create mode 100644 system/tuicore/src/main/res/layout/core_select_item_layout.xml create mode 100644 system/tuicore/src/main/res/layout/layout_popup_card.xml create mode 100644 system/tuicore/src/main/res/layout/line_controller_view.xml create mode 100644 system/tuicore/src/main/res/layout/permission_activity_layout.xml create mode 100644 system/tuicore/src/main/res/layout/permission_tip_layout.xml create mode 100644 system/tuicore/src/main/res/layout/pop_dialog_adapter.xml create mode 100644 system/tuicore/src/main/res/layout/pop_menu_adapter.xml create mode 100644 system/tuicore/src/main/res/layout/profile_icon_view.xml create mode 100644 system/tuicore/src/main/res/layout/title_bar_layout.xml create mode 100644 system/tuicore/src/main/res/layout/tuicore_selection_activity.xml create mode 100644 system/tuicore/src/main/res/layout/view_dialog.xml create mode 100644 system/tuicore/src/main/res/values-zh-rCN/im_error_msg.xml create mode 100644 system/tuicore/src/main/res/values-zh-rCN/strings.xml create mode 100644 system/tuicore/src/main/res/values/attrs.xml create mode 100644 system/tuicore/src/main/res/values/colors.xml create mode 100644 system/tuicore/src/main/res/values/dimens.xml create mode 100644 system/tuicore/src/main/res/values/im_error_msg.xml create mode 100644 system/tuicore/src/main/res/values/strings.xml create mode 100644 system/tuicore/src/main/res/values/styles.xml create mode 100644 system/tuicore/src/main/res/values/tui_theme_attrs.xml create mode 100644 system/tuicore/src/main/res/xml/file_paths_public.xml create mode 100644 system/tuigroup/.gitignore create mode 100644 system/tuigroup/build.gradle create mode 100644 system/tuigroup/src/main/AndroidManifest.xml create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/ITUIGroupService.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/TUIGroupConstants.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/TUIGroupService.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/bean/ChatInfo.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/bean/GroupApplyInfo.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/bean/GroupInfo.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/bean/GroupMemberInfo.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/interfaces/IGroupMemberChangedCallback.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/interfaces/IGroupMemberListener.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/page/GroupApplyManagerActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/page/GroupInfoActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/page/GroupInfoFragment.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/page/GroupMemberActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/page/GroupNoticeActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/page/ManageGroupActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/page/SetGroupManagerActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/view/GroupApplyAdapter.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/view/GroupApplyManagerLayout.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/view/GroupInfoAdapter.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/view/GroupInfoLayout.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/view/GroupMemberAdapter.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/classicui/view/GroupMemberLayout.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/component/BottomSelectSheet.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/interfaces/GroupEventListener.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/interfaces/IGroupApplyLayout.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/interfaces/IGroupMemberLayout.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/interfaces/IGroupMemberChangedCallback.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/interfaces/IGroupMemberListener.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/page/GroupApplyManagerMinimalistActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/page/GroupInfoMinimalistActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/page/GroupInfoMinimalistFragment.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/page/GroupMemberMinimalistActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/page/GroupNoticeMinimalistActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/page/ManageGroupMinimalistActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/page/SetGroupManagerMinimalistActivity.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/view/GroupApplyAdapter.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/view/GroupApplyManagerLayout.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/view/GroupInfoAdapter.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/view/GroupInfoLayout.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/view/GroupMemberAdapter.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/minimalistui/view/GroupMemberLayout.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/model/GroupInfoProvider.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/presenter/GroupApplyPresenter.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/presenter/GroupInfoPresenter.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/presenter/GroupManagerPresenter.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/util/TUIGroupLog.java create mode 100644 system/tuigroup/src/main/java/com/tencent/qcloud/tuikit/tuigroup/util/TUIGroupUtils.java create mode 100644 system/tuigroup/src/main/res-light/drawable-xxhdpi/group_add_icon_light.png create mode 100644 system/tuigroup/src/main/res-light/values/light_colors.xml create mode 100644 system/tuigroup/src/main/res-light/values/light_styles.xml create mode 100644 system/tuigroup/src/main/res-lively/drawable-xxhdpi/group_add_icon_lively.png create mode 100644 system/tuigroup/src/main/res-lively/values/lively_colors.xml create mode 100644 system/tuigroup/src/main/res-lively/values/lively_styles.xml create mode 100644 system/tuigroup/src/main/res-minimalist/drawable/group_minimalist_add_border.xml create mode 100644 system/tuigroup/src/main/res-minimalist/layout/group_minimalist_apply_manager_activity.xml create mode 100644 system/tuigroup/src/main/res-minimalist/layout/group_minimalist_info_fragment.xml create mode 100644 system/tuigroup/src/main/res-minimalist/layout/group_minimalist_members_list.xml create mode 100644 system/tuigroup/src/main/res-serious/drawable-xxhdpi/group_add_icon_serious.png create mode 100644 system/tuigroup/src/main/res-serious/values/serious_colors.xml create mode 100644 system/tuigroup/src/main/res-serious/values/serious_styles.xml create mode 100644 system/tuigroup/src/main/res/anim/bottom_select_sheet_enter.xml create mode 100644 system/tuigroup/src/main/res/anim/bottom_select_sheet_exit.xml create mode 100644 system/tuigroup/src/main/res/color/bg_negative_btn.xml create mode 100644 system/tuigroup/src/main/res/color/bg_positive_btn.xml create mode 100644 system/tuigroup/src/main/res/drawable-hdpi/alert_bg.9.png create mode 100644 system/tuigroup/src/main/res/drawable-hdpi/trans_bg.png create mode 100644 system/tuigroup/src/main/res/drawable-xxhdpi/add_group_member.png create mode 100644 system/tuigroup/src/main/res/drawable-xxhdpi/check_box_selected.png create mode 100644 system/tuigroup/src/main/res/drawable-xxhdpi/check_box_unselected.png create mode 100644 system/tuigroup/src/main/res/drawable-xxhdpi/del_group_member.png create mode 100644 system/tuigroup/src/main/res/drawable-xxhdpi/group_select_disable.png create mode 100644 system/tuigroup/src/main/res/drawable/bottom_action_border.xml create mode 100644 system/tuigroup/src/main/res/drawable/bottom_sheet_border.xml create mode 100644 system/tuigroup/src/main/res/drawable/editor_border_gray.xml create mode 100644 system/tuigroup/src/main/res/drawable/gray_btn_bg.xml create mode 100644 system/tuigroup/src/main/res/drawable/group_checkbox_selector.xml create mode 100644 system/tuigroup/src/main/res/drawable/group_confirm_button_bg.xml create mode 100644 system/tuigroup/src/main/res/drawable/group_list_divider.xml create mode 100644 system/tuigroup/src/main/res/drawable/my_cursor.xml create mode 100644 system/tuigroup/src/main/res/drawable/popu_dialog_bg.xml create mode 100644 system/tuigroup/src/main/res/drawable/text_border.xml create mode 100644 system/tuigroup/src/main/res/layout/activity_group_manager.xml create mode 100644 system/tuigroup/src/main/res/layout/activity_group_notice.xml create mode 100644 system/tuigroup/src/main/res/layout/activity_set_group_manager.xml create mode 100644 system/tuigroup/src/main/res/layout/bottom_select_sheet.xml create mode 100644 system/tuigroup/src/main/res/layout/bottom_sheet_item.xml create mode 100644 system/tuigroup/src/main/res/layout/group_apply_manager_activity.xml create mode 100644 system/tuigroup/src/main/res/layout/group_apply_manager_layout.xml create mode 100644 system/tuigroup/src/main/res/layout/group_info_activity.xml create mode 100644 system/tuigroup/src/main/res/layout/group_info_fragment.xml create mode 100644 system/tuigroup/src/main/res/layout/group_info_layout.xml create mode 100644 system/tuigroup/src/main/res/layout/group_manager_item.xml create mode 100644 system/tuigroup/src/main/res/layout/group_manager_pop_menu.xml create mode 100644 system/tuigroup/src/main/res/layout/group_member_apply_adpater.xml create mode 100644 system/tuigroup/src/main/res/layout/group_member_item_layout.xml create mode 100644 system/tuigroup/src/main/res/layout/group_member_layout.xml create mode 100644 system/tuigroup/src/main/res/layout/group_member_list_item.xml create mode 100644 system/tuigroup/src/main/res/layout/group_member_selected_item.xml create mode 100644 system/tuigroup/src/main/res/layout/group_members_list.xml create mode 100644 system/tuigroup/src/main/res/layout/group_profile_icon_view.xml create mode 100644 system/tuigroup/src/main/res/layout/layout_dialog.xml create mode 100644 system/tuigroup/src/main/res/layout/layout_ensure_dialog.xml create mode 100644 system/tuigroup/src/main/res/values-zh-rCN/strings.xml create mode 100644 system/tuigroup/src/main/res/values/arrays.xml create mode 100644 system/tuigroup/src/main/res/values/colors.xml create mode 100644 system/tuigroup/src/main/res/values/dimens.xml create mode 100644 system/tuigroup/src/main/res/values/strings.xml create mode 100644 system/tuigroup/src/main/res/values/styles.xml create mode 100644 system/tuigroup/src/main/res/values/tui_theme_attrs.xml create mode 100644 system/tuigroup/src/main/res/xml/file_paths_public.xml create mode 100644 system/video/.gitignore create mode 100644 system/video/build.gradle create mode 100644 system/video/src/main/AndroidManifest.xml create mode 100644 system/video/src/main/java/cn/jzvd/JZDataSource.java create mode 100644 system/video/src/main/java/cn/jzvd/JZMediaInterface.java create mode 100644 system/video/src/main/java/cn/jzvd/JZMediaSystem.java create mode 100644 system/video/src/main/java/cn/jzvd/JZTextureView.java create mode 100644 system/video/src/main/java/cn/jzvd/JZUtils.java create mode 100644 system/video/src/main/java/cn/jzvd/Jzvd.java create mode 100644 system/video/src/main/java/cn/jzvd/JzvdStd.java create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_add_volume.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_back_normal.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_back_pressed.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_back_tiny_normal.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_back_tiny_pressed.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_backward_icon.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_battery_level_10.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_battery_level_100.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_battery_level_30.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_battery_level_50.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_battery_level_70.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_battery_level_90.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_brightness_video.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_clarity_popwindow_bg.9.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_close_volume.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_enlarge.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_forward_icon.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_loading_bg.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_pause_normal.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_pause_pressed.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_play_normal.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_play_pressed.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_restart_normal.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_restart_pressed.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_share_normal.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_share_pressed.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_shrink.png create mode 100644 system/video/src/main/res/drawable-xhdpi/jz_volume_icon.png create mode 100644 system/video/src/main/res/drawable/jz_bottom_bg.9.png create mode 100644 system/video/src/main/res/drawable/jz_bottom_progress.xml create mode 100644 system/video/src/main/res/drawable/jz_bottom_seek_poster.xml create mode 100644 system/video/src/main/res/drawable/jz_bottom_seek_progress.xml create mode 100644 system/video/src/main/res/drawable/jz_clarity_popwindow_bg.9.png create mode 100644 system/video/src/main/res/drawable/jz_click_back_selector.xml create mode 100644 system/video/src/main/res/drawable/jz_click_back_tiny_selector.xml create mode 100644 system/video/src/main/res/drawable/jz_click_pause_selector.xml create mode 100644 system/video/src/main/res/drawable/jz_click_play_selector.xml create mode 100644 system/video/src/main/res/drawable/jz_click_replay_selector.xml create mode 100644 system/video/src/main/res/drawable/jz_click_share_selector.xml create mode 100644 system/video/src/main/res/drawable/jz_dialog_progress.xml create mode 100644 system/video/src/main/res/drawable/jz_dialog_progress_bg.xml create mode 100644 system/video/src/main/res/drawable/jz_loading.xml create mode 100644 system/video/src/main/res/drawable/jz_retry.xml create mode 100644 system/video/src/main/res/drawable/jz_seek_poster_normal.xml create mode 100644 system/video/src/main/res/drawable/jz_seek_poster_pressed.xml create mode 100644 system/video/src/main/res/drawable/jz_title_bg.9.png create mode 100644 system/video/src/main/res/drawable/jz_volume_progress_bg.xml create mode 100644 system/video/src/main/res/layout/jz_dialog_brightness.xml create mode 100644 system/video/src/main/res/layout/jz_dialog_progress.xml create mode 100644 system/video/src/main/res/layout/jz_dialog_volume.xml create mode 100644 system/video/src/main/res/layout/jz_layout_clarity.xml create mode 100644 system/video/src/main/res/layout/jz_layout_clarity_item.xml create mode 100644 system/video/src/main/res/layout/jz_layout_std.xml create mode 100644 system/video/src/main/res/values-es/strings.xml create mode 100644 system/video/src/main/res/values-ja-rJP/strings.xml create mode 100644 system/video/src/main/res/values-ko-rKR/strings.xml create mode 100644 system/video/src/main/res/values-pt/strings.xml create mode 100644 system/video/src/main/res/values-tr/strings.xml create mode 100644 system/video/src/main/res/values-zh/strings.xml create mode 100644 system/video/src/main/res/values/dimens.xml create mode 100644 system/video/src/main/res/values/strings.xml create mode 100644 system/video/src/main/res/values/styles.xml create mode 100644 system/video/src/main/res/xml/jz_network_security_config.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2650be5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/* +/.idea/assetWizardSettings.xml +.DS_Store +/build +/system/**/build/ +/captures +.externalNativeBuild +.cxx +local.properties +/system/video/build/ +/system/tuigroup/build/ +/system/tuicore/build/ +/system/tuiconversation/build/ +/system/tuicontact/build/ +/system/tuichat/build/ +/system/tuicallkit/build/ +*.apk +app/debug/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..bcd770c --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# 专家端专家端安卓原生 + +#### 介绍 +专家端专家端 + +#### 软件架构 +软件架构说明 +使用MVVM架构 + + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..bbf8763 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,18 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +.idea/ +.idea/gradle.xml +.idea/misc.xml diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..041ead2 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,133 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' +// id 'kotlin-android-extensions' + id 'kotlin-kapt' + id 'org.jetbrains.kotlin.android' + id 'kotlin-parcelize' +// id 'com.huawei.agconnect' +} + +android { + compileSdk rootProject.ext.compileSdkVersion + + defaultConfig { + applicationId "com.yxjk.healthexpertclient" + minSdk rootProject.ext.minSdkVersion + targetSdk rootProject.ext.targetSdkVersion + versionCode rootProject.ext.versionCode + versionName rootProject.ext.versionName + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + ndk { + // 选择实际需要的cpu架构 + abiFilters 'armeabi-v7a', 'arm64-v8a'//, 'x86', 'x86_64' + } +// manifestPlaceholders = [ +// JPUSH_PKGNAME : applicationId, +// JPUSH_APPKEY : "4480cf772398ae1b775c91aa", //JPush 上注册的包名对应的 Appkey. +// JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可. +// MEIZU_APPKEY : "MZ-魅族的APPKEY", +// MEIZU_APPID : "MZ-魅族的APPID", +// XIAOMI_APPID : "MI-小米的APPID", +// XIAOMI_APPKEY : "MI-小米的APPKEY", +// OPPO_APPKEY : "OP-oppo的APPKEY", +// OPPO_APPID : "OP-oppo的APPID", +// OPPO_APPSECRET : "OP-oppo的APPSECRET", +// VIVO_APPKEY : "vivo的APPKEY", +// VIVO_APPID : "vivo的APPID", +// HONOR_APPID : "Honor的APP ID" +// ] + } + signingConfigs{ + release { + storeFile file('/key/yxjkExpert.jks') + storePassword "yxjk1234" + keyAlias "yxjk" + keyPassword "yxjk1234" + //SHA1: 48:30:3D:D2:C1:6E:E7:D5:CC:1C:24:A4:64:F5:04:19:2E:9D:F3:98 + } + } + buildTypes { + debug { + signingConfig signingConfigs.release + minifyEnabled false // 开启混淆 + shrinkResources false // 启动资源压缩 + zipAlignEnabled true // 开启zipalign优化 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + release { + signingConfig signingConfigs.release + minifyEnabled false + shrinkResources false // 启动资源压缩 + zipAlignEnabled true // 开启zipalign优化 + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = '1.8' + } + packagingOptions { + exclude 'META-INF/gradle/incremental.annotation.processors' + exclude 'DebugProbesKt.bin' + } + dataBinding { + enabled = true + } + kapt { + generateStubs = true + } + sourceSets { + main { + jniLibs.srcDirs = ['libs'] + res.srcDirs = [ + 'src/main/res-login', + 'src/main/res-workbench', + 'src/main/res-mine', + 'src/main/res-other', + 'src/main/res-im', + 'src/main/res' + ] + } + } +} + +dependencies { + implementation project(path: ':lib_base') + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + + implementation rootProject.ext.androidxLibs + // ViewModel and LiveData + implementation rootProject.ext.jetpackLibs + /* annotationProcessor */ + kapt rootProject.ext.annotationProcessorLibs + /*网络请求相关*/ + implementation rootProject.ext.networkLibs + /*Glide*/ + implementation rootProject.ext.glideLibs + /*AgentWeb*/ + implementation rootProject.ext.agentWebLibs + /*高德地图*/ + implementation rootProject.ext.mapLibs + /*极光推送*/ +// implementation rootProject.ext.jPushLibs + // 其他包 + implementation rootProject.ext.commonLibs +// implementation project(path: ':systemLib') + implementation project(path: ':system:base_resource') + implementation project(path: ':system:video') + implementation project(path: ':ninegridview') + + api project(':system:tuichat') + api project(':system:tuicontact') + api project(':system:tuiconversation') + api project(':system:tuigroup') + api project(':system:tuicallkit') +// api project(':system:tuicallkit-7.3.4358') +} \ No newline at end of file diff --git a/app/key/yxjkExpert.jks b/app/key/yxjkExpert.jks new file mode 100644 index 0000000000000000000000000000000000000000..f5e2dcec4a74b8c911bf7f64d6f38552b47bc5f2 GIT binary patch literal 2612 zcma);S5Om-(uULMK`EgLp@SF%LoWgb3`kX~G%13i1w<**q(!R0Cq)SmI-y5VdKHi^ zHApB@q^N*&_^2Wr|M}1O&AB?~VrOUHcXu!L;+aL_=#d~G7>T3%OihP~(vCW01kwO= zadiC<99_?ExdVx#D*F$MiU7e;;eX31zvBfp!@sAX^gvK9jtcc#R6#oZnV@1sS|Szy zDWOPl2n@gOyZuC%{ZkdV?1NhjtYQ;Q`6Z;X#+7} z2oM2bYFi6-iT!#k6H|}S+{dT$KyZ+ejFl7znW!Z`c!(<&uI@?~71`S3x2E_SMubVN z_vYxD!(%WV&+d&yHF~)$$9W{VPd!G`r(}K!oVdjz@7f)Owo8?m*3|u(D?&^H5p-#N z6SEFoHDkSi98r$BJ*?HP$Ns*e4k58yUsiz0Wt7%Clr>4_-5>A~#;tz53=!ih#)?o& zZ!AfQL-2*6NzXZCTE0%QfO&C7&QX`eBJxt;wwHmfPZQ7TeB&DI;%12E}TWseZ@LNGZQ@Y?M+I`Um~`Fv&J z$pbYthd!;hZF4eWoul$4>7UN|6=_~0cbuPP+~L6E z2Vn}ZxdMjnnIf!|GxYgONi0erdZyr9GTUM3w&jUaV?)~VD2$g`z|oAoI>6>d&-o4LHH;qr*z}z3Q*7}r^0H&dO$|uS}@Oy zg-W)L|P1or})5LG#b+Qjm z$;A8piPE(mQt@srwTpI?FNAYMkkRrExQ51wjyA7lDd_T_O3|?VRdrw z5=YM)0xKvuVP(osz#{Rb#_7m}rc+nAGw01e5|HtpUDGrrKyq7&gOWgeW+Pb+{ zQz@jpw?S(v&GjxcJQYtRf#)Kqi7fpBrh9B0i26#M#5xGP>%>ztt2y?!)^`ZDa z;?hP-vngnh4-Ay5;!;eyQA1p=?hrozyp+EjnoQM~O5&3gpqxLNW&DKA1oQ(sC-4Y9 z^~uZb*Tro{>xSv>hq0C{7hA%-uOi&UBHeDpEr3;Gq0 z5)0}Xp_znIi(J+FrB0G27`=$p#v03C zU!U{dd}f<5-k&dUu+;6bY=^qi(!?U1H(vPkW%mwOn~?LDp%dwG&H$r}u+Q?z-j~c( zIU7ub7=WfhTG7^yfA5QR#5*}702t}wz^19_v(UHP==J=>R}Ckdq_k|u=8&Yu(9!>IV|QQPa$n1@Cu*(MkSQofD#=sOpcHBIZ2~lRi<;I!DPYgS0N2&(|W_n_pbXwk{tO&I+B1SKq-6v$NFATOvWrCNJ&m%M= z@=CD73nn_eS?hEf^UBhZMzZ2_JDaaBUYSD3IR{btS}|AZ%j~O9Ul7i8dL4`y_oF9o zZ+|QiE0sQdAD5pSLp|S61nq1%xcaya0MAI~PZh&=jZ#9UeFRgm>$2xd}mL+IkkwUOxLF&owe2 zUogxWb5%fqxA8=jPi=E#P`+|{(T37a72bUlcucP?szYES%r$}U!0n|@^$SQ;ynJbs zZiAg$v5!|B?qwT}xkNgc$T>pGoh%MEJr)DGvXzfuY&sUNtXw_?8ChdLLswZ#81PdYAniVA>yR+QI5axci z7%joo1wo&NK{>rI2xYw)?(FRIE|6= zb`c_RPXYr}(2b!{E-lf`bD*!P&&K1@&raiYd;^QkA1n^r__gdS;>p_*Y6BX-yq>q# z*WQ@Su_Kt>V7nci6!aJ@Vz4bV8+n9MQkX;; +} +-keepclassmembers class kotlin.Metadata { + public ; +} +-assumenosideeffects class kotlin.jvm.internal.Intrinsics { + static void checkParameterIsNotNull(java.lang.Object, java.lang.String); + static void checkNotNullParameter(java.lang.Object, java.lang.String); +} + +################glide############### +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} +#okhttp +-dontwarn com.squareup.okhttp3.** +-keep class com.squareup.okhttp3.** { *;} +-dontwarn okio.** + +################retrofit############### +-dontwarn retrofit2.** +-keep class retrofit2.** { *; } +-keep class io.reactivex.rxjava2.** { *; } +-keep class org.jetbrains.kotlin.** { *; } +-keepattributes Signature +-keepattributes Exceptions + +################common############### + + #实体类不参与混淆 +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} +-keepnames class * implements java.io.Serializable +-keepattributes Signature +-keep class **.R$* {*;} +-ignorewarnings +-dontwarn com.google.errorprone.annotations.Immutable +-keepclassmembers class **.R$* { + public static ; +} + +-keepclasseswithmembernames class * { # 保持native方法不被混淆 + native ; +} + +-keepclassmembers enum * { # 使用enum类型时需要注意避免以下两个方法混淆,因为enum类的特殊性,以下两个方法会被反射调用, + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +# 保留自定义控件(继承自View)不能被混淆 +-keep public class * extends android.view.View { + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); + public (android.content.Context, android.util.AttributeSet, int, int); + public void set*(***); + *** get* (); +} + -keep class * extends androidx.lifecycle.ViewModel + -keepclassmembers public class * extends androidx.lifecycle.ViewModel { + public (...); + } + -keep class * implements androidx.viewbinding.ViewBinding { + *; + } + -keepattributes JavascriptInterface + -keepclassmembers class * { + @android.webkit.JavascriptInterface ; + } + -keepclassmembers class android.webkit.WebView { + public *; + } + -keepclassmembers class * extends android.webkit.WebViewClient { + public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); + public boolean *(android.webkit.WebView, java.lang.String); + } + # 过滤注解 + -keepattributes *Annotation* + -keep class * extends java.lang.annotation.Annotation { *; } + -keep interface * extends java.lang.annotation.Annotation { *; } + # 过滤泛型 + -keepattributes Signature + #保持bean目录下文件不被混淆 + -keep class com.yxjk.healthexpertclient.bean.** {*;} + -keep class com.btpj.lib_base.data.bean.** {*;} +# ImmersionBar + -keep class com.gyf.immersionbar.* {*;} + -dontwarn com.gyf.immersionbar.** +# PictureSelector + -keep class com.luck.picture.lib.** { *; } + -keep class com.luck.lib.camerax.** { *; } + -dontwarn com.yalantis.ucrop** + -keep class com.yalantis.ucrop** { *; } + -keep interface com.yalantis.ucrop** { *; } + # BaseRecyclerViewAdapterHelper混淆 + -keep public class * extends com.chad.library.adapter.base.viewholder.BaseViewHolder + -keep public class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder + -keepclassmembers class com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { + public void *(android.view.View); + } + -keepclassmembers class * extends com.chad.library.adapter.base.viewholder.BaseDataBindingHolder { + public void *(android.view.View); + } +# Gson + -keep class com.google.gson.** {*;} + -keep class com.google.**{*;} + -dontwarn com.kingja.loadsir.** + -keep class com.kingja.loadsir.** {*;} + # 对于带有回调函数的onXXEvent、**On*Listener的,不能被混淆 + -keepclassmembers class * { + void *(**On*Event); + void *(**On*Listener); + } + # AgentWeb + -keep class com.just.agentweb.** { + *; + } + -dontwarn com.just.agentweb.** +#EventBus + -keepattributes *Annotation* + -keepclassmembers class * { + @org.greenrobot.eventbus.Subscribe ; + } + -keep enum org.greenrobot.eventbus.ThreadMode { *; } + + # Only required if you use AsyncExecutor + -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { + (java.lang.Throwable); + } +# IM混淆配置 +-keep class com.tencent.imsdk.** { *; } +# 高德地图SDK(都加上,省的以后万一加功能还得加) +-keep class com.amap.api.maps.**{*;} +-keep class com.autonavi.**{*;} +-keep class com.amap.api.trace.**{*;} +# 定位 +-keep class com.amap.api.location.**{*;} +-keep class com.amap.api.fence.**{*;} +-keep class com.autonavi.aps.amapapi.model.**{*;} +# 搜索 +-keep class com.amap.api.services.**{*;} +# 2D地图 +-keep class com.amap.api.maps2d.**{*;} +-keep class com.amap.api.mapcore2d.**{*;} +# 导航 +-keep class com.amap.api.navi.**{*;} +-keep class com.autonavi.**{*;} +# 蒲公英 +#-libraryjars libs/pgyer_sdk_x.x.jar +-dontwarn com.pgyersdk.** +-keep class com.pgyersdk.** { *; } +# 极光推送 +-dontoptimize +-dontpreverify + +-dontwarn cn.jpush.** +-keep class cn.jpush.** { *; } +-keep class * extends cn.jpush.android.service.JPushMessageReceiver { *; } + +-dontwarn cn.jiguang.** +-keep class cn.jiguang.** { *; } \ No newline at end of file diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..646edb3 --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.yxjk.healthexpertclient", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 13, + "versionName": "1.0.23", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..5fcf6a4 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/tab.json b/app/src/main/assets/tab.json new file mode 100644 index 0000000..67fe222 --- /dev/null +++ b/app/src/main/assets/tab.json @@ -0,0 +1,23 @@ +{ + "textColorNormal": "#A4A3A3", + "textColorSelected": "#21BEBD", + "textSizeNormal": 12, + "textSizeSelected": 12, + "backgroundColor": "#e9e9e9", + "isNameResId": false, + "isTitleVisible": true, + "tabs": [ + { + "tabName": "工作台", + "tabTag": "WorkbenchFragment", + "iconNormal": "icon_main_workbench_normal", + "iconSelected": "icon_main_workbench_selected" + }, + { + "tabName": "我的", + "tabTag": "MineFragment", + "iconNormal": "icon_main_mine_normal", + "iconSelected": "icon_main_mine_selected" + } + ] +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/MyApplication.kt b/app/src/main/java/com/yxjk/healthexpertclient/MyApplication.kt new file mode 100644 index 0000000..be00857 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/MyApplication.kt @@ -0,0 +1,210 @@ +package com.yxjk.healthexpertclient + +import android.app.Activity +import android.content.Context +import android.os.Bundle +import android.util.Log +import androidx.appcompat.app.AppCompatActivity +import com.btpj.lib_base.BaseApp +import com.btpj.lib_base.data.local.DataStoreManager +import com.btpj.lib_base.data.local.IpManager +import com.btpj.lib_base.ext.hideLoading +import com.btpj.lib_base.ext.jsonToBean +import com.btpj.lib_base.ext.showLoading +import com.lzy.ninegrid.NineGridView +import com.yxjk.healthexpertclient.bean.AppUpdateBean +import com.yxjk.healthexpertclient.ext.startLoginActivity +import com.yxjk.healthexpertclient.ext.userSigExpired +import com.yxjk.healthexpertclient.ui.main.viewmodel.AppViewModel +import com.yxjk.healthexpertclient.utils.BrandUtil +import com.yxjk.healthexpertclient.utils.CustomActivityManager +import com.yxjk.healthexpertclient.utils.DebuggerUtils +import com.yxjk.healthexpertclient.utils.NineGridViewImageLoader +import com.yxjk.healthexpertclient.utils.updateplugin.CheckUpdateAppVersion +import com.yxjk.healthexpertclient.view.CustomDownloadNotifier +import com.yxjk.healthexpertclient.view.CustomInstallNotifier +import com.yxjk.healthexpertclient.view.CustomUpdateNotifier +import com.tencent.imsdk.v2.V2TIMManager +import com.tencent.imsdk.v2.V2TIMValueCallback +import com.tencent.qcloud.tuicore.TUILogin +import com.tencent.qcloud.tuicore.interfaces.TUILoginListener +import com.tencent.qcloud.tuicore.util.ErrorMessageConverter +import com.tencent.qcloud.tuikit.tuichat.config.TUIChatConfigs +import com.tencent.qcloud.tuikit.tuichat.interfaces.IMInputViewActionListener +import org.json.JSONException +import org.json.JSONObject +import org.lzh.framework.updatepluginlib.UpdateConfig +import org.lzh.framework.updatepluginlib.base.UpdateParser +import org.lzh.framework.updatepluginlib.base.UpdateStrategy +import org.lzh.framework.updatepluginlib.model.CheckEntity +import org.lzh.framework.updatepluginlib.model.Update + +class MyApplication : BaseApp() { + val TAG = MyApplication::class.java.simpleName + companion object { + lateinit var appViewModel: AppViewModel + } + override fun onCreate() { + super.onCreate() + appViewModel = getAppViewModelProvider()[AppViewModel::class.java] + appViewModel.init() + initBuildInformation() + initLoginStatusListener() + NineGridView.setImageLoader(NineGridViewImageLoader()) + initUpdateApp() + initJPushSdk() + DataStoreManager.initialize(this) + DebuggerUtils.checkDebuggableInNotDebugModel(this) + TUIChatConfigs.getConfigs().imInputViewActionListener = + IMInputViewActionListener { workType, workId -> + var activity = CustomActivityManager.getInstance().currentActivity() + if(activity is AppCompatActivity){ + activity?.showLoading() + } + appViewModel.finishIMChat(workType, workId, finallyCall = { + hideLoading() + }) + } + registerActivityLifecycleCallbacks(AdjustLifecycleCallbacks()) + } + override fun attachBaseContext(base: Context) { + super.attachBaseContext(base) + } + /** + * 初始化极光推送 + */ + private fun initJPushSdk(){ +// JPushInterface.setDebugMode(true) +// // 调整点一:初始化代码前增加setAuth调用 +// var isPrivacyReady: Boolean = true // app根据是否已弹窗获取隐私授权来赋值 +// if (!isPrivacyReady) { +// JCollectionAuth.setAuth(this, false) // 后续初始化过程将被拦截 +// } +// JPushInterface.init(this) +// // 调整点二:隐私政策授权获取成功后调用 +// JCollectionAuth.setAuth(this, true); //如初始化被拦截过,将重试初始化过程 + } + private fun initUpdateApp(){ + UpdateConfig.getConfig() + .setCheckWorker(CheckUpdateAppVersion::class.java) + //为了通过原检查更新库的检查随便传入的地址,实际请求参考CheckUpdateAppVersion.class + .setCheckEntity(CheckEntity().setUrl("https://www.baidu.com")) + .setCheckNotifier(CustomUpdateNotifier()) + .setInstallNotifier(CustomInstallNotifier()) + .setDownloadNotifier(CustomDownloadNotifier()) + .setUpdateParser(object : UpdateParser() { + override fun parse(response: String?): Update { + val resultBean: AppUpdateBean? = response.jsonToBean(AppUpdateBean::class.java) + val update = Update() + if(resultBean == null){ + return update + } + // 此apk包的下载地址 + update.updateUrl = IpManager.getImageBaseUrl()+resultBean.appUrl + // 此apk包的版本号(因接口只有在有更新时才会返回数据,而且没有返回云端APP版本号,故将当前APP版本号+1,传给更新框架用作判断有新版本) + update.versionCode = resultBean.versionNo ?: 0 + // 此apk包的版本名称 + update.versionName = resultBean.versionName + // 此apk包的更新内容 + update.updateContent = resultBean.updateContent + // 此apk包是否为强制更新 + if (resultBean != null) { + update.isForced = 1 == resultBean.forced + }else{ + update.isForced = false + } + // 是否显示忽略此次版本更新按钮 + update.isIgnore = 1 == resultBean.ignoreFlag + return update + } + }).updateStrategy = object : UpdateStrategy() { + override fun isShowUpdateDialog(update: Update): Boolean { + // 是否在检查到有新版本更新时展示Dialog。 + return true + } + + override fun isAutoInstall(): Boolean { + // 是否自动更新.当为自动更新时。代表下载成功后不通知用户。直接调起安装。 + return true + } + + override fun isShowDownloadDialog(): Boolean { + // 在APK下载时。是否显示下载进度的Dialog + return true + } + } + } + private fun initBuildInformation() { + try { + val buildInfoJson = JSONObject() + buildInfoJson.put("buildBrand", BrandUtil.getBuildBrand()) + buildInfoJson.put("buildManufacturer", BrandUtil.getBuildManufacturer()) + buildInfoJson.put("buildModel", BrandUtil.getBuildModel()) + buildInfoJson.put("buildVersionRelease", BrandUtil.getBuildVersionRelease()) + buildInfoJson.put("buildVersionSDKInt", BrandUtil.getBuildVersionSDKInt()) + // 工信部要求 app 在运行期间只能获取一次设备信息。因此 app 获取设备信息设置给 SDK 后,SDK 使用该值并且不再调用系统接口。 + V2TIMManager.getInstance().callExperimentalAPI( + "setBuildInfo", + buildInfoJson.toString(), + object : V2TIMValueCallback { + override fun onSuccess(o: Any?) { + Log.i(TAG, "setBuildInfo success") + } + + override fun onError(code: Int, desc: String) { + Log.i( + TAG, + "setBuildInfo code:" + code + " desc:" + ErrorMessageConverter.convertIMError( + code, + desc + ) + ) + } + }) + } catch (e: JSONException) { + e.printStackTrace() + } + } + + private fun initLoginStatusListener() { + TUILogin.addLoginListener(loginStatusListener) + } + + private val loginStatusListener: TUILoginListener = object : TUILoginListener() { + override fun onKickedOffline() { + startLoginActivity(CustomActivityManager.getInstance().currentActivity()) + } + + override fun onUserSigExpired() { + CustomActivityManager.getInstance().currentActivity().userSigExpired() + } + } + private class AdjustLifecycleCallbacks : ActivityLifecycleCallbacks { + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + println("路径" + activity.javaClass.name) + CustomActivityManager.getInstance().addActivity(activity) + } + + override fun onActivityStarted(activity: Activity) { + } + + override fun onActivityResumed(activity: Activity) { + + } + + override fun onActivityPaused(activity: Activity) { + + } + + override fun onActivityStopped(activity: Activity) { + } + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { + } + + override fun onActivityDestroyed(activity: Activity) { + CustomActivityManager.getInstance().removeActivity(activity) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/base/BaseActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/base/BaseActivity.kt new file mode 100644 index 0000000..83c1b6b --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/base/BaseActivity.kt @@ -0,0 +1,95 @@ +package com.buddy.kredit.android.base + +import android.content.Intent +import android.os.Bundle +import android.os.SystemClock +import androidx.databinding.ViewDataBinding +import com.btpj.lib_base.base.BaseVMBActivity +import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.data.local.DataStoreManager +import com.yxjk.healthexpertclient.ext.startLoginActivity +import com.yxjk.healthexpertclient.utils.CustomActivityManager +import retrofit2.HttpException + + +/** + * 继承自BaseVMBActivity + * 在这里只做了统一处理跳转登录页面的逻辑 + * + * @author nanfeifei 2021/11/23 + */ +abstract class BaseActivity(contentViewResId: Int) : + BaseVMBActivity(contentViewResId) { + override fun createObserve() { + super.createObserve() + mViewModel.errorResponse.observe(this) { + if (it?.code == 401) { + startLoginActivity(this) + } + } + mViewModel.exception.observe(this){ + if(it is HttpException){ + if(it.code() == 401){ + startLoginActivity(this) + } + } + } + } + fun isLogin(): Boolean{ + return if(!DataStoreManager.isLogin()){ + startLoginActivity(this) + false + }else{ + true + } + } + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) +// CustomActivityManager.getInstance().addActivity(this) + } + + override fun onBackEvent() { + CustomActivityManager.getInstance().printActivity() + super.onBackEvent() + } + + /** + * 每次启动activity都会调用此方法 + */ + override fun startActivity(intent: Intent) { + if (checkDoubleClick(intent)){ + super.startActivity(intent) + } + + } + + private var mActivityJumpTag //activity跳转tag + : String? = null + private var mClickTime //activity跳转时间 + : Long = 0 + + /** + * 检查是否重复跳转,不需要则重写方法并返回true + */ + protected open fun checkDoubleClick(intent: Intent): Boolean { + // 默认检查通过 + var result = true + // 标记对象 + val tag: String? = if (intent.component != null) { // 显式跳转 + intent.component!!.className + } else if (intent.action != null) { // 隐式跳转 + intent.action + } else { + return true + } + if (tag == mActivityJumpTag && mClickTime >= SystemClock.uptimeMillis() - 500) { + // 检查不通过 + result = false + } + // 记录启动标记和时间 + mActivityJumpTag = tag + mClickTime = SystemClock.uptimeMillis() + return result + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/base/BaseFragment.kt b/app/src/main/java/com/yxjk/healthexpertclient/base/BaseFragment.kt new file mode 100644 index 0000000..51aaf24 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/base/BaseFragment.kt @@ -0,0 +1,81 @@ +package com.buddy.kredit.android.base + +import android.content.Intent +import android.os.Bundle +import android.os.SystemClock +import androidx.databinding.ViewDataBinding +import com.btpj.lib_base.base.BaseVMBFragment +import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.data.local.DataStoreManager +import com.yxjk.healthexpertclient.ext.startLoginActivity +import retrofit2.HttpException + +/** + * 继承自BaseVMBFragment + * 在这里只做了统一处理跳转登录页面的逻辑 + * + * @author nanfeifei 2021/11/23 + */ +abstract class BaseFragment(contentViewResId: Int) : + BaseVMBFragment(contentViewResId) { + + override fun createObserve() { + super.createObserve() + mViewModel.errorResponse.observe(viewLifecycleOwner) { + if (it?.code == 401) { // 需要登录 + startLoginActivity(requireContext()) + } + } + mViewModel.exception.observe(this){ + if(it is HttpException){ + if(it.code() == 401){ + startLoginActivity(requireContext()) + } + } + } + } + fun isLogin(): Boolean{ + return if(!DataStoreManager.isLogin()){ + startLoginActivity(requireContext()) + false + }else{ + true + } + } + /** + * 每次启动activity都会调用此方法 + */ + override fun startActivity(intent: Intent, options: Bundle?) { + if (checkDoubleClick(intent)){ + super.startActivity(intent) + } + } + private var mActivityJumpTag //activity跳转tag + : String? = null + private var mClickTime //activity跳转时间 + : Long = 0 + + /** + * 检查是否重复跳转,不需要则重写方法并返回true + */ + protected open fun checkDoubleClick(intent: Intent): Boolean { + // 默认检查通过 + var result = true + // 标记对象 + val tag: String? = if (intent.component != null) { // 显式跳转 + intent.component!!.className + } else if (intent.action != null) { // 隐式跳转 + intent.action + } else { + return true + } + if (tag == mActivityJumpTag && mClickTime >= SystemClock.uptimeMillis() - 500) { + // 检查不通过 + result = false + } + // 记录启动标记和时间 + mActivityJumpTag = tag + mClickTime = SystemClock.uptimeMillis() + return result + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/AppUpdateBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/AppUpdateBean.kt new file mode 100644 index 0000000..ed06e82 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/AppUpdateBean.kt @@ -0,0 +1,16 @@ +package com.yxjk.healthexpertclient.bean + +data class AppUpdateBean( + var appId: String = "", + var appName: String = "", + var appStatus: Int = 0, + var appUrl: String = "", + var deviceType: Int = 0, + var forced: Int = 0, + var id: String = "", + var ignoreFlag: Int = 0, + var updateContent: String = "", + var updateTime: Any? = null, + var versionName: String = "", + var versionNo: Int = 0 +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/CommonSettingMenuBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/CommonSettingMenuBean.kt new file mode 100644 index 0000000..0710f68 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/CommonSettingMenuBean.kt @@ -0,0 +1,14 @@ +package com.yxjk.healthexpertclient.bean + + +import com.btpj.lib_base.base.adapter.BaseCheckRecycleViewAdapter + +/** + * 配置菜单 + */ +data class CommonSettingMenuBean( + val value: String = "", + val text: String = "", + override val itemType: Int = -1, + override var checked: Boolean = false +): BaseCheckRecycleViewAdapter.CheckItem diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/ImageBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/ImageBean.kt new file mode 100644 index 0000000..0121f24 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/ImageBean.kt @@ -0,0 +1,6 @@ +package com.yxjk.healthexpertclient.bean + +/** + * 类似九宫格图集使用 + */ +data class ImageBean(var imageUrl: String = "", var isFilePath: Boolean = false, var isAddButton: Boolean = false) diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/UploadFileResultBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/UploadFileResultBean.kt new file mode 100644 index 0000000..a70cdde --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/UploadFileResultBean.kt @@ -0,0 +1,5 @@ +package com.yxjk.healthexpertclient.bean + +data class UploadFileResultBean( + var url: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/UserInfoBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/UserInfoBean.kt new file mode 100644 index 0000000..1a8dbce --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/UserInfoBean.kt @@ -0,0 +1,43 @@ +package com.yxjk.healthexpertclient.bean + +/** + * 登录成功之后返回的用户信息 + */ +data class UserInfoBean( + var activitiSync: Any? = null, + var avatar: String = "", + var birthday: String = "", + var bpmStatus: Any? = null, + var clientId: Any? = null, + var createBy: Any? = null, + var createTime: String = "", + var delFlag: Int = 0, + var depart: Any? = null, + var departIds: Any? = null, + var departTree: List = listOf(), + var email: Any? = null, + var homePath: Any? = null, + var id: String = "", + var idCard: String = "", + var loginTenantId: Int = 0, + var orgCode: Any? = null, + var orgCodeTxt: Any? = null, + var personType: Any? = null, + var phone: String = "", + var post: Any? = null, + var postText: Any? = null, + var realname: String = "", + var relTenantIds: String = "", + var secondDepart: Any? = null, + var sex: String = "", + var sex_dictText: String = "", + var status: String = "", + var status_dictText: String = "", + var telephone: Any? = null, + var updateBy: String = "", + var updateTime: String = "", + var userIdentity: Any? = null, + var username: String = "", + var workNo: String = "", + var userToken: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/im/IMAssistantBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/im/IMAssistantBean.kt new file mode 100644 index 0000000..02066da --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/im/IMAssistantBean.kt @@ -0,0 +1,11 @@ +package com.yxjk.healthexpertclient.bean.im + + +class IMAssistantBean( + var helpId: String = "", + var id: String = "", + val groupId: String, + val userId: String, + val member: ArrayList, + val tfNew: String +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/im/IMInfoBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/im/IMInfoBean.kt new file mode 100644 index 0000000..7e40488 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/im/IMInfoBean.kt @@ -0,0 +1,7 @@ +package com.yxjk.healthexpertclient.bean.im + +data class IMInfoBean( + val userSig: String, + val userId: String, + val sdkAppId: String +) diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/login/LoginResultBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/login/LoginResultBean.kt new file mode 100644 index 0000000..db4ac92 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/login/LoginResultBean.kt @@ -0,0 +1,8 @@ +package com.yxjk.healthexpertclient.bean.login + +import com.yxjk.healthexpertclient.bean.UserInfoBean + +data class LoginResultBean( + var token: String = "", + var userInfo: UserInfoBean = UserInfoBean() +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/BillRecordBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/BillRecordBean.kt new file mode 100644 index 0000000..2b3b352 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/BillRecordBean.kt @@ -0,0 +1,34 @@ +package com.yxjk.healthexpertclient.bean.mine + +data class BillRecordBean( + var accountMoney: String? = "", + var charDate: String? = "", + var createBy: String? = "", + var createTime: String? = "", + var delFlag: Int = 0, + var id: Int = 0, + var income: String = "", + var incomeTime: String? = "", + var memo: String? = "", + var operateId: String? = "", + var operateName: String? = "", + var operateType: String? = "", + var paymentAccount: String? = "", + var paymentMoney: String? = "", + var paymentName: String? = "", + var paymentTime: String? = "", + var realityMoney: String? = "", + var remarks: String? = "", + var sessionId: String? = "", + var status: Int = 0, + var sumIncome: String? = "", + var sumPaymentMoney: String? = "", + var updateBy: String? = "", + var updateTime: String? = "", + var userId: String? = "", + var userName: String? = "", + var withdraw: String? = "", + var withdrawalName: String? = "", + var waterType: String = "", //1是收益 2是支出 + var operateTypeName: String = "" + ) diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/CommonSettingMenuBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/CommonSettingMenuBean.kt new file mode 100644 index 0000000..8025465 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/CommonSettingMenuBean.kt @@ -0,0 +1,13 @@ +package com.yxjk.healthexpertclient.bean.mine + +import com.btpj.lib_base.base.adapter.BaseCheckRecycleViewAdapter + +/** + * 暂停原因 + */ +data class CommonSettingMenuBean( + val value: String, + val text: String, + override val itemType: Int = -1, + override var checked: Boolean = false +): BaseCheckRecycleViewAdapter.CheckItem diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/ConsultStatisticsBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/ConsultStatisticsBean.kt new file mode 100644 index 0000000..34e1bdf --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/ConsultStatisticsBean.kt @@ -0,0 +1,7 @@ +package com.yxjk.healthexpertclient.bean.mine + +data class ConsultStatisticsBean( + var sumIncome: String = "", + var sumPaymentMoney: String = "", + var unsettled: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/ConsultTypeBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/ConsultTypeBean.kt new file mode 100644 index 0000000..e708c1c --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/ConsultTypeBean.kt @@ -0,0 +1,8 @@ +package com.yxjk.healthexpertclient.bean.mine + +data class ConsultTypeBean( + var completed: Int = 0, + var content_type: String = "", + var inProgress: Int = 0, + var total: Int = 0 +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/DiseaseBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/DiseaseBean.kt new file mode 100644 index 0000000..e1e616b --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/DiseaseBean.kt @@ -0,0 +1,15 @@ +package com.yxjk.healthexpertclient.bean.mine + +import android.os.Parcelable +import com.btpj.lib_base.base.adapter.BaseCheckRecycleViewAdapter +import kotlinx.android.parcel.Parcelize + +@Parcelize +data class DiseaseBean( + var departmentId: String = "", + var descript: String = "", + var id: String = "", + var sicksName: String = "", + override val itemType: Int = -1, + override var checked: Boolean = false +): BaseCheckRecycleViewAdapter.CheckItem, Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/DoctorBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/DoctorBean.kt new file mode 100644 index 0000000..eed4f28 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/DoctorBean.kt @@ -0,0 +1,54 @@ +package com.yxjk.healthexpertclient.bean.mine + +/** + * 专家信息实体 + */ +data class DoctorBean( + var address: String? = null, + var award: String? = null, + var contactAddress: String? = null, + var createBy: String? = null, + var createTime: String? = null, + var degreeHeat: String? = null, + var delFlag: Int = 0, + var departmentId: String = "", + var departmentName: String? = null, + var doctorJob: String = "", + var doctorLabel: String? = null, + var doctorName: String = "", + var doctorStatus: String = "", + var doctorTitle: String = "", + var eq: String? = null, + var experience: String = "", + var gdId: String = "", + var goodAt: String = "", + var goodAtSymptom: String = "", + var healthStatus: String? = null, + var id: String = "", + var introduction: String? = null, + var isAccept: String = "", + var joinWork: String? = null, + var memo: String? = null, + var messageNum: String? = null, + var nationality: String? = null, + var nativePlace: String? = null, + var onDutyTime: String? = null, + var outTime: String? = null, + var overallMerit: String? = null, + var photo: String? = null, + var replyNum: String? = null, + var resourceId: String = "", + var resourceName: String? = null, + var responseRate: String? = null, + var school: String? = null, + var sort: String = "", + var status: Int = 0, + var tfRecommend: String = "", + var type: String = "", + var updateBy: String? = null, + var updateTime: String? = null, + var userScore: String = "", + var userScoreNum: String = "", + var goodAtSickness: String? = "", + var goodAtSicknessName: MutableList? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/PageManagerBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/PageManagerBean.kt new file mode 100644 index 0000000..649b66d --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/PageManagerBean.kt @@ -0,0 +1,9 @@ +package com.yxjk.healthexpertclient.bean.mine + +data class PageManagerBean( + var current: Int = 0, + var pages: Int = 0, + var records: MutableList = mutableListOf(), + var size: Int = 0, + var total: Int = 0 +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SchedulingBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SchedulingBean.kt new file mode 100644 index 0000000..d6c28b2 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SchedulingBean.kt @@ -0,0 +1,17 @@ +package com.yxjk.healthexpertclient.bean.mine + +import com.btpj.lib_base.base.adapter.BaseCheckRecycleViewAdapter + +data class SchedulingBean( + var amNum: String? = "0", + var id: String? = "", + var pmNum: String? = "0", + var tfJumpHoliday: String? = "", + var type: String? = "", + var week: String? = "", + var timePeriod: Int = 0, + var tfDefault: String? = "", + var consultSwitchOn: Boolean = true, + override val itemType: Int = -1, + override var checked: Boolean = false +): BaseCheckRecycleViewAdapter.CheckItem diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SchedulingResultBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SchedulingResultBean.kt new file mode 100644 index 0000000..2c51349 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SchedulingResultBean.kt @@ -0,0 +1,8 @@ +package com.yxjk.healthexpertclient.bean.mine + +data class SchedulingResultBean( + var list: MutableList, + var tfJumpHoliday: String, + var tfDefault: String, + var audioStatus: String +) diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SuspensionServiceBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SuspensionServiceBean.kt new file mode 100644 index 0000000..ed5170f --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/mine/SuspensionServiceBean.kt @@ -0,0 +1,24 @@ +package com.yxjk.healthexpertclient.bean.mine + +import com.chad.library.adapter.base.entity.SectionEntity + +data class SuspensionServiceBean( + var createBy: String? = "", + var createTime: String? = "", + var delFlag: Int? = 0, + var doctorId: String? = "", + var doctorName: String? = "", + var endDay: String? = "", + var id: String? = "", + var memo: String? = "", + var notice: String? = "", + var serviceStatus: Int? = 0, + var startDay: String? = "", + var status: Int? = null, + var stopReason: String? = "", + var updateBy: String? = "", + var updateTime: String? = "", + var startDayLong: Long = 0, + var endDayLong: Long = 0, + override val isHeader: Boolean = false + ): SectionEntity diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/other/UserListBean.java b/app/src/main/java/com/yxjk/healthexpertclient/bean/other/UserListBean.java new file mode 100644 index 0000000..5f86a1e --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/other/UserListBean.java @@ -0,0 +1,1577 @@ +package com.yxjk.healthexpertclient.bean.other; + +import java.util.ArrayList; +import java.util.List; + +public class UserListBean { + + private List records=new ArrayList<>(); + private Integer total; + private Integer size; + private Integer current; + private Integer pages; + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public Integer getCurrent() { + return current; + } + + public void setCurrent(Integer current) { + this.current = current; + } + + public Integer getPages() { + return pages; + } + + public void setPages(Integer pages) { + this.pages = pages; + } + + public static class RecordsDTO { + private boolean isReal=false; + private String id; + private String username; + private String realname; + private String avatar; + private String birthday; + private Integer age; + private String sex; + private String sex_dictText; + private Object email; + private String phone=""; + private String orgCode=""; + private Object orgCodeThree; + private Integer loginTenantId; + private String status; + private String status_dictText; + private Integer delFlag; + private String workNo; + private Object post; + private Object telephone; + private Object createBy; + private String createTime; + private Object updateBy; + private String updateTime; + private Object activitiSync; + private Object userIdentity; + private Object departIds; + private Object departCodes; + private String relTenantIds; + private Object clientId; + private Object homePath; + private Object postText; + private Object bpmStatus; + private String idCard=""; + private Object postageCode; + private String userGroup; + private String userGroupUpdateTime; + private String personType; + private String personType_dictText; + private List departTree; + private SecondDepartDTO secondDepart; + private ThreeDepartDTO threeDepart; + private DepartDTO depart; + private Object postId; + private Object roleCodes; + private Integer familyNum; + private Object client; + private String orgCodeTxt; + + public boolean isReal() { + return isReal; + } + + public void setReal(boolean real) { + isReal = real; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getRealname() { + return realname; + } + + public void setRealname(String realname) { + this.realname = realname; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getBirthday() { + return birthday; + } + + public void setBirthday(String birthday) { + this.birthday = birthday; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getSex_dictText() { + return sex_dictText; + } + + public void setSex_dictText(String sex_dictText) { + this.sex_dictText = sex_dictText; + } + + public Object getEmail() { + return email; + } + + public void setEmail(Object email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getOrgCode() { + return orgCode; + } + + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + public Object getOrgCodeThree() { + return orgCodeThree; + } + + public void setOrgCodeThree(Object orgCodeThree) { + this.orgCodeThree = orgCodeThree; + } + + public Integer getLoginTenantId() { + return loginTenantId; + } + + public void setLoginTenantId(Integer loginTenantId) { + this.loginTenantId = loginTenantId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatus_dictText() { + return status_dictText; + } + + public void setStatus_dictText(String status_dictText) { + this.status_dictText = status_dictText; + } + + public Integer getDelFlag() { + return delFlag; + } + + public void setDelFlag(Integer delFlag) { + this.delFlag = delFlag; + } + + public String getWorkNo() { + return workNo; + } + + public void setWorkNo(String workNo) { + this.workNo = workNo; + } + + public Object getPost() { + return post; + } + + public void setPost(Object post) { + this.post = post; + } + + public Object getTelephone() { + return telephone; + } + + public void setTelephone(Object telephone) { + this.telephone = telephone; + } + + public Object getCreateBy() { + return createBy; + } + + public void setCreateBy(Object createBy) { + this.createBy = createBy; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Object getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(Object updateBy) { + this.updateBy = updateBy; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public Object getActivitiSync() { + return activitiSync; + } + + public void setActivitiSync(Object activitiSync) { + this.activitiSync = activitiSync; + } + + public Object getUserIdentity() { + return userIdentity; + } + + public void setUserIdentity(Object userIdentity) { + this.userIdentity = userIdentity; + } + + public Object getDepartIds() { + return departIds; + } + + public void setDepartIds(Object departIds) { + this.departIds = departIds; + } + + public Object getDepartCodes() { + return departCodes; + } + + public void setDepartCodes(Object departCodes) { + this.departCodes = departCodes; + } + + public String getRelTenantIds() { + return relTenantIds; + } + + public void setRelTenantIds(String relTenantIds) { + this.relTenantIds = relTenantIds; + } + + public Object getClientId() { + return clientId; + } + + public void setClientId(Object clientId) { + this.clientId = clientId; + } + + public Object getHomePath() { + return homePath; + } + + public void setHomePath(Object homePath) { + this.homePath = homePath; + } + + public Object getPostText() { + return postText; + } + + public void setPostText(Object postText) { + this.postText = postText; + } + + public Object getBpmStatus() { + return bpmStatus; + } + + public void setBpmStatus(Object bpmStatus) { + this.bpmStatus = bpmStatus; + } + + public String getIdCard() { + return idCard==null?"":idCard; + } + + public void setIdCard(String idCard) { + this.idCard = idCard; + } + + public Object getPostageCode() { + return postageCode; + } + + public void setPostageCode(Object postageCode) { + this.postageCode = postageCode; + } + + public String getUserGroup() { + return userGroup; + } + + public void setUserGroup(String userGroup) { + this.userGroup = userGroup; + } + + public String getUserGroupUpdateTime() { + return userGroupUpdateTime; + } + + public void setUserGroupUpdateTime(String userGroupUpdateTime) { + this.userGroupUpdateTime = userGroupUpdateTime; + } + + public String getPersonType() { + return personType; + } + + public void setPersonType(String personType) { + this.personType = personType; + } + + public String getPersonType_dictText() { + return personType_dictText; + } + + public void setPersonType_dictText(String personType_dictText) { + this.personType_dictText = personType_dictText; + } + + public List getDepartTree() { + return departTree; + } + + public void setDepartTree(List departTree) { + this.departTree = departTree; + } + + public SecondDepartDTO getSecondDepart() { + return secondDepart; + } + + public void setSecondDepart(SecondDepartDTO secondDepart) { + this.secondDepart = secondDepart; + } + + public ThreeDepartDTO getThreeDepart() { + return threeDepart; + } + + public void setThreeDepart(ThreeDepartDTO threeDepart) { + this.threeDepart = threeDepart; + } + + public DepartDTO getDepart() { + return depart; + } + + public void setDepart(DepartDTO depart) { + this.depart = depart; + } + + public Object getPostId() { + return postId; + } + + public void setPostId(Object postId) { + this.postId = postId; + } + + public Object getRoleCodes() { + return roleCodes; + } + + public void setRoleCodes(Object roleCodes) { + this.roleCodes = roleCodes; + } + + public Integer getFamilyNum() { + return familyNum; + } + + public void setFamilyNum(Integer familyNum) { + this.familyNum = familyNum; + } + + public Object getClient() { + return client; + } + + public void setClient(Object client) { + this.client = client; + } + + public String getOrgCodeTxt() { + return orgCodeTxt; + } + + public void setOrgCodeTxt(String orgCodeTxt) { + this.orgCodeTxt = orgCodeTxt; + } + + public static class SecondDepartDTO { + private String id; + private String parentId; + private String departName; + private Object departNameEn; + private Object departNameAbbr; + private Integer departOrder; + private Object description; + private String orgCategory; + private String orgType; + private String orgCode; + private String orgClass; + private String orgClass_dictText; + private Object mobile; + private Object fax; + private Object address; + private Object healthManageUserName; + private Object healthManageUserMobile; + private Object healthManageUserAddress; + private Object medialManageUserName; + private Object medialManageUserMobile; + private Object medialManageUserAddress; + private Object monitorManageUserName; + private Object monitorManageUserMobile; + private Object memo; + private String status; + private String status_dictText; + private String delFlag; + private String delFlag_dictText; + private Object qywxIdentifier; + private Object createBy; + private String createTime; + private Object updateBy; + private Object updateTime; + private Object lng; + private Object lat; + private Integer tenantId; + private Integer izLeaf; + private Object manager; + private Object directorUserIds; + private Object oldDirectorUserIds; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getDepartName() { + return departName; + } + + public void setDepartName(String departName) { + this.departName = departName; + } + + public Object getDepartNameEn() { + return departNameEn; + } + + public void setDepartNameEn(Object departNameEn) { + this.departNameEn = departNameEn; + } + + public Object getDepartNameAbbr() { + return departNameAbbr; + } + + public void setDepartNameAbbr(Object departNameAbbr) { + this.departNameAbbr = departNameAbbr; + } + + public Integer getDepartOrder() { + return departOrder; + } + + public void setDepartOrder(Integer departOrder) { + this.departOrder = departOrder; + } + + public Object getDescription() { + return description; + } + + public void setDescription(Object description) { + this.description = description; + } + + public String getOrgCategory() { + return orgCategory; + } + + public void setOrgCategory(String orgCategory) { + this.orgCategory = orgCategory; + } + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + public String getOrgCode() { + return orgCode; + } + + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + public String getOrgClass() { + return orgClass; + } + + public void setOrgClass(String orgClass) { + this.orgClass = orgClass; + } + + public String getOrgClass_dictText() { + return orgClass_dictText; + } + + public void setOrgClass_dictText(String orgClass_dictText) { + this.orgClass_dictText = orgClass_dictText; + } + + public Object getMobile() { + return mobile; + } + + public void setMobile(Object mobile) { + this.mobile = mobile; + } + + public Object getFax() { + return fax; + } + + public void setFax(Object fax) { + this.fax = fax; + } + + public Object getAddress() { + return address; + } + + public void setAddress(Object address) { + this.address = address; + } + + public Object getHealthManageUserName() { + return healthManageUserName; + } + + public void setHealthManageUserName(Object healthManageUserName) { + this.healthManageUserName = healthManageUserName; + } + + public Object getHealthManageUserMobile() { + return healthManageUserMobile; + } + + public void setHealthManageUserMobile(Object healthManageUserMobile) { + this.healthManageUserMobile = healthManageUserMobile; + } + + public Object getHealthManageUserAddress() { + return healthManageUserAddress; + } + + public void setHealthManageUserAddress(Object healthManageUserAddress) { + this.healthManageUserAddress = healthManageUserAddress; + } + + public Object getMedialManageUserName() { + return medialManageUserName; + } + + public void setMedialManageUserName(Object medialManageUserName) { + this.medialManageUserName = medialManageUserName; + } + + public Object getMedialManageUserMobile() { + return medialManageUserMobile; + } + + public void setMedialManageUserMobile(Object medialManageUserMobile) { + this.medialManageUserMobile = medialManageUserMobile; + } + + public Object getMedialManageUserAddress() { + return medialManageUserAddress; + } + + public void setMedialManageUserAddress(Object medialManageUserAddress) { + this.medialManageUserAddress = medialManageUserAddress; + } + + public Object getMonitorManageUserName() { + return monitorManageUserName; + } + + public void setMonitorManageUserName(Object monitorManageUserName) { + this.monitorManageUserName = monitorManageUserName; + } + + public Object getMonitorManageUserMobile() { + return monitorManageUserMobile; + } + + public void setMonitorManageUserMobile(Object monitorManageUserMobile) { + this.monitorManageUserMobile = monitorManageUserMobile; + } + + public Object getMemo() { + return memo; + } + + public void setMemo(Object memo) { + this.memo = memo; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatus_dictText() { + return status_dictText; + } + + public void setStatus_dictText(String status_dictText) { + this.status_dictText = status_dictText; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDelFlag_dictText() { + return delFlag_dictText; + } + + public void setDelFlag_dictText(String delFlag_dictText) { + this.delFlag_dictText = delFlag_dictText; + } + + public Object getQywxIdentifier() { + return qywxIdentifier; + } + + public void setQywxIdentifier(Object qywxIdentifier) { + this.qywxIdentifier = qywxIdentifier; + } + + public Object getCreateBy() { + return createBy; + } + + public void setCreateBy(Object createBy) { + this.createBy = createBy; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Object getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(Object updateBy) { + this.updateBy = updateBy; + } + + public Object getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Object updateTime) { + this.updateTime = updateTime; + } + + public Object getLng() { + return lng; + } + + public void setLng(Object lng) { + this.lng = lng; + } + + public Object getLat() { + return lat; + } + + public void setLat(Object lat) { + this.lat = lat; + } + + public Integer getTenantId() { + return tenantId; + } + + public void setTenantId(Integer tenantId) { + this.tenantId = tenantId; + } + + public Integer getIzLeaf() { + return izLeaf; + } + + public void setIzLeaf(Integer izLeaf) { + this.izLeaf = izLeaf; + } + + public Object getManager() { + return manager; + } + + public void setManager(Object manager) { + this.manager = manager; + } + + public Object getDirectorUserIds() { + return directorUserIds; + } + + public void setDirectorUserIds(Object directorUserIds) { + this.directorUserIds = directorUserIds; + } + + public Object getOldDirectorUserIds() { + return oldDirectorUserIds; + } + + public void setOldDirectorUserIds(Object oldDirectorUserIds) { + this.oldDirectorUserIds = oldDirectorUserIds; + } + } + + public static class ThreeDepartDTO { + private String id; + private String parentId; + private String departName; + private Object departNameEn; + private Object departNameAbbr; + private Object departOrder; + private Object description; + private String orgCategory; + private String orgType; + private String orgCode; + private String orgClass; + private String orgClass_dictText; + private Object mobile; + private Object fax; + private Object address; + private Object healthManageUserName; + private Object healthManageUserMobile; + private Object healthManageUserAddress; + private Object medialManageUserName; + private Object medialManageUserMobile; + private Object medialManageUserAddress; + private Object monitorManageUserName; + private Object monitorManageUserMobile; + private Object memo; + private String status; + private String status_dictText; + private String delFlag; + private String delFlag_dictText; + private Object qywxIdentifier; + private Object createBy; + private String createTime; + private Object updateBy; + private Object updateTime; + private Object lng; + private Object lat; + private Integer tenantId; + private Integer izLeaf; + private Object manager; + private Object directorUserIds; + private Object oldDirectorUserIds; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getDepartName() { + return departName; + } + + public void setDepartName(String departName) { + this.departName = departName; + } + + public Object getDepartNameEn() { + return departNameEn; + } + + public void setDepartNameEn(Object departNameEn) { + this.departNameEn = departNameEn; + } + + public Object getDepartNameAbbr() { + return departNameAbbr; + } + + public void setDepartNameAbbr(Object departNameAbbr) { + this.departNameAbbr = departNameAbbr; + } + + public Object getDepartOrder() { + return departOrder; + } + + public void setDepartOrder(Object departOrder) { + this.departOrder = departOrder; + } + + public Object getDescription() { + return description; + } + + public void setDescription(Object description) { + this.description = description; + } + + public String getOrgCategory() { + return orgCategory; + } + + public void setOrgCategory(String orgCategory) { + this.orgCategory = orgCategory; + } + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + public String getOrgCode() { + return orgCode; + } + + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + public String getOrgClass() { + return orgClass; + } + + public void setOrgClass(String orgClass) { + this.orgClass = orgClass; + } + + public String getOrgClass_dictText() { + return orgClass_dictText; + } + + public void setOrgClass_dictText(String orgClass_dictText) { + this.orgClass_dictText = orgClass_dictText; + } + + public Object getMobile() { + return mobile; + } + + public void setMobile(Object mobile) { + this.mobile = mobile; + } + + public Object getFax() { + return fax; + } + + public void setFax(Object fax) { + this.fax = fax; + } + + public Object getAddress() { + return address; + } + + public void setAddress(Object address) { + this.address = address; + } + + public Object getHealthManageUserName() { + return healthManageUserName; + } + + public void setHealthManageUserName(Object healthManageUserName) { + this.healthManageUserName = healthManageUserName; + } + + public Object getHealthManageUserMobile() { + return healthManageUserMobile; + } + + public void setHealthManageUserMobile(Object healthManageUserMobile) { + this.healthManageUserMobile = healthManageUserMobile; + } + + public Object getHealthManageUserAddress() { + return healthManageUserAddress; + } + + public void setHealthManageUserAddress(Object healthManageUserAddress) { + this.healthManageUserAddress = healthManageUserAddress; + } + + public Object getMedialManageUserName() { + return medialManageUserName; + } + + public void setMedialManageUserName(Object medialManageUserName) { + this.medialManageUserName = medialManageUserName; + } + + public Object getMedialManageUserMobile() { + return medialManageUserMobile; + } + + public void setMedialManageUserMobile(Object medialManageUserMobile) { + this.medialManageUserMobile = medialManageUserMobile; + } + + public Object getMedialManageUserAddress() { + return medialManageUserAddress; + } + + public void setMedialManageUserAddress(Object medialManageUserAddress) { + this.medialManageUserAddress = medialManageUserAddress; + } + + public Object getMonitorManageUserName() { + return monitorManageUserName; + } + + public void setMonitorManageUserName(Object monitorManageUserName) { + this.monitorManageUserName = monitorManageUserName; + } + + public Object getMonitorManageUserMobile() { + return monitorManageUserMobile; + } + + public void setMonitorManageUserMobile(Object monitorManageUserMobile) { + this.monitorManageUserMobile = monitorManageUserMobile; + } + + public Object getMemo() { + return memo; + } + + public void setMemo(Object memo) { + this.memo = memo; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatus_dictText() { + return status_dictText; + } + + public void setStatus_dictText(String status_dictText) { + this.status_dictText = status_dictText; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDelFlag_dictText() { + return delFlag_dictText; + } + + public void setDelFlag_dictText(String delFlag_dictText) { + this.delFlag_dictText = delFlag_dictText; + } + + public Object getQywxIdentifier() { + return qywxIdentifier; + } + + public void setQywxIdentifier(Object qywxIdentifier) { + this.qywxIdentifier = qywxIdentifier; + } + + public Object getCreateBy() { + return createBy; + } + + public void setCreateBy(Object createBy) { + this.createBy = createBy; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Object getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(Object updateBy) { + this.updateBy = updateBy; + } + + public Object getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Object updateTime) { + this.updateTime = updateTime; + } + + public Object getLng() { + return lng; + } + + public void setLng(Object lng) { + this.lng = lng; + } + + public Object getLat() { + return lat; + } + + public void setLat(Object lat) { + this.lat = lat; + } + + public Integer getTenantId() { + return tenantId; + } + + public void setTenantId(Integer tenantId) { + this.tenantId = tenantId; + } + + public Integer getIzLeaf() { + return izLeaf; + } + + public void setIzLeaf(Integer izLeaf) { + this.izLeaf = izLeaf; + } + + public Object getManager() { + return manager; + } + + public void setManager(Object manager) { + this.manager = manager; + } + + public Object getDirectorUserIds() { + return directorUserIds; + } + + public void setDirectorUserIds(Object directorUserIds) { + this.directorUserIds = directorUserIds; + } + + public Object getOldDirectorUserIds() { + return oldDirectorUserIds; + } + + public void setOldDirectorUserIds(Object oldDirectorUserIds) { + this.oldDirectorUserIds = oldDirectorUserIds; + } + } + + public static class DepartDTO { + private String id; + private String parentId; + private String departName; + private Object departNameEn; + private Object departNameAbbr; + private Object departOrder; + private Object description; + private String orgCategory; + private String orgType; + private String orgCode; + private String orgClass; + private String orgClass_dictText; + private Object mobile; + private Object fax; + private Object address; + private Object healthManageUserName; + private Object healthManageUserMobile; + private Object healthManageUserAddress; + private Object medialManageUserName; + private Object medialManageUserMobile; + private Object medialManageUserAddress; + private Object monitorManageUserName; + private Object monitorManageUserMobile; + private Object memo; + private String status; + private String status_dictText; + private String delFlag; + private String delFlag_dictText; + private Object qywxIdentifier; + private Object createBy; + private String createTime; + private Object updateBy; + private Object updateTime; + private Object lng; + private Object lat; + private Integer tenantId; + private Integer izLeaf; + private Object manager; + private Object directorUserIds; + private Object oldDirectorUserIds; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getDepartName() { + return departName; + } + + public void setDepartName(String departName) { + this.departName = departName; + } + + public Object getDepartNameEn() { + return departNameEn; + } + + public void setDepartNameEn(Object departNameEn) { + this.departNameEn = departNameEn; + } + + public Object getDepartNameAbbr() { + return departNameAbbr; + } + + public void setDepartNameAbbr(Object departNameAbbr) { + this.departNameAbbr = departNameAbbr; + } + + public Object getDepartOrder() { + return departOrder; + } + + public void setDepartOrder(Object departOrder) { + this.departOrder = departOrder; + } + + public Object getDescription() { + return description; + } + + public void setDescription(Object description) { + this.description = description; + } + + public String getOrgCategory() { + return orgCategory; + } + + public void setOrgCategory(String orgCategory) { + this.orgCategory = orgCategory; + } + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + public String getOrgCode() { + return orgCode; + } + + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + public String getOrgClass() { + return orgClass; + } + + public void setOrgClass(String orgClass) { + this.orgClass = orgClass; + } + + public String getOrgClass_dictText() { + return orgClass_dictText; + } + + public void setOrgClass_dictText(String orgClass_dictText) { + this.orgClass_dictText = orgClass_dictText; + } + + public Object getMobile() { + return mobile; + } + + public void setMobile(Object mobile) { + this.mobile = mobile; + } + + public Object getFax() { + return fax; + } + + public void setFax(Object fax) { + this.fax = fax; + } + + public Object getAddress() { + return address; + } + + public void setAddress(Object address) { + this.address = address; + } + + public Object getHealthManageUserName() { + return healthManageUserName; + } + + public void setHealthManageUserName(Object healthManageUserName) { + this.healthManageUserName = healthManageUserName; + } + + public Object getHealthManageUserMobile() { + return healthManageUserMobile; + } + + public void setHealthManageUserMobile(Object healthManageUserMobile) { + this.healthManageUserMobile = healthManageUserMobile; + } + + public Object getHealthManageUserAddress() { + return healthManageUserAddress; + } + + public void setHealthManageUserAddress(Object healthManageUserAddress) { + this.healthManageUserAddress = healthManageUserAddress; + } + + public Object getMedialManageUserName() { + return medialManageUserName; + } + + public void setMedialManageUserName(Object medialManageUserName) { + this.medialManageUserName = medialManageUserName; + } + + public Object getMedialManageUserMobile() { + return medialManageUserMobile; + } + + public void setMedialManageUserMobile(Object medialManageUserMobile) { + this.medialManageUserMobile = medialManageUserMobile; + } + + public Object getMedialManageUserAddress() { + return medialManageUserAddress; + } + + public void setMedialManageUserAddress(Object medialManageUserAddress) { + this.medialManageUserAddress = medialManageUserAddress; + } + + public Object getMonitorManageUserName() { + return monitorManageUserName; + } + + public void setMonitorManageUserName(Object monitorManageUserName) { + this.monitorManageUserName = monitorManageUserName; + } + + public Object getMonitorManageUserMobile() { + return monitorManageUserMobile; + } + + public void setMonitorManageUserMobile(Object monitorManageUserMobile) { + this.monitorManageUserMobile = monitorManageUserMobile; + } + + public Object getMemo() { + return memo; + } + + public void setMemo(Object memo) { + this.memo = memo; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatus_dictText() { + return status_dictText; + } + + public void setStatus_dictText(String status_dictText) { + this.status_dictText = status_dictText; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDelFlag_dictText() { + return delFlag_dictText; + } + + public void setDelFlag_dictText(String delFlag_dictText) { + this.delFlag_dictText = delFlag_dictText; + } + + public Object getQywxIdentifier() { + return qywxIdentifier; + } + + public void setQywxIdentifier(Object qywxIdentifier) { + this.qywxIdentifier = qywxIdentifier; + } + + public Object getCreateBy() { + return createBy; + } + + public void setCreateBy(Object createBy) { + this.createBy = createBy; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Object getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(Object updateBy) { + this.updateBy = updateBy; + } + + public Object getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Object updateTime) { + this.updateTime = updateTime; + } + + public Object getLng() { + return lng; + } + + public void setLng(Object lng) { + this.lng = lng; + } + + public Object getLat() { + return lat; + } + + public void setLat(Object lat) { + this.lat = lat; + } + + public Integer getTenantId() { + return tenantId; + } + + public void setTenantId(Integer tenantId) { + this.tenantId = tenantId; + } + + public Integer getIzLeaf() { + return izLeaf; + } + + public void setIzLeaf(Integer izLeaf) { + this.izLeaf = izLeaf; + } + + public Object getManager() { + return manager; + } + + public void setManager(Object manager) { + this.manager = manager; + } + + public Object getDirectorUserIds() { + return directorUserIds; + } + + public void setDirectorUserIds(Object directorUserIds) { + this.directorUserIds = directorUserIds; + } + + public Object getOldDirectorUserIds() { + return oldDirectorUserIds; + } + + public void setOldDirectorUserIds(Object oldDirectorUserIds) { + this.oldDirectorUserIds = oldDirectorUserIds; + } + } + } +} diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/AppointmentBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/AppointmentBean.kt new file mode 100644 index 0000000..d70e133 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/AppointmentBean.kt @@ -0,0 +1,46 @@ +package com.yxjk.healthexpertclient.bean.workbench + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class AppointmentBean( + val amPm: String = "", + val charDate: String = "", + val contentStatus: String = "", + val contentType: String = "", + val cost: String = "", + val createBy: String = "", + val createTime: String = "", + val delFlag: String = "", + val doctorEndTime: String = "", + val doctorStartTime: String = "", + val endTime: String = "", + val fromAccount: String = "", + val fromName: String = "", + val id: String = "", + val imId: String = "", + val jobStatus: String = "", + val medicalRecordsId: String = "", + val memberAge: String = "", + val memberId: String = "", + val memberName: String = "", + val memberSex: String = "", + val memo: String = "", + val reasonType: String = "", + val rejectReason: String = "", + val reservationTime: String = "", + val schedulingDateId: String = "", + val sessionDate: String = "", + val sessionStatus: String = "", + val sessionTime: String = "", + val sessionType: String = "", + val status: String = "", + val thirdAccount: String = "", + val thirdName: String = "", + val toAccount: String = "", + val toName: String = "", + val updateBy: String = "", + val updateTime: String = "", + val week: String = "" +): Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ArchivesBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ArchivesBean.kt new file mode 100644 index 0000000..f10fb19 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ArchivesBean.kt @@ -0,0 +1,24 @@ +package com.yxjk.healthexpertclient.bean.workbench + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class ArchivesBean( + val id: String? = null, + var medicalDescribe: String = "", + var recordsName: String = "", + val createTime: String = "", + val createTimeLong: Long = 0, + var tfPermission: String? = null, + var haveTime: String? = null, + var haveTimeValue: String? = null, + var desire: String = "", + var tfLook: String? = null, + var lookOffice: String? = null, + var tfLookValue: String? = null, + var lookMedicalName: String? = null, + var image: String = "", + var updateTime : String? = null, + var memberId: String? = null +): Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ArchivesDetailResultBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ArchivesDetailResultBean.kt new file mode 100644 index 0000000..0cfb17a --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ArchivesDetailResultBean.kt @@ -0,0 +1,12 @@ +package com.yxjk.healthexpertclient.bean.workbench + +/** + * @author nanfeifei + * @time 2023/6/20 13:35 + * @description + */ +class ArchivesDetailResultBean ( + var answer: MutableList? = mutableListOf(), + var conMedicalRecordsDO: ArchivesBean? = null, + var conFamilyMembersDO: ConsultInfoBean? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/AudioVideoCallBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/AudioVideoCallBean.kt new file mode 100644 index 0000000..c5fe7c4 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/AudioVideoCallBean.kt @@ -0,0 +1,15 @@ +package com.yxjk.healthexpertclient.bean.workbench + + +import com.google.gson.annotations.SerializedName + +data class AudioVideoCallBean( + @SerializedName("groupId") + var groupId: String = "", + @SerializedName("member") + var member: List = listOf(), + @SerializedName("userId") + var userId: String = "", + @SerializedName("videoSessionId") + var videoSessionId: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CallTimeBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CallTimeBean.kt new file mode 100644 index 0000000..372eef3 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CallTimeBean.kt @@ -0,0 +1,15 @@ +package com.yxjk.healthexpertclient.bean.workbench + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class CallTimeBean( + val createTime: String = "", + val endTime: String = "", + val createTimeLong: Long? = null, + val endTimeLong: Long?= null, + var startTime: String = "", + var startTimLong: Long? = null, + val type: String = "" +): Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckItemBySfzhTotalBean.java b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckItemBySfzhTotalBean.java new file mode 100644 index 0000000..f7e9672 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckItemBySfzhTotalBean.java @@ -0,0 +1,522 @@ +package com.yxjk.healthexpertclient.bean.workbench; + +import java.io.Serializable; +import java.util.List; + +/** + * @author nanfeifei 有问题找梁文杰咨询,复制的 + */ +public class CheckItemBySfzhTotalBean implements Serializable { + + private SuggestionInfoDTO conclusionInfo; + private SuggestionInfoDTO suggestionInfo; + private Integer normalCount; + private List resultList; + private Integer unusualCount; + + public SuggestionInfoDTO getConclusionInfo() { + return conclusionInfo; + } + + public void setConclusionInfo(SuggestionInfoDTO conclusionInfo) { + this.conclusionInfo = conclusionInfo; + } + + public SuggestionInfoDTO getSuggestionInfo() { + return suggestionInfo; + } + + public void setSuggestionInfo(SuggestionInfoDTO suggestionInfo) { + this.suggestionInfo = suggestionInfo; + } + + public Integer getNormalCount() { + return normalCount; + } + + public void setNormalCount(Integer normalCount) { + this.normalCount = normalCount; + } + + public List getResultList() { + return resultList; + } + + public void setResultList(List resultList) { + this.resultList = resultList; + } + + public Integer getUnusualCount() { + return unusualCount; + } + + public void setUnusualCount(Integer unusualCount) { + this.unusualCount = unusualCount; + } + + + public static class SuggestionInfoDTO implements Serializable { + private Object id; + private String cqbh; + private String cqbhBak; + private String cqmc; + private Object cqckz; + private String xmz; + private String jcms; + private String xmdw; + private Object officeIds; + private Boolean exceptionFlag; + private Boolean newX; + private Boolean show; + + public Object getId() { + return id; + } + + public void setId(Object id) { + this.id = id; + } + + public String getCqbh() { + return cqbh; + } + + public void setCqbh(String cqbh) { + this.cqbh = cqbh; + } + + public String getCqbhBak() { + return cqbhBak; + } + + public void setCqbhBak(String cqbhBak) { + this.cqbhBak = cqbhBak; + } + + public String getCqmc() { + return cqmc; + } + + public void setCqmc(String cqmc) { + this.cqmc = cqmc; + } + + public Object getCqckz() { + return cqckz; + } + + public void setCqckz(Object cqckz) { + this.cqckz = cqckz; + } + + public String getXmz() { + return xmz; + } + + public void setXmz(String xmz) { + this.xmz = xmz; + } + + public String getJcms() { + return jcms; + } + + public void setJcms(String jcms) { + this.jcms = jcms; + } + + public String getXmdw() { + return xmdw; + } + + public void setXmdw(String xmdw) { + this.xmdw = xmdw; + } + + public Object getOfficeIds() { + return officeIds; + } + + public void setOfficeIds(Object officeIds) { + this.officeIds = officeIds; + } + + public Boolean getExceptionFlag() { + return exceptionFlag; + } + + public void setExceptionFlag(Boolean exceptionFlag) { + this.exceptionFlag = exceptionFlag; + } + + public Boolean getNewX() { + return newX; + } + + public void setNewX(Boolean newX) { + this.newX = newX; + } + + public Boolean getShow() { + return show; + } + + public void setShow(Boolean show) { + this.show = show; + } + } + + public static class ResultListDTO implements Serializable { + private Object id; + private String cqbh; + private String cqbhBak; + private String cqmc; + private Object cqckz; + private Object xmz; + private Object jcms; + private Object xmdw; + private Object officeIds; + private List childlist; + private Boolean exceptionFlag; + private Boolean newX; + private Boolean show; + + public Object getId() { + return id; + } + + public void setId(Object id) { + this.id = id; + } + + public String getCqbh() { + return cqbh; + } + + public void setCqbh(String cqbh) { + this.cqbh = cqbh; + } + + public String getCqbhBak() { + return cqbhBak; + } + + public void setCqbhBak(String cqbhBak) { + this.cqbhBak = cqbhBak; + } + + public String getCqmc() { + return cqmc; + } + + public void setCqmc(String cqmc) { + this.cqmc = cqmc; + } + + public Object getCqckz() { + return cqckz; + } + + public void setCqckz(Object cqckz) { + this.cqckz = cqckz; + } + + public Object getXmz() { + return xmz; + } + + public void setXmz(Object xmz) { + this.xmz = xmz; + } + + public Object getJcms() { + return jcms; + } + + public void setJcms(Object jcms) { + this.jcms = jcms; + } + + public Object getXmdw() { + return xmdw; + } + + public void setXmdw(Object xmdw) { + this.xmdw = xmdw; + } + + public Object getOfficeIds() { + return officeIds; + } + + public void setOfficeIds(Object officeIds) { + this.officeIds = officeIds; + } + + public List getChildlist() { + return childlist; + } + + public void setChildlist(List childlist) { + this.childlist = childlist; + } + + public Boolean getExceptionFlag() { + return exceptionFlag; + } + + public void setExceptionFlag(Boolean exceptionFlag) { + this.exceptionFlag = exceptionFlag; + } + + public Boolean getNewX() { + return newX; + } + + public void setNewX(Boolean newX) { + this.newX = newX; + } + + public Boolean getShow() { + return show; + } + + public void setShow(Boolean show) { + this.show = show; + } + + public static class ChildlistDTO implements Serializable { + private Object id; + private String cqbh; + private String cqbhBak; + private String cqmc; + private String cqckz; + private String xmz; + private String jcms; + private String xmdw; + private Object officeIds; + private List childlist; + private Boolean exceptionFlag; + private Boolean newX; + private Boolean show; + + public Object getId() { + return id; + } + + public void setId(Object id) { + this.id = id; + } + + public String getCqbh() { + return cqbh; + } + + public void setCqbh(String cqbh) { + this.cqbh = cqbh; + } + + public String getCqbhBak() { + return cqbhBak; + } + + public void setCqbhBak(String cqbhBak) { + this.cqbhBak = cqbhBak; + } + + public String getCqmc() { + return cqmc; + } + + public void setCqmc(String cqmc) { + this.cqmc = cqmc; + } + + public String getCqckz() { + return cqckz; + } + + public void setCqckz(String cqckz) { + this.cqckz = cqckz; + } + + public String getXmz() { + return xmz; + } + + public void setXmz(String xmz) { + this.xmz = xmz; + } + + public String getJcms() { + return jcms; + } + + public void setJcms(String jcms) { + this.jcms = jcms; + } + + public String getXmdw() { + return xmdw; + } + + public void setXmdw(String xmdw) { + this.xmdw = xmdw; + } + + public Object getOfficeIds() { + return officeIds; + } + + public void setOfficeIds(Object officeIds) { + this.officeIds = officeIds; + } + + public List getChildlist() { + return childlist; + } + + public void setChildlist(List childlist) { + this.childlist = childlist; + } + + public Boolean getExceptionFlag() { + return exceptionFlag; + } + + public void setExceptionFlag(Boolean exceptionFlag) { + this.exceptionFlag = exceptionFlag; + } + + public Boolean getNewX() { + return newX; + } + + public void setNewX(Boolean newX) { + this.newX = newX; + } + + public Boolean getShow() { + return show; + } + + public void setShow(Boolean show) { + this.show = show; + } + + } + + public static class ChildlistDTO2 implements Serializable { + private Object id; + private String cqbh; + private String cqbhBak; + private String cqmc; + private String cqckz; + private String xmz; + private String jcms; + private String xmdw; + private Object officeIds; + private Boolean exceptionFlag; + private Boolean newX; + private Boolean show; + + public Object getId() { + return id; + } + + public void setId(Object id) { + this.id = id; + } + + public String getCqbh() { + return cqbh; + } + + public void setCqbh(String cqbh) { + this.cqbh = cqbh; + } + + public String getCqbhBak() { + return cqbhBak; + } + + public void setCqbhBak(String cqbhBak) { + this.cqbhBak = cqbhBak; + } + + public String getCqmc() { + return cqmc; + } + + public void setCqmc(String cqmc) { + this.cqmc = cqmc; + } + + public String getCqckz() { + return cqckz; + } + + public void setCqckz(String cqckz) { + this.cqckz = cqckz; + } + + public String getXmz() { + return xmz; + } + + public void setXmz(String xmz) { + this.xmz = xmz; + } + + public String getJcms() { + return jcms; + } + + public void setJcms(String jcms) { + this.jcms = jcms; + } + + public String getXmdw() { + return xmdw; + } + + public void setXmdw(String xmdw) { + this.xmdw = xmdw; + } + + public Object getOfficeIds() { + return officeIds; + } + + public void setOfficeIds(Object officeIds) { + this.officeIds = officeIds; + } + + + public Boolean getExceptionFlag() { + return exceptionFlag; + } + + public void setExceptionFlag(Boolean exceptionFlag) { + this.exceptionFlag = exceptionFlag; + } + + public Boolean getNewX() { + return newX; + } + + public void setNewX(Boolean newX) { + this.newX = newX; + } + + public Boolean getShow() { + return show; + } + + public void setShow(Boolean show) { + this.show = show; + } + + } + } +} diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckRecordUserInfoBean.java b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckRecordUserInfoBean.java new file mode 100644 index 0000000..e144d9f --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckRecordUserInfoBean.java @@ -0,0 +1,167 @@ +package com.yxjk.healthexpertclient.bean.workbench; + +import java.util.ArrayList; +/** + * 体检报告结果使用,copy自用户端 + */ + +public class CheckRecordUserInfoBean { + + private String id; + private String userId; + private String userName; + private String sex; + private String sex_dictText; + private String age; + private String card; + private String mobilePhone; + private String email; + private String empNativeplace; + private String peQueueDate; + private String empBirthday; + private String conclusion; + private String suggest; + private String medicalYear; + private String hospitalName; + private ArrayList resultItemResList; + + public String getHospitalName() { + return hospitalName == null ? "" : hospitalName; + } + + public void setHospitalName(String hospitalName) { + this.hospitalName = hospitalName; + } + + public ArrayList getResultItemResList() { + if (resultItemResList == null) { + return new ArrayList<>(); + } + return resultItemResList; + } + + public void setResultItemResList(ArrayList resultItemResList) { + this.resultItemResList = resultItemResList; + } + + public String getId() { + return id == null ? "" : id; + } + + public void setId(String id) { + this.id = id; + } + + public String getUserId() { + return userId == null ? "" : userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName == null ? "" : userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getSex() { + return sex == null ? "" : sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getSex_dictText() { + return sex_dictText == null ? "" : sex_dictText; + } + + public void setSex_dictText(String sex_dictText) { + this.sex_dictText = sex_dictText; + } + + public String getAge() { + return age == null ? "" : age; + } + + public void setAge(String age) { + this.age = age; + } + + public String getCard() { + return card == null ? "" : card; + } + + public void setCard(String card) { + this.card = card; + } + + public String getMobilePhone() { + return mobilePhone == null ? "" : mobilePhone; + } + + public void setMobilePhone(String mobilePhone) { + this.mobilePhone = mobilePhone; + } + + public String getEmail() { + return email == null ? "" : email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getEmpNativeplace() { + return empNativeplace == null ? "" : empNativeplace; + } + + public void setEmpNativeplace(String empNativeplace) { + this.empNativeplace = empNativeplace; + } + + public String getPeQueueDate() { + return peQueueDate == null ? "" : peQueueDate; + } + + public void setPeQueueDate(String peQueueDate) { + this.peQueueDate = peQueueDate; + } + + public String getEmpBirthday() { + return empBirthday == null ? "" : empBirthday; + } + + public void setEmpBirthday(String empBirthday) { + this.empBirthday = empBirthday; + } + + public String getConclusion() { + return conclusion == null ? "" : conclusion; + } + + public void setConclusion(String conclusion) { + this.conclusion = conclusion; + } + + public String getSuggest() { + return suggest == null ? "" : suggest; + } + + public void setSuggest(String suggest) { + this.suggest = suggest; + } + + public String getMedicalYear() { + return medicalYear == null ? "" : medicalYear; + } + + public void setMedicalYear(String medicalYear) { + this.medicalYear = medicalYear; + } + +} diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckUpDetailListBean.java b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckUpDetailListBean.java new file mode 100644 index 0000000..5216cf0 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/CheckUpDetailListBean.java @@ -0,0 +1,190 @@ +package com.yxjk.healthexpertclient.bean.workbench; + +import java.util.List; + +public class CheckUpDetailListBean { + private String cqmc; + private String cqbh; + private String cqbhBak; + private String cqmcChild; + private String cqbhChild; + private String cqbhBakChild; + private List list; + + public String getCqmc() { + return cqmc; + } + + public void setCqmc(String cqmc) { + this.cqmc = cqmc; + } + + public String getCqbh() { + return cqbh; + } + + public void setCqbh(String cqbh) { + this.cqbh = cqbh; + } + + public String getCqbhBak() { + return cqbhBak; + } + + public void setCqbhBak(String cqbhBak) { + this.cqbhBak = cqbhBak; + } + + public String getCqmcChild() { + return cqmcChild; + } + + public void setCqmcChild(String cqmcChild) { + this.cqmcChild = cqmcChild; + } + + public String getCqbhChild() { + return cqbhChild; + } + + public void setCqbhChild(String cqbhChild) { + this.cqbhChild = cqbhChild; + } + + public String getCqbhBakChild() { + return cqbhBakChild; + } + + public void setCqbhBakChild(String cqbhBakChild) { + this.cqbhBakChild = cqbhBakChild; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public static class CheckUpDetailListChildBean { + private Object id; + private String cqbh; + private String cqbhBak; + private String cqmc; + private String cqckz; + private String xmz; + private String jcms; + private String xmdw; + private Object officeIds; + private List childlist; + private Boolean exceptionFlag=false; + private Boolean newX; + private Boolean show; + + public Object getId() { + return id; + } + + public void setId(Object id) { + this.id = id; + } + + public String getCqbh() { + return cqbh; + } + + public void setCqbh(String cqbh) { + this.cqbh = cqbh; + } + + public String getCqbhBak() { + return cqbhBak; + } + + public void setCqbhBak(String cqbhBak) { + this.cqbhBak = cqbhBak; + } + + public String getCqmc() { + return cqmc; + } + + public void setCqmc(String cqmc) { + this.cqmc = cqmc; + } + + public String getCqckz() { + return cqckz; + } + + public void setCqckz(String cqckz) { + this.cqckz = cqckz; + } + + public String getXmz() { + return xmz; + } + + public void setXmz(String xmz) { + this.xmz = xmz; + } + + public String getJcms() { + return jcms; + } + + public void setJcms(String jcms) { + this.jcms = jcms; + } + + public String getXmdw() { + return xmdw; + } + + public void setXmdw(String xmdw) { + this.xmdw = xmdw; + } + + public Object getOfficeIds() { + return officeIds; + } + + public void setOfficeIds(Object officeIds) { + this.officeIds = officeIds; + } + + public List getChildlist() { + return childlist; + } + + public void setChildlist(List childlist) { + this.childlist = childlist; + } + + public Boolean getExceptionFlag() { + return exceptionFlag; + } + + public void setExceptionFlag(Boolean exceptionFlag) { + this.exceptionFlag = exceptionFlag; + } + + public Boolean getNewX() { + return newX; + } + + public void setNewX(Boolean newX) { + this.newX = newX; + } + + public Boolean getShow() { + return show; + } + + public void setShow(Boolean show) { + this.show = show; + } + + } +} diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultDetailBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultDetailBean.kt new file mode 100644 index 0000000..46f8af8 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultDetailBean.kt @@ -0,0 +1,15 @@ +package com.yxjk.healthexpertclient.bean.workbench + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class ConsultDetailBean( + var answer: MutableList? = mutableListOf(), + var conFamilyMembersDO: ConsultInfoBean? = ConsultInfoBean(), + var conMedicalRecordsListDO: ArchivesBean? = ArchivesBean(), + var conSession: ConsultRecordBean? = ConsultRecordBean(), + var createTime: Long = 0, + var idNo: String? = null, + var imList: MutableList? = mutableListOf() +): Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultInfoBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultInfoBean.kt new file mode 100644 index 0000000..765185b --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultInfoBean.kt @@ -0,0 +1,19 @@ +package com.yxjk.healthexpertclient.bean.workbench + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +/** + * 咨询人相关信息 + */ +@Parcelize +data class ConsultInfoBean( + val birthday: String = "", + val familyRelation: String = "", + val gender: String = "", + val height: String = "", + val id: String = "", + val name: String = "", + val weight: String = "", + val age: String = "" +): Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultRecordBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultRecordBean.kt new file mode 100644 index 0000000..e4985d2 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ConsultRecordBean.kt @@ -0,0 +1,31 @@ +package com.yxjk.healthexpertclient.bean.workbench + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +/** + * 咨询记录相关信息 + */ +@Parcelize +data class ConsultRecordBean( + val doctorEndTime: String? = "", + val doctorStartTime: String? = "", + val doctorEndTimeLong: Long? = null, + val doctorStartTimeLong: Long? = null, + val sessionDateLong: Long? = null, + val week: String? = "", + val amPm: String? = "", + val id: String? = "", + val imId: String? = "", + val memberAge: String? = "", + val memberId: String? = "", + val memberName: String? = "", + val memberSex: String? = "", + val createTime: String? = "", + var unreadCount: Int = 0, + val contentStatus: String? = "", //预约状态 1待确认 2待开始 3已开始 4待评价 5完成 6拒绝 7取消 + val contentType: String? = "", //咨询类型:1图文咨询 2音视频咨询 + val reasonType: String? = "", //拒绝原因 + val rejectReason: String? = "", //拒绝的备注 + var fromAccount: String? = null +) : Parcelable diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/HealthInfoBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/HealthInfoBean.kt new file mode 100644 index 0000000..94a8f99 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/HealthInfoBean.kt @@ -0,0 +1,10 @@ +package com.yxjk.healthexpertclient.bean.workbench + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class HealthInfoBean( + val answerKey: String, + val answerValue: String +): Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/MessageBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/MessageBean.kt new file mode 100644 index 0000000..c8bd25c --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/MessageBean.kt @@ -0,0 +1,21 @@ +package com.yxjk.healthexpertclient.bean.workbench + +data class MessageBean( + var contentType: String? = null, + var createBy: String = "", + var createTime: String = "", + var delFlag: String = "", + var endTime: String = "", + var fromAccount: String = "", + var groupId: String = "", + var id: String = "", + var memo: String = "", + var msgContent: String = "", + var msgSeq: String = "", + var msgType: String = "", + var sendTime: String = "", + var status: String = "", + var toAccount: String = "", + var updateBy: String = "", + var updateTime: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/PhysicalExaminationReportBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/PhysicalExaminationReportBean.kt new file mode 100644 index 0000000..38ccbdd --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/PhysicalExaminationReportBean.kt @@ -0,0 +1,18 @@ +package com.yxjk.healthexpertclient.bean.workbench + +import com.google.gson.annotations.SerializedName + +/** + * 体检报告(字段命名骂后台就行) + */ +data class PhysicalExaminationReportBean( + var id: String = "", + @SerializedName("peQueueDate") + var insertdate: String = "", //体检记录生成时间 + @SerializedName("userName") + var name: String = "", //体检人姓名 + @SerializedName("hospitalName") + var yymc: String = "", //体检地点 + @SerializedName("medicalYear") + var tjrq: String = "" //体检日期 +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/RefuseReasonBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/RefuseReasonBean.kt new file mode 100644 index 0000000..b46b6aa --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/RefuseReasonBean.kt @@ -0,0 +1,6 @@ +package com.yxjk.healthexpertclient.bean.workbench + +data class RefuseReasonBean( + val value: String, + val text: String + ) diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ResultItemListBean.java b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ResultItemListBean.java new file mode 100644 index 0000000..4611712 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/ResultItemListBean.java @@ -0,0 +1,178 @@ +package com.yxjk.healthexpertclient.bean.workbench; + +import java.util.List; + +/** + * 体检报告结果使用,copy自用户端 + */ +public class ResultItemListBean { + + private String analysisId; + private String analysisName; + private List senResultRes; + + public String getAnalysisId() { + return analysisId; + } + + public void setAnalysisId(String analysisId) { + this.analysisId = analysisId; + } + + public String getAnalysisName() { + return analysisName == null ? "" : analysisName; + } + + public void setAnalysisName(String analysisName) { + this.analysisName = analysisName; + } + + public List getSenResultRes() { + return senResultRes; + } + + public void setSenResultRes(List senResultRes) { + this.senResultRes = senResultRes; + } + + public static class SenResultResDTO { + private String uniItemClassId; + private String uniItemClassName; + private List thirdResultRes; + + public String getUniItemClassId() { + return uniItemClassId; + } + + public void setUniItemClassId(String uniItemClassId) { + this.uniItemClassId = uniItemClassId; + } + + public String getUniItemClassName() { + return uniItemClassName; + } + + public void setUniItemClassName(String uniItemClassName) { + this.uniItemClassName = uniItemClassName; + } + + public List getThirdResultRes() { + return thirdResultRes; + } + + public void setThirdResultRes(List thirdResultRes) { + this.thirdResultRes = thirdResultRes; + } + + public static class ThirdResultResDTO { + private Object userResultId; + private String id; + private String peItemName; + private Object uniItemId; + private String printContext; + private String peResult; + private String unit; + private String colour; + private Object uniItemClassId; + private Object uniItemClassName; + private Object analysisId; + private Object analysisName; + + public String getColour() { + return colour == null ? "" : colour; + } + + public void setColour(String colour) { + this.colour = colour; + } + + public Object getUserResultId() { + return userResultId; + } + + public void setUserResultId(Object userResultId) { + this.userResultId = userResultId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getPeItemName() { + return peItemName; + } + + public void setPeItemName(String peItemName) { + this.peItemName = peItemName; + } + + public Object getUniItemId() { + return uniItemId; + } + + public void setUniItemId(Object uniItemId) { + this.uniItemId = uniItemId; + } + + public String getPrintContext() { + return printContext; + } + + public void setPrintContext(String printContext) { + this.printContext = printContext; + } + + public String getPeResult() { + return peResult; + } + + public void setPeResult(String peResult) { + this.peResult = peResult; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + public Object getUniItemClassId() { + return uniItemClassId; + } + + public void setUniItemClassId(Object uniItemClassId) { + this.uniItemClassId = uniItemClassId; + } + + public Object getUniItemClassName() { + return uniItemClassName; + } + + public void setUniItemClassName(Object uniItemClassName) { + this.uniItemClassName = uniItemClassName; + } + + public Object getAnalysisId() { + return analysisId; + } + + public void setAnalysisId(Object analysisId) { + this.analysisId = analysisId; + } + + public Object getAnalysisName() { + return analysisName; + } + + public void setAnalysisName(Object analysisName) { + this.analysisName = analysisName; + } + } + } +} diff --git a/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/WorkBenchConsultNumBean.kt b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/WorkBenchConsultNumBean.kt new file mode 100644 index 0000000..fb2e9dd --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/bean/workbench/WorkBenchConsultNumBean.kt @@ -0,0 +1,19 @@ +package com.yxjk.healthexpertclient.bean.workbench + + +import com.google.gson.annotations.SerializedName + +class WorkBenchConsultNumBean( + @SerializedName("pictureFinish") + var pictureFinish: String = "", + @SerializedName("pictureIng") + var pictureIng: String = "", + @SerializedName("pictureUnReply") + var pictureUnReply: String = "", + @SerializedName("videoFinish") + var videoFinish: String = "", + @SerializedName("videoIng") + var videoIng: String = "", + @SerializedName("videoUnReply") + var videoUnReply: String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/data/api/IMApi.kt b/app/src/main/java/com/yxjk/healthexpertclient/data/api/IMApi.kt new file mode 100644 index 0000000..7d8a5d6 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/data/api/IMApi.kt @@ -0,0 +1,14 @@ +package com.yxjk.healthexpertclient.data.api + +import com.btpj.lib_base.data.bean.ApiResponse +import com.yxjk.healthexpertclient.bean.im.IMInfoBean +import retrofit2.http.GET + +interface IMApi { + /** + * 获取IM登录Sig + */ + @GET("/health-im/wnapp/userSigAndroid") + suspend fun getIMSig(): ApiResponse + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/data/api/LoginApi.kt b/app/src/main/java/com/yxjk/healthexpertclient/data/api/LoginApi.kt new file mode 100644 index 0000000..d95355b --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/data/api/LoginApi.kt @@ -0,0 +1,37 @@ +package com.yxjk.healthexpertclient.data.api + +import com.btpj.lib_base.data.bean.ApiResponse +import com.yxjk.healthexpertclient.bean.CommonSettingMenuBean +import com.yxjk.healthexpertclient.bean.login.LoginResultBean +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.QueryMap + +interface LoginApi { + /** + * 登录接口 + */ + @POST("/health-consultation/conDoctor/loginDoctor") +// @POST("/sys/mLogin") + suspend fun login(@Body requestBody: RequestBody): ApiResponse + + /** + * 校验用户信息 + */ + @POST("health-system/api/anon/sys/checkUser") + suspend fun checkUserInfo(@Body requestBody: RequestBody): ApiResponse + + /** + * 修改密码 + */ + @POST("health-system/api/anon/sys/resetUserPwd") + suspend fun resetUserPwd(@Body requestBody: RequestBody): ApiResponse + + /** + * 获取后台配置的菜单(例如:咨询人中与本人的关系) + */ + @GET("/health-consultation/api/consult/conDoctor/selectDictList") + suspend fun getCommonSettingMenuList(@QueryMap params: MutableMap): ApiResponse> +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/data/api/MineApi.kt b/app/src/main/java/com/yxjk/healthexpertclient/data/api/MineApi.kt new file mode 100644 index 0000000..a953ff3 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/data/api/MineApi.kt @@ -0,0 +1,126 @@ +package com.yxjk.healthexpertclient.data.api + +import com.btpj.lib_base.data.bean.ApiResponse +import com.yxjk.healthexpertclient.bean.UploadFileResultBean +import com.yxjk.healthexpertclient.bean.im.IMAssistantBean +import com.yxjk.healthexpertclient.bean.mine.BillRecordBean +import com.yxjk.healthexpertclient.bean.mine.CommonSettingMenuBean +import com.yxjk.healthexpertclient.bean.mine.ConsultStatisticsBean +import com.yxjk.healthexpertclient.bean.mine.ConsultTypeBean +import com.yxjk.healthexpertclient.bean.mine.DiseaseBean +import com.yxjk.healthexpertclient.bean.mine.DoctorBean +import com.yxjk.healthexpertclient.bean.mine.PageManagerBean +import com.yxjk.healthexpertclient.bean.mine.SchedulingResultBean +import com.yxjk.healthexpertclient.bean.mine.SuspensionServiceBean +import okhttp3.MultipartBody +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Multipart +import retrofit2.http.POST +import retrofit2.http.PUT +import retrofit2.http.Part +import retrofit2.http.QueryMap + +interface MineApi { + /** + * 获取专家信息 + */ + @GET("/health-consultation/api/consult/conDoctor/queryDoctor") + suspend fun getDoctorInfo(): ApiResponse + /** + * 修改专家信息 + */ + @POST("/health-consultation/api/consult/conDoctor/update") + suspend fun editDoctorInfo(@Body requestBody: RequestBody): ApiResponse + + /** + * 查询医生排班 + */ + @GET("/health-consultation/api/consult/conDoctorScheduling/selectDoctorScheduling") + suspend fun getDoctorScheduling(@QueryMap params: MutableMap): ApiResponse + /** + * 一次性插入排班 + */ + @POST("/health-consultation/api/consult/conDoctorScheduling/insertDoctorScheduling") + suspend fun createDoctorScheduling(@Body requestBody: RequestBody): ApiResponse + /** + * 单条插入排班 + */ + @POST("/health-consultation/api/consult/conDoctorScheduling/insertDoctorSchedulingSingle") + suspend fun createDoctorCustomScheduling(@Body requestBody: RequestBody): ApiResponse + + /** + * 修改密码 + */ + @PUT("/health-consultation/api/consult/conDoctor/updatePassword") + suspend fun editPassword(@Body requestBody: RequestBody): ApiResponse + + /** + * 账单明细 + */ + @GET("/health-consultation/api/consult/conCostStatistics/findlistpage") + suspend fun getBillRecord(@QueryMap params: MutableMap): ApiResponse> + /** + * 账单详情 + */ + @GET("/health-consultation/api/consult/conCostStatistics/queryById") + suspend fun getBillDetail(@QueryMap params: MutableMap): ApiResponse + /** + * 收益统计 + */ + @GET("/health-consultation/api/consult/conCostStatistics/getStatistics") + suspend fun getConsultStatistics(): ApiResponse + /** + * 咨询方式统计(按月) + */ + @GET("/health-consultation/api/consult/conCostStatistics/groupByTypehList") + suspend fun getConsultTypeData(@QueryMap params: MutableMap): ApiResponse> + /** + * 暂停服务记录 + */ + @GET("/health-consultation/api/consult/conService/list") + suspend fun getSuspensionServiceList(@QueryMap params: MutableMap): ApiResponse> + /** + * 停止暂定服务 + */ + @POST("/health-consultation/api/consult/conService/edit") + suspend fun stopSuspensionService(@Body requestBody: RequestBody): ApiResponse + /** + * 添加暂定服务 + */ + @POST("/health-consultation/api/consult/conService/add") + suspend fun addSuspensionService(@Body requestBody: RequestBody): ApiResponse + /** + * 获取后台配置的功能列表(例如:医生暂停服务原因列表) + */ + @GET("/health-consultation/api/consult/conDoctor/selectDictList") + suspend fun getCommonSettingMenuList(@QueryMap params: MutableMap): ApiResponse> + /** + * 获取指定时间范围内存在的咨询单 + */ + @GET("/health-consultation/api/consult/conSession/selectSessionVideoExistDoctor") + suspend fun getDateRangeConsultNum(@QueryMap params: MutableMap): ApiResponse + /** + * 上传文件 + */ + @Multipart + @POST("/sys/upload/uploadFile") + suspend fun uploadFile(@Part part: MultipartBody.Part, @Part("biz") path: RequestBody): ApiResponse + /** + * 更像头像 + */ + @POST("/sys/user/updateUserAvatar") + suspend fun uploadHeadImage(@QueryMap params: MutableMap): ApiResponse + /** + * 获取医生可选擅长疾病 + */ + @GET("/health-consultation/api/consult/conSicks/selectSickListByDepartmentIdDoctorSearch") + suspend fun getDoctorGoodAtDisease(@QueryMap params: MutableMap): ApiResponse> + /** + * 咨询小助手 + */ + @GET("health-consultation/api/consult/conSession/insertProfessorAndHelperSession") + suspend fun submitAssistantConsultApply(): ApiResponse + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/data/api/OtherApi.kt b/app/src/main/java/com/yxjk/healthexpertclient/data/api/OtherApi.kt new file mode 100644 index 0000000..7c4b49d --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/data/api/OtherApi.kt @@ -0,0 +1,58 @@ +package com.yxjk.healthexpertclient.data.api + +import com.btpj.lib_base.data.bean.ApiResponse +import com.yxjk.healthexpertclient.bean.AppUpdateBean +import com.yxjk.healthexpertclient.bean.other.UserListBean +import com.yxjk.healthexpertclient.bean.workbench.ArchivesDetailResultBean +import com.yxjk.healthexpertclient.bean.workbench.AudioVideoCallBean +import com.yxjk.healthexpertclient.bean.workbench.CheckRecordUserInfoBean +import com.yxjk.healthexpertclient.bean.workbench.ConsultDetailBean +import com.yxjk.healthexpertclient.bean.workbench.ConsultRecordBean +import com.yxjk.healthexpertclient.bean.workbench.HealthInfoBean +import com.yxjk.healthexpertclient.bean.workbench.MessageBean +import com.yxjk.healthexpertclient.bean.workbench.PhysicalExaminationReportBean +import com.yxjk.healthexpertclient.bean.workbench.RefuseReasonBean +import com.yxjk.healthexpertclient.bean.workbench.WorkBenchConsultNumBean +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.FieldMap +import retrofit2.http.FormUrlEncoded +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.QueryMap + +/** + * @author nanfeifei + * @time 2023/5/24 15:08 + * @description 工作台接口定义 + */ +interface OtherApi { + /** + * 获取模拟用户列表 + */ + @GET("/health-system/sys/user/listAll") + suspend fun listAll(@QueryMap params: MutableMap): ApiResponse + /** + * 模拟用户信息 + */ + @FormUrlEncoded + @POST("/health-system/test/fake") + suspend fun fake(@FieldMap params: MutableMap): ApiResponse + /** + * 获取模拟用户信息 + */ + @POST("/health-system/test/fakeUser") + suspend fun fakeUser(@Body requestBody: RequestBody): ApiResponse + /** + * 重置模拟 + */ + @POST("/health-system/test/restore") + suspend fun restore(@Body requestBody: RequestBody): ApiResponse + + /** + * 校验token是否过期 + */ + @GET("/health-consultation/api/consult/msgRecord/selectTokenExpire") + suspend fun selectTokenExpire(@QueryMap params: MutableMap): ApiResponse + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/data/api/WorkbenchApi.kt b/app/src/main/java/com/yxjk/healthexpertclient/data/api/WorkbenchApi.kt new file mode 100644 index 0000000..89d3bec --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/data/api/WorkbenchApi.kt @@ -0,0 +1,139 @@ +package com.yxjk.healthexpertclient.data.api + +import com.btpj.lib_base.data.bean.ApiResponse +import com.yxjk.healthexpertclient.bean.AppUpdateBean +import com.yxjk.healthexpertclient.bean.workbench.ArchivesDetailResultBean +import com.yxjk.healthexpertclient.bean.workbench.AudioVideoCallBean +import com.yxjk.healthexpertclient.bean.workbench.CheckRecordUserInfoBean +import com.yxjk.healthexpertclient.bean.workbench.ConsultDetailBean +import com.yxjk.healthexpertclient.bean.workbench.ConsultRecordBean +import com.yxjk.healthexpertclient.bean.workbench.HealthInfoBean +import com.yxjk.healthexpertclient.bean.workbench.MessageBean +import com.yxjk.healthexpertclient.bean.workbench.PhysicalExaminationReportBean +import com.yxjk.healthexpertclient.bean.workbench.RefuseReasonBean +import com.yxjk.healthexpertclient.bean.workbench.WorkBenchConsultNumBean +import okhttp3.RequestBody +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.QueryMap + +/** + * @author nanfeifei + * @time 2023/5/24 15:08 + * @description 工作台接口定义 + */ +interface WorkbenchApi { + /** + * 获取咨询记录(当前登录人专家的咨询列表) + */ + @GET("/health-consultation/api/consult/conSession/selectSessionListByDoctorIdNew") + suspend fun getConsultRecord(@QueryMap params: MutableMap): ApiResponse> + /** + * 获取咨询记录(某个用户(员工)的咨询历史记录) + */ + @GET("/health-consultation/api/consult/conSession/sessionDetailDoctorSearch") + suspend fun getConsultHistory(@QueryMap params: MutableMap): ApiResponse> + /** + * 图文咨询详情 + */ + @GET("/health-consultation/api/consult/conSession/sessionDetailDoctor") + suspend fun getImageTextConsultDetail(@QueryMap params: MutableMap): ApiResponse + /** + * 音视频咨询详情 + */ + @GET("/health-consultation/api/consult/conSession/sessionDetailDoctorAll") + suspend fun getAudioVideoConsultDetail(@QueryMap params: MutableMap): ApiResponse + /** + * 医生接受会话的原因 + */ + @GET("/health-consultation/api/consult/conSession/selectRejectReason") + suspend fun getRefusalAudioVideoCallReason(): ApiResponse> + /** + * 医生拒绝会话 + */ + @GET("/health-consultation/api/consult/conSession/sessionReject") + suspend fun refusalAudioVideoCall(@QueryMap params: MutableMap): ApiResponse + /** + * 医生接受会话 + */ + @GET("/health-consultation/api/consult/conSession/sessionConfirm") + suspend fun acceptAudioVideoCall(@QueryMap params: MutableMap): ApiResponse + /** + * 医生发起会话 + */ + @GET("/health-consultation/api/consult/conSessionVideoInfo/startVideoSession") + suspend fun initiateAudioVideoCall(@QueryMap params: MutableMap): ApiResponse + /** + * 查询档案详情 + */ + @GET("/health-consultation/api/consult/medicalRecords/selectConMedicalRecordsByIdDoctor") + suspend fun getArchivesDetail(@QueryMap params: MutableMap): ApiResponse + /** + * 查询体检报告 + */ + @GET("/health-archives/historyReport/selectNewHealthReport") + suspend fun getPhysicalExaminationReport(@QueryMap params: MutableMap): ApiResponse + /** + * 获取音视频咨询未处理消息数 + */ + @GET("/health-consultation/api/consult/ ") + suspend fun getAudioVideoUnreadNum(@QueryMap params: MutableMap): ApiResponse + /** + * 通过IM会话列表匹配对应的图文咨询列表 + */ + @POST("/health-consultation/api/consult/conSession/selectSessionByImIdNewNew") + suspend fun getImageTextConsultRecord(@Body requestBody: RequestBody): ApiResponse> + /** + * 获取用户基本健康信息 + */ + @GET("/health-consultation/api/consult/healthInfo/selectHealthInfoDoctor") + suspend fun getBaseHealthInfo(@QueryMap params: MutableMap): ApiResponse> + /** + * 查询体检信息(这里复制的用户端的) + */ +// @GET("cqyt/middleController/getCheckItemBySfzhTotal") +// suspend fun getCheckItemBySfzhTotal(@Query("sfzh") sfzh:String, @Query("tjrq") tjrq:String, @Query("type") type:String=""): ApiResponse + @GET("health-archives/historyReport/getHistoryReportById") + suspend fun getHistoryReportNoDetail(@QueryMap params: MutableMap): ApiResponse + /** + * 结束咨询 + */ + @GET("/health-consultation/api/consult/conSession/finishSession") + suspend fun finishConsult(@QueryMap params: MutableMap): ApiResponse + /** + * 音视频通话之后再次预约时间 + */ + @GET("/health-consultation/api/consult/sessionReservationDate/sessionReservationDate") + suspend fun againAppointmentDateTime(@QueryMap params: MutableMap): ApiResponse + /** + * 音视频通话开始 + */ + @GET("/health-consultation/api/consult/sessionReservationDate/sessionReservationDate") + suspend fun audioVideoCallStart(@QueryMap params: MutableMap): ApiResponse + /** + * 音视频通话结束 + */ + @GET("/health-consultation/api/consult/sessionReservationDate/endPhone") + suspend fun audioVideoCallEnd(@QueryMap params: MutableMap): ApiResponse + /** + * 首页咨询数量获取 + */ + @GET("/health-consultation/api/consult/conSession/selectSessionProfessorIngNew") + suspend fun getWorkBenchConsultNum(): ApiResponse + /** + * 获取当前咨询中的小助手信息 + */ + @GET("/health-consultation/api/consult/conSession/insertProfessorAndHelperSessionShow") + suspend fun getConsultAssistantInfo(): ApiResponse + /** + * 获取消息列表 + */ + @POST("/health-consultation/api/consult/msgRecord/selectMsgRecordList") + suspend fun getMessageList(@Body requestBody: RequestBody): ApiResponse> + /** + * 检查更新 + */ + @GET("/health-system/version/getSysVersionDetailByPackageName") + suspend fun getAppUpdateInfo(@QueryMap params: MutableMap): ApiResponse +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/data/repository/IMRepository.kt b/app/src/main/java/com/yxjk/healthexpertclient/data/repository/IMRepository.kt new file mode 100644 index 0000000..c42809c --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/data/repository/IMRepository.kt @@ -0,0 +1,17 @@ +package com.yxjk.healthexpertclient.data.repository + +import com.btpj.lib_base.data.bean.ApiResponse +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.yxjk.healthexpertclient.bean.im.IMInfoBean +import com.yxjk.healthexpertclient.data.api.IMApi + +object IMRepository: BaseRepository() { + private val service by lazy { RetrofitManager.getService(IMApi::class.java) } + suspend fun getIMSig(): ApiResponse { + return apiCall { service.getIMSig() } + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/data/repository/LoginRepository.kt b/app/src/main/java/com/yxjk/healthexpertclient/data/repository/LoginRepository.kt new file mode 100644 index 0000000..094389c --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/data/repository/LoginRepository.kt @@ -0,0 +1,53 @@ +package com.yxjk.healthexpertclient.data.repository + +import com.btpj.lib_base.data.bean.ApiResponse +import com.btpj.lib_base.ext.toJson +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.btpj.lib_base.http.RetrofitManager.toRequestBody +import com.yxjk.healthexpertclient.bean.CommonSettingMenuBean +import com.yxjk.healthexpertclient.bean.login.LoginResultBean +import com.yxjk.healthexpertclient.data.api.LoginApi +import com.yxjk.healthexpertclient.utils.DevicesInfoUtils + +object LoginRepository: BaseRepository() { + private val service by lazy { RetrofitManager.getService(LoginApi::class.java) } + suspend fun login(account: String, password: String): ApiResponse { + val params = mutableMapOf() + params["deviceType"] = "${DevicesInfoUtils.getDeviceBrand()}" + params["deviceSystem"] = "${DevicesInfoUtils.getDeviceModel()}(Android${DevicesInfoUtils.getDeviceAndroidVersion()})" + params["username"] = account + params["password"] = password + return apiCall { service.login(params.toJson().toRequestBody()) } + } + + /** + * 校验用户信息 + */ + suspend fun checkUserInfo(realname:String,idCard:String,phone:String): ApiResponse { + return apiCall { + val map = mutableMapOf() + map.put("realname",realname) + map.put("idCard",idCard) + map.put("phone",phone) + service.checkUserInfo(map.toJson().toRequestBody()) + } + } + /** + * 修改密码 + */ + suspend fun resetUserPwd(newPassword:String,newPasswordConfirm:String,resetCode:String): ApiResponse { + return apiCall { + val map = mutableMapOf() + map.put("newPassword",newPassword) + map.put("newPasswordConfirm",newPasswordConfirm) + map.put("resetCode",resetCode) + service.resetUserPwd(map.toJson().toRequestBody()) + } + } + suspend fun getCommonSettingMenuList(menuKey: String): ApiResponse> { + val params = mutableMapOf() + params["dictKey"] = menuKey + return apiCall { service.getCommonSettingMenuList(params)} + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/data/repository/MineRepository.kt b/app/src/main/java/com/yxjk/healthexpertclient/data/repository/MineRepository.kt new file mode 100644 index 0000000..311acb7 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/data/repository/MineRepository.kt @@ -0,0 +1,150 @@ +package com.yxjk.healthexpertclient.data.repository + +import com.btpj.lib_base.data.bean.ApiResponse +import com.btpj.lib_base.ext.toJson +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.btpj.lib_base.http.RetrofitManager.toRequestBody +import com.yxjk.healthexpertclient.bean.UploadFileResultBean +import com.yxjk.healthexpertclient.bean.im.IMAssistantBean +import com.yxjk.healthexpertclient.bean.mine.BillRecordBean +import com.yxjk.healthexpertclient.bean.mine.CommonSettingMenuBean +import com.yxjk.healthexpertclient.bean.mine.ConsultStatisticsBean +import com.yxjk.healthexpertclient.bean.mine.ConsultTypeBean +import com.yxjk.healthexpertclient.bean.mine.DiseaseBean +import com.yxjk.healthexpertclient.bean.mine.DoctorBean +import com.yxjk.healthexpertclient.bean.mine.PageManagerBean +import com.yxjk.healthexpertclient.bean.mine.SchedulingBean +import com.yxjk.healthexpertclient.bean.mine.SchedulingResultBean +import com.yxjk.healthexpertclient.bean.mine.SuspensionServiceBean +import com.yxjk.healthexpertclient.data.api.MineApi +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import java.io.File + + +object MineRepository : BaseRepository() { + private val service by lazy { RetrofitManager.getService(MineApi::class.java) } + suspend fun getDoctorInfo(): ApiResponse { + return apiCall { service.getDoctorInfo() } + } + + suspend fun editDoctorInfo(doctorBean: DoctorBean): ApiResponse { + return apiCall { service.editDoctorInfo(doctorBean.toJson().toRequestBody()) } + } + + suspend fun getDoctorScheduling(): ApiResponse { + val params = mutableMapOf() + return apiCall { service.getDoctorScheduling(params) } + } + + suspend fun createDoctorScheduling( + schedulingList: MutableList, + isJumpHoliday: Boolean, + openAudioVideo: Boolean, + isCustomScheduling: Boolean + ): ApiResponse { + val params = mutableMapOf() + params["list"] = schedulingList + params["tfJumpHoliday"] = if (isJumpHoliday) "1" else "0" + params["tfDefault"] = if (isCustomScheduling) "1" else "0" + params["audioStatus"] = if (openAudioVideo) "1" else "0" + return apiCall { service.createDoctorScheduling(params.toJson().toRequestBody()) } + } + + suspend fun createDoctorCustomScheduling(schedulingBean: SchedulingBean): ApiResponse { + return apiCall { service.createDoctorScheduling(schedulingBean.toJson().toRequestBody()) } + } + + suspend fun editPassword( + username: String, + oldPassword: String, + password: String, + confirmPassword: String + ): ApiResponse { + val params = mutableMapOf() + params["username"] = username + params["oldpassword"] = oldPassword + params["confirmpassword"] = confirmPassword + params["password"] = password +// params["oldPassword"] = oldPassword +// params["confirmPassword"] = confirmPassword + return apiCall { service.editPassword(params.toJson().toRequestBody()) } + } + + suspend fun getBillRecord(date: String, type: String, pageNo: Int, pageSize: Int = 20): ApiResponse>{ + val params = mutableMapOf() + params["date"] = date + params["type"] = type + params["pageNo"] = pageNo + params["pageSize"] = pageSize + return apiCall { service.getBillRecord(params) } + } + + suspend fun getBillDetail(id: String): ApiResponse{ + val params = mutableMapOf() + params["id"] = id + return apiCall { service.getBillDetail(params) } + } + /** + * 收益统计 + */ + suspend fun getConsultStatistics(): ApiResponse{ + return apiCall { service.getConsultStatistics() } + } + /** + * 咨询方式统计(按月) + * @param date 月份,示例2023-05 + */ + suspend fun getConsultTypeData(date: String): ApiResponse>{ + val params = mutableMapOf() + params["date"] = date + return apiCall { service.getConsultTypeData(params) } + } + suspend fun getSuspensionServiceList(pageNo: Int, pageSize: Int = 20): ApiResponse>{ + val params = mutableMapOf() + params["pageNo"] = pageNo + params["pageSize"] = pageSize + return apiCall { service.getSuspensionServiceList(params) } + } + + suspend fun stopSuspensionService(recordId: String): ApiResponse{ + val params = mutableMapOf() + params["id"] = recordId + params["serviceStatus"] = 1 + return apiCall { service.stopSuspensionService(params.toJson().toRequestBody()) } + } + suspend fun getSuspensionReasonList(): ApiResponse>{ + val params = mutableMapOf() + params["dictKey"] = "doctor_stop_reason_type" + return apiCall { service.getCommonSettingMenuList(params) } + } + suspend fun addSuspensionService(suspensionServiceBean: SuspensionServiceBean): ApiResponse{ + return apiCall { service.addSuspensionService(suspensionServiceBean.toJson().toRequestBody()) } + } + suspend fun getDateRangeConsultNum(startDate: Long, endDate: Long): ApiResponse{ + val params = mutableMapOf() + params["startTime"] = startDate + params["endTime"] = endDate + return apiCall { service.getDateRangeConsultNum(params) } + } + suspend fun uploadFile(file: File): ApiResponse{ + val photoPart = MultipartBody.Part.createFormData("file", file.name, file.asRequestBody("image/jpg".toMediaTypeOrNull())) + return apiCall { service.uploadFile(photoPart, "".toRequestBody("".toMediaTypeOrNull())) } + } + suspend fun uploadHeadImage(imageUrl: String): ApiResponse{ + val params = mutableMapOf() + params["avatar"] = imageUrl + return apiCall { service.uploadHeadImage(params) } + } + suspend fun getDoctorGoodAtDisease(departmentId: String): ApiResponse>{ + val params = mutableMapOf() + params["departmentId"] = departmentId + return apiCall { service.getDoctorGoodAtDisease(params) } + } + suspend fun submitAssistantConsultApply(): ApiResponse{ + return apiCall { service.submitAssistantConsultApply() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/data/repository/OtherRepository.kt b/app/src/main/java/com/yxjk/healthexpertclient/data/repository/OtherRepository.kt new file mode 100644 index 0000000..c2cd395 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/data/repository/OtherRepository.kt @@ -0,0 +1,74 @@ +package com.yxjk.healthexpertclient.data.repository + +import com.btpj.lib_base.data.bean.ApiResponse +import com.btpj.lib_base.data.local.DataStoreManager +import com.btpj.lib_base.ext.toJson +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.btpj.lib_base.http.RetrofitManager.toRequestBody +import com.yxjk.healthexpertclient.BuildConfig +import com.yxjk.healthexpertclient.bean.AppUpdateBean +import com.yxjk.healthexpertclient.bean.other.UserListBean +import com.yxjk.healthexpertclient.bean.workbench.ArchivesDetailResultBean +import com.yxjk.healthexpertclient.bean.workbench.AudioVideoCallBean +import com.yxjk.healthexpertclient.bean.workbench.CheckRecordUserInfoBean +import com.yxjk.healthexpertclient.bean.workbench.ConsultDetailBean +import com.yxjk.healthexpertclient.bean.workbench.ConsultRecordBean +import com.yxjk.healthexpertclient.bean.workbench.HealthInfoBean +import com.yxjk.healthexpertclient.bean.workbench.MessageBean +import com.yxjk.healthexpertclient.bean.workbench.PhysicalExaminationReportBean +import com.yxjk.healthexpertclient.bean.workbench.RefuseReasonBean +import com.yxjk.healthexpertclient.bean.workbench.WorkBenchConsultNumBean +import com.yxjk.healthexpertclient.data.api.OtherApi +import com.yxjk.healthexpertclient.data.api.WorkbenchApi +import com.yxjk.healthexpertclient.utils.DevicesInfoUtils + +object OtherRepository : BaseRepository() { + private val service by lazy { RetrofitManager.getService(OtherApi::class.java) } + suspend fun getList( + username: String + ): ApiResponse { + val params = mutableMapOf() + params["personType"] = 3 + params["username"] = username + params["pageNo"] = 1 + params["pageSize"] = 100 + return apiCall { + service.listAll(params) + } + } + + suspend fun simulateUser( + userId: String + ): ApiResponse { + val params = mutableMapOf() + params["userId"] = userId + return apiCall { service.fake(params) } + } + + suspend fun fakeUser( + + ): ApiResponse { + val params = mutableMapOf() +// params["X-Access-Token"] = DataStoreManager.getToken() + return apiCall { service.fakeUser(params.toJson().toRequestBody()) } + } + suspend fun restore( + ): ApiResponse { + val params = mutableMapOf() +// params["userId"] = userId + return apiCall { service.restore(params.toJson().toRequestBody()) } + } + + /** + * 校验token有效性 + */ + suspend fun selectTokenExpire(token:String): ApiResponse { + return apiCall { + val map = mutableMapOf() + map.put("token",token) + service.selectTokenExpire(map) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/data/repository/WorkbenchRepository.kt b/app/src/main/java/com/yxjk/healthexpertclient/data/repository/WorkbenchRepository.kt new file mode 100644 index 0000000..babef5b --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/data/repository/WorkbenchRepository.kt @@ -0,0 +1,193 @@ +package com.yxjk.healthexpertclient.data.repository + +import com.btpj.lib_base.data.bean.ApiResponse +import com.btpj.lib_base.ext.toJson +import com.btpj.lib_base.http.BaseRepository +import com.btpj.lib_base.http.RetrofitManager +import com.btpj.lib_base.http.RetrofitManager.toRequestBody +import com.yxjk.healthexpertclient.BuildConfig +import com.yxjk.healthexpertclient.bean.AppUpdateBean +import com.yxjk.healthexpertclient.bean.workbench.ArchivesDetailResultBean +import com.yxjk.healthexpertclient.bean.workbench.AudioVideoCallBean +import com.yxjk.healthexpertclient.bean.workbench.CheckRecordUserInfoBean +import com.yxjk.healthexpertclient.bean.workbench.ConsultDetailBean +import com.yxjk.healthexpertclient.bean.workbench.ConsultRecordBean +import com.yxjk.healthexpertclient.bean.workbench.HealthInfoBean +import com.yxjk.healthexpertclient.bean.workbench.MessageBean +import com.yxjk.healthexpertclient.bean.workbench.PhysicalExaminationReportBean +import com.yxjk.healthexpertclient.bean.workbench.RefuseReasonBean +import com.yxjk.healthexpertclient.bean.workbench.WorkBenchConsultNumBean +import com.yxjk.healthexpertclient.data.api.WorkbenchApi + +object WorkbenchRepository : BaseRepository() { + private val service by lazy { RetrofitManager.getService(WorkbenchApi::class.java) } + suspend fun getConsultRecord( + type: String, + status: String, + pageNo: Int, + pageSize: Int + ): ApiResponse> { + val params = mutableMapOf() + params["type"] = type + params["status"] = status + params["pageNo"] = pageNo + params["pageSize"] = pageSize + return apiCall { + var result = service.getConsultRecord(params) + result + } + } + + suspend fun getConsultHistory( + memberId: String, + searchKey: String, + pageNo: Int, + pageSize: Int + ): ApiResponse> { + val params = mutableMapOf() + params["memberId"] = memberId + params["searchKey"] = searchKey + params["pageNo"] = pageNo + params["pageSize"] = pageSize + return apiCall { service.getConsultRecord(params) } + } + + suspend fun getImageTextConsultDetail(recordId: String): ApiResponse { + val params = mutableMapOf() + params["id"] = recordId + return apiCall { service.getImageTextConsultDetail(params) } + } + + suspend fun getAudioVideoConsultDetail(recordId: String): ApiResponse { + val params = mutableMapOf() + params["id"] = recordId + return apiCall { service.getAudioVideoConsultDetail(params) } + } + + suspend fun getRefusalAudioVideoCallReason(): ApiResponse> { + return apiCall { service.getRefusalAudioVideoCallReason() } + } + + suspend fun refusalAudioVideoCall( + recordId: String, + reasonType: String, + rejectReason: String + ): ApiResponse { + val params = mutableMapOf() + params["id"] = recordId + params["reasonType"] = reasonType + params["rejectReason"] = rejectReason + return apiCall { service.refusalAudioVideoCall(params) } + } + + suspend fun acceptAudioVideoCall( + recordId: String, + startTime: Long, + endTime: Long + ): ApiResponse { + val params = mutableMapOf() + params["id"] = recordId + params["startTime"] = startTime + params["endTime"] = endTime + return apiCall { service.acceptAudioVideoCall(params) } + } + + suspend fun initiateAudioVideoCall(sessionId: String): ApiResponse { + val params = mutableMapOf() + params["sessionId"] = sessionId + return apiCall { service.initiateAudioVideoCall(params) } + } + + suspend fun getArchivesDetail(archivesId: String): ApiResponse { + val params = mutableMapOf() + params["id"] = archivesId + return apiCall { service.getArchivesDetail(params) } + } + + suspend fun getPhysicalExaminationReport(userId: String): ApiResponse { + val params = mutableMapOf() + params["userId"] = userId + return apiCall { service.getPhysicalExaminationReport(params) } + } + + suspend fun getAudioVideoUnreadNum(): ApiResponse { + val params = mutableMapOf() + return apiCall { service.getAudioVideoUnreadNum(params) } + } + + suspend fun getImageTextConsultRecord(tfReply:Int,imIdList: MutableList): ApiResponse> { + val params = mutableMapOf() + params["tfReply"] = tfReply + params["imIds"] = imIdList + return apiCall { service.getImageTextConsultRecord(params.toJson().toRequestBody()) } + } + + suspend fun getBaseHealthInfo(memberId: String): ApiResponse> { + val params = mutableMapOf() + params["memberId"] = memberId + return apiCall { service.getBaseHealthInfo(params) } + } + +// suspend fun getPhysicalExaminationReportDetail( +// idCard: String, +// year: String, +// type: String = "" +// ): ApiResponse { +// return apiCall { service.getCheckItemBySfzhTotal(idCard, year, type) } +// } + suspend fun getHistoryReportNoDetail(id: String): ApiResponse{ + val params = mutableMapOf() + params["id"] = id + return apiCall {service.getHistoryReportNoDetail(params)} + } + suspend fun finishConsult(id: String): ApiResponse { + val map = mutableMapOf() + map["id"] = id + return apiCall { service.finishConsult(map) } + } + + suspend fun againAppointmentDateTime( + id: String, + startTime: Long, + endTime: Long + ): ApiResponse { + val params = mutableMapOf() + params["id"] = id + params["startTime"] = startTime + params["endTime"] = endTime + params["type"] = "1" + return apiCall { service.againAppointmentDateTime(params) } + } + suspend fun audioVideoCallStart(id: String): ApiResponse{ + val params = mutableMapOf() + params["id"] = id + params["type"] = "2" //郑文斌写的接口,非要这么搞,骂人骂他 + params["startTime"] = "" + params["endTime"] = "" + return apiCall { service.audioVideoCallStart(params) } + } + suspend fun audioVideoCallEnd(id: String): ApiResponse{ + val params = mutableMapOf() + params["id"] = id + return apiCall { service.audioVideoCallEnd(params) } + } + suspend fun getWorkBenchConsultNum(): ApiResponse{ + return apiCall { service.getWorkBenchConsultNum() } + } + suspend fun getConsultAssistantInfo(): ApiResponse{ + return apiCall { service.getConsultAssistantInfo() } + } + suspend fun getMessageList(pageNo: Int, + pageSize: Int): ApiResponse>{ + val params = mutableMapOf() + params["pageNo"] = pageNo + params["pageSize"] = pageSize + return apiCall { service.getMessageList(params.toJson().toRequestBody()) } + } + suspend fun getAppUpdateInfo(appId: String): ApiResponse{ + val params = mutableMapOf() + params["androidOrIos"] = 1 + params["packageName"] = BuildConfig.APPLICATION_ID + return apiCall { service.getAppUpdateInfo(params) } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/event/AddGoodAtDiseaseEvent.kt b/app/src/main/java/com/yxjk/healthexpertclient/event/AddGoodAtDiseaseEvent.kt new file mode 100644 index 0000000..fd2d462 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/event/AddGoodAtDiseaseEvent.kt @@ -0,0 +1,11 @@ +package com.yxjk.healthexpertclient.event + +import com.yxjk.healthexpertclient.bean.mine.DiseaseBean + +/** + * @author nanfeifei + * @time 2023/6/25 18:34 + * @description + */ +class AddGoodAtDiseaseEvent(val list: MutableList) { +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/event/ConsultRecordEvent.kt b/app/src/main/java/com/yxjk/healthexpertclient/event/ConsultRecordEvent.kt new file mode 100644 index 0000000..f5dae1f --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/event/ConsultRecordEvent.kt @@ -0,0 +1,9 @@ +package com.yxjk.healthexpertclient.event + +/** + * @author nanfeifei + * @time 2023/5/29 16:50 + * @description 咨询记录在详情页操作导致状态变化后刷新列表使用 + */ +class ConsultRecordEvent { +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/event/DoctorEvent.kt b/app/src/main/java/com/yxjk/healthexpertclient/event/DoctorEvent.kt new file mode 100644 index 0000000..6ff9681 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/event/DoctorEvent.kt @@ -0,0 +1,9 @@ +package com.yxjk.healthexpertclient.event + +/** + * @author nanfeifei + * @time 2023/6/5 16:22 + * @description 医生信息发生变化后刷新首页医生信息 + */ +class DoctorEvent { +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/event/GlobalEvent.java b/app/src/main/java/com/yxjk/healthexpertclient/event/GlobalEvent.java new file mode 100644 index 0000000..94edf0a --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/event/GlobalEvent.java @@ -0,0 +1,14 @@ +package com.yxjk.healthexpertclient.event; + +public class GlobalEvent { + public final int message;//0 重新登录 + public Object object; + + public GlobalEvent(int message) { + this.message = message; + } + public GlobalEvent(int message, Object object) { + this.message = message; + this.object=object; + } +} diff --git a/app/src/main/java/com/yxjk/healthexpertclient/event/SuspensionServiceEvent.kt b/app/src/main/java/com/yxjk/healthexpertclient/event/SuspensionServiceEvent.kt new file mode 100644 index 0000000..8f0d3af --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/event/SuspensionServiceEvent.kt @@ -0,0 +1,9 @@ +package com.yxjk.healthexpertclient.event + +/** + * @author nanfeifei + * @time 2023/6/5 14:07 + * @description 发布暂停服务后刷新暂停服务记录 + */ +class SuspensionServiceEvent { +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/event/WorkbenchEvent.kt b/app/src/main/java/com/yxjk/healthexpertclient/event/WorkbenchEvent.kt new file mode 100644 index 0000000..ac002a8 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/event/WorkbenchEvent.kt @@ -0,0 +1,9 @@ +package com.yxjk.healthexpertclient.event + +/** + * @author nanfeifei + * @time 2023/7/18 10:30 + * @description + */ +class WorkbenchEvent { +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ext/DatimeEntityExt.kt b/app/src/main/java/com/yxjk/healthexpertclient/ext/DatimeEntityExt.kt new file mode 100644 index 0000000..aaa3add --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ext/DatimeEntityExt.kt @@ -0,0 +1,25 @@ +package com.yxjk.healthexpertclient.ext + +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.github.gzuliyujiang.wheelpicker.entity.DatimeEntity +import java.util.Calendar + +/** + * @author nanfeifei + * @time 2023/7/11 14:01 + * @description 几天之后的时间 + * @param day 日期差值 + */ +fun DatimeEntity.dayOnAfter(day: Int): DatimeEntity{ + val entity = DatimeEntity() + var calendar = Calendar.getInstance() + calendar.timeInMillis = this.toTimeInMillis() + calendar.add(Calendar.DAY_OF_MONTH, day) + entity.date = DateEntity.target(calendar) + return entity +} +fun DateEntity.target(millis: Long): DateEntity{ + var calendar = Calendar.getInstance() + calendar.timeInMillis = millis + return DateEntity.target(calendar) +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ext/IMManager.kt b/app/src/main/java/com/yxjk/healthexpertclient/ext/IMManager.kt new file mode 100644 index 0000000..04c25a2 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ext/IMManager.kt @@ -0,0 +1,161 @@ +package com.yxjk.healthexpertclient.ext + +import android.content.Context +import android.util.Log +import com.yxjk.healthexpertclient.MyApplication.Companion.appViewModel +import com.yxjk.healthexpertclient.utils.TUIUtils +import com.tencent.imsdk.BaseConstants +import com.tencent.imsdk.v2.V2TIMConversation +import com.tencent.imsdk.v2.V2TIMManager +import com.tencent.imsdk.v2.V2TIMSDKConfig +import com.tencent.imsdk.v2.V2TIMSDKListener +import com.tencent.imsdk.v2.V2TIMUserFullInfo +import com.tencent.imsdk.v2.V2TIMUserStatus +import com.tencent.qcloud.tuicore.TUILogin +import com.tencent.qcloud.tuicore.interfaces.TUICallback +import com.tencent.qcloud.tuikit.TUICommonDefine +import com.tencent.qcloud.tuikit.tuicallengine.TUICallDefine +import com.tencent.qcloud.tuikit.tuicallkit.TUICallKit +import com.tencent.qcloud.tuikit.tuicallkit.base.Constants +import com.tencent.qcloud.tuikit.tuicallkit.config.OfflinePushInfoConfig +import com.tencent.qcloud.tuikit.tuichat.bean.WorkBean +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch + +fun Context.initIMSDK(imSdkAppId: Int) { + val config = V2TIMSDKConfig() + config.logLevel = V2TIMSDKConfig.V2TIM_LOG_INFO + V2TIMManager.getInstance().initSDK(this, imSdkAppId, config) +} +/** + * 腾讯im登录方法 + */ +fun Context.loginIm(successCall: () -> Unit = {}) { + var userId = appViewModel.imUserId.value + var userSig: String = appViewModel.imSig.value + var appId = appViewModel.imAppId.value + if (userSig.isNullOrEmpty()) { + CoroutineScope(Dispatchers.Main).launch { + appViewModel.getIMSig(successCall = { + loginIm(it.sdkAppId, it.userId, it.userSig, successCall) + }) + } + } else { + loginIm(appId, userId, userSig, successCall) + } +} + +fun Context.loginIm(appId: String, userId: String, userSig: String, successCall: () -> Unit = {}) { + if (TUILogin.isUserLogined() && userId == TUILogin.getUserId()) { + successCall.invoke() + return + } + TUILogin.login( + this, + appId.toInt(), + userId, + userSig, + TUIUtils.getLoginConfig(), + object : TUICallback() { + override fun onError(code: Int, desc: String) { + when (code) { + BaseConstants.ERR_SVR_ACCOUNT_USERSIG_EXPIRED, + BaseConstants.ERR_USER_SIG_EXPIRED -> {//UserSig过期 + userSigExpired() + } + } + Log.i( + "loginIm", + "imLogin errorCode = $code, errorInfo = $desc" + ) + } + + override fun onSuccess() { + appViewModel.setUserIMInfo() + successCall.invoke() + } + }) +} +fun Context.userSigExpired(loginSuccessCall: () -> Unit = {}){ + logout(successCall = { + loginIm(loginSuccessCall) + }) +} +fun logout(successCall: () -> Unit = {}){ + if (!TUILogin.isUserLogined()){ + return + } + CoroutineScope(Dispatchers.Main).launch{ + appViewModel.imSig.emit("") //清空本地缓存的UserSig + appViewModel.imUserId.emit("") + } + TUILogin.logout(object : TUICallback(){ + override fun onSuccess() { + successCall.invoke() + } + + override fun onError(errorCode: Int, errorMessage: String?) { + Log.i("logout","IM logout errorCode = $errorCode, errorInfo = $errorMessage") + } + }) +} +fun Context.startC2CChat(chatId: String, groupName: String, workBean: WorkBean? = null) { + if (TUILogin.isUserLogined()) { + // TUIUtils.createGroup("VHMQIUMM", "android测试组", V2TIMConversation.V2TIM_GROUP) + TUIUtils.startChat(chatId, groupName, V2TIMConversation.V2TIM_C2C, workBean) + } else { + loginIm(successCall = { + TUIUtils.startChat(chatId, groupName, V2TIMConversation.V2TIM_C2C, workBean) + }) + } +} + +fun Context.startGroupChat(groupId: String, groupName: String = "", workBean: WorkBean? = null) { + if (TUILogin.isUserLogined()) { + // TUIUtils.createGroup("VHMQIUMM", "android测试组", V2TIMConversation.V2TIM_GROUP) + TUIUtils.startChat(groupId, groupName, V2TIMConversation.V2TIM_GROUP, workBean) + } else { + loginIm(successCall = { + TUIUtils.startChat(groupId, groupName, V2TIMConversation.V2TIM_GROUP, workBean) + }) + } +} + +fun Context.call( + userId: String, + callMediaType: TUICallDefine.MediaType = TUICallDefine.MediaType.Video +) { + if (TUILogin.isUserLogined()) { + TUICallKit.createInstance(this).call(userId, callMediaType) + } else { + loginIm(successCall = { + TUICallKit.createInstance(this).call(userId, callMediaType) + }) + } +} + +fun Context.groupCall( + groupId: String, + userIdList: List, + callMediaType: TUICallDefine.MediaType = TUICallDefine.MediaType.Video, + params: TUICallDefine.CallParams? = null, + callback: TUICommonDefine.Callback? = null +) { + var callParams = TUICallDefine.CallParams() + if (params == null) { + callParams.offlinePushInfo = OfflinePushInfoConfig.createOfflinePushInfo(this) + callParams.timeout = Constants.SIGNALING_MAX_TIME + } else { + callParams = params + } + if (TUILogin.isUserLogined()) { + TUICallKit.createInstance(this) + .groupCall(groupId, userIdList, callMediaType, callParams, callback) + } else { + loginIm(successCall = { + TUICallKit.createInstance(this) + .groupCall(groupId, userIdList, callMediaType, callParams, callback) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ext/StartActivityManager.kt b/app/src/main/java/com/yxjk/healthexpertclient/ext/StartActivityManager.kt new file mode 100644 index 0000000..dedeb39 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ext/StartActivityManager.kt @@ -0,0 +1,262 @@ +package com.yxjk.healthexpertclient.ext + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.core.view.ContentInfoCompat +import com.yxjk.healthexpertclient.bean.mine.DiseaseBean +import com.yxjk.healthexpertclient.ui.login.ChangePassWordActivity +import com.yxjk.healthexpertclient.ui.login.LoginActivity +import com.yxjk.healthexpertclient.ui.login.RetrievePassWordActivity +import com.yxjk.healthexpertclient.ui.main.MainActivity +import com.yxjk.healthexpertclient.ui.main.WebActivity +import com.yxjk.healthexpertclient.ui.mine.AddSuspensionAnnouncementActivity +import com.yxjk.healthexpertclient.ui.mine.BillRecordActivity +import com.yxjk.healthexpertclient.ui.mine.ConsultStatisticsActivity +import com.yxjk.healthexpertclient.ui.mine.CustomSchedulingActivity +import com.yxjk.healthexpertclient.ui.mine.EditPasswordActivity +import com.yxjk.healthexpertclient.ui.mine.GoodAtDiseaseActivity +import com.yxjk.healthexpertclient.ui.mine.PersonInfoActivity +import com.yxjk.healthexpertclient.ui.mine.SchedulingActivity +import com.yxjk.healthexpertclient.ui.mine.SettingActivity +import com.yxjk.healthexpertclient.ui.mine.SuspensionServiceActivity +import com.yxjk.healthexpertclient.ui.mine.WithDrawActivity +import com.yxjk.healthexpertclient.ui.other.SimulateUserActivity +import com.yxjk.healthexpertclient.ui.workbench.ArchivesDetailActivity +import com.yxjk.healthexpertclient.ui.workbench.AudioVideoConsultActivity +import com.yxjk.healthexpertclient.ui.workbench.BaseHealthyInformationActivity +import com.yxjk.healthexpertclient.ui.workbench.BigImageActivity +import com.yxjk.healthexpertclient.ui.workbench.CheckUpDetailActivity +import com.yxjk.healthexpertclient.ui.workbench.ConsultFinishActivity +import com.yxjk.healthexpertclient.ui.workbench.ConsultHistoryActivity +import com.yxjk.healthexpertclient.ui.workbench.ConsultRecordActivity +import com.yxjk.healthexpertclient.ui.workbench.ConsultWaitStartActivity +import com.yxjk.healthexpertclient.ui.workbench.ImageTextConsultDetailActivity +import com.yxjk.healthexpertclient.ui.workbench.MessageListActivity + +fun startActivity(context: Context, @ContentInfoCompat.Flags flags: MutableList? = null, + bundle: Bundle? = null, targetClass: Class<*>){ + var intent = Intent(context, targetClass) + if(!flags.isNullOrEmpty()){ + flags.forEachIndexed { index, flag -> + if (0 == index){ + intent.flags = flag + }else{ + intent.addFlags(flag) + } + } + } + if (bundle != null){ + intent.putExtras(bundle) + } + context.startActivity(intent) +} +/** + * 登录 + */ +fun startLoginActivity(context: Context){ + var flagArray = mutableListOf() +// flagArray.add(Intent.FLAG_ACTIVITY_NO_HISTORY) + flagArray.add(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(context, flags = flagArray, targetClass = LoginActivity::class.java) +} +/** + * 找回密码 + */ +fun startRetrievePassWordActivity(context: Context){ + val bundle = Bundle() + startActivity(context, bundle = bundle, targetClass = RetrievePassWordActivity::class.java) +} +/** + * 首页 + */ +fun startMainActivity(context: Context){ + val bundle = Bundle() + startActivity(context, bundle = bundle, targetClass = MainActivity::class.java) +} +/** + * 咨询记录 + */ +fun startConsultRecordActivity(context: Context, consultModel: Int, consultIndex: Int = 0){ + val bundle = Bundle() + bundle.putInt("consultModel", consultModel) + bundle.putInt("consultIndex", consultIndex) + startActivity(context, bundle = bundle, targetClass = ConsultRecordActivity::class.java) +} +/** + * 咨询详情 + */ +fun startConsultDetailActivity(context: Context, recordId: String){ + val bundle = Bundle() + bundle.putString("recordId", recordId) + startActivity(context, bundle = bundle, targetClass = ImageTextConsultDetailActivity::class.java) +} + +/** + * 基础健康信息 + */ +fun startBaseHealthyInformationActivity(context: Context, recordId: Int){ + val bundle = Bundle() + bundle.putInt("memberId", recordId) + startActivity(context, bundle = bundle, targetClass = BaseHealthyInformationActivity::class.java) +} +/** + * 档案详情 + */ +fun startArchivesDetailActivity(context: Context, archivesId: String){ + val bundle = Bundle() + bundle.putString("archivesId", archivesId) + startActivity(context, bundle = bundle, targetClass = ArchivesDetailActivity::class.java) +} +/** + * 咨询历史 + */ +fun startConsultHistoryActivity(context: Context, recordId: Int){ + val bundle = Bundle() + bundle.putInt("recordId", recordId) + startActivity(context, bundle = bundle, targetClass = ConsultHistoryActivity::class.java) +} +/** + * 音视频咨询-待确认 + */ +fun startConsultWaitConfirmActivity(context: Context, recordId: String){ + val bundle = Bundle() + bundle.putString("recordId", recordId) + startActivity(context, bundle = bundle, targetClass = AudioVideoConsultActivity::class.java) +} +/** + * 音视频咨询-已完成 + */ +fun startConsultFinishActivity(context: Context, recordId: String){ + val bundle = Bundle() + bundle.putString("recordId", recordId) + startActivity(context, bundle = bundle, targetClass = ConsultFinishActivity::class.java) +} +/** + * 音视频咨询-待开始 + */ +fun startConsultWaitStartActivity(context: Context, recordId: String){ + val bundle = Bundle() + bundle.putString("recordId", recordId) + startActivity(context, bundle = bundle, targetClass = ConsultWaitStartActivity::class.java) +} +/** + * 排班设置 + */ +fun startSchedulingActivity(context: Context){ + startActivity(context, targetClass = SchedulingActivity::class.java) +} +/** + * 自定义排班 + */ +fun startCustomSchedulingActivity(context: Context){ + startActivity(context, targetClass = CustomSchedulingActivity::class.java) +} +/** + * 暂停服务 + */ +fun startSuspensionServiceActivity(context: Context){ + startActivity(context, targetClass = SuspensionServiceActivity::class.java) +} +/** + * 暂停服务公告 + */ +fun startAddSuspensionAnnouncementActivity(context: Context){ + startActivity(context, targetClass = AddSuspensionAnnouncementActivity::class.java) +} +/** + * 咨询统计 + */ +fun startConsultStatisticsActivity(context: Context){ + startActivity(context, targetClass = ConsultStatisticsActivity::class.java) +} +/** + * 账单明细 + */ +fun startBillRecordActivity(context: Context){ + startActivity(context, targetClass = BillRecordActivity::class.java) +} +/** + * 提现详情 + */ +fun startWithDrawActivity(context: Context, recordId: Int){ + val bundle = Bundle() + bundle.putInt("recordId", recordId) + startActivity(context, bundle = bundle, targetClass = WithDrawActivity::class.java) +} +/** + * 修改密码 + */ +fun startEditPasswordActivity(context: Context){ + startActivity(context, targetClass = EditPasswordActivity::class.java) +} + +/** + * 修改密码 + */ +fun Context.startChangePassWordActivity(code:String) { + val bundle = Bundle() + bundle.putString("code", code) + startActivity(this, bundle = bundle,targetClass = ChangePassWordActivity::class.java) +} + +/** + * 个人信息 + */ +fun startPersonInfoActivity(context: Context){ + startActivity(context, targetClass = PersonInfoActivity::class.java) +} +/** + * 设置 + */ +fun startSettingActivity(context: Context){ + startActivity(context, targetClass = SettingActivity::class.java) +} +/** + * 擅长病种 + */ +fun startGoodAtDiseaseActivity(context: Context, departmentId: String, currentDiseaseList: MutableList){ + val bundle = Bundle() + bundle.putString("departmentId", departmentId) + bundle.putParcelableArrayList("currentDiseaseList", ArrayList(currentDiseaseList)) + startActivity(context, bundle = bundle, targetClass = GoodAtDiseaseActivity::class.java) +} +/** + * 体检详情 + */ +fun startCheckUpDetailActivity(context: Context, id: String?){ + val bundle = Bundle() + bundle.putString("id", id.orEmpty()) + startActivity(context, bundle = bundle, targetClass = CheckUpDetailActivity::class.java) +} +/** + * 跳转Web + */ +fun startWebActivity(context: Context, url: String){ + val bundle = Bundle() + bundle.putString("url", url) + bundle.putBoolean("javaScriptEnabled", true) + startActivity(context, bundle = bundle, targetClass = WebActivity::class.java) +} +/** + * 消息 + */ +fun startMessageListActivity(context: Context){ + startActivity(context, targetClass = MessageListActivity::class.java) +} +/** + * 查看大图 + */ +fun Context.startBigImageActivity(url: String, isFilePath: Boolean = false){ + val bundle = Bundle() + bundle.putString("imageUrl", url) + bundle.putBoolean("isFilePath", isFilePath) + startActivity(this, bundle = bundle, targetClass = BigImageActivity::class.java) +} + +/** + * 模拟用户 + */ +fun startSimulateUserActivity(context: Context){ + startActivity(context, targetClass = SimulateUserActivity::class.java) +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/im/IMMainActivity.java b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/IMMainActivity.java new file mode 100644 index 0000000..423ef8b --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/IMMainActivity.java @@ -0,0 +1,581 @@ +package com.yxjk.healthexpertclient.ui.im; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Build; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.viewpager2.widget.ViewPager2; + +import com.yxjk.healthexpertclient.R; +import com.yxjk.healthexpertclient.ui.im.adapter.FragmentAdapter; +import com.yxjk.healthexpertclient.ui.im.view.Menu; +import com.yxjk.healthexpertclient.utils.TUIUtils; +import com.tencent.imsdk.BaseConstants; +import com.tencent.imsdk.v2.V2TIMCallback; +import com.tencent.imsdk.v2.V2TIMConversation; +import com.tencent.imsdk.v2.V2TIMConversationListFilter; +import com.tencent.imsdk.v2.V2TIMConversationOperationResult; +import com.tencent.imsdk.v2.V2TIMConversationResult; +import com.tencent.imsdk.v2.V2TIMFriendApplication; +import com.tencent.imsdk.v2.V2TIMFriendApplicationResult; +import com.tencent.imsdk.v2.V2TIMFriendshipListener; +import com.tencent.imsdk.v2.V2TIMManager; +import com.tencent.imsdk.v2.V2TIMValueCallback; +import com.tencent.qcloud.tuicore.TUIConstants; +import com.tencent.qcloud.tuicore.component.TitleBarLayout; +import com.tencent.qcloud.tuicore.component.action.PopActionClickListener; +import com.tencent.qcloud.tuicore.component.action.PopMenuAction; +import com.tencent.qcloud.tuicore.component.activities.BaseLightActivity; +import com.tencent.qcloud.tuicore.component.interfaces.ITitleBarLayout; +import com.tencent.qcloud.tuicore.util.ErrorMessageConverter; +import com.tencent.qcloud.tuicore.util.ToastUtil; +import com.tencent.qcloud.tuikit.tuicontact.TUIContactConstants; +import com.tencent.qcloud.tuikit.tuicontact.classicui.pages.TUIContactFragment; +import com.tencent.qcloud.tuikit.tuiconversation.TUIConversationConstants; +import com.tencent.qcloud.tuikit.tuiconversation.classicui.page.TUIConversationFragment; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class IMMainActivity extends BaseLightActivity { + + private static final String TAG = IMMainActivity.class.getSimpleName(); + private TextView mCommunityBtnText; + private TextView mConversationBtnText; + private TextView mContactBtnText; + private TextView mProfileSelfBtnText; + private View mConversationBtn; + private ImageView mCommunityBtnIcon; + private ImageView mConversationBtnIcon; + private ImageView mContactBtnIcon; + private ImageView mProfileSelfBtnIcon; + private TextView mMsgUnread; + private TextView mNewFriendUnread; + private View mainNavigationBar; + + private TitleBarLayout mainTitleBar; + private Menu menu; + + private ViewPager2 mainViewPager; + private List fragments; + + private int count = 0; + private long lastClickTime = 0; + private HashMap markUnreadMap = new HashMap<>(); + + private static WeakReference instance; + private BroadcastReceiver unreadCountReceiver; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + Log.i(TAG, "onCreate"); + super.onCreate(savedInstanceState); + instance = new WeakReference<>(this); + + initView(); + initUnreadCountReceiver(); + } + + private void initUnreadCountReceiver() { + unreadCountReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + long unreadCount = intent.getLongExtra(TUIConstants.UNREAD_COUNT_EXTRA, 0); + if (unreadCount > 0) { + mMsgUnread.setVisibility(View.VISIBLE); + } else { + mMsgUnread.setVisibility(View.GONE); + } + String unreadStr = "" + unreadCount; + if (unreadCount > 100) { + unreadStr = "99+"; + } + mMsgUnread.setText(unreadStr); + // update Huawei offline push Badge +// OfflineMessageDispatcher.updateBadge(MainActivity.this, (int) unreadCount); + } + }; + + IntentFilter unreadCountFilter = new IntentFilter(); + unreadCountFilter.addAction(TUIConstants.CONVERSATION_UNREAD_COUNT_ACTION); + LocalBroadcastManager.getInstance(this).registerReceiver(unreadCountReceiver, unreadCountFilter); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + Log.i(TAG, "onNewIntent"); + setIntent(intent); + } + + private void initView() { + setContentView(R.layout.im_activity); + + mainTitleBar = findViewById(R.id.main_title_bar); + initMenuAction(); + mCommunityBtnText = findViewById(R.id.tab_community_tv); + mConversationBtnText = findViewById(R.id.conversation); + mContactBtnText = findViewById(R.id.contact); + mProfileSelfBtnText = findViewById(R.id.mine); + mCommunityBtnIcon = findViewById(R.id.tab_community_icon); + mConversationBtnIcon = findViewById(R.id.tab_conversation_icon); + mContactBtnIcon = findViewById(R.id.tab_contact_icon); + mProfileSelfBtnIcon = findViewById(R.id.tab_profile_icon); + mConversationBtn = findViewById(R.id.conversation_btn_group); + mMsgUnread = findViewById(R.id.msg_total_unread); + mNewFriendUnread = findViewById(R.id.new_friend_total_unread); + mainNavigationBar = findViewById(R.id.main_navigation_bar); + + fragments = new ArrayList<>(); + fragments.add(new TUIConversationFragment()); +// fragments.add(new TUICommunityFragment()); + fragments.add(new TUIContactFragment()); +// fragments.add(new ProfileFragment()); + + mainViewPager = findViewById(R.id.view_pager); + FragmentAdapter fragmentAdapter = new FragmentAdapter(this); + fragmentAdapter.setFragmentList(fragments); + mainViewPager.setUserInputEnabled(false); + mainViewPager.setOffscreenPageLimit(4); + mainViewPager.setAdapter(fragmentAdapter); + mainViewPager.setCurrentItem(0, false); + setConversationTitleBar(); + + prepareToClearAllUnreadMessage(); + } + + private void initMenuAction() { + int titleBarIconSize = 23; + mainTitleBar.getLeftIcon().setMaxHeight(titleBarIconSize); + mainTitleBar.getLeftIcon().setMaxWidth(titleBarIconSize); + mainTitleBar.getRightIcon().setMaxHeight(titleBarIconSize); + mainTitleBar.getRightIcon().setMaxWidth(titleBarIconSize); + mainTitleBar.setOnRightClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (menu == null) { + return; + } + if (menu.isShowing()) { + menu.hide(); + } else { + menu.show(); + } + } + }); + } + + private void prepareToClearAllUnreadMessage() { + mMsgUnread.setOnTouchListener(new View.OnTouchListener() { + private float downX; + private float downY; + private boolean isTriggered = false; + @Override + public boolean onTouch(View view, MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + downX = mMsgUnread.getX(); + downY = mMsgUnread.getY(); + break; + case MotionEvent.ACTION_MOVE: + if (isTriggered) { + return true; + } + float viewX = view.getX(); + float viewY = view.getY(); + float eventX = event.getX(); + float eventY = event.getY(); + float translationX = eventX + viewX - downX; + float translationY = eventY + viewY - downY; + view.setTranslationX(translationX); + view.setTranslationY(translationY); + // If the moved x and y axis coordinates exceed a certain pixel, it will trigger one-click to clear all unread sessions + if (Math.abs(translationX) > 200|| Math.abs(translationY) > 200) { + isTriggered = true; + mMsgUnread.setVisibility(View.GONE); + triggerClearAllUnreadMessage(); + } + break; + case MotionEvent.ACTION_UP: + view.setTranslationX(0); + view.setTranslationY(0); + isTriggered = false; + break; + case MotionEvent.ACTION_CANCEL: + isTriggered = false; + break; + } + + return true; + } + }); + } + + private void triggerClearAllUnreadMessage() { + V2TIMManager.getMessageManager().markAllMessageAsRead(new V2TIMCallback() { + @Override + public void onSuccess() { + Log.i(TAG, "markAllMessageAsRead success"); + ToastUtil.toastShortMessage(IMMainActivity.this.getString(R.string.mark_all_message_as_read_succ)); + } + + @Override + public void onError(int code, String desc) { + Log.i(TAG, "markAllMessageAsRead error:" + code + ", desc:" + ErrorMessageConverter.convertIMError(code, desc)); + ToastUtil.toastShortMessage(IMMainActivity.this.getString(R.string.mark_all_message_as_read_err_format, code, ErrorMessageConverter.convertIMError(code, desc))); + mMsgUnread.setVisibility(View.VISIBLE); + } + }); + + V2TIMConversationListFilter filter = new V2TIMConversationListFilter(); + filter.setMarkType(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_UNREAD); + getMarkUnreadConversationList(filter, 0, 100, true, new V2TIMValueCallback>() { + @Override + public void onSuccess(HashMap stringV2TIMConversationHashMap) { + if (stringV2TIMConversationHashMap.size() == 0) { + return; + } + List unreadConversationIDList = new ArrayList<>(); + Iterator> iterator = markUnreadMap.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + unreadConversationIDList.add(entry.getKey()); + } + + V2TIMManager.getConversationManager().markConversation(unreadConversationIDList, + V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_UNREAD, + false, + new V2TIMValueCallback>() { + @Override + public void onSuccess(List v2TIMConversationOperationResults) { + for (V2TIMConversationOperationResult result : v2TIMConversationOperationResults) { + if (result.getResultCode() == BaseConstants.ERR_SUCC) { + V2TIMConversation v2TIMConversation = markUnreadMap.get(result.getConversationID()); + if (!v2TIMConversation.getMarkList().contains(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_HIDE)) { + markUnreadMap.remove(result.getConversationID()); + } + } + } + } + + @Override + public void onError(int code, String desc) { + Log.e(TAG, "triggerClearAllUnreadMessage->markConversation error:" + code + ", desc:" + ErrorMessageConverter.convertIMError(code, desc)); + } + }); + } + + @Override + public void onError(int code, String desc) { + Log.e(TAG, "triggerClearAllUnreadMessage->getMarkUnreadConversationList error:" + code + ", desc:" + ErrorMessageConverter.convertIMError(code, desc)); + } + }); + } + + private void getMarkUnreadConversationList(V2TIMConversationListFilter filter, long nextSeq, int count, boolean fromStart, V2TIMValueCallback> callback) { + if (fromStart) { + markUnreadMap.clear(); + } + V2TIMManager.getConversationManager().getConversationListByFilter(filter, nextSeq, count, new V2TIMValueCallback() { + @Override + public void onSuccess(V2TIMConversationResult v2TIMConversationResult) { + List conversationList = v2TIMConversationResult.getConversationList(); + for (V2TIMConversation conversation : conversationList) { + markUnreadMap.put(conversation.getConversationID(), conversation); + } + + if (!v2TIMConversationResult.isFinished()) { + getMarkUnreadConversationList(filter, v2TIMConversationResult.getNextSeq(), count, false, callback); + } else { + if (callback != null) { + callback.onSuccess(markUnreadMap); + } + } + } + + @Override + public void onError(int code, String desc) { + Log.e(TAG, "getMarkUnreadConversationList error:" + code + ", desc:" + ErrorMessageConverter.convertIMError(code, desc)); + } + }); + } + + + public void tabClick(View view) { + resetMenuState(); + switch (view.getId()) { + case R.id.conversation_btn_group: + mainTitleBar.setVisibility(View.VISIBLE); + mainViewPager.setCurrentItem(0, false); + setConversationTitleBar(); + break; + case R.id.community_btn_group: + mainTitleBar.setVisibility(View.GONE); + mainViewPager.setCurrentItem(1, false); + setCommunityBackground(); + break; + case R.id.contact_btn_group: + mainTitleBar.setVisibility(View.VISIBLE); + mainViewPager.setCurrentItem(2, false); + setContactTitleBar(); + break; + case R.id.myself_btn_group: + mainTitleBar.setVisibility(View.VISIBLE); + mainViewPager.setCurrentItem(3, false); + setProfileTitleBar(); + break; + default: + break; + } + } + + private void setCommunityBackground() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + getWindow().setStatusBarColor(getResources().getColor(R.color.demo_community_page_status_bar_color)); + } + mainNavigationBar.setBackgroundColor(getResources().getColor(R.color.demo_community_page_navigate_bar_color)); + } + + private void setConversationTitleBar() { + mainTitleBar.setTitle(getResources().getString(R.string.conversation_title), ITitleBarLayout.Position.MIDDLE); + mainTitleBar.getLeftGroup().setVisibility(View.GONE); + mainTitleBar.getRightGroup().setVisibility(View.VISIBLE); + int titleBarIconSize = 23; + ViewGroup.LayoutParams params = mainTitleBar.getRightIcon().getLayoutParams(); + params.width = titleBarIconSize; + params.height = titleBarIconSize; + mainTitleBar.getRightIcon().setLayoutParams(params); + setConversationMenu(); + } + + private void setConversationMenu() { + menu = new Menu(this, mainTitleBar.getRightIcon()); + PopActionClickListener popActionClickListener = new PopActionClickListener() { + @Override + public void onActionClick(int position, Object data) { + PopMenuAction action = (PopMenuAction) data; + if (TextUtils.equals(action.getActionName(), getResources().getString(R.string.start_conversation))) { + TUIUtils.startActivity("StartC2CChatActivity", null); + } + + if (TextUtils.equals(action.getActionName(), getResources().getString(R.string.create_private_group))) { + Bundle bundle = new Bundle(); + bundle.putInt(TUIConversationConstants.GroupType.TYPE, TUIConversationConstants.GroupType.PRIVATE); + TUIUtils.startActivity("StartGroupChatActivity", bundle); + } + if (TextUtils.equals(action.getActionName(), getResources().getString(R.string.create_group_chat))) { + Bundle bundle = new Bundle(); + bundle.putInt(TUIConversationConstants.GroupType.TYPE, TUIConversationConstants.GroupType.PUBLIC); + TUIUtils.startActivity("StartGroupChatActivity", bundle); + } + if (TextUtils.equals(action.getActionName(), getResources().getString(R.string.create_chat_room))) { + Bundle bundle = new Bundle(); + bundle.putInt(TUIConversationConstants.GroupType.TYPE, TUIConversationConstants.GroupType.CHAT_ROOM); + TUIUtils.startActivity("StartGroupChatActivity", bundle); + } + if (TextUtils.equals(action.getActionName(), getResources().getString(R.string.create_community))) { + Bundle bundle = new Bundle(); + bundle.putInt(TUIConversationConstants.GroupType.TYPE, TUIConversationConstants.GroupType.COMMUNITY); + TUIUtils.startActivity("StartGroupChatActivity", bundle); + } + menu.hide(); + } + }; + + List menuActions = new ArrayList<>(); + + PopMenuAction action = new PopMenuAction(); + + action.setActionName(getResources().getString(R.string.start_conversation)); + action.setActionClickListener(popActionClickListener); + action.setIconResId(R.drawable.create_c2c); + menuActions.add(action); + + action = new PopMenuAction(); + action.setActionName(getResources().getString(R.string.create_group_chat)); + action.setIconResId(R.drawable.group_icon); + action.setActionClickListener(popActionClickListener); + menuActions.add(action); + + menu.setMenuAction(menuActions); + } + + private void setContactTitleBar() { + mainTitleBar.setTitle(getResources().getString(R.string.contact_title), ITitleBarLayout.Position.MIDDLE); + mainTitleBar.getLeftGroup().setVisibility(View.GONE); + mainTitleBar.getRightGroup().setVisibility(View.VISIBLE); + setContactMenu(); + } + + public void setContactMenu() { + menu = new Menu(this, mainTitleBar.getRightIcon()); + List menuActionList = new ArrayList<>(2); + PopActionClickListener popActionClickListener = new PopActionClickListener() { + @Override + public void onActionClick(int index, Object data) { + PopMenuAction action = (PopMenuAction) data; + if (TextUtils.equals(action.getActionName(), getResources().getString(R.string.add_friend))) { + Bundle bundle = new Bundle(); + bundle.putBoolean(TUIContactConstants.GroupType.GROUP, false); + TUIUtils.startActivity("AddMoreActivity", bundle); + } + if (TextUtils.equals(action.getActionName(), getResources().getString(R.string.add_group))) { + Bundle bundle = new Bundle(); + bundle.putBoolean(TUIContactConstants.GroupType.GROUP, true); + TUIUtils.startActivity("AddMoreActivity", bundle); + } + menu.hide(); + } + }; + PopMenuAction action = new PopMenuAction(); + action.setActionName(getResources().getString(R.string.add_friend)); + action.setIconResId(com.tencent.qcloud.tuikit.tuicontact.R.drawable.contact_add_friend); + action.setActionClickListener(popActionClickListener); + menuActionList.add(action); + + action = new PopMenuAction(); + action.setActionName(getResources().getString(R.string.add_group)); + action.setIconResId(com.tencent.qcloud.tuikit.tuicontact.R.drawable.contact_add_group); + action.setActionClickListener(popActionClickListener); + menuActionList.add(action); + menu.setMenuAction(menuActionList); + } + + private void setProfileTitleBar() { + mainTitleBar.getLeftGroup().setVisibility(View.GONE); + mainTitleBar.getRightGroup().setVisibility(View.GONE); + mainTitleBar.setTitle(getResources().getString(R.string.profile), ITitleBarLayout.Position.MIDDLE); + } + + private void resetMenuState() { + + } + + private final V2TIMFriendshipListener friendshipListener = new V2TIMFriendshipListener() { + @Override + public void onFriendApplicationListAdded(List applicationList) { + refreshFriendApplicationUnreadCount(); + } + + @Override + public void onFriendApplicationListDeleted(List userIDList) { + refreshFriendApplicationUnreadCount(); + } + + @Override + public void onFriendApplicationListRead() { + refreshFriendApplicationUnreadCount(); + } + }; + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + finish(); + } + return super.onKeyDown(keyCode, event); + } + + @Override + public void finish() { + super.finish(); + } + + @Override + protected void onStart() { + Log.i(TAG, "onStart"); + super.onStart(); + } + + @Override + protected void onResume() { + Log.i(TAG, "onResume"); + super.onResume(); + registerUnreadListener(); +// handleOfflinePush(); + } + + + private void registerUnreadListener() { + V2TIMManager.getFriendshipManager().addFriendListener(friendshipListener); + refreshFriendApplicationUnreadCount(); + } + + private void refreshFriendApplicationUnreadCount() { + V2TIMManager.getFriendshipManager().getFriendApplicationList(new V2TIMValueCallback() { + @Override + public void onSuccess(V2TIMFriendApplicationResult v2TIMFriendApplicationResult) { + runOnUiThread(new Runnable() { + @Override + public void run() { + int unreadCount = v2TIMFriendApplicationResult.getUnreadCount(); + if (unreadCount > 0) { + mNewFriendUnread.setVisibility(View.VISIBLE); + } else { + mNewFriendUnread.setVisibility(View.GONE); + } + String unreadStr = "" + unreadCount; + if (unreadCount > 100) { + unreadStr = "99+"; + } + mNewFriendUnread.setText(unreadStr); + } + }); + } + + @Override + public void onError(int code, String desc) { + + } + }); + } + + @Override + protected void onPause() { + Log.i(TAG, "onPause"); + super.onPause(); + V2TIMManager.getFriendshipManager().removeFriendListener(friendshipListener); + } + + @Override + protected void onStop() { + Log.i(TAG, "onStop"); + super.onStop(); + } + + @Override + protected void onDestroy() { + Log.i(TAG, "onDestroy"); + super.onDestroy(); + + if (unreadCountReceiver != null) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(unreadCountReceiver); + unreadCountReceiver = null; + } + } + + public static void finishMainActivity() { + if (instance != null && instance.get() != null) { + instance.get().finish(); + } + } + +} diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/im/MainMinimalistActivity.java b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/MainMinimalistActivity.java new file mode 100644 index 0000000..c7fd10c --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/MainMinimalistActivity.java @@ -0,0 +1,446 @@ +package com.yxjk.healthexpertclient.ui.im; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.util.Log; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.localbroadcastmanager.content.LocalBroadcastManager; +import androidx.viewpager2.widget.ViewPager2; + +import com.yxjk.healthexpertclient.R; +import com.yxjk.healthexpertclient.ui.im.adapter.FragmentAdapter; +import com.tencent.imsdk.BaseConstants; +import com.tencent.imsdk.v2.V2TIMCallback; +import com.tencent.imsdk.v2.V2TIMConversation; +import com.tencent.imsdk.v2.V2TIMConversationListFilter; +import com.tencent.imsdk.v2.V2TIMConversationOperationResult; +import com.tencent.imsdk.v2.V2TIMConversationResult; +import com.tencent.imsdk.v2.V2TIMFriendApplication; +import com.tencent.imsdk.v2.V2TIMFriendApplicationResult; +import com.tencent.imsdk.v2.V2TIMFriendshipListener; +import com.tencent.imsdk.v2.V2TIMManager; +import com.tencent.imsdk.v2.V2TIMValueCallback; +import com.tencent.qcloud.tuicore.TUIConstants; +import com.tencent.qcloud.tuicore.component.activities.BaseMinimalistLightActivity; +import com.tencent.qcloud.tuicore.util.ErrorMessageConverter; +import com.tencent.qcloud.tuicore.util.ToastUtil; +import com.tencent.qcloud.tuikit.tuicontact.minimalistui.pages.TUIContactMinimalistFragment; +import com.tencent.qcloud.tuikit.tuiconversation.minimalistui.page.ConversationMinimalistFragment; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class MainMinimalistActivity extends BaseMinimalistLightActivity { + + private static final String TAG = MainMinimalistActivity.class.getSimpleName(); + private TextView mConversationBtnText; + private TextView mContactBtnText; + private TextView mProfileSelfBtnText; + private ImageView mConversationBtnIcon; + private ImageView mContactBtnIcon; + private ImageView mProfileSelfBtnIcon; + private TextView mMsgUnread; + private TextView mNewFriendUnread; + + private ViewPager2 mainViewPager; + private List fragments; + + private HashMap markUnreadMap = new HashMap<>(); + + private static WeakReference instance; + private BroadcastReceiver unreadCountReceiver; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + Log.i(TAG, "onCreate"); + super.onCreate(savedInstanceState); + instance = new WeakReference<>(this); + + initView(); + initUnreadCountReceiver(); + } + + private void initUnreadCountReceiver() { + unreadCountReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + long unreadCount = intent.getLongExtra(TUIConstants.UNREAD_COUNT_EXTRA, 0); + if (unreadCount > 0) { + mMsgUnread.setVisibility(View.VISIBLE); + } else { + mMsgUnread.setVisibility(View.GONE); + } + String unreadStr = "" + unreadCount; + if (unreadCount > 100) { + unreadStr = "99+"; + } + mMsgUnread.setText(unreadStr); + // update Huawei offline push Badge +// OfflineMessageDispatcher.updateBadge(MainMinimalistActivity.this, (int) unreadCount); + } + }; + + IntentFilter unreadCountFilter = new IntentFilter(); + unreadCountFilter.addAction(TUIConstants.CONVERSATION_UNREAD_COUNT_ACTION); + LocalBroadcastManager.getInstance(this).registerReceiver(unreadCountReceiver, unreadCountFilter); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + Log.i(TAG, "onNewIntent"); + setIntent(intent); + } + + private void initView() { + setContentView(R.layout.overseas_main_activity); + + mConversationBtnText = findViewById(R.id.conversation); + mContactBtnText = findViewById(R.id.contact); + mProfileSelfBtnText = findViewById(R.id.mine); + mConversationBtnIcon = findViewById(R.id.tab_conversation_icon); + mContactBtnIcon = findViewById(R.id.tab_contact_icon); + mProfileSelfBtnIcon = findViewById(R.id.tab_profile_icon); + mMsgUnread = findViewById(R.id.msg_total_unread); + mNewFriendUnread = findViewById(R.id.new_friend_total_unread); + + fragments = new ArrayList<>(); + fragments.add(new ConversationMinimalistFragment()); + fragments.add(new TUIContactMinimalistFragment()); +// fragments.add(new ProfileMinimalistFragment()); + + mainViewPager = findViewById(R.id.view_pager); + FragmentAdapter fragmentAdapter = new FragmentAdapter(this); + fragmentAdapter.setFragmentList(fragments); + mainViewPager.setUserInputEnabled(false); + mainViewPager.setOffscreenPageLimit(4); + mainViewPager.setAdapter(fragmentAdapter); + mainViewPager.setCurrentItem(0, false); + prepareToClearAllUnreadMessage(); + } + + private void prepareToClearAllUnreadMessage() { + mMsgUnread.setOnTouchListener(new View.OnTouchListener() { + private float downX; + private float downY; + private boolean isTriggered = false; + @Override + public boolean onTouch(View view, MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + downX = mMsgUnread.getX(); + downY = mMsgUnread.getY(); + break; + case MotionEvent.ACTION_MOVE: + if (isTriggered) { + return true; + } + float viewX = view.getX(); + float viewY = view.getY(); + float eventX = event.getX(); + float eventY = event.getY(); + float translationX = eventX + viewX - downX; + float translationY = eventY + viewY - downY; + view.setTranslationX(translationX); + view.setTranslationY(translationY); + // If the moved x and y axis coordinates exceed a certain pixel, it will trigger one-click to clear all unread sessions + if (Math.abs(translationX) > 200|| Math.abs(translationY) > 200) { + isTriggered = true; + mMsgUnread.setVisibility(View.GONE); + triggerClearAllUnreadMessage(); + } + break; + case MotionEvent.ACTION_UP: + view.setTranslationX(0); + view.setTranslationY(0); + isTriggered = false; + break; + case MotionEvent.ACTION_CANCEL: + isTriggered = false; + break; + } + + return true; + } + }); + } + + private void triggerClearAllUnreadMessage() { + V2TIMManager.getMessageManager().markAllMessageAsRead(new V2TIMCallback() { + @Override + public void onSuccess() { + Log.i(TAG, "markAllMessageAsRead success"); + ToastUtil.toastShortMessage(MainMinimalistActivity.this.getString(R.string.mark_all_message_as_read_succ)); + } + + @Override + public void onError(int code, String desc) { + Log.i(TAG, "markAllMessageAsRead error:" + code + ", desc:" + ErrorMessageConverter.convertIMError(code, desc)); + ToastUtil.toastShortMessage(MainMinimalistActivity.this.getString(R.string.mark_all_message_as_read_err_format, code, ErrorMessageConverter.convertIMError(code, desc))); + mMsgUnread.setVisibility(View.VISIBLE); + } + }); + + V2TIMConversationListFilter filter = new V2TIMConversationListFilter(); + filter.setMarkType(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_UNREAD); + getMarkUnreadConversationList(filter, 0, 100, true, new V2TIMValueCallback>() { + @Override + public void onSuccess(HashMap stringV2TIMConversationHashMap) { + if (stringV2TIMConversationHashMap.size() == 0) { + return; + } + List unreadConversationIDList = new ArrayList<>(); + Iterator> iterator = markUnreadMap.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + unreadConversationIDList.add(entry.getKey()); + } + + V2TIMManager.getConversationManager().markConversation(unreadConversationIDList, + V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_UNREAD, + false, + new V2TIMValueCallback>() { + @Override + public void onSuccess(List v2TIMConversationOperationResults) { + for (V2TIMConversationOperationResult result : v2TIMConversationOperationResults) { + if (result.getResultCode() == BaseConstants.ERR_SUCC) { + V2TIMConversation v2TIMConversation = markUnreadMap.get(result.getConversationID()); + if (!v2TIMConversation.getMarkList().contains(V2TIMConversation.V2TIM_CONVERSATION_MARK_TYPE_HIDE)) { + markUnreadMap.remove(result.getConversationID()); + } + } + } + } + + @Override + public void onError(int code, String desc) { + Log.e(TAG, "triggerClearAllUnreadMessage->markConversation error:" + code + ", desc:" + ErrorMessageConverter.convertIMError(code, desc)); + } + }); + } + + @Override + public void onError(int code, String desc) { + Log.e(TAG, "triggerClearAllUnreadMessage->getMarkUnreadConversationList error:" + code + ", desc:" + ErrorMessageConverter.convertIMError(code, desc)); + } + }); + } + + private void getMarkUnreadConversationList(V2TIMConversationListFilter filter, long nextSeq, int count, boolean fromStart, V2TIMValueCallback> callback) { + if (fromStart) { + markUnreadMap.clear(); + } + V2TIMManager.getConversationManager().getConversationListByFilter(filter, nextSeq, count, new V2TIMValueCallback() { + @Override + public void onSuccess(V2TIMConversationResult v2TIMConversationResult) { + List conversationList = v2TIMConversationResult.getConversationList(); + for (V2TIMConversation conversation : conversationList) { + markUnreadMap.put(conversation.getConversationID(), conversation); + } + + if (!v2TIMConversationResult.isFinished()) { + getMarkUnreadConversationList(filter, v2TIMConversationResult.getNextSeq(), count, false, callback); + } else { + if (callback != null) { + callback.onSuccess(markUnreadMap); + } + } + } + + @Override + public void onError(int code, String desc) { + Log.e(TAG, "getMarkUnreadConversationList error:" + code + ", desc:" + ErrorMessageConverter.convertIMError(code, desc)); + } + }); + } + + + public void tabClick(View view) { + resetMenuState(); + switch (view.getId()) { + case R.id.conversation_btn_group: + mainViewPager.setCurrentItem(0, false); + mConversationBtnText.setTextColor(getResources().getColor(R.color.demo_main_tab_text_selected_color_light)); + mConversationBtnIcon.setBackground(getResources().getDrawable(R.drawable.demo_overseas_main_tab_conversation_selected)); + break; + case R.id.contact_btn_group: + mainViewPager.setCurrentItem(1, false); + mContactBtnText.setTextColor(getResources().getColor(R.color.demo_main_tab_text_selected_color_light)); + mContactBtnIcon.setBackground(getResources().getDrawable(R.drawable.demo_overseas_main_tab_contact_selected_bg)); + break; + case R.id.myself_btn_group: + mainViewPager.setCurrentItem(2, false); + mProfileSelfBtnText.setTextColor(getResources().getColor(R.color.demo_main_tab_text_selected_color_light)); + mProfileSelfBtnIcon.setBackground(getResources().getDrawable(R.drawable.demo_overseas_main_tab_settings_selected_bg)); + break; + default: + break; + } + } + + private void resetMenuState() { + mConversationBtnText.setTextColor(getResources().getColor(com.tencent.qcloud.tuicore.R.color.core_light_bg_secondary_text_color_light)); + mConversationBtnIcon.setBackground(getResources().getDrawable(R.drawable.demo_overseas_main_tab_conversation_normal)); + mContactBtnText.setTextColor(getResources().getColor(com.tencent.qcloud.tuicore.R.color.core_light_bg_secondary_text_color_light)); + mContactBtnIcon.setBackground(getResources().getDrawable(R.drawable.demo_overseas_main_tab_contact_normal_bg)); + mProfileSelfBtnText.setTextColor(getResources().getColor(com.tencent.qcloud.tuicore.R.color.core_light_bg_secondary_text_color_light)); + mProfileSelfBtnIcon.setBackground(getResources().getDrawable(R.drawable.demo_overseas_main_tab_settings_normal_bg)); + } + + private final V2TIMFriendshipListener friendshipListener = new V2TIMFriendshipListener() { + @Override + public void onFriendApplicationListAdded(List applicationList) { + refreshFriendApplicationUnreadCount(); + } + + @Override + public void onFriendApplicationListDeleted(List userIDList) { + refreshFriendApplicationUnreadCount(); + } + + @Override + public void onFriendApplicationListRead() { + refreshFriendApplicationUnreadCount(); + } + }; + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + finish(); + } + return super.onKeyDown(keyCode, event); + } + + @Override + public void finish() { + super.finish(); + } + + @Override + protected void onStart() { + Log.i(TAG, "onStart"); + super.onStart(); + } + + @Override + protected void onResume() { + Log.i(TAG, "onResume"); + super.onResume(); + registerUnreadListener(); + handleOfflinePush(); + } + + private void handleOfflinePush() { + Intent intent = getIntent(); + if (intent == null) { + Log.d(TAG, "handleOfflinePush intent is null"); + return; + } + +// if (OfflinePushConfigs.getOfflinePushConfigs().getClickNotificationCallbackMode() == OfflinePushConfigs.CLICK_NOTIFICATION_CALLBACK_INTENT) { +// TUIUtils.handleOfflinePush(intent, new HandleOfflinePushCallBack() { +// @Override +// public void onHandleOfflinePush(boolean hasLogged) { +// if (hasLogged) { +// setIntent(null); +// } else { +// finish(); +// } +// } +// }); +// } else { +// String ext = intent.getStringExtra(TUIConstants.TUIOfflinePush.NOTIFICATION_EXT_KEY); +// TUIUtils.handleOfflinePush(ext, new HandleOfflinePushCallBack() { +// @Override +// public void onHandleOfflinePush(boolean hasLogged) { +// if (hasLogged) { +// setIntent(null); +// } else { +// finish(); +// } +// } +// }); +// } + } + + + private void registerUnreadListener() { + V2TIMManager.getFriendshipManager().addFriendListener(friendshipListener); + refreshFriendApplicationUnreadCount(); + } + + private void refreshFriendApplicationUnreadCount() { + V2TIMManager.getFriendshipManager().getFriendApplicationList(new V2TIMValueCallback() { + @Override + public void onSuccess(V2TIMFriendApplicationResult v2TIMFriendApplicationResult) { + runOnUiThread(new Runnable() { + @Override + public void run() { + int unreadCount = v2TIMFriendApplicationResult.getUnreadCount(); + if (unreadCount > 0) { + mNewFriendUnread.setVisibility(View.VISIBLE); + } else { + mNewFriendUnread.setVisibility(View.GONE); + } + String unreadStr = "" + unreadCount; + if (unreadCount > 100) { + unreadStr = "99+"; + } + mNewFriendUnread.setText(unreadStr); + } + }); + } + + @Override + public void onError(int code, String desc) { + + } + }); + } + + @Override + protected void onPause() { + Log.i(TAG, "onPause"); + super.onPause(); + V2TIMManager.getFriendshipManager().removeFriendListener(friendshipListener); + } + + @Override + protected void onStop() { + Log.i(TAG, "onStop"); + super.onStop(); + } + + @Override + protected void onDestroy() { + Log.i(TAG, "onDestroy"); + super.onDestroy(); + + if (unreadCountReceiver != null) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(unreadCountReceiver); + unreadCountReceiver = null; + } + } + + public static void finishMainActivity() { + if (instance != null && instance.get() != null) { + instance.get().finish(); + } + } + +} diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/im/SelectLocationActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/SelectLocationActivity.kt new file mode 100644 index 0000000..5a0fe17 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/SelectLocationActivity.kt @@ -0,0 +1,152 @@ +package com.yxjk.healthexpertclient.ui.im + +import android.Manifest +import android.content.Intent +import android.graphics.BitmapFactory +import android.os.Bundle +import android.view.View +import com.amap.api.location.AMapLocationClient +import com.amap.api.maps.AMap +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.CameraPosition +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.MyLocationStyle +import com.btpj.lib_base.ext.toJson +import com.buddy.kredit.android.base.BaseActivity +import com.permissionx.guolindev.PermissionX +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivitySelectLocationBinding +import com.yxjk.healthexpertclient.ui.im.viewmodel.SelectLocationViewModel +import com.tencent.qcloud.tuikit.tuichat.bean.message.LocationMessageBean +import com.tencent.qcloud.tuikit.tuichat.classicui.setting.ChatLayoutSetting + + +/** + * @author nanfeifei + * @time 2023/7/4 10:38 + * @description 选择位置(IM发送位置使用) + */ +class SelectLocationActivity : BaseActivity( + R.layout.activity_select_location) { + //初始化地图控制器对象 + var aMap: AMap? = null + var mCurrentLat: Double = 0.0 + var mCurrentLon: Double = 0.0 + var mPermissionList= arrayListOf( + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION) + + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mBinding.mapView.onSaveInstanceState(outState) + + } + + override fun onCreate(savedInstanceState: Bundle?) { + AMapLocationClient.updatePrivacyShow(this@SelectLocationActivity, true, true) + AMapLocationClient.updatePrivacyAgree(this@SelectLocationActivity, true) + super.onCreate(savedInstanceState) + } + override fun initView(savedInstanceState: Bundle?) { + setToolBarRightText(getString(R.string.select_location_send)) + mBinding.apply { + mapView.onCreate(savedInstanceState) + if (aMap == null) { + aMap = mapView.map + } + PermissionX.init(this@SelectLocationActivity) + .permissions(mPermissionList) + .request { allGranted, grantedList, deniedList -> + if (allGranted){ + setUpMap() + } + } + } + } + + override fun initData() { + + } + private fun setUpMap() { + // 自定义系统定位小蓝点 + val myLocationStyle = MyLocationStyle() + // 设置小蓝点的图 + myLocationStyle.myLocationIcon( + BitmapDescriptorFactory + .fromResource(R.drawable.ic_my_location) + ) + myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW) + mBinding.apply { + aMap?.myLocationStyle = myLocationStyle + aMap?.moveCamera(CameraUpdateFactory.zoomTo(13F)) + aMap?.uiSettings?.isMyLocationButtonEnabled = true // 设置默认定位按钮是否显示 + aMap?.uiSettings?.isRotateGesturesEnabled = false + aMap?.uiSettings?.isTiltGesturesEnabled = false + aMap?.isMyLocationEnabled = true // 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false + aMap?.setOnMyLocationChangeListener { + mCurrentLat = it.latitude + mCurrentLon = it.longitude + val markerOption = MarkerOptions() + markerOption.position(LatLng(mCurrentLat, mCurrentLon)) + aMap?.moveCamera(CameraUpdateFactory.newLatLng(LatLng(mCurrentLat, mCurrentLon))) + markerOption.icon( + BitmapDescriptorFactory.fromBitmap( + BitmapFactory + .decodeResource(resources, R.drawable.ic_select_location) + ) + ) + markerOption.isFlat = true + var marker = aMap?.addMarker(markerOption) + aMap?.setOnCameraChangeListener(object : AMap.OnCameraChangeListener { + override fun onCameraChange(cameraPosition: CameraPosition?) { + if (cameraPosition != null) { + marker?.position = cameraPosition.target + mCurrentLat = cameraPosition.target.latitude + mCurrentLon = cameraPosition.target.longitude + } + } + + override fun onCameraChangeFinish(p0: CameraPosition?) { + + } + }) + } + } + + } + override fun onResume() { + super.onResume() + mBinding.mapView.onResume() + } + + override fun onPause() { + super.onPause() + mBinding.mapView.onPause() + } + + override fun onDestroy() { + super.onDestroy() + mBinding.mapView.onDestroy() + } + override fun bindEvent() { + addClickViews(mBinding.toolbarLay.tvRight) + } + + override fun onClick(paramView: View?) { + super.onClick(paramView) + when (paramView?.id) { + R.id.tv_right -> { + var intent = Intent() + var locationMessageBean = LocationMessageBean() + locationMessageBean.longitude = mCurrentLon + locationMessageBean.latitude = mCurrentLat + intent.putExtra(ChatLayoutSetting.KEY_CUSTOM_MESSAGE, locationMessageBean.toJson()) + setResult(ChatLayoutSetting.RESULT_CODE_LOCATION, intent) + finish() + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/im/ViewLocationActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/ViewLocationActivity.kt new file mode 100644 index 0000000..a084188 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/ViewLocationActivity.kt @@ -0,0 +1,118 @@ +package com.yxjk.healthexpertclient.ui.im + +import android.Manifest +import android.graphics.BitmapFactory +import android.os.Bundle +import com.amap.api.location.AMapLocationClient +import com.amap.api.maps.AMap +import com.amap.api.maps.CameraUpdateFactory +import com.amap.api.maps.model.BitmapDescriptorFactory +import com.amap.api.maps.model.LatLng +import com.amap.api.maps.model.MarkerOptions +import com.amap.api.maps.model.MyLocationStyle +import com.buddy.kredit.android.base.BaseActivity +import com.permissionx.guolindev.PermissionX +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivityViewLocationBinding +import com.yxjk.healthexpertclient.ui.im.viewmodel.ViewLocationViewModel + + +/** + * @author nanfeifei + * @time 2023/7/4 10:38 + * @description 查看位置(IM查看位置使用) + */ +class ViewLocationActivity : BaseActivity( + R.layout.activity_view_location) { + //初始化地图控制器对象 + var aMap: AMap? = null + var mCurrentLat: Double = 0.0 + var mCurrentLon: Double = 0.0 + var mPermissionList= arrayListOf( + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.QUERY_ALL_PACKAGES) + override fun onSaveInstanceState(outState: Bundle) { + super.onSaveInstanceState(outState) + mBinding.mapView.onSaveInstanceState(outState) + + } + + override fun onCreate(savedInstanceState: Bundle?) { + AMapLocationClient.updatePrivacyShow(this@ViewLocationActivity, true, true) + AMapLocationClient.updatePrivacyAgree(this@ViewLocationActivity, true) + super.onCreate(savedInstanceState) + } + override fun initView(savedInstanceState: Bundle?) { + intent.extras?.let { + mCurrentLat = it.getDouble("latitude") + mCurrentLon = it.getDouble("longitude") + } + mBinding.apply { + mapView.onCreate(savedInstanceState) + if (aMap == null) { + aMap = mapView.map + } + PermissionX.init(this@ViewLocationActivity) + .permissions(mPermissionList) + .request { allGranted, grantedList, deniedList -> + setUpMap(allGranted) + } + } + } + + override fun initData() { + + } + private fun setUpMap(allGranted: Boolean) { + + mBinding.apply { + if (allGranted){ + // 自定义系统定位小蓝点 + val myLocationStyle = MyLocationStyle() + // 设置小蓝点的图 + myLocationStyle.myLocationIcon( + BitmapDescriptorFactory + .fromResource(R.drawable.ic_my_location) + ) + myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW) + aMap?.myLocationStyle = myLocationStyle + aMap?.uiSettings?.isMyLocationButtonEnabled = true // 设置默认定位按钮是否显示 + aMap?.uiSettings?.isRotateGesturesEnabled = false + aMap?.uiSettings?.isTiltGesturesEnabled = false + aMap?.isMyLocationEnabled = true // 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false + } + aMap?.moveCamera(CameraUpdateFactory.zoomTo(13F)) + val markerOption = MarkerOptions() + markerOption.position(LatLng(mCurrentLat, mCurrentLon)) + aMap?.moveCamera(CameraUpdateFactory.newLatLng(LatLng(mCurrentLat, mCurrentLon))) + markerOption.icon( + BitmapDescriptorFactory.fromBitmap( + BitmapFactory + .decodeResource(resources, R.drawable.ic_select_location) + ) + ) + markerOption.isFlat = true + aMap?.addMarker(markerOption) + } + + } + override fun onResume() { + super.onResume() + mBinding.mapView.onResume() + } + + override fun onPause() { + super.onPause() + mBinding.mapView.onPause() + } + + override fun onDestroy() { + super.onDestroy() + mBinding.mapView.onDestroy() + } + override fun bindEvent() { + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/im/adapter/FragmentAdapter.java b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/adapter/FragmentAdapter.java new file mode 100644 index 0000000..3d5eb2b --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/adapter/FragmentAdapter.java @@ -0,0 +1,46 @@ +package com.yxjk.healthexpertclient.ui.im.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentManager; +import androidx.lifecycle.Lifecycle; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import java.util.List; + +public class FragmentAdapter extends FragmentStateAdapter { + private static final String TAG = FragmentAdapter.class.getSimpleName(); + + private List fragmentList; + + public FragmentAdapter(@NonNull FragmentActivity fragmentActivity) { + super(fragmentActivity); + } + + public FragmentAdapter(@NonNull Fragment fragment) { + super(fragment); + } + + public FragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) { + super(fragmentManager, lifecycle); + } + + public void setFragmentList(List fragmentList) { + this.fragmentList = fragmentList; + } + + @NonNull + @Override + public Fragment createFragment(int position) { + if (fragmentList == null || fragmentList.size() <= position) { + return new Fragment(); + } + return fragmentList.get(position); + } + + @Override + public int getItemCount() { + return fragmentList == null ? 0 : fragmentList.size(); + } +} diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/im/utils/IMInputActionSettingUtils.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/utils/IMInputActionSettingUtils.kt new file mode 100644 index 0000000..accc52d --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/utils/IMInputActionSettingUtils.kt @@ -0,0 +1,29 @@ +package com.yxjk.healthexpertclient.ui.im.utils + +import com.tencent.qcloud.tuikit.tuichat.classicui.setting.InputActionSetting + +object IMInputActionSettingUtils { + + /** + * 图文咨询IM功能配置 + */ + fun createImageTextConsultSetting(isSelf: Boolean = false, disableSendMessage: Boolean = false){ + var inputActionSetting = InputActionSetting.createInstance() + inputActionSetting.isDisableAudioCall = true + inputActionSetting.isDisableVideoCall = true + inputActionSetting.isDisableArchives = false + inputActionSetting.isDisableMedicalExaminationReport = !isSelf + inputActionSetting.isDisableSendMessage = disableSendMessage + } + /** + * 小助手IM功能配置 + */ + fun createAssistantSetting(){ + var inputActionSetting = InputActionSetting.createInstance() + inputActionSetting.isDisableAudioCall = true + inputActionSetting.isDisableVideoCall = true + inputActionSetting.isDisableArchives = true + inputActionSetting.isDisableMedicalExaminationReport = true + inputActionSetting.isDisableSendMessage = false + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/im/view/Menu.java b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/view/Menu.java new file mode 100644 index 0000000..ed406b4 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/view/Menu.java @@ -0,0 +1,172 @@ +package com.yxjk.healthexpertclient.ui.im.view; + +import android.app.Activity; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PixelFormat; +import android.graphics.RectF; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.PopupWindow; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.tencent.qcloud.tuicore.R; +import com.tencent.qcloud.tuicore.component.action.PopMenuAction; +import com.tencent.qcloud.tuicore.component.action.PopMenuAdapter; +import com.tencent.qcloud.tuicore.util.ScreenUtil; + +import java.util.ArrayList; +import java.util.List; + +public class Menu { + + private static final int SHADOW_WIDTH = 10; + private static final int Y_OFFSET = 4; + + private ListView mMenuList; + private PopMenuAdapter mMenuAdapter; + private PopupWindow mMenuWindow; + private List mActions = new ArrayList<>(); + private Activity mActivity; + private View mAttachView; + + public Menu(Activity activity, View attach) { + mActivity = activity; + mAttachView = attach; + } + + public void setMenuAction(List menuActions) { + mActions.clear(); + mActions.addAll(menuActions); + } + + public boolean isShowing() { + if (mMenuWindow == null) { + return false; + } + return mMenuWindow.isShowing(); + } + + public void hide() { + mMenuWindow.dismiss(); + } + + public void show() { + if (mActions == null || mActions.size() == 0) { + return; + } + mMenuWindow = new PopupWindow(mActivity); + mMenuWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); + mMenuWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); + mMenuWindow.setBackgroundDrawable(new ColorDrawable()); + + mMenuAdapter = new PopMenuAdapter(); + mMenuAdapter.setDataSource(mActions); + View menuView = LayoutInflater.from(mActivity).inflate(R.layout.core_pop_menu, null); + menuView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); + mMenuWindow.setContentView(menuView); + mMenuList = menuView.findViewById(R.id.menu_pop_list); + mMenuList.setAdapter(mMenuAdapter); + mMenuList.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + PopMenuAction action = (PopMenuAction) mMenuAdapter.getItem(position); + if (action != null && action.getActionClickListener() != null) { + action.getActionClickListener().onActionClick(position, mActions.get(position)); + } + } + }); + + int paddingLeftRight = ScreenUtil.dip2px(15.0f); + int paddingTopBottom = ScreenUtil.dip2px(12.0f); + + int itemWidth = mActivity.getResources().getDimensionPixelSize(R.dimen.core_pop_menu_item_width); + int itemHeight = mActivity.getResources().getDimensionPixelSize(R.dimen.core_pop_menu_item_height); + float anchorWidth = mAttachView.getWidth(); + float anchorHeight = mAttachView.getHeight(); + + mMenuWindow.getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + + int[] location = new int[2]; + mAttachView.getLocationOnScreen(location); + int rowCount = mActions.size(); + int indicatorHeight = mActivity.getResources().getDimensionPixelOffset(R.dimen.core_pop_menu_indicator_height); + + int popWidth = itemWidth + paddingLeftRight * 2 - SHADOW_WIDTH; + int popHeight = itemHeight * rowCount + paddingTopBottom * 2 - SHADOW_WIDTH; + + float indicatorX = anchorWidth / 2; + int screenWidth = ScreenUtil.getScreenWidth(mActivity); + int x = location[0]; + int y; + float xOffset = anchorWidth / 2; + // If it is on the right, the x-coordinate of the small arrow and the x-position of the pop-up window will change + if (location[0] * 2 + anchorWidth > screenWidth) { + indicatorX = popWidth - anchorWidth / 2 - xOffset; + x = (int) (location[0] + anchorWidth - popWidth + xOffset); + } + + y = (int) (location[1] + anchorHeight) + Y_OFFSET; + popHeight = popHeight - indicatorHeight; + + Drawable backgroundDrawable = getBackgroundDrawable(popWidth, popHeight, indicatorX, indicatorHeight, 16); + menuView.setBackground(backgroundDrawable); + + mMenuWindow.setFocusable(true); + mMenuWindow.setTouchable(true); + mMenuWindow.setOutsideTouchable(true); + mMenuWindow.showAtLocation(mAttachView, Gravity.NO_GRAVITY, x, y); + } + + /** + * Draw a popup background with small triangles + */ + public Drawable getBackgroundDrawable(final float widthPixel, final float heightPixel, float indicatorX, float indicatorHeight, float radius) { + int borderWidth = SHADOW_WIDTH; + + Path path = new Path(); + Drawable drawable = new Drawable() { + + @Override + public void draw(@NonNull Canvas canvas) { + Paint paint = new Paint(); + paint.setColor(Color.WHITE); + paint.setStyle(Paint.Style.FILL); + paint.setShadowLayer(borderWidth, 0,0,0xFFAAAAAA); + path.addRoundRect(new RectF(borderWidth, indicatorHeight + borderWidth, widthPixel - borderWidth, heightPixel + indicatorHeight - borderWidth), radius, radius, Path.Direction.CW); + path.moveTo(indicatorX - indicatorHeight, indicatorHeight + borderWidth); + path.lineTo(indicatorX, borderWidth); + path.lineTo(indicatorX + indicatorHeight, indicatorHeight + borderWidth); + path.close(); + canvas.drawPath(path, paint); + } + + @Override + public void setAlpha(int alpha) { + + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } + }; + return drawable; + } +} diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/im/viewmodel/SelectLocationViewModel.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/viewmodel/SelectLocationViewModel.kt new file mode 100644 index 0000000..2d93185 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/viewmodel/SelectLocationViewModel.kt @@ -0,0 +1,14 @@ +package com.yxjk.healthexpertclient.ui.im.viewmodel + +import com.btpj.lib_base.base.BaseViewModel + +/** + * @author nanfeifei + * @time 2023/7/4 10:38 + * @description + */ +class SelectLocationViewModel: BaseViewModel() { + override fun init() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/im/viewmodel/ViewLocationViewModel.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/viewmodel/ViewLocationViewModel.kt new file mode 100644 index 0000000..b8eec8f --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/im/viewmodel/ViewLocationViewModel.kt @@ -0,0 +1,14 @@ +package com.yxjk.healthexpertclient.ui.im.viewmodel + +import com.btpj.lib_base.base.BaseViewModel + +/** + * @author nanfeifei + * @time 2023/7/4 10:38 + * @description + */ +class ViewLocationViewModel: BaseViewModel() { + override fun init() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/login/ChangePassWordActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/login/ChangePassWordActivity.kt new file mode 100644 index 0000000..7feee50 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/login/ChangePassWordActivity.kt @@ -0,0 +1,117 @@ +package com.yxjk.healthexpertclient.ui.login + +import android.content.res.ColorStateList +import android.graphics.Color +import android.graphics.drawable.GradientDrawable +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.text.method.HideReturnsTransformationMethod +import android.text.method.PasswordTransformationMethod +import android.view.View +import android.widget.RadioButton +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.btpj.lib_base.base.BaseVMBActivity +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivityChangePasswordBinding +import com.yxjk.healthexpertclient.ui.login.viewmodel.LoginViewModel +import com.yxjk.healthexpertclient.utils.CommonUtils +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +/** + * 找回密码 + */ +class ChangePassWordActivity: BaseVMBActivity(R.layout.activity_change_password), View.OnClickListener { + var mCode="" + override fun initView(savedInstanceState: Bundle?) { + } + + override fun initData() { + mCode= intent.getStringExtra("code").toString() + } + + override fun bindEvent() { + mBinding?.let{ + addClickViews(it.retrieveConfirm) + it.loginIvEye.setOnClickListener { + mBinding?.let { + var selection=it.tvNewPassword.selectionEnd + if (it.tvNewPassword.transformationMethod== PasswordTransformationMethod.getInstance()){ + it.tvNewPassword.setTransformationMethod( + HideReturnsTransformationMethod.getInstance()) + it.loginIvEye.setImageResource(R.mipmap.ic_password_show) + }else{ + it.tvNewPassword.setTransformationMethod( + PasswordTransformationMethod.getInstance()) + it.loginIvEye.setImageResource(R.mipmap.ic_password_hind) + } + it.tvNewPassword.setSelection(selection) + } + } + it.loginIvEye2.setOnClickListener { + mBinding?.let { + var selection=it.tvConfirmPassword.selectionEnd + if (it.tvConfirmPassword.transformationMethod== PasswordTransformationMethod.getInstance()){ + it.tvConfirmPassword.setTransformationMethod( + HideReturnsTransformationMethod.getInstance()) + it.loginIvEye2.setImageResource(R.mipmap.ic_password_show) + }else{ + it.tvConfirmPassword.setTransformationMethod( + PasswordTransformationMethod.getInstance()) + it.loginIvEye2.setImageResource(R.mipmap.ic_password_hind) + } + it.tvConfirmPassword.setSelection(selection) + } + } + } + } + override fun createObserve() { + super.createObserve() + mBinding.apply { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.mChangeState.collectLatest { result -> + if (result){ + showToast("修改密码成功") + finish() + } + } + } + } + } + } + override fun onClick(v: View?) { + processClick(v) + } + + fun processClick(paramView: View?) { + when(paramView?.id){ + R.id.retrieve_confirm -> { + //密码需要为12-32位(包含数字、大写、小写字母、特殊字符) + // TODO: 2024/5/11 密码改为12-32位 + var newPassword=mBinding?.tvNewPassword?.text.toString().trim() + if (newPassword.isNullOrEmpty()) { + showToast("请输入新密码") + return + } + var confirmPassword=mBinding?.tvConfirmPassword?.text.toString().trim() + if (confirmPassword.isNullOrEmpty()) { + showToast("请输入验证码") + return + } + if (newPassword!=confirmPassword) { + showToast("两次密码输入不一致,请重新输入") + return + } + if (newPassword.length < 12 || newPassword.length > 32 || !CommonUtils.isPasswordMatches(newPassword)){ + showToast(getString(R.string.password_hint)) + return + } + mViewModel.resetUserPwd(newPassword,confirmPassword,mCode) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/login/LoginActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/login/LoginActivity.kt new file mode 100644 index 0000000..8969c1d --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/login/LoginActivity.kt @@ -0,0 +1,276 @@ +package com.yxjk.healthexpertclient.ui.login + +import android.os.Bundle +import android.text.SpannableString +import android.text.Spanned +import android.text.TextPaint +import android.text.TextUtils +import android.text.method.LinkMovementMethod +import android.text.style.ClickableSpan +import android.text.style.ForegroundColorSpan +import android.text.style.UnderlineSpan +import android.view.Gravity +import android.view.View +import androidx.core.content.ContextCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.btpj.lib_base.data.local.DataStoreManager +import com.btpj.lib_base.data.local.IpManager +import com.buddy.kredit.android.base.BaseActivity +import com.yxjk.healthexpertclient.MyApplication.Companion.appViewModel +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivityLoginBinding +import com.yxjk.healthexpertclient.ext.startMainActivity +import com.yxjk.healthexpertclient.ext.startRetrievePassWordActivity +import com.yxjk.healthexpertclient.ext.startWebActivity +import com.yxjk.healthexpertclient.ui.login.viewmodel.LoginViewModel +import com.yxjk.healthexpertclient.utils.CommonUtils +import com.yxjk.healthexpertclient.utils.ConstantUtils +import com.yxjk.healthexpertclient.view.PrivacyDialog +import com.yxjk.healthexpertclient.view.TextViewDialog +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +/** + * @author nanfeifei + * @time 2023/5/29 16:33 + * @description 登录 + */ +class LoginActivity : + BaseActivity(R.layout.activity_login) { + var mTextViewDialog: TextViewDialog? = null + override fun transparentStatusBar(): Boolean { + return true + } + + override fun initView(savedInstanceState: Bundle?) { + initAgreement() + mTextViewDialog = TextViewDialog(this) + mBinding.apply { + } + + } + + override fun createObserve() { + super.createObserve() + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + appViewModel.loginState.collect { isLogin -> + if (isLogin) { + startMainActivity(this@LoginActivity) + finish() + } else { + CommonUtils.clearUserInfo() + } + } + } + } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.list.collectLatest { list -> + if (list != null) { + list?.let { + for (index in 0 until it.size) { + when (it[index].value) { + "1" -> { + //用户协议 + if (it[index].text.isNotEmpty()) { + DataStoreManager.saveUserAgreementUrl( + IpManager.getH5BaseUrl( + IpManager.baseUrlType + ) + it[index].text + ) + } + } + + "2" -> { + //隐私政策 + if (it[index].text.isNotEmpty()) { + DataStoreManager.savePrivacyAgreementUrl( + IpManager.getH5BaseUrl( + IpManager.baseUrlType + ) + it[index].text + ) + } + } + + "3" -> { + //相关法律说明 + if (it[index].text.isNotEmpty()) { + DataStoreManager.saveLawUrl( + IpManager.getH5BaseUrl( + IpManager.baseUrlType + ) + it[index].text + ) + } + } + } + } + } + } + } + } + } + } + + override fun initData() { + lifecycleScope.launch { + appViewModel.loginState.emit(false) + } + mViewModel.getAgreementData() + if (!DataStoreManager.isPrivacyState()) { + privacyShow() + } + } + + fun privacyShow() { + val textViewDialog = PrivacyDialog(LoginActivity@ this) + textViewDialog?.setDialogTitle("隐私协议授权", 18f) + textViewDialog?.setContent(ConstantUtils.mPrivacy, 14f) + textViewDialog?.setContentStyle(Gravity.LEFT) + textViewDialog?.setBtnText("同意", 18f) + textViewDialog?.setDialogCancelable(false) + textViewDialog?.setCancelBtnText("退出", 18f) + textViewDialog?.setOnAffirmClickListener(object : PrivacyDialog.OnAffirmClickListener { + override fun onAffirmClick(viewDialog: PrivacyDialog) { + DataStoreManager.savePrivacyState(true) + + } + + override fun onCancelClick(viewDialog: PrivacyDialog) { + System.exit(0) + } + }) + textViewDialog?.show() + } + + + override fun bindEvent() { + mBinding.apply { + addClickViews(loginSubmit, loginRetrievePassword) + } + mTextViewDialog?.let { + it.setDialogTitle("温馨提示", 18f) + it.setContent("您的密码不安全,请先修改密码", 14f) + it.setContentStyle(Gravity.LEFT) + it.setBtnText("确认", 18f) + it.setDialogCancelable(false) + it.setCancelBtnText("取消", 18f) + it.setOnAffirmClickListener(object : TextViewDialog.OnAffirmClickListener { + override fun onAffirmClick(viewDialog: TextViewDialog) { + startRetrievePassWordActivity(this@LoginActivity) + } + + override fun onCancelClick(viewDialog: TextViewDialog) { + + } + }) + } + + } + + override fun onClick(v: View?) { + super.onClick(v) + when (v?.id) { + R.id.login_submit -> { + mBinding.apply { + val account = loginEtUserName.text.toString() + val password = loginEtUserPassword.getInputContext() + if (TextUtils.isEmpty(account)) { + showToast(resources?.getString(R.string.login_account_hint)) + return + } + if (TextUtils.isEmpty(password)) { + showToast(resources?.getString(R.string.login_password_hint)) + return + } + if (password.length < 12 || password.length > 32) { + //弹窗提示去修改密码 + mTextViewDialog?.show() + } else { + mViewModel.login(account, password) + } + } + } + + R.id.login_retrieve_password -> { //找回密码 + startRetrievePassWordActivity(this) + } + } + } + + private fun initAgreement() { + var span = SpannableString(getString(R.string.login_privacy_agreement)) + span.setSpan(object : ClickableSpan() { + + override fun onClick(widget: View) { + DataStoreManager.getUserAgreementUrl()?.let { + if (it.isNotEmpty()) { + startWebActivity(this@LoginActivity, it) + } + } + } + // 表示点击整个text的长度都有效触发这个事件 + }, 6, 12, Spanned.SPAN_INCLUSIVE_EXCLUSIVE) + span.setSpan(NoUnderlineSpan(), 6, 12, Spanned.SPAN_MARK_MARK) + span.setSpan( + ForegroundColorSpan( + ContextCompat.getColor( + this@LoginActivity, + R.color.link_blue_color + ) + ), 6, 12, Spanned.SPAN_INCLUSIVE_EXCLUSIVE + ) + + span.setSpan(object : ClickableSpan() { + + override fun onClick(widget: View) { + DataStoreManager.getPrivacyAgreementUrl()?.let { + if (it.isNotEmpty()) { + startWebActivity(this@LoginActivity, it) + } + } + } + // 表示点击整个text的长度都有效触发这个事件 + }, 13, 19, Spanned.SPAN_INCLUSIVE_EXCLUSIVE) + span.setSpan(NoUnderlineSpan(), 13, 19, Spanned.SPAN_MARK_MARK) + span.setSpan( + ForegroundColorSpan( + ContextCompat.getColor( + this@LoginActivity, + R.color.link_blue_color + ) + ), 13, 19, Spanned.SPAN_INCLUSIVE_EXCLUSIVE + ) +// span.setSpan(object : ClickableSpan() { +// +// override fun onClick(widget: View) { +// DataStoreManager.getLawUrl()?.let { +// if (it.isNotEmpty()) { +// startWebActivity(this@LoginActivity,it) +// } +// } +// } +// // 表示点击整个text的长度都有效触发这个事件 +// }, 20, 28, Spanned.SPAN_INCLUSIVE_EXCLUSIVE) +// span.setSpan(NoUnderlineSpan(), 20, 28, Spanned.SPAN_MARK_MARK) +// span.setSpan( +// ForegroundColorSpan( +// ContextCompat.getColor( +// this@LoginActivity, +// R.color.link_blue_color +// ) +// ), 20, 28, Spanned.SPAN_INCLUSIVE_EXCLUSIVE +// ) + mBinding.loginTvAgreement.text = span + mBinding.loginTvAgreement.movementMethod = LinkMovementMethod.getInstance() + } + + internal class NoUnderlineSpan : UnderlineSpan() { + override fun updateDrawState(ds: TextPaint) { + ds.color = ds.linkColor + ds.isUnderlineText = false + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/login/RetrievePassWordActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/login/RetrievePassWordActivity.kt new file mode 100644 index 0000000..b74a847 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/login/RetrievePassWordActivity.kt @@ -0,0 +1,165 @@ +package com.yxjk.healthexpertclient.ui.login + +import android.content.res.ColorStateList +import android.graphics.Color +import android.os.Bundle +import android.os.CountDownTimer +import android.os.Handler +import android.os.Message +import android.view.View +import android.widget.RadioButton +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.btpj.lib_base.base.BaseVMBActivity +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivityRetrievePasswordBinding +import com.yxjk.healthexpertclient.ext.startChangePassWordActivity +import com.yxjk.healthexpertclient.ui.login.viewmodel.LoginViewModel +import com.yxjk.healthexpertclient.ui.login.viewmodel.RetrievePassWordViewModel +import com.yxjk.healthexpertclient.utils.AuthCodeCountDownTimer +import com.yxjk.healthexpertclient.utils.phoneCheck +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +/** + * @author nanfeifei + * @time 2023/5/29 19:30 + * @description 找回密码 + */ +class RetrievePassWordActivity: BaseVMBActivity(R.layout.activity_retrieve_password) , View.OnClickListener{ + var mNumber=60 + var mIsSendCode=true + var type=0 //0 信息找回 1 验证码找回 + var mhandler=object : Handler(){ + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + when (msg.what) { + 0 -> { + if (type==1) { + if (mNumber==1) { + mIsSendCode=true + mNumber=60 + mBinding?.retrieveGetCheckCode?.text="重新发送" + mBinding?.retrieveGetCheckCode?.backgroundTintList = ColorStateList.valueOf( + Color.parseColor("#21BEBD")) + }else{ + mIsSendCode=false + mNumber=mNumber-1 + mBinding?.retrieveGetCheckCode?.text="重新发送(${mNumber}s)" + sendEmptyMessageDelayed(0,1000) + } + }else{ + mNumber=60 + mBinding?.retrieveGetCheckCode?.text="获取验证码" + mBinding?.retrieveGetCheckCode?.backgroundTintList = ColorStateList.valueOf( + Color.parseColor("#21BEBD")) + } + + + } + else -> {} + } + } + } + override fun initView(savedInstanceState: Bundle?) { + switchFindMode() + } + + override fun initData() { + } + + override fun bindEvent() { + mBinding?.let{ + addClickViews(it.retrieveGetCheckCode,it.retrieveConfirm) + } + mBinding?.radioGroup?.setOnCheckedChangeListener { group, checkedId -> + var radio=findViewById(checkedId) + var value=radio.text.toString() + if (value=="用户信息找回") { + type=0 + switchFindMode() + }else{ + type=1 + switchFindMode() + } + } + } + + fun switchFindMode(){ + if (type==0){ + mBinding?.llInfoFind?.visibility=View.VISIBLE + mBinding?.llCodeFind?.visibility=View.GONE + }else{ + mBinding?.llInfoFind?.visibility=View.GONE + mBinding?.llCodeFind?.visibility=View.VISIBLE + } + } + + override fun createObserve() { + super.createObserve() + mBinding.apply { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.mCode.collectLatest { code -> + if (!code.isNullOrEmpty()) { + startChangePassWordActivity(code) + finish() + } + } + } + } + } + } + override fun onClick(v: View?) { + processClick(v) + } + fun processClick(paramView: View?) { + when(paramView?.id){ + R.id.retrieve_get_check_code -> { + if (mIsSendCode) { + mBinding?.retrieveGetCheckCode?.backgroundTintList = ColorStateList.valueOf( + Color.parseColor("#BBBBBB")) + mBinding?.retrieveGetCheckCode?.text="重新发送(${mNumber}s)" + mhandler.sendEmptyMessageDelayed(0,1000) + } + } + R.id.retrieve_confirm -> { + if (type==0) { + var name=mBinding?.tvUserName?.text.toString().trim() + var idcard=mBinding?.tvUserIdCard?.text.toString().trim() + var phone=mBinding?.tvUserPhone?.text.toString().trim() + if (name.isNullOrEmpty()) { + showToast("请输入用户姓名") + return + } + if (idcard.isNullOrEmpty()) { + showToast("请输入身份证号") + return + } + if (phone.isNullOrEmpty()) { + showToast("请输入手机号") + return + } + mViewModel.checkUserInfo(name,idcard,phone) + }else if (type==1) { + var phone=mBinding?.retrievePhone?.text.toString().trim() + if (phone.isNullOrEmpty()) { + showToast("请输入手机号码") + return + } + if(!phone.phoneCheck()){ + showToast("手机号码格式不正确") + return + } + var code=mBinding?.retrieveCheckCode?.text.toString().trim() + if (code.isNullOrEmpty()) { + showToast("请输入验证码") + return + } + } + + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/login/viewmodel/LoginViewModel.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/login/viewmodel/LoginViewModel.kt new file mode 100644 index 0000000..a5c339d --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/login/viewmodel/LoginViewModel.kt @@ -0,0 +1,75 @@ +package com.yxjk.healthexpertclient.ui.login.viewmodel + +import com.baileren.rsalibrary.RSACipherStrategy +import com.btpj.lib_base.BaseApp.Companion.appContext +import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.ext.encrypt +import com.btpj.lib_base.ext.handleRequest +import com.btpj.lib_base.ext.launch +import com.yxjk.healthexpertclient.MyApplication.Companion.appViewModel +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.CommonSettingMenuBean +import com.yxjk.healthexpertclient.data.repository.LoginRepository +import com.yxjk.healthexpertclient.utils.CommonUtils +import com.yxjk.healthexpertclient.utils.ConstantUtils +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow + +/** + * @author nanfeifei + * @time 2023/5/29 18:32 + * @description + */ +class LoginViewModel : BaseViewModel() { + val agreement = MutableStateFlow(false) + var mCode = MutableStateFlow("") + var mChangeState = MutableSharedFlow() + var list = MutableStateFlow?>(null) + override fun init() { + + } + + fun checkUserInfo(realname:String,idCard:String,phone:String){ + launch({ + handleRequest(LoginRepository.checkUserInfo(realname,idCard,phone), successBlock = { + it.result?.let { it1 -> mCode.emit(it1) } + }) + }) + } + + fun login(account: String,password: String) { + launch( + { + if (!agreement.value) { + exception.value = + Exception(appContext.getString(R.string.login_privacy_agreement)) + return@launch + } + + handleRequest(LoginRepository.login(account, password.encrypt(ConstantUtils.RSA_PUBLIC_KEY)), successBlock = { + it.result?.let { result -> + result.userInfo.userToken = result.token + CommonUtils.saveUserInfo(result.userInfo) + } + appViewModel.loginState.emit(true) + }) + }) + } + + fun getAgreementData(){ + launch({ + handleRequest(LoginRepository.getCommonSettingMenuList("z_jump_url"), successBlock = { + it.result?.let { it1 -> list.emit(it1) } + }) + }) + } + fun resetUserPwd(password:String,confirmPassword:String,resetCode:String){ + var newPassword= RSACipherStrategy().encrypt(ConstantUtils.RSA_PUBLIC_KEY,password) + var newPasswordConfirm= RSACipherStrategy().encrypt(ConstantUtils.RSA_PUBLIC_KEY,confirmPassword) + launch({ + handleRequest(LoginRepository.resetUserPwd(newPassword,newPasswordConfirm,resetCode), successBlock = { + it.result?.let { it1 -> mChangeState.emit(true) } + }) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/login/viewmodel/RetrievePassWordViewModel.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/login/viewmodel/RetrievePassWordViewModel.kt new file mode 100644 index 0000000..5f37189 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/login/viewmodel/RetrievePassWordViewModel.kt @@ -0,0 +1,54 @@ +package com.yxjk.healthexpertclient.ui.login.viewmodel + +import com.btpj.lib_base.BaseApp.Companion.appContext +import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.ext.isMobile +import com.btpj.lib_base.ext.launch +import com.yxjk.healthexpertclient.R +import kotlinx.coroutines.flow.MutableStateFlow + +/** + * @author nanfeifei + * @time 2023/5/29 19:30 + * @description + */ +class RetrievePassWordViewModel: BaseViewModel() { + var mobile = MutableStateFlow("") + var authCode = MutableStateFlow("") + var sendAuthCode = MutableStateFlow(false) + override fun init() { + + } + fun sendAuthCode(){ + launch({ + if(mobile.value.isNullOrEmpty()){ + exception.value = Exception(appContext.getString(R.string.retrieve_password_mobile_hint)) + return@launch + } + if(!mobile.value.isMobile()){ + exception.value = Exception(appContext.getString(R.string.retrieve_password_mobile_hint)) + return@launch + } + sendAuthCode.emit(true) + }) + + } + fun submitAuthCode(){ + launch({ + if(mobile.value.isNullOrEmpty()){ + exception.value = Exception(appContext.getString(R.string.retrieve_password_mobile_hint)) + return@launch + } + if(!mobile.value.isMobile()){ + exception.value = Exception(appContext.getString(R.string.retrieve_password_mobile_hint)) + return@launch + } + if(!authCode.value.isMobile()){ + exception.value = Exception(appContext.getString(R.string.retrieve_password_mobile_hint)) + return@launch + } + + }) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/main/MainActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/MainActivity.kt new file mode 100644 index 0000000..9890753 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/MainActivity.kt @@ -0,0 +1,154 @@ +package com.yxjk.healthexpertclient.ui.main + +import android.os.Bundle +import androidx.fragment.app.Fragment +import com.btpj.lib_base.ext.clearLongClickToast +import com.buddy.kredit.android.base.BaseActivity +import com.yxjk.healthexpertclient.MyApplication.Companion.appViewModel +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivityMainBinding +import com.yxjk.healthexpertclient.event.DoctorEvent +import com.yxjk.healthexpertclient.ext.loginIm +import com.yxjk.healthexpertclient.ui.main.viewmodel.MainViewModel +import com.yxjk.healthexpertclient.ui.mine.fragment.MineFragment +import com.yxjk.healthexpertclient.ui.workbench.fragment.WorkbenchFragment +import com.tencent.qcloud.tuicore.TUIThemeManager +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.lzh.framework.updatepluginlib.UpdateBuilder + +class MainActivity : BaseActivity(R.layout.activity_main) { + companion object { + /** 记录修改配置(如页面旋转)前navBar的位置的常量 */ + private const val CURRENT_NAV_POSITION = "currentNavPosition" + } + private val workbenchFragment by lazy { WorkbenchFragment.newInstance() } + private val mineFragment by lazy { MineFragment.newInstance() } + /** 设置默认值为账号页,目的是第一次设置Fragment的时候防止跟实际会设置的Fragment一样,导致不添加() */ + private var mCurrentFragment: Fragment? = null + private var mCurrentNavPosition = 0 + override fun initView(savedInstanceState: Bundle?) { + // 修改配置时(例如页面旋转、深浅模式切换等)的页面恢复 + if (savedInstanceState != null) { + getIndexFragment(savedInstanceState.getInt(CURRENT_NAV_POSITION)) + } + initTUIThemeManager() + UpdateBuilder.create() + .check()// 启动更新任务 + mBinding.apply { + bottomNavigationView.apply { + // 处理bottomNavigationView的item长按出现Toast的问题 + clearLongClickToast( + mutableListOf( + R.id.menu_workbench, + R.id.menu_mine + ) + ) + + setOnItemSelectedListener { + return@setOnItemSelectedListener onNavBarItemSelected(it.itemId) + } + } + } + getIndexFragment(0) + } + + override fun initData() { + if(isLogin()){ + appViewModel.getIMSig(successCall = { + loginIm() + }) + }else{ + finish() + } + } + private fun initTUIThemeManager(){ + TUIThemeManager.getInstance().changeTheme(this, TUIThemeManager.THEME_SERIOUS) + TUIThemeManager.setWebViewLanguage(this) + } + /** + * 设置指定下标的Fragment + */ + private fun getIndexFragment(index: Int) { + when (index) { + 0 -> R.id.menu_workbench + 1 -> R.id.menu_mine + else -> R.id.menu_workbench + }.let { + mBinding.bottomNavigationView.selectedItemId = it + onNavBarItemSelected(it) + } + } + /** + * bottomNavigationView切换时调用的方法 + * + * @param itemId 切换Item的id + */ + private fun onNavBarItemSelected(itemId: Int): Boolean { + when (itemId) { + R.id.menu_workbench -> { + mCurrentNavPosition = 0 + switchFragment(workbenchFragment) + return true + } + R.id.menu_mine -> { + mCurrentNavPosition = 1 + switchFragment(mineFragment) + return true + } + else -> { + mCurrentNavPosition = 0 + switchFragment(workbenchFragment) + return true + } + } + } + /** + * 切换Fragment + * + * @param fragment 要切换的Fragment + */ + private fun switchFragment(fragment: Fragment) { + if (fragment !== mCurrentFragment) { + val fragmentTransaction = supportFragmentManager.beginTransaction() + // 先隐藏当前显示的Fragment + mCurrentFragment?.let { fragmentTransaction.hide(it) } + if (!fragment.isAdded) { + var oldFragment = supportFragmentManager.findFragmentByTag(fragment.javaClass.simpleName) + if(oldFragment == null){ + // 存入Tag,以便获取,解决界面重叠问题 参考http://blog.csdn.net/showdy/article/details/50825800 + fragmentTransaction.add(R.id.main_content_layout, fragment, fragment.javaClass.simpleName) + .show(fragment) + }else{ + fragmentTransaction.show(oldFragment) + } + } else { + fragmentTransaction.show(fragment) + } + // 执行提交 + fragmentTransaction.commitAllowingStateLoss() + // 将当前Fragment赋值为切换后的Fragment + mCurrentFragment = fragment + } + } + + override fun onSaveInstanceState(outState: Bundle) { + // 解决Fragment界面重叠问题,直接传递一个空的Bundle 参考http://blog.csdn.net/showdy/article/details/50825800 + super.onSaveInstanceState(Bundle()) + // 记录屏幕旋转/更换深浅模式等之前切换的Fragment的位置 + outState.putInt(CURRENT_NAV_POSITION, mCurrentNavPosition) + } + + override fun onBackPressed() { + super.onBackPressed() + finish() + } + override fun bindEvent() { + + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: DoctorEvent) { + mViewModel.getDoctorInfo() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/main/WebActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/WebActivity.kt new file mode 100644 index 0000000..842127e --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/WebActivity.kt @@ -0,0 +1,69 @@ +package com.yxjk.healthexpertclient.ui.main + +import android.os.Bundle +import android.webkit.WebView +import android.widget.FrameLayout +import com.buddy.kredit.android.base.BaseActivity +import com.just.agentweb.AgentWeb +import com.just.agentweb.WebChromeClient +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivityWebBinding +import com.yxjk.healthexpertclient.ui.main.viewmodel.WebViewModel +/** + * @author nanfeifei + * @time 2023/5/23 16:20 + * @description WebView页面 + */ +class WebActivity: BaseActivity(R.layout.activity_web) { + private lateinit var mAgentWeb: AgentWeb + private lateinit var mUrl: String + private lateinit var mTitle: String + + override fun initView(savedInstanceState: Bundle?) { + + mAgentWeb = AgentWeb.with(this) + .setAgentWebParent(mBinding.flWeb, FrameLayout.LayoutParams(-1, -1)) + .useDefaultIndicator() + .setWebChromeClient(object : WebChromeClient() { + override fun onReceivedTitle(view: WebView?, title: String?) { + super.onReceivedTitle(view, title) + mTitle = title ?: "" + if(mTitle.startsWith("http")){ + mTitle = getString(R.string.app_name) + } + mBinding.toolbarLay.tvTitle.text = mTitle + } + }) + .createAgentWeb() + .ready() + .go(getUrl()) + var javaScriptEnabled = intent.extras?.getBoolean("javaScriptEnabled") + if (javaScriptEnabled != null) { + mAgentWeb.agentWebSettings.webSettings.javaScriptEnabled = javaScriptEnabled + } + } + + override fun bindEvent() { + + } + + private fun getUrl(): String { + mUrl = intent.extras?.getString("url").toString() + return mUrl + } + + override fun onResume() { + mAgentWeb.webLifeCycle.onResume() + super.onResume() + } + + override fun onPause() { + mAgentWeb.webLifeCycle.onPause() + super.onPause() + } + + override fun onDestroy() { + mAgentWeb.webLifeCycle.onDestroy() + super.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/main/adapter/ImageAdapter.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/adapter/ImageAdapter.kt new file mode 100644 index 0000000..a14aeb6 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/adapter/ImageAdapter.kt @@ -0,0 +1,128 @@ +package com.yxjk.healthexpertclient.ui.main.adapter + +import android.view.View +import com.btpj.lib_base.base.adapter.BaseDataBindingAdapter +import com.btpj.lib_base.ext.loadRoundedImage +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.ImageBean +import com.yxjk.healthexpertclient.databinding.ItemRecycleImageBinding +import java.io.File + +/** + * @author nanfeifei + * @time 2023/5/25 18:01 + * @description + */ +class ImageAdapter(var maxNum: Int): BaseDataBindingAdapter( + R.layout.item_recycle_image +), LoadMoreModule { + private var isEditModel = false + private var editImageShow = false + override fun bindViewClickListener( + viewHolder: BaseDataBindingHolder, + viewType: Int + ) { + addChildClickViewIds(R.id.btn_delete) + super.bindViewClickListener(viewHolder, viewType) + } + override fun convert( + holder: BaseDataBindingHolder, + item: ImageBean + ) { + val mBinding = holder.dataBinding + mBinding?.let { + if(item.isAddButton){ + mBinding.ivImage.setImageResource(R.drawable.icon_image_add) + mBinding.btnDelete.visibility = View.GONE + }else{ + if(item.isFilePath){ + mBinding.ivImage.loadRoundedImage(File(item.imageUrl), 5f) + }else{ + mBinding.ivImage.loadRoundedImage(item.imageUrl, 5f, R.drawable.ic_default_archives_image) + } + if(isEditModel){ + mBinding.btnDelete.visibility = View.VISIBLE + }else{ + mBinding.btnDelete.visibility = View.GONE + } + } + } + } + fun isEditModel(isEdit: Boolean){ + isEditModel = isEdit + notifyDataSetChanged() + if(isEditModel && !editImageShow){ + showAddButton(true) + } + } + + override fun setList(list: Collection?) { + super.setList(list) + if(isEditModel){ + showAddButton(true) + } + } + override fun setNewInstance(list: MutableList?) { + super.setNewInstance(list) + if(isEditModel){ + showAddButton(true) + } + } + + override fun addData(newData: Collection) { + if(isEditModel){ + if(editImageShow){ + var lastPosition = data.size - 1 + if(lastPosition < 0){ + lastPosition = 0 + } + addData(lastPosition, newData) + }else{ + showAddButton(true) + } + if(data.size > maxNum){ + showAddButton(false) + } + }else{ + super.addData(newData) + } + } + + override fun removeAt(position: Int) { + super.removeAt(position) + if(isEditModel && !editImageShow){ + showAddButton(true) + } + } + fun getImageList(): MutableList{ + var list = mutableListOf() + data.forEach { imageBean -> + if(!imageBean.isAddButton){ + list.add(imageBean) + } + } + return list + } + fun getImageSize(): Int { + if(isEditModel && editImageShow){ + return getDefItemCount() - 1 + } + return getDefItemCount() + } + + /** + * 显示添加图片按钮 + * @param isShow true为显示 false为隐藏 + */ + private fun showAddButton(isShow: Boolean){ + editImageShow = if(isShow){ + addData(ImageBean(isAddButton = true)) + true + }else{ + removeAt(data.size-1) + false + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/AppViewModel.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/AppViewModel.kt new file mode 100644 index 0000000..655a6ef --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/AppViewModel.kt @@ -0,0 +1,84 @@ +package com.yxjk.healthexpertclient.ui.main.viewmodel + +import com.btpj.lib_base.BaseApp.Companion.appContext +import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.ext.addImageBaseUrl +import com.btpj.lib_base.ext.handleRequest +import com.btpj.lib_base.ext.launch +import com.yxjk.healthexpertclient.bean.UserInfoBean +import com.yxjk.healthexpertclient.bean.im.IMInfoBean +import com.yxjk.healthexpertclient.data.repository.IMRepository +import com.yxjk.healthexpertclient.data.repository.WorkbenchRepository +import com.yxjk.healthexpertclient.event.ConsultRecordEvent +import com.yxjk.healthexpertclient.event.WorkbenchEvent +import com.yxjk.healthexpertclient.ext.initIMSDK +import com.yxjk.healthexpertclient.utils.CommonUtils +import com.yxjk.healthexpertclient.utils.TUIUtils +import com.tencent.imsdk.v2.V2TIMCallback +import com.tencent.imsdk.v2.V2TIMManager +import com.tencent.imsdk.v2.V2TIMUserFullInfo +import kotlinx.coroutines.flow.MutableStateFlow +import org.greenrobot.eventbus.EventBus + +/** + * @author nanfeifei + * @time 2023/5/11 14:11 + * @description + */ +class AppViewModel: BaseViewModel() { + var loginState = MutableStateFlow(false) + var imSig = MutableStateFlow("") + var imAppId = MutableStateFlow("") + var imUserId = MutableStateFlow("") + override fun init() { + + } + fun getIMSig(successCall: (IMInfoBean) -> Unit = {}){ + launch({ + handleRequest(IMRepository.getIMSig(), successBlock = { + it.result?.let { imBean -> + imSig.emit(imBean.userSig) + imUserId.emit(imBean.userId) + imAppId.emit(imBean.sdkAppId) + appContext.initIMSDK(imBean.sdkAppId.toInt()) + successCall.invoke(imBean) + } + }) + }) + } + fun setUserIMInfo(){ + var info = V2TIMUserFullInfo() + var userInfo: UserInfoBean? = CommonUtils.getUserInfo() ?: return + info.setNickname(userInfo?.realname) + info.faceUrl = addImageBaseUrl(userInfo?.avatar) + V2TIMManager.getInstance().setSelfInfo(info, object : V2TIMCallback { + override fun onSuccess() { + // 设置个人资料成功 + } + + override fun onError(code: Int, desc: String) { + // 设置个人资料失败 + } + }) + } + fun finishIMChat(workType: Int, workId: String, finallyCall: () -> Unit = {}){ + launch({ + when(workType){ + TUIUtils.WORK_TYPE_IMAGE_TEXT_CONSULT -> { + handleRequest(WorkbenchRepository.finishConsult(workId), successBlock = { + EventBus.getDefault().post(ConsultRecordEvent()) + EventBus.getDefault().post(WorkbenchEvent()) + }) + } + TUIUtils.WORK_TYPE_ASSISTANT -> { + handleRequest(WorkbenchRepository.finishConsult(workId), successBlock = { + EventBus.getDefault().post(WorkbenchEvent()) + }) + } + } + }, finallyBlock = { + finallyCall.invoke() + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/MainViewModel.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/MainViewModel.kt new file mode 100644 index 0000000..1602f40 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/MainViewModel.kt @@ -0,0 +1,30 @@ +package com.yxjk.healthexpertclient.ui.main.viewmodel + +import com.btpj.lib_base.base.BaseViewModel +import com.btpj.lib_base.ext.handleRequest +import com.btpj.lib_base.ext.launch +import com.yxjk.healthexpertclient.bean.im.IMAssistantBean +import com.yxjk.healthexpertclient.bean.mine.DoctorBean +import com.yxjk.healthexpertclient.data.repository.MineRepository +import kotlinx.coroutines.flow.MutableStateFlow + +class MainViewModel: BaseViewModel() { + var doctorBean = MutableStateFlow(DoctorBean()) + override fun init() { + getDoctorInfo() + } + fun getDoctorInfo(){ + launch({ + handleRequest(MineRepository.getDoctorInfo(), successBlock = { + it.result?.let { result -> doctorBean.emit(result) } + }) + }) + } + fun submitAssistantConsultApply(successCall: (IMAssistantBean) -> Unit = {}){ + launch({ + handleRequest(MineRepository.submitAssistantConsultApply(), successBlock = { + it.result?.let { it1 -> successCall.invoke(it1) } + }) + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/WebViewModel.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/WebViewModel.kt new file mode 100644 index 0000000..106e9d7 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/main/viewmodel/WebViewModel.kt @@ -0,0 +1,8 @@ +package com.yxjk.healthexpertclient.ui.main.viewmodel + +import com.btpj.lib_base.base.BaseViewModel + +class WebViewModel: BaseViewModel() { + override fun init() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/AddSuspensionAnnouncementActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/AddSuspensionAnnouncementActivity.kt new file mode 100644 index 0000000..14b238b --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/AddSuspensionAnnouncementActivity.kt @@ -0,0 +1,173 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.os.Bundle +import android.view.View +import androidx.core.view.ViewCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.btpj.lib_base.base.adapter.BaseCheckRecycleViewAdapter +import com.buddy.kredit.android.base.BaseActivity +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.listener.OnItemClickListener +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.google.android.flexbox.FlexboxLayoutManager +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivityAddSuspensionAnnouncementBinding +import com.yxjk.healthexpertclient.ui.mine.adapter.SuspensionCauseAdapter +import com.yxjk.healthexpertclient.ui.mine.viewmodel.AddSuspensionAnnouncementViewModel +import com.yxjk.healthexpertclient.view.SuspensionAnnouncementAffirmDialog +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +/** + * @author nanfeifei + * @time 2023/5/17 18:30 + * @description 暂停服务公告 + */ +class AddSuspensionAnnouncementActivity : + BaseActivity(R.layout.activity_add_suspension_announcement), + OnItemClickListener { + private val affirmDialog by lazy { SuspensionAnnouncementAffirmDialog(this) } + private val mAdapter: SuspensionCauseAdapter = SuspensionCauseAdapter() + val dataPicker: DatePicker by lazy { DatePicker(this) } + private var startDate: DateEntity = DateEntity.today() + private var endDate: DateEntity = DateEntity.today() + companion object{ + const val DATE_TYPE_START = 1 + const val DATE_TYPE_END = 2 + } + override fun initView(savedInstanceState: Bundle?) { + mBinding.apply { + val flexboxLayoutManager = FlexboxLayoutManager(this@AddSuspensionAnnouncementActivity) + rvCauseList.layoutManager = flexboxLayoutManager + ViewCompat.setNestedScrollingEnabled(rvCauseList, false) + } + } + + override fun initData() { + super.initData() + setDate(startDate.year, startDate.month, startDate.day, DATE_TYPE_START) + setDate(endDate.year, endDate.month, endDate.day, DATE_TYPE_END) + } + override fun createObserve() { + super.createObserve() + mBinding.apply { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.causeList.collectLatest { list -> + if(list.isNullOrEmpty()){ + return@collectLatest + } + mAdapter.setNewInstance(list) + if (rvCauseList.adapter == null) { + mAdapter.enabledCheckMode = true + mAdapter.singleMode = true + mAdapter.singleModeIsCanCancel = true + mAdapter.setOnItemClickListener(this@AddSuspensionAnnouncementActivity) + rvCauseList.adapter = mAdapter + } + } + } + } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.underwayConsult.collectLatest { it -> + affirmDialog.setAudioVideoNum(it) + if(!affirmDialog.isShowing){ + affirmDialog.show() + } + } + } + } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.finishActivity.collectLatest { + if(it){ + finish() + } + } + } + } + } + } + override fun bindEvent() { + addClickViews(mBinding.btnSubmit, mBinding.tvStartTime, mBinding.tvEndTime) + affirmDialog.setOnSubmitClickListener(object : SuspensionAnnouncementAffirmDialog.OnSubmitClickListener{ + override fun onSubmitClick(viewDialog: SuspensionAnnouncementAffirmDialog) { + mViewModel.addSuspensionAnnouncement() + } + + override fun onCloseClick(viewDialog: SuspensionAnnouncementAffirmDialog) { + } + }) + } + + override fun onClick(v: View?) { + super.onClick(v) + when(v?.id){ + R.id.btn_submit -> { + mViewModel.checkSuspensionAnnouncementContent(mAdapter.checkedItems) + } + R.id.tv_start_time -> { + showDatePicker(R.string.add_suspension_announcement_start_time, startDate, DATE_TYPE_START) + } + R.id.tv_end_time -> { + showDatePicker(R.string.add_suspension_announcement_end_time, endDate, DATE_TYPE_END) + } + } + } + private fun showDatePicker(titleId: Int, defaultData: DateEntity, dateType: Int) { + dataPicker.setBackgroundResource(R.drawable.rectangle_top_round_corner20_white) + dataPicker.setTitle(titleId) + var wheelLayout = dataPicker.wheelLayout + wheelLayout.setDateMode(DateMode.YEAR_MONTH_DAY) + wheelLayout.setRange(DateEntity.today(), DateEntity.yearOnFuture(1), defaultData) + wheelLayout.setResetWhenLinkage(false) + dataPicker.setOnDatePickedListener { year, month, day -> + setDate(year, month, day, dateType) + } + if(!dataPicker.isShowing){ + dataPicker.show() + } + } + + private fun setDate(year: Int, month: Int, day: Int, dateType: Int) { + when(dateType){ + DATE_TYPE_START -> { + startDate = DateEntity.target(year, month, day) + mViewModel.suspensionServiceBean.value.startDayLong = startDate.toTimeInMillis() + mViewModel.suspensionServiceBean.value.startDay = startDate.toString() + mBinding.tvStartTime.text = + getString(R.string.add_suspension_announcement_birthday_format, year, month, day) + if(startDateBeforeEndDate(startDate, endDate)){ + setDate(year, month, day, DATE_TYPE_END) + } + } + DATE_TYPE_END -> { + endDate = DateEntity.target(year, month, day) + mViewModel.suspensionServiceBean.value.endDayLong = endDate.toTimeInMillis() + mViewModel.suspensionServiceBean.value.endDay = endDate.toString() + mBinding.tvEndTime.text = + getString(R.string.add_suspension_announcement_birthday_format, year, month, day) + } + } + } + + /** + * 开始时间是否在结束时间之前 + * @param startDate + * @param endDate + */ + private fun startDateBeforeEndDate(startDate: DateEntity, endDate: DateEntity): Boolean{ + if(startDate == null || endDate == null){ + false + } + return startDate.toTimeInMillis() > endDate.toTimeInMillis() + } + override fun onItemClick(adapter: BaseQuickAdapter<*, *>, view: View, position: Int) { + (adapter as BaseCheckRecycleViewAdapter).clickItem(position, false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/BillRecordActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/BillRecordActivity.kt new file mode 100644 index 0000000..ddc6e05 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/BillRecordActivity.kt @@ -0,0 +1,109 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.content.res.ColorStateList +import android.os.Bundle +import android.view.Gravity +import android.view.View +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope +import androidx.viewpager2.widget.ViewPager2 +import com.btpj.lib_base.utils.DateUtil.getDateYearMonthStr +import com.buddy.kredit.android.base.BaseActivity +import com.github.gzuliyujiang.wheelpicker.DatePicker +import com.github.gzuliyujiang.wheelpicker.annotation.DateMode +import com.github.gzuliyujiang.wheelpicker.entity.DateEntity +import com.google.android.material.tabs.TabLayoutMediator +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivityBillRecordBinding +import com.yxjk.healthexpertclient.ui.mine.fragment.BillRecordFragment +import com.yxjk.healthexpertclient.ui.mine.fragment.BillRecordFragment.Companion.BILL_TYPE_ALL +import com.yxjk.healthexpertclient.ui.mine.fragment.BillRecordFragment.Companion.BILL_TYPE_INCOME +import com.yxjk.healthexpertclient.ui.mine.fragment.BillRecordFragment.Companion.BILL_TYPE_PAYMENT +import com.yxjk.healthexpertclient.ui.mine.viewmodel.BillRecordViewModel +import com.yxjk.healthexpertclient.view.viewpager.ViewPagerAdapter +import kotlinx.coroutines.launch + + +/** + * 账单明细 + */ +class BillRecordActivity: BaseActivity(R.layout.activity_bill_record), + ViewPagerAdapter.OnCreateFragmentListener { + val dataPicker: DatePicker by lazy { DatePicker(this) } + var defaultData: DateEntity = DateEntity.today() + override fun initView(savedInstanceState: Bundle?) { + setToolBarRightText(getString(R.string.bill_record_date_select)) + val tabs = arrayOf("全部", "收益记录", "提现记录") + //禁用预加载 + mBinding.viewPager.offscreenPageLimit = ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT + mBinding.viewPager.adapter = ViewPagerAdapter(this, tabs, this) + + var mediator = TabLayoutMediator( + mBinding.tabLayout, mBinding.viewPager, false, true + ) { tab, position -> //这里可以自定义TabView + val tabView = TextView(this@BillRecordActivity) + tabView.gravity = Gravity.CENTER + tabView.text = tabs[position] + val states = arrayOfNulls(2) + states[0] = intArrayOf(android.R.attr.state_selected) + states[1] = intArrayOf() + val colors = intArrayOf( + ContextCompat.getColor(this@BillRecordActivity, R.color.text_black_33), + ContextCompat.getColor(this@BillRecordActivity, R.color.text_black_66)) + val colorStateList = ColorStateList (states, colors) + tabView.setTextColor(colorStateList) + tab.customView = tabView + } + //要执行这一句才是真正将两者绑定起来 + mediator.attach() + + } + + override fun bindEvent() { + + } + override fun createFragment(position: Int): Fragment { + when(position){ + 0 -> { + return BillRecordFragment.newInstance(BILL_TYPE_ALL) + } + 1 -> { + return BillRecordFragment.newInstance(BILL_TYPE_INCOME) + } + 2 -> { + return BillRecordFragment.newInstance(BILL_TYPE_PAYMENT) + } + } + return BillRecordFragment.newInstance(BILL_TYPE_ALL) + } + + override fun onClick(v: View?) { + super.onClick(v) + when(v?.id){ + R.id.tv_right -> { + showDatePicker() + } + } + } + private fun showDatePicker() { + dataPicker.setBackgroundResource(R.drawable.rectangle_top_round_corner20_white) + dataPicker.setTitle(R.string.bill_record_date_select) + var wheelLayout = dataPicker.wheelLayout + wheelLayout.setDateMode(DateMode.YEAR_MONTH) + wheelLayout.setRange(DateEntity.target(2020, 1, 1), DateEntity.today(), defaultData) + wheelLayout.setResetWhenLinkage(false) + dataPicker.setOnDatePickedListener { year, month, day -> + defaultData = DateEntity.target(year, month, day) + var dateStr = getDateYearMonthStr(defaultData.toTimeInMillis()) + mBinding.toolbarLay.tvRight.text = dateStr + lifecycleScope.launch { + mViewModel.billDate.emit(dateStr) + } + } + if(!dataPicker.isShowing){ + dataPicker.show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/ConsultStatisticsActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/ConsultStatisticsActivity.kt new file mode 100644 index 0000000..cb07546 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/ConsultStatisticsActivity.kt @@ -0,0 +1,191 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.graphics.Color +import android.os.Bundle +import android.view.View +import android.widget.AdapterView +import android.widget.AdapterView.OnItemSelectedListener +import android.widget.ArrayAdapter +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.btpj.lib_base.utils.DateUtil +import com.buddy.kredit.android.base.BaseActivity +import com.github.mikephil.charting.charts.PieChart +import com.github.mikephil.charting.components.Description +import com.github.mikephil.charting.components.Legend +import com.github.mikephil.charting.data.PieData +import com.github.mikephil.charting.data.PieDataSet +import com.github.mikephil.charting.data.PieEntry +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.ConsultTypeBean +import com.yxjk.healthexpertclient.databinding.ActivityConsultStatisticsBinding +import com.yxjk.healthexpertclient.ext.startBillRecordActivity +import com.yxjk.healthexpertclient.ui.mine.utils.ConsultStatisticsFormatter +import com.yxjk.healthexpertclient.ui.mine.viewmodel.ConsultStatisticsViewModel +import com.yxjk.healthexpertclient.utils.CommonUtils +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + + +/** + * @author nanfeifei + * @time 2023/5/18 17:26 + * @description 咨询统计 + */ +class ConsultStatisticsActivity : + BaseActivity( + R.layout.activity_consult_statistics + ) { + override fun initView(savedInstanceState: Bundle?) { + } + + override fun createObserve() { + super.createObserve() + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.consultTypeMonthList.collectLatest { + var visibility = View.VISIBLE + if (it.isNullOrEmpty()){ + visibility = View.VISIBLE + }else{ + it.forEach { consultTypeBean -> + if (consultTypeBean.total > 0){ + visibility = View.GONE + } + } + } + mBinding.tvNoDate.visibility = visibility + if (it != null) { + showPieChart(mBinding.pieChartView, it) + } + } + } + } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.firstMonthList.collectLatest { + setSpinnerData(it.toTypedArray()) + } + } + } + } + override fun bindEvent() { + addClickViews(mBinding.clMoneyLay) + } + + override fun onClick(v: View?) { + super.onClick(v) + when(v?.id){ + R.id.cl_money_lay -> { + startBillRecordActivity(this@ConsultStatisticsActivity) + } + } + } + private fun setSpinnerData(array: Array){ + val adapter = ArrayAdapter(this@ConsultStatisticsActivity, R.layout.item_spinner_dropdown, array) + mBinding.spinnerMonth.adapter = adapter + mBinding.spinnerMonth.onItemSelectedListener = object : OnItemSelectedListener{ + override fun onItemSelected( + parent: AdapterView<*>?, + view: View?, + position: Int, + id: Long + ) { + lifecycleScope.launch { + if(mViewModel.firstMonthList.value != null && position < mViewModel.firstMonthList.value.size){ + mViewModel.date.emit(DateUtil.chineseDateToStrShortMonth(mViewModel.firstMonthList.value[position])) + mViewModel.getConsultTypeMonthData() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + } + } + + private fun getPieChartData(list: MutableList): List { + var mPie: MutableList = mutableListOf() + var pieEntry: PieEntry + for (data in list) { + pieEntry = PieEntry(data.total.toFloat(), data.content_type) + mPie.add(pieEntry) + } + return mPie + } + private fun showPieChart(pieChart: PieChart, pieList: MutableList) { + val dataSet = PieDataSet(getPieChartData(pieList), "") + // 设置颜色list + dataSet.colors = getPieColor(pieList) + val pieData = PieData(dataSet) + + // 设置描述 + val description = Description() + description.isEnabled = false + pieChart.description = description + //设置半透明圆环的半径, 0为透明 + pieChart.transparentCircleRadius = 0f + //设置初始旋转角度 + pieChart.rotationAngle = -12f + //数据连接线距图形片内部边界的距离,为百分数 +// dataSet.valueLinePart1OffsetPercentage = 90f + dataSet.valueLinePart1Length = 0.5f + //设置连接线的颜色 +// dataSet.valueLineColor = Color.LTGRAY + dataSet.isUsingSliceColorAsValueLineColor = true + // 连接线在饼状图外面 + dataSet.yValuePosition = PieDataSet.ValuePosition.OUTSIDE_SLICE + + // 设置饼块之间的间隔 +// dataSet.sliceSpace = 1f + dataSet.isHighlightEnabled = true + // 显示图例 + val legend = pieChart.legend + legend.isEnabled = true + legend.horizontalAlignment = Legend.LegendHorizontalAlignment.CENTER + legend.textSize = 10f //设置图例标签文本的大小 + legend.textColor = R.color.text_black_33//设置图例标签文本的颜色 + // 和四周相隔一段距离,显示数据 + pieChart.setExtraOffsets(35f, 5f, 35f, 5f) + // 设置pieChart图表是否可以手动旋转 + pieChart.isRotationEnabled = false + // 设置piecahrt图表点击Item高亮是否可用 + pieChart.isHighlightPerTapEnabled = false + // 设置pieChart图表展示动画效果,动画运行1.4秒结束 + pieChart.animateY(700) + //设置pieChart是否只显示饼图上百分比不显示文字 + pieChart.setDrawEntryLabels(false) + //是否绘制PieChart内部中心文本 + pieChart.setDrawCenterText(true) + pieChart.centerText = "咨询方式" +// pieChart.setCenterTextColor(R.color.text_black_33) +// pieChart.setCenterTextSize(14f) + // 绘制内容value,设置字体颜色大小 + pieData.setDrawValues(true) + pieData.setValueFormatter(ConsultStatisticsFormatter()) + pieData.setValueTextSize(10f) + pieData.setValueTextColor(Color.DKGRAY) + pieChart.data = pieData + // 更新 piechart 视图 + pieChart.postInvalidate() + } + private fun getPieColor(list: MutableList): ArrayList{ + val colors = ArrayList() + for (index in list.indices) { + when(index){ + 0 -> { + colors.add(Color.parseColor("#407FFF")) + } + 1 -> { + colors.add(Color.parseColor("#A682E6")) + } + else -> { + colors.add(CommonUtils.getRandomColor()) + } + } + + } + return colors + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/CustomSchedulingActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/CustomSchedulingActivity.kt new file mode 100644 index 0000000..73fc5d8 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/CustomSchedulingActivity.kt @@ -0,0 +1,119 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.os.Bundle +import android.view.View +import androidx.core.view.ViewCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.recyclerview.widget.GridLayoutManager +import com.btpj.lib_base.base.adapter.BaseCheckRecycleViewAdapter +import com.buddy.kredit.android.base.BaseActivity +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.listener.OnItemClickListener +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.SchedulingBean +import com.yxjk.healthexpertclient.databinding.ActivityCustomSchedulingBinding +import com.yxjk.healthexpertclient.ext.startSchedulingActivity +import com.yxjk.healthexpertclient.ui.mine.adapter.CustomSchedulingAdapter +import com.yxjk.healthexpertclient.ui.mine.viewmodel.CustomSchedulingViewModel +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +/** + * @author nanfeifei + * @time 2023/5/17 13:10 + * @description 自定义排班 + */ +class CustomSchedulingActivity: BaseActivity( + R.layout.activity_custom_scheduling), OnItemClickListener { + private val mAdapter: CustomSchedulingAdapter = CustomSchedulingAdapter() + override fun initView(savedInstanceState: Bundle?) { + mBinding.apply { + val gridLayoutManager = GridLayoutManager(this@CustomSchedulingActivity, 7) +// linearLayoutManager.orientation = HORIZONTAL + rvList.layoutManager = gridLayoutManager + ViewCompat.setNestedScrollingEnabled(rvList, false) + } + mAdapter.enabledCheckMode = true + mAdapter.singleMode = true + mAdapter.singleModeIsCanCancel = false + mAdapter.setOnItemClickListener(this@CustomSchedulingActivity) + } + override fun createObserve() { + super.createObserve() + mBinding.apply { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.schedulingList.collectLatest { list -> + if(list.isNullOrEmpty()){ + return@collectLatest + } + mAdapter.setNewInstance(list) + if (rvList.adapter == null) { + rvList.adapter = mAdapter + } + changeWeek(mAdapter, 0) + } + } + } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.showAudioVideoConsult.collectLatest { isShow -> + if(mAdapter.currentCheckedPosition < 0||mAdapter.data.isNullOrEmpty()||mAdapter.currentCheckedPosition >= mAdapter.data.size){ + return@collectLatest + } + mAdapter.getItem(mAdapter.currentCheckedPosition).consultSwitchOn = isShow + } + } + } + } + + } + override fun bindEvent() { + addClickViews(mBinding.btnUnifyScheduling, mBinding.btnSubmit) + } + + override fun onClick(v: View?) { + super.onClick(v) + when(v?.id){ + R.id.btn_submit -> { + setLastAppointmentNum() + mViewModel.createDoctorScheduling() + } + R.id.btn_unify_scheduling -> { + startSchedulingActivity(this) + finish() + } + } + } + override fun onItemClick(adapter: BaseQuickAdapter<*, *>, view: View, position: Int) { + changeWeek(adapter, position) + } + private fun changeWeek(adapter: BaseQuickAdapter<*, *>,position: Int){ + setLastAppointmentNum() + (adapter as BaseCheckRecycleViewAdapter).clickItem(position, false) + var schedulingBean: SchedulingBean = adapter.getItem(position) as SchedulingBean + lifecycleScope.launch { + mViewModel.showAudioVideoConsult.emit(schedulingBean.consultSwitchOn) + } + mBinding.apply { + schedulingBean.amNum?.let { + layConsultNumSetting.etMorningAppointmentsNumber.setText(it) + } + schedulingBean.pmNum?.let { + layConsultNumSetting.etAfternoonAppointmentsNumber.setText(it) + } + } + } + private fun setLastAppointmentNum(){ + //mAdapter.currentCheckedPosition在clickItem之后才会被更改,所以此时相当于还是上一次选中的值 + if(mAdapter.currentCheckedPosition < 0||mAdapter.data.isNullOrEmpty()||mAdapter.currentCheckedPosition >= mAdapter.data.size){ + return + } + var schedulingBean: SchedulingBean = mAdapter.getItem(mAdapter.currentCheckedPosition) + schedulingBean.amNum = mBinding.layConsultNumSetting.etMorningAppointmentsNumber.text.toString().trim() + schedulingBean.pmNum = mBinding.layConsultNumSetting.etAfternoonAppointmentsNumber.text.toString().trim() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/EditPasswordActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/EditPasswordActivity.kt new file mode 100644 index 0000000..cbdbffb --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/EditPasswordActivity.kt @@ -0,0 +1,78 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.os.Bundle +import android.text.method.HideReturnsTransformationMethod +import android.text.method.PasswordTransformationMethod +import android.view.View +import com.buddy.kredit.android.base.BaseActivity +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivityEditPasswordBinding +import com.yxjk.healthexpertclient.ui.mine.viewmodel.EditPasswordViewModel + +/** + * @author nanfeifei + * @time 2023/5/22 17:06 + * @description 修改密码 + */ +class EditPasswordActivity: BaseActivity(R.layout.activity_edit_password) { + override fun initView(savedInstanceState: Bundle?) { + + } + + override fun bindEvent() { + mBinding.layOldPassword.loginIvEye.setOnClickListener { + mBinding?.let { + var selection=it.layOldPassword.evPasswordContent.selectionEnd + if (it.layOldPassword.evPasswordContent.transformationMethod== PasswordTransformationMethod.getInstance()){ + it.layOldPassword.evPasswordContent.setTransformationMethod( + HideReturnsTransformationMethod.getInstance()) + it.layOldPassword.loginIvEye.setImageResource(R.mipmap.ic_password_show) + }else{ + it.layOldPassword.evPasswordContent.setTransformationMethod(PasswordTransformationMethod.getInstance()) + it.layOldPassword.loginIvEye.setImageResource(R.mipmap.ic_password_hind) + } + it.layOldPassword.evPasswordContent.setSelection(selection) + } + } + mBinding.layNewPassword.loginIvEye.setOnClickListener { + mBinding?.let { + var selection=it.layNewPassword.evPasswordContent.selectionEnd + if (it.layNewPassword.evPasswordContent.transformationMethod== PasswordTransformationMethod.getInstance()){ + it.layNewPassword.evPasswordContent.setTransformationMethod( + HideReturnsTransformationMethod.getInstance()) + it.layNewPassword.loginIvEye.setImageResource(R.mipmap.ic_password_show) + }else{ + it.layNewPassword.evPasswordContent.setTransformationMethod(PasswordTransformationMethod.getInstance()) + it.layNewPassword.loginIvEye.setImageResource(R.mipmap.ic_password_hind) + } + it.layNewPassword.evPasswordContent.setSelection(selection) + } + } + mBinding.layConfirmPassword.loginIvEye.setOnClickListener { + mBinding?.let { + var selection=it.layConfirmPassword.evPasswordContent.selectionEnd + if (it.layConfirmPassword.evPasswordContent.transformationMethod== PasswordTransformationMethod.getInstance()){ + it.layConfirmPassword.evPasswordContent.setTransformationMethod( + HideReturnsTransformationMethod.getInstance()) + it.layConfirmPassword.loginIvEye.setImageResource(R.mipmap.ic_password_show) + }else{ + it.layConfirmPassword.evPasswordContent.setTransformationMethod(PasswordTransformationMethod.getInstance()) + it.layConfirmPassword.loginIvEye.setImageResource(R.mipmap.ic_password_hind) + } + it.layConfirmPassword.evPasswordContent.setSelection(selection) + } + } + addClickViews(mBinding.btnSubmit) + } + + override fun onClick(v: View?) { + super.onClick(v) + when(v?.id){ + R.id.btn_submit -> { + mViewModel.submitEditPassword(successCall = { + finish() + }) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/GoodAtDiseaseActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/GoodAtDiseaseActivity.kt new file mode 100644 index 0000000..190084b --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/GoodAtDiseaseActivity.kt @@ -0,0 +1,82 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.os.Bundle +import android.view.View +import androidx.core.view.ViewCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.recyclerview.widget.GridLayoutManager +import com.btpj.lib_base.base.adapter.BaseCheckRecycleViewAdapter +import com.buddy.kredit.android.base.BaseActivity +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.listener.OnItemClickListener +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.DiseaseBean +import com.yxjk.healthexpertclient.databinding.ActivityGoodAtDiseaseBinding +import com.yxjk.healthexpertclient.event.AddGoodAtDiseaseEvent +import com.yxjk.healthexpertclient.ui.mine.adapter.DiseaseAdapter +import com.yxjk.healthexpertclient.ui.mine.viewmodel.GoodAtDiseaseViewModel +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import org.greenrobot.eventbus.EventBus + +/** + * @author nanfeifei + * @time 2023/6/25 18:04 + * @description 添加擅长疾病 + */ +class GoodAtDiseaseActivity: BaseActivity(R.layout.activity_good_at_disease), + OnItemClickListener { + private val mAdapter: DiseaseAdapter = DiseaseAdapter() + lateinit var departmentId: String + lateinit var currentDiseaseList: ArrayList + override fun initView(savedInstanceState: Bundle?) { + departmentId = intent.extras?.getString("departmentId") ?: "" + currentDiseaseList = intent.extras?.getParcelableArrayList("currentDiseaseList") ?: arrayListOf() + setToolBarRightText(getString(R.string.dialog_add_disease_affirm)) + mBinding.apply { + val gridLayoutManager = GridLayoutManager(this@GoodAtDiseaseActivity, 2) + rvList.layoutManager = gridLayoutManager + ViewCompat.setNestedScrollingEnabled(rvList, false) + } + mAdapter.enabledCheckMode = true + mAdapter.setOnItemClickListener(this@GoodAtDiseaseActivity) + + } + + override fun createObserve() { + super.createObserve() + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.allDiseaseList.collectLatest { list -> + mAdapter.setList(list) + if (mBinding.rvList.adapter == null){ + mBinding.rvList.adapter = mAdapter + } + } + } + } + } + + override fun initData() { + super.initData() + mViewModel.getDoctorGoodAtDisease(departmentId, currentDiseaseList) + } + override fun bindEvent() { + + } + override fun onClick(v: View?) { + super.onClick(v) + when(v?.id){ + R.id.tv_right -> { + EventBus.getDefault().post(AddGoodAtDiseaseEvent(mAdapter.checkedItems.toMutableList())) + finish() + } + } + } + override fun onItemClick(adapter: BaseQuickAdapter<*, *>, view: View, position: Int) { + (adapter as BaseCheckRecycleViewAdapter).clickItem(position, false) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/PersonInfoActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/PersonInfoActivity.kt new file mode 100644 index 0000000..928600a --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/PersonInfoActivity.kt @@ -0,0 +1,172 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.os.Bundle +import android.view.View +import androidx.core.view.ViewCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import com.btpj.lib_base.ext.loadCircle +import com.buddy.kredit.android.base.BaseActivity +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.listener.OnItemChildClickListener +import com.google.android.flexbox.FlexboxLayoutManager +import com.luck.picture.lib.basic.PictureSelectionModel +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.SelectMimeType +import com.luck.picture.lib.config.SelectModeConfig +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.interfaces.OnResultCallbackListener +import com.luck.picture.lib.utils.SandboxTransformUtils +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.DoctorBean +import com.yxjk.healthexpertclient.databinding.ActivityPersonInfoBinding +import com.yxjk.healthexpertclient.event.AddGoodAtDiseaseEvent +import com.yxjk.healthexpertclient.ext.startGoodAtDiseaseActivity +import com.yxjk.healthexpertclient.ui.mine.adapter.AddDiseaseAdapter +import com.yxjk.healthexpertclient.ui.mine.viewmodel.PersonInfoViewModel +import com.yxjk.healthexpertclient.utils.AndroidBug5497Workaround +import com.yxjk.healthexpertclient.utils.pictureSelector.GlideEngine +import com.yxjk.healthexpertclient.utils.pictureSelector.ImageFileCompressEngine +import com.yxjk.healthexpertclient.utils.pictureSelector.ImageFileCropEngine +import com.yxjk.healthexpertclient.view.AddDiseaseDialog +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import java.io.File + +/** + * @author nanfeifei + * @time 2023/5/22 19:34 + * @description 个人信息 + */ +class PersonInfoActivity: BaseActivity(R.layout.activity_person_info), + OnItemChildClickListener { + val mAdapter by lazy { AddDiseaseAdapter() } + val addDiseaseDialog by lazy { AddDiseaseDialog(this@PersonInfoActivity) } + override fun initView(savedInstanceState: Bundle?) { + AndroidBug5497Workaround.assistActivity(this) + mBinding.apply { + val flexboxLayoutManager = FlexboxLayoutManager(this@PersonInfoActivity) + rvDisease.layoutManager = flexboxLayoutManager + ViewCompat.setNestedScrollingEnabled(rvDisease, false) + } + } + + override fun createObserve() { + super.createObserve() + mBinding.apply { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED){ + mViewModel.doctorBean.collectLatest { + setDoctorInfo(it) + } + } + } + + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.diseaseList.collectLatest { list -> + mAdapter.setNewInstance(list) + if (rvDisease.adapter == null) { + mAdapter.setOnItemChildClickListener(this@PersonInfoActivity) + rvDisease.adapter = mAdapter + } + } + } + } + } + } + private fun setDoctorInfo(doctorBean: DoctorBean){ + mBinding.apply { + + } + } + override fun bindEvent() { + addClickViews(mBinding.rlHeadImage, mBinding.btnAdd, mBinding.btnSave) + addDiseaseDialog.setOnSubmitClickListener(object : AddDiseaseDialog.OnSubmitClickListener{ + override fun onSubmitClick(viewDialog: AddDiseaseDialog, inputText: String) { +// mAdapter.addData(inputText) + } + + override fun onCloseClick(viewDialog: AddDiseaseDialog) { + + } + }) + } + + override fun onClick(v: View?) { + super.onClick(v) + when(v?.id){ + R.id.rl_head_image -> { + initPictureSelectorModel() + .forResult(object : OnResultCallbackListener { + override fun onResult(result: ArrayList?) { + result?.get(0) + ?.let { +// showLoading() + var path = getImagePath(it) + mBinding.ivHeadImg.loadCircle( + File(path)) + mViewModel.uploadFile(path) + } + } + + override fun onCancel() {} + }) + } + R.id.btn_add -> { + startGoodAtDiseaseActivity(this, mViewModel.doctorBean.value.departmentId, mViewModel.diseaseList.value) +// addDiseaseDialog.show() + } + R.id.btn_save -> { + mViewModel.savePersonInfo() + } + } + } + + override fun onItemChildClick(adapter: BaseQuickAdapter<*, *>, view: View, position: Int) { + when(view.id){ + R.id.btn_delete -> { + mAdapter.removeAt(position) + } + } + } + fun getImagePath(localMedia: LocalMedia): String { + if(!localMedia.cutPath.isNullOrEmpty()){ + return localMedia.cutPath + } + if (!localMedia.compressPath.isNullOrEmpty()) { + return localMedia.compressPath + } + if (!localMedia.sandboxPath.isNullOrEmpty()) { + return localMedia.sandboxPath + } + return localMedia.path + } + private fun initPictureSelectorModel(): PictureSelectionModel { + return PictureSelector.create(this) + .openGallery(SelectMimeType.TYPE_IMAGE) + .setSelectionMode(SelectModeConfig.SINGLE) + .setCropEngine(ImageFileCropEngine()) + .setCompressEngine(ImageFileCompressEngine()) + .setImageEngine(GlideEngine.createGlideEngine()) + .setSandboxFileEngine { context, srcPath, mineType, call -> + if (call != null) { + var sandboxPath = + SandboxTransformUtils.copyPathToSandbox(context, srcPath, mineType) + call.onCallback(srcPath, sandboxPath) + } + } + } + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: AddGoodAtDiseaseEvent) { + if(event == null){ + return + } + lifecycleScope.launch { + mViewModel.diseaseList.emit(event.list) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SchedulingActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SchedulingActivity.kt new file mode 100644 index 0000000..26efea4 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SchedulingActivity.kt @@ -0,0 +1,72 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.os.Bundle +import android.view.View +import androidx.core.view.ViewCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.recyclerview.widget.LinearLayoutManager +import com.buddy.kredit.android.base.BaseActivity +import com.buddy.kredit.android.view.SpaceItemDecoration +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivitySchedulingBinding +import com.yxjk.healthexpertclient.ext.startCustomSchedulingActivity +import com.yxjk.healthexpertclient.ui.mine.adapter.NewSchedulingAdapter +import com.yxjk.healthexpertclient.ui.mine.viewmodel.SchedulingViewModel +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +/** + * @author nanfeifei + * @time 2023/5/16 14:23 + * @description 排班设置 + */ +class SchedulingActivity: BaseActivity(R.layout.activity_scheduling) { + private val mAdapter: NewSchedulingAdapter = NewSchedulingAdapter() + override fun initView(savedInstanceState: Bundle?) { + mBinding.apply { + val linearLayoutManager = LinearLayoutManager(this@SchedulingActivity) + rvList.layoutManager = linearLayoutManager + rvList.addItemDecoration(SpaceItemDecoration(this@SchedulingActivity, 0, 8f)) + ViewCompat.setNestedScrollingEnabled(rvList, false) + } + } + override fun createObserve() { + super.createObserve() + mBinding.apply { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.schedulingList.collectLatest { list -> + mAdapter.setList(list) + if (rvList.adapter == null) { + rvList.adapter = mAdapter + } + } + } + } + } + } + + override fun initData() { + super.initData() + } + override fun bindEvent() { + mBinding.apply { + addClickViews(btnSubmit, btnCustomScheduling) + } + } + + override fun onClick(v: View?) { + super.onClick(v) + when(v?.id){ + R.id.btn_submit -> { + mViewModel.createDoctorScheduling() + } + R.id.btn_custom_scheduling -> { + startCustomSchedulingActivity(this) + finish() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SettingActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SettingActivity.kt new file mode 100644 index 0000000..077017a --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SettingActivity.kt @@ -0,0 +1,125 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.app.ProgressDialog +import android.os.Bundle +import android.view.View +import android.view.Window +import com.btpj.lib_base.data.local.DataStoreManager +import com.btpj.lib_base.data.local.IpManager +import com.btpj.lib_base.ext.jsonToBean +import com.btpj.lib_base.utils.AppUtil +import com.buddy.kredit.android.base.BaseActivity +import com.yxjk.healthexpertclient.BuildConfig +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.AppUpdateBean +import com.yxjk.healthexpertclient.databinding.ActivitySettingBinding +import com.yxjk.healthexpertclient.ext.startWebActivity +import com.yxjk.healthexpertclient.ui.mine.viewmodel.SettingViewModel +import com.yxjk.healthexpertclient.view.LoadingProgressDialog +import org.lzh.framework.updatepluginlib.UpdateBuilder +import org.lzh.framework.updatepluginlib.base.UpdateParser +import org.lzh.framework.updatepluginlib.model.Update + +/** + * @author nanfeifei + * @time 2023/5/23 16:06 + * @description 设置 + */ +class SettingActivity: BaseActivity(R.layout.activity_setting) { + var dialog: LoadingProgressDialog? = null + override fun initView(savedInstanceState: Bundle?) { + + } + + override fun initData() { + super.initData() + createDialog() + var str=AppUtil.getAppVersionName(this)+"(${AppUtil.getAppVersionCode(this)})" + mBinding.tvVersion.text = getString(R.string.app_version, str) +// mBinding.tvAbout.text = getString(R.string.setting_about, getString(R.string.app_name)) + initUpdateApp(false) + } + + override fun bindEvent() { + addClickViews(mBinding.tvUserProtocol, mBinding.tvPrivacyPolicy, mBinding.tvAbout,mBinding.rlVersionUpdate) + } + + override fun onClick(v: View?) { + super.onClick(v) + when(v?.id){ + R.id.tv_user_protocol -> { + DataStoreManager.getUserAgreementUrl()?.let { + if (it.isNotEmpty()) { + startWebActivity(this@SettingActivity,it) + } + } + } + R.id.tv_privacy_policy -> { + DataStoreManager.getPrivacyAgreementUrl()?.let { + if (it.isNotEmpty()) { + startWebActivity(this@SettingActivity,it) + } + } + } + R.id.tv_about -> { + + } + R.id.rl_version_update -> { + initUpdateApp(true) + } + } + } + + private fun initUpdateApp(isClick:Boolean){ + dialog?.show() + UpdateBuilder.create().setUpdateParser(object : UpdateParser() { + override fun parse(response: String?): Update { + val resultBean: AppUpdateBean? = response.jsonToBean(AppUpdateBean::class.java) + val update = Update() + if(resultBean == null){ + return update + } + runOnUiThread { + dialog?.dismiss() + if (resultBean.versionNo> BuildConfig.VERSION_CODE){ + mBinding?.tvVersionUpdate?.text="有新版本待更新" + }else{ + mBinding?.tvVersionUpdate?.text="已是最新版本" + } + } + if (!isClick) { + return update + } + + // 此apk包的下载地址 + update.updateUrl = IpManager.getImageBaseUrl()+resultBean.appUrl + // 此apk包的版本号(因接口只有在有更新时才会返回数据,而且没有返回云端APP版本号,故将当前APP版本号+1,传给更新框架用作判断有新版本) + update.versionCode = resultBean.versionNo ?: 0 + // 此apk包的版本名称 + update.versionName = resultBean.versionName + // 此apk包的更新内容 + update.updateContent = resultBean.updateContent + // 此apk包是否为强制更新 + if (resultBean != null) { + update.isForced = 1 == resultBean.forced + }else{ + update.isForced = false + } + // 是否显示忽略此次版本更新按钮 + update.isIgnore = 1 == resultBean.ignoreFlag + return update + } + }).check() + } + + private fun createDialog() { + dialog = LoadingProgressDialog( + this@SettingActivity, + ProgressDialog.STYLE_SPINNER, "数据加载中" + ) + dialog!!.requestWindowFeature(Window.FEATURE_NO_TITLE) + dialog!!.setCanceledOnTouchOutside(false) + dialog!!.setCancelable(false) + dialog!!.setMessage("请稍后...") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SuspensionServiceActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SuspensionServiceActivity.kt new file mode 100644 index 0000000..bff5619 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/SuspensionServiceActivity.kt @@ -0,0 +1,141 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.os.Bundle +import android.view.View +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import com.btpj.lib_base.ext.getEmptyView +import com.btpj.lib_base.ext.initColors +import com.buddy.kredit.android.base.BaseActivity +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.listener.OnItemChildClickListener +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.SuspensionServiceBean +import com.yxjk.healthexpertclient.databinding.ActivitySuspensionServiceBinding +import com.yxjk.healthexpertclient.databinding.ViewFooterSuspensionServiceBinding +import com.yxjk.healthexpertclient.event.SuspensionServiceEvent +import com.yxjk.healthexpertclient.ext.startAddSuspensionAnnouncementActivity +import com.yxjk.healthexpertclient.ui.mine.adapter.SuspensionServiceAdapter +import com.yxjk.healthexpertclient.ui.mine.viewmodel.SuspensionServiceViewModel +import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +/** + * @author nanfeifei + * @time 2023/5/17 14:26 + * @description 暂停服务 + */ +class SuspensionServiceActivity : + BaseActivity(R.layout.activity_suspension_service), + OnItemChildClickListener, SwipeRefreshLayout.OnRefreshListener { + private val mAdapter: SuspensionServiceAdapter = SuspensionServiceAdapter() + override fun initView(savedInstanceState: Bundle?) { + mBinding.apply { + swipeRefresh.initColors() + swipeRefresh.setOnRefreshListener(this@SuspensionServiceActivity) + val linearLayoutManager = LinearLayoutManager(this@SuspensionServiceActivity + ) + rvList.layoutManager = linearLayoutManager + val headersDecor = StickyRecyclerHeadersDecoration(mAdapter) + rvList.addItemDecoration(headersDecor) + } + } + + override fun createObserve() { + super.createObserve() + mBinding.apply { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.suspensionServiceList.collectLatest { list -> + if(list == null){ + return@collectLatest + } + if (mViewModel.isRefreshing.value) { + mAdapter.setNewInstance(list) + } else { + mAdapter.addData(list) + } + mAdapter.loadMoreModule.loadMoreComplete() + if (rvList.adapter == null) { + mAdapter.setEmptyView(rvList.getEmptyView()) + mAdapter.setOnItemChildClickListener(this@SuspensionServiceActivity) +// mAdapter.addFooterView(getFooterView()) + initLoadMore() + rvList.adapter = mAdapter + } + } + } + } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.isRefreshing.collectLatest { + swipeRefresh.isRefreshing = it + } + } + } + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.CREATED) { + mViewModel.isLoadMoreEnd.collectLatest { + mAdapter.loadMoreModule.loadMoreEnd(it) + } + } + } + } + } + + + override fun bindEvent() { + addClickViews(mBinding.layOperate.btnAdd) + } + override fun onRefresh() { + mViewModel.getSuspensionServiceList(true) + } + private fun initLoadMore() { + mAdapter.loadMoreModule.setOnLoadMoreListener { mViewModel.getSuspensionServiceList(false) } + mAdapter.loadMoreModule.isAutoLoadMore = true + //当自动加载开启,同时数据不满一屏时,是否继续执行自动加载更多(默认为true) + mAdapter.loadMoreModule.isEnableLoadMoreIfNotFullPage = false + } + + private fun getFooterView(): View{ + val footerView: ViewFooterSuspensionServiceBinding = + DataBindingUtil.inflate( + layoutInflater, + R.layout.view_footer_suspension_service, + mBinding.rvList, + false + ) + addClickViews(footerView.btnAdd) + return footerView.root + } + + override fun onClick(v: View?) { + super.onClick(v) + when(v?.id){ + R.id.btn_add -> { + startAddSuspensionAnnouncementActivity(this@SuspensionServiceActivity) + } + } + } + + override fun onItemChildClick(adapter: BaseQuickAdapter<*, *>, view: View, position: Int) { + when(view?.id){ + R.id.btn_status -> { + var suspensionServiceBean = adapter.getItem(position) as SuspensionServiceBean + if(suspensionServiceBean.serviceStatus == 0) + suspensionServiceBean.id?.let { mViewModel.editSuspensionAnnouncement(it) } + } + } + } + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEvent(event: SuspensionServiceEvent) { + onRefresh() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/WithDrawActivity.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/WithDrawActivity.kt new file mode 100644 index 0000000..06026c2 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/WithDrawActivity.kt @@ -0,0 +1,31 @@ +package com.yxjk.healthexpertclient.ui.mine + +import android.os.Bundle +import androidx.lifecycle.lifecycleScope +import com.buddy.kredit.android.base.BaseActivity +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.databinding.ActivityWithDrawBinding +import com.yxjk.healthexpertclient.ui.mine.viewmodel.WithDrawViewModel +import kotlinx.coroutines.launch + +/** + * @author nanfeifei + * @time 2023/5/22 16:17 + * @description 提现详情 + */ +class WithDrawActivity: BaseActivity(R.layout.activity_with_draw) { + override fun initView(savedInstanceState: Bundle?) { + val recordId = intent.extras?.getInt("recordId") ?: 0 + lifecycleScope.launch { + mViewModel.recordId.emit(recordId) + } + } + + override fun initData() { + super.initData() + mViewModel.getWithDrawDetail() + } + override fun bindEvent() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/AddDiseaseAdapter.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/AddDiseaseAdapter.kt new file mode 100644 index 0000000..29580a6 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/AddDiseaseAdapter.kt @@ -0,0 +1,34 @@ +package com.yxjk.healthexpertclient.ui.mine.adapter + +import com.btpj.lib_base.base.adapter.BaseDataBindingAdapter +import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.DiseaseBean +import com.yxjk.healthexpertclient.databinding.ItemRecycleAddDiseaseBinding + +/** + * @author nanfeifei + * @time 2023/5/23 10:37 + * @description + */ +class AddDiseaseAdapter: BaseDataBindingAdapter(R.layout.item_recycle_add_disease) { + + override fun bindViewClickListener( + viewHolder: BaseDataBindingHolder, + viewType: Int + ) { + addChildClickViewIds(R.id.btn_delete) + super.bindViewClickListener(viewHolder, viewType) + } + override fun convert( + holder: BaseDataBindingHolder, + item: DiseaseBean + ) { + + val mBinding = holder.dataBinding + mBinding?.apply { + + tvDisease.text = item.sicksName + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/BillRecordAdapter.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/BillRecordAdapter.kt new file mode 100644 index 0000000..3af6872 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/BillRecordAdapter.kt @@ -0,0 +1,21 @@ +package com.yxjk.healthexpertclient.ui.mine.adapter + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.BillRecordBean +import com.yxjk.healthexpertclient.utils.CommonUtils + +class BillRecordAdapter() : + BaseQuickAdapter( + R.layout.item_recycle_bill_record + ), LoadMoreModule { + override fun convert(holder: BaseViewHolder, item: BillRecordBean) { + holder.setText(R.id.tv_title, item.operateTypeName) + holder.setText(R.id.tv_change_money, CommonUtils.getIncomeText(item.waterType, item.income)) + holder.setTextColorRes(R.id.tv_change_money, CommonUtils.getIncomeTextColor(item.waterType)) + holder.setText(R.id.tv_time, item.createTime) + holder.setText(R.id.tv_balance, context.getString(R.string.bill_record_balance, item.accountMoney)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/CustomSchedulingAdapter.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/CustomSchedulingAdapter.kt new file mode 100644 index 0000000..8ae1c64 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/CustomSchedulingAdapter.kt @@ -0,0 +1,23 @@ +package com.yxjk.healthexpertclient.ui.mine.adapter + +import com.btpj.lib_base.base.adapter.BaseCheckRecycleViewAdapter +import com.btpj.lib_base.utils.DateUtil +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.SchedulingBean + +/** + * @author nanfeifei + * @time 2023/5/17 11:21 + * @description + */ +class CustomSchedulingAdapter(): + BaseCheckRecycleViewAdapter( + R.layout.item_recycle_custom_scheduling, + null + ) { + override fun convert(holder: BaseViewHolder, item: SchedulingBean) { + holder.setText(R.id.cb_week, DateUtil.getWeekStrChinese(item.week)) + handleCompoundButton(holder.getView(R.id.cb_week), item) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/DiseaseAdapter.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/DiseaseAdapter.kt new file mode 100644 index 0000000..134266f --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/DiseaseAdapter.kt @@ -0,0 +1,22 @@ +package com.yxjk.healthexpertclient.ui.mine.adapter + +import com.btpj.lib_base.base.adapter.BaseCheckRecycleViewAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.DiseaseBean + +/** + * @author nanfeifei + * @time 2023/5/17 11:21 + * @description + */ +class DiseaseAdapter(): + BaseCheckRecycleViewAdapter( + R.layout.item_recycle_disease, + null + ) { + override fun convert(holder: BaseViewHolder, item: DiseaseBean) { + holder.setText(R.id.cb_disease, item.sicksName) + handleCompoundButton(holder.getView(R.id.cb_disease), item) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/NewSchedulingAdapter.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/NewSchedulingAdapter.kt new file mode 100644 index 0000000..8060f28 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/NewSchedulingAdapter.kt @@ -0,0 +1,39 @@ +package com.yxjk.healthexpertclient.ui.mine.adapter + +import com.btpj.lib_base.base.adapter.BaseDataBindingAdapter +import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +import com.yxjk.healthexpertclient.BR +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.SchedulingBean +import com.yxjk.healthexpertclient.databinding.ItemRecycleNewSchedulingBinding + +/** + * @author nanfeifei + * @time 2023/5/17 11:21 + * @description + */ +class NewSchedulingAdapter(): + BaseDataBindingAdapter( + R.layout.item_recycle_new_scheduling, + null + ) { + override fun onBindViewHolder( + holder: BaseDataBindingHolder, + position: Int + ) { + super.onBindViewHolder(holder, position) + holder.setIsRecyclable(false) //禁止复用,这里没必要复用,固定7条 + } + override fun convert( + holder: BaseDataBindingHolder, + item: SchedulingBean + ) { + val mBinding = holder.dataBinding + mBinding?.apply { + mBinding.setVariable(BR.item, item) + } +// holder.setText(R.id.tv_week, DateUtil.getWeekStrChinese(item.week)) +// holder.setText(R.id.et_morning_appointments_number, item.amNum) +// holder.setText(R.id.et_afternoon_appointments_number, item.pmNum) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SchedulingAdapter.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SchedulingAdapter.kt new file mode 100644 index 0000000..0c0b129 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SchedulingAdapter.kt @@ -0,0 +1,79 @@ +package com.yxjk.healthexpertclient.ui.mine.adapter + +import com.btpj.lib_base.base.adapter.BaseDataBindingAdapter +import com.btpj.lib_base.utils.DateUtil +import com.chad.library.adapter.base.viewholder.BaseDataBindingHolder +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.SchedulingBean +import com.yxjk.healthexpertclient.databinding.ItemRecycleSchedulingBinding + +/** + * @author nanfeifei + * @time 2023/5/16 16:18 + * @description + */ +class SchedulingAdapter : BaseDataBindingAdapter( + R.layout.item_recycle_scheduling +) { + override fun convert( + holder: BaseDataBindingHolder, + item: SchedulingBean + ) { + val mBinding = holder.dataBinding + mBinding?.apply { + tvWeek.text = DateUtil.getWeekStrChinese(item.week) + cbAll.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + cbAfternoon.isChecked = false + cbMorning.isChecked = false + item.type = "2" + } else { + item.type = "3" + } + } + cbMorning.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + cbAfternoon.isChecked = false + cbAll.isChecked = false + item.type = "0" + } else { + item.type = "3" + } + } + cbAfternoon.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + cbMorning.isChecked = false + cbAll.isChecked = false + item.type = "1" + } else { + item.type = "3" + } + } + when (item.type) { + "0" -> { + cbMorning.isChecked = true + } + + "1" -> { + cbAfternoon.isChecked = true + } + + "2" -> { + cbAll.isChecked = true + } + + "3" -> { + cbMorning.isChecked = false + cbAfternoon.isChecked = false + cbAll.isChecked = false + } + else -> { + cbMorning.isChecked = false + cbAfternoon.isChecked = false + cbAll.isChecked = false + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SuspensionCauseAdapter.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SuspensionCauseAdapter.kt new file mode 100644 index 0000000..af5b2c0 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SuspensionCauseAdapter.kt @@ -0,0 +1,22 @@ +package com.yxjk.healthexpertclient.ui.mine.adapter + +import com.btpj.lib_base.base.adapter.BaseCheckRecycleViewAdapter +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.CommonSettingMenuBean + +/** + * @author nanfeifei + * @time 2023/5/17 11:21 + * @description + */ +class SuspensionCauseAdapter(): + BaseCheckRecycleViewAdapter( + R.layout.item_recycle_cause, + null + ) { + override fun convert(holder: BaseViewHolder, item: CommonSettingMenuBean) { + holder.setText(R.id.cb_cause, item.text) + handleCompoundButton(holder.getView(R.id.cb_cause), item) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SuspensionServiceAdapter.kt b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SuspensionServiceAdapter.kt new file mode 100644 index 0000000..880c135 --- /dev/null +++ b/app/src/main/java/com/yxjk/healthexpertclient/ui/mine/adapter/SuspensionServiceAdapter.kt @@ -0,0 +1,84 @@ +package com.yxjk.healthexpertclient.ui.mine.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import androidx.core.content.ContextCompat +import com.btpj.lib_base.utils.DateUtil +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.module.LoadMoreModule +import com.chad.library.adapter.base.viewholder.BaseViewHolder +import com.yxjk.healthexpertclient.R +import com.yxjk.healthexpertclient.bean.mine.SuspensionServiceBean +import com.yxjk.healthexpertclient.utils.CommonUtils +import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter + +/** + * @author nanfeifei + * @time 2023/5/17 14:26 + * @description 暂停服务 + */ +class SuspensionServiceAdapter : + BaseQuickAdapter( + R.layout.item_recycle_suspension_service, + null + ), StickyRecyclerHeadersAdapter, LoadMoreModule { + override fun bindViewClickListener(viewHolder: BaseViewHolder, viewType: Int) { + addChildClickViewIds(R.id.btn_status) + super.bindViewClickListener(viewHolder, viewType) + } + override fun convert(holder: BaseViewHolder, item: SuspensionServiceBean) { + holder.setText( + R.id.tv_suspension_time, + context.getString( + R.string.suspension_service_time, + DateUtil.getShortDateStr(item.startDayLong), + DateUtil.getShortDateStr(item.endDayLong) + ) + ) + holder.setText( + R.id.tv_suspension_cause, item.stopReason) + if (item.serviceStatus == 0) { + holder.getView