From 3b289749194b9a86c08b5cfbd62e452e9822914d Mon Sep 17 00:00:00 2001 From: max Date: Thu, 27 Jun 2024 19:41:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=88=9D=E6=AD=A5=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E5=8A=A8=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 9 + .../main/java/com/chwl/app/MainActivity.java | 7 +- .../home/adapter/CommunityNoticeAdapter.java | 5 +- .../com/chwl/app/photo/BigPhotoActivity.java | 13 + .../chwl/app/photo/DynamicImageAdapter.java | 76 ++ .../java/com/chwl/app/ui/im/ImInitHelper.java | 8 + .../ui/user/activity/UserInfoActivity.java | 9 +- .../user/activity/UserInfoModifyActivity.kt | 1 - .../user/adapter/UserInfoDynamicAdapter.java | 249 ++++ .../ui/user/fragment/UserInfoDataFragment.kt | 2 +- .../user/fragment/UserInfoDynamicFragment.kt | 140 ++ .../ui/user/viewmodel/UserInfoViewModel.kt | 9 +- .../chwl/app/ui/widget/MainRedPointTab.java | 4 +- .../com/chwl/app/ui/widget/MainTabLayout.java | 18 +- .../res/drawable-xxhdpi/base_status_empty.png | Bin 0 -> 23306 bytes .../drawable-xxhdpi/ic_main_tab_square.png | Bin 0 -> 3987 bytes .../ic_main_tab_square_pressed.png | Bin 0 -> 8558 bytes .../main/res/layout/activity_big_photo.xml | 1 + .../res/layout/item_community_notice_list.xml | 2 +- .../main/res/layout/item_userinfo_dynamic.xml | 232 ++++ app/src/main/res/layout/main_tab_layout.xml | 11 +- .../res/layout/user_info_dynamic_fragment.xml | 15 + .../main/res/layout/user_info_tab_empty.xml | 33 + app/src/main/res/values-ar/strings.xml | 2 +- .../com/chwl/app/community/ConstantValue.java | 10 + .../dynamic/adapter/CommentAdapter.java | 165 +++ .../dynamic/adapter/CommentReplyAdapter.java | 74 ++ .../dynamic/adapter/WorldDynamicAdapter.java | 307 +++++ .../dynamic/view/DynamicDetailActivity.java | 1162 +++++++++++++++++ .../chwl/app/community/helper/CalcSize.java | 24 + .../app/community/helper/DynamicUiHelper.java | 30 + .../app/community/helper/ImageUiHelper.java | 73 ++ .../community/helper/ShareDynamicHelper.java | 30 + .../community/holder/DynamicSysHolder.java | 133 ++ .../im/WorldDynamicShareViewHolder.java | 103 ++ .../app/community/publish/ImageAdapter.java | 46 + .../publish/presenter/PublishPresenter.java | 222 ++++ .../presenter/WorldChoosePresenter.java | 62 + .../community/publish/view/IPublishView.java | 20 + .../publish/view/IWorldsChooseView.java | 11 + .../publish/view/PublishActivity.java | 656 ++++++++++ .../publish/view/WorldChooseAdapter.java | 31 + .../publish/view/WorldsChooseFrg.java | 147 +++ .../square/SquareDynamicFragment.java | 313 +++++ .../app/community/square/SquareFragment.java | 193 +++ .../square/adapter/SquareDynamicAdapter.java | 250 ++++ .../user_dynamic/IUserDynamicView.java | 17 + .../user_dynamic/UserDynamicAdapter.java | 285 ++++ .../user_dynamic/UserDynamicFrg.java | 258 ++++ .../user_dynamic/UserDynamicPresenter.java | 146 +++ .../app/community/utils/ObjectTypeHelper.java | 81 ++ .../app/community/utils/TopicUpTextWrapper.kt | 34 + .../widget/DynamicNickDetailWidget.java | 99 ++ .../community/widget/ExpandableTextView.java | 533 ++++++++ .../app/community/widget/GridImageWidget.java | 135 ++ .../app/community/widget/TopicLabelWidget.kt | 50 + .../widget/TouchHideKeyboardView.java | 36 + .../app/community/widget/ZoomImageView.java | 476 +++++++ .../drawable-xhdpi/bg_dy_popup_comment.png | Bin 0 -> 1344 bytes .../bg_dy_popup_comment_three.png | Bin 0 -> 1340 bytes .../res/drawable-xhdpi/ic_back_dynamic.webp | Bin 0 -> 296 bytes .../res/drawable-xhdpi/ic_box_dynamic.png | Bin 0 -> 449 bytes .../res/drawable-xhdpi/ic_close_publish.png | Bin 0 -> 415 bytes .../ic_communicate_community_list.png | Bin 0 -> 489 bytes .../drawable-xhdpi/ic_dy_square_in_room.webp | Bin 0 -> 1152 bytes .../ic_female_age_community_notice.png | Bin 0 -> 1556 bytes .../res/drawable-xhdpi/ic_img_dynamic.png | Bin 0 -> 517 bytes .../drawable-xhdpi/ic_like_community_list.png | Bin 0 -> 525 bytes .../ic_male_community_notice.png | Bin 0 -> 1623 bytes .../drawable-xhdpi/ic_more_community_list.png | Bin 0 -> 213 bytes .../ic_name_community_notice_list.png | Bin 0 -> 487 bytes .../ic_share_community_list.png | Bin 0 -> 500 bytes .../res/drawable-xhdpi/ic_square_live.png | Bin 0 -> 677 bytes .../res/drawable-xhdpi/ic_square_publish.webp | Bin 0 -> 7620 bytes .../res/drawable-xhdpi/ic_text_dynamic.png | Bin 0 -> 411 bytes .../res/drawable-xhdpi/ic_topic_close.png | Bin 0 -> 264 bytes .../drawable-xhdpi/ic_translate_dynamic.png | Bin 0 -> 461 bytes .../ic_translate_selected_dynamic.webp | Bin 0 -> 344 bytes .../res/drawable-xhdpi/ic_video_dynamic.png | Bin 0 -> 420 bytes .../res/drawable-xhdpi/ic_voice_dynamic.png | Bin 0 -> 422 bytes .../drawable-xhdpi/icon_dy_detail_comment.png | Bin 0 -> 443 bytes .../drawable-xhdpi/icon_dy_detail_share.png | Bin 0 -> 451 bytes .../icon_dy_dynamic_publisher.png | Bin 0 -> 777 bytes .../res/drawable-xhdpi/icon_dy_emoji.png | Bin 0 -> 2768 bytes .../drawable-xhdpi/icon_dy_first_dynamic.png | Bin 0 -> 469 bytes .../res/drawable-xhdpi/icon_dy_item_more.webp | Bin 0 -> 710 bytes .../drawable-xhdpi/icon_dy_list_comment.webp | Bin 0 -> 1388 bytes .../drawable-xhdpi/icon_dy_list_female.png | Bin 0 -> 270 bytes .../res/drawable-xhdpi/icon_dy_list_like.webp | Bin 0 -> 2534 bytes .../icon_dy_list_like_00000.png | Bin 0 -> 1313 bytes .../icon_dy_list_like_00001.png | Bin 0 -> 1840 bytes .../icon_dy_list_like_00002.png | Bin 0 -> 2378 bytes .../icon_dy_list_like_00003.png | Bin 0 -> 2591 bytes .../icon_dy_list_like_00004.png | Bin 0 -> 2739 bytes .../icon_dy_list_like_00005.png | Bin 0 -> 3070 bytes .../icon_dy_list_like_00006.png | Bin 0 -> 3335 bytes .../icon_dy_list_like_00007.png | Bin 0 -> 3313 bytes .../icon_dy_list_like_00008.png | Bin 0 -> 3171 bytes .../icon_dy_list_like_00009.png | Bin 0 -> 2870 bytes .../icon_dy_list_like_00010.png | Bin 0 -> 2080 bytes .../icon_dy_list_like_00011.png | Bin 0 -> 1802 bytes .../icon_dy_list_like_00012.png | Bin 0 -> 1650 bytes .../icon_dy_list_like_00013.png | Bin 0 -> 1313 bytes .../icon_dy_list_like_false.webp | Bin 0 -> 788 bytes .../drawable-xhdpi/icon_dy_list_like_true.png | Bin 0 -> 846 bytes .../res/drawable-xhdpi/icon_dy_list_male.png | Bin 0 -> 215 bytes .../drawable-xhdpi/icon_dy_list_share.webp | Bin 0 -> 978 bytes .../res/drawable-xhdpi/icon_dy_miniworld.png | Bin 0 -> 455 bytes .../res/drawable-xhdpi/icon_dy_popup_copy.png | Bin 0 -> 278 bytes .../drawable-xhdpi/icon_dy_popup_delete.png | Bin 0 -> 265 bytes .../drawable-xhdpi/icon_dy_popup_report.png | Bin 0 -> 425 bytes .../icon_dy_publish_examine.png | Bin 0 -> 10709 bytes .../drawable-xhdpi/icon_dy_publish_false.png | Bin 0 -> 385 bytes .../drawable-xhdpi/icon_dy_publish_true.webp | Bin 0 -> 608 bytes .../icon_square_dynamic_comment.webp | Bin 0 -> 826 bytes .../icon_square_dynamic_like_checked.webp | Bin 0 -> 1940 bytes .../icon_square_dynamic_like_normal.webp | Bin 0 -> 1308 bytes .../icon_square_dynamic_more.png | Bin 0 -> 360 bytes .../icon_square_dynamic_share.webp | Bin 0 -> 756 bytes .../res/drawable-xhdpi/icon_top.png | Bin 0 -> 661 bytes .../res/drawable/anim_list_dy_like.xml | 61 + .../res/drawable/bg_round_1affbc51_9_4.xml | 11 + .../btn_translate_dynamic_selector.xml | 5 + .../res/drawable/divider_flexlayout.xml | 6 + .../selector_dy_publish_btn_status.xml | 5 + .../drawable/shape_bg_mini_world_added.xml | 17 + .../res/drawable/shape_bg_mini_world_name.xml | 5 + .../res/drawable/shape_bg_square_list.xml | 5 + .../res/drawable/shape_round.xml | 5 + .../res/drawable/topic_up_drawable.xml | 4 + .../res/layout/activity_dynamic_detail.xml | 108 ++ .../res/layout/activity_publish.xml | 207 +++ .../res/layout/dialog_dy_publish_success.xml | 50 + .../res/layout/dy_empty_dynamic_comment.xml | 31 + .../res/layout/dy_footer_loadmore.xml | 29 + .../res/layout/fragment_square.xml | 83 ++ .../res/layout/fragment_square_dynamic.xml | 27 + .../res/layout/frg_user_dynamic.xml | 23 + .../res/layout/frg_worlds_choose.xml | 21 + .../res/layout/head_dynamic_detail.xml | 305 +++++ .../res/layout/item_dy_comment.xml | 102 ++ .../res/layout/item_dy_reply.xml | 86 ++ .../res/layout/item_dynamic_image.xml | 33 + .../res/layout/item_dynamic_sys.xml | 39 + .../res/layout/item_grid_image_widget.xml | 30 + .../res/layout/item_label_mini_world.xml | 16 + .../res/layout/item_publish_image.xml | 0 .../res/layout/item_reply_footer_view.xml | 10 + .../res/layout/item_square_dynamic.xml | 274 ++++ .../res/layout/item_user_dynamic_image.xml | 30 + .../res/layout/item_user_dynamic_list.xml | 269 ++++ .../res/layout/item_world_dynamic.xml | 282 ++++ .../res/layout/item_worlds_choose.xml | 63 + .../res/layout/layout_dy_nick_detail.xml | 131 ++ .../res/layout/popup_dy_comment.xml | 51 + .../view_holder_world_dynamic_share.xml | 60 + .../res/layout/widget_grid_image.xml | 11 + .../res/values-ar/strings.xml | 20 + .../res/values-zh-rTW/strings.xml | 19 + app/src/module_community/res/values/attrs.xml | 18 + .../module_community/res/values/dimens.xml | 9 + .../module_community/res/values/strings.xml | 19 + .../main/java/com/chwl/core/XConstants.java | 5 +- .../com/chwl/core/home/bean/MainTabType.java | 13 +- .../com/chwl/core/initial/InitialModel.java | 8 +- .../com/chwl/core/user/bean/BaseUserInfo.java | 1 + .../attachment/DynamicSysAttachment.java | 3 + .../attachment/UnReadCountAttachment.java | 3 + .../chwl/core/community/im/DynamicImMsg.java | 3 + .../community/im/WorldDynamicAttachment.java | 3 + .../com/chwl/library/utils/TimeUtils.java | 3 +- .../library}/common/photo/PhotoProvider.kt | 38 +- 173 files changed, 9666 insertions(+), 54 deletions(-) create mode 100644 app/src/main/java/com/chwl/app/photo/DynamicImageAdapter.java create mode 100644 app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoDynamicAdapter.java create mode 100644 app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoDynamicFragment.kt create mode 100644 app/src/main/res/drawable-xxhdpi/base_status_empty.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_main_tab_square.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_main_tab_square_pressed.png create mode 100644 app/src/main/res/layout/item_userinfo_dynamic.xml create mode 100644 app/src/main/res/layout/user_info_dynamic_fragment.xml create mode 100644 app/src/main/res/layout/user_info_tab_empty.xml create mode 100644 app/src/module_community/java/com/chwl/app/community/ConstantValue.java create mode 100644 app/src/module_community/java/com/chwl/app/community/dynamic/adapter/CommentAdapter.java create mode 100644 app/src/module_community/java/com/chwl/app/community/dynamic/adapter/CommentReplyAdapter.java create mode 100644 app/src/module_community/java/com/chwl/app/community/dynamic/adapter/WorldDynamicAdapter.java create mode 100644 app/src/module_community/java/com/chwl/app/community/dynamic/view/DynamicDetailActivity.java create mode 100644 app/src/module_community/java/com/chwl/app/community/helper/CalcSize.java create mode 100644 app/src/module_community/java/com/chwl/app/community/helper/DynamicUiHelper.java create mode 100644 app/src/module_community/java/com/chwl/app/community/helper/ImageUiHelper.java create mode 100644 app/src/module_community/java/com/chwl/app/community/helper/ShareDynamicHelper.java create mode 100644 app/src/module_community/java/com/chwl/app/community/holder/DynamicSysHolder.java create mode 100644 app/src/module_community/java/com/chwl/app/community/im/WorldDynamicShareViewHolder.java create mode 100644 app/src/module_community/java/com/chwl/app/community/publish/ImageAdapter.java create mode 100644 app/src/module_community/java/com/chwl/app/community/publish/presenter/PublishPresenter.java create mode 100644 app/src/module_community/java/com/chwl/app/community/publish/presenter/WorldChoosePresenter.java create mode 100644 app/src/module_community/java/com/chwl/app/community/publish/view/IPublishView.java create mode 100644 app/src/module_community/java/com/chwl/app/community/publish/view/IWorldsChooseView.java create mode 100644 app/src/module_community/java/com/chwl/app/community/publish/view/PublishActivity.java create mode 100644 app/src/module_community/java/com/chwl/app/community/publish/view/WorldChooseAdapter.java create mode 100644 app/src/module_community/java/com/chwl/app/community/publish/view/WorldsChooseFrg.java create mode 100644 app/src/module_community/java/com/chwl/app/community/square/SquareDynamicFragment.java create mode 100644 app/src/module_community/java/com/chwl/app/community/square/SquareFragment.java create mode 100644 app/src/module_community/java/com/chwl/app/community/square/adapter/SquareDynamicAdapter.java create mode 100644 app/src/module_community/java/com/chwl/app/community/user_dynamic/IUserDynamicView.java create mode 100644 app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicAdapter.java create mode 100644 app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicFrg.java create mode 100644 app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicPresenter.java create mode 100644 app/src/module_community/java/com/chwl/app/community/utils/ObjectTypeHelper.java create mode 100644 app/src/module_community/java/com/chwl/app/community/utils/TopicUpTextWrapper.kt create mode 100644 app/src/module_community/java/com/chwl/app/community/widget/DynamicNickDetailWidget.java create mode 100644 app/src/module_community/java/com/chwl/app/community/widget/ExpandableTextView.java create mode 100644 app/src/module_community/java/com/chwl/app/community/widget/GridImageWidget.java create mode 100644 app/src/module_community/java/com/chwl/app/community/widget/TopicLabelWidget.kt create mode 100644 app/src/module_community/java/com/chwl/app/community/widget/TouchHideKeyboardView.java create mode 100644 app/src/module_community/java/com/chwl/app/community/widget/ZoomImageView.java create mode 100644 app/src/module_community/res/drawable-xhdpi/bg_dy_popup_comment.png create mode 100644 app/src/module_community/res/drawable-xhdpi/bg_dy_popup_comment_three.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_back_dynamic.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_box_dynamic.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_close_publish.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_communicate_community_list.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_dy_square_in_room.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_female_age_community_notice.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_img_dynamic.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_like_community_list.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_male_community_notice.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_more_community_list.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_name_community_notice_list.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_share_community_list.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_square_live.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_square_publish.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_text_dynamic.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_topic_close.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_translate_dynamic.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_translate_selected_dynamic.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_video_dynamic.png create mode 100644 app/src/module_community/res/drawable-xhdpi/ic_voice_dynamic.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_detail_comment.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_detail_share.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_dynamic_publisher.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_emoji.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_first_dynamic.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_item_more.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_comment.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_female.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00000.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00001.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00002.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00003.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00004.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00005.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00006.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00007.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00008.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00009.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00010.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00011.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00012.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00013.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_false.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_true.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_male.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_list_share.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_miniworld.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_popup_copy.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_popup_delete.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_popup_report.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_publish_examine.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_publish_false.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_dy_publish_true.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_square_dynamic_comment.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_square_dynamic_like_checked.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_square_dynamic_like_normal.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_square_dynamic_more.png create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_square_dynamic_share.webp create mode 100644 app/src/module_community/res/drawable-xhdpi/icon_top.png create mode 100644 app/src/module_community/res/drawable/anim_list_dy_like.xml create mode 100644 app/src/module_community/res/drawable/bg_round_1affbc51_9_4.xml create mode 100644 app/src/module_community/res/drawable/btn_translate_dynamic_selector.xml create mode 100644 app/src/module_community/res/drawable/divider_flexlayout.xml create mode 100644 app/src/module_community/res/drawable/selector_dy_publish_btn_status.xml create mode 100644 app/src/module_community/res/drawable/shape_bg_mini_world_added.xml create mode 100644 app/src/module_community/res/drawable/shape_bg_mini_world_name.xml create mode 100644 app/src/module_community/res/drawable/shape_bg_square_list.xml create mode 100644 app/src/module_community/res/drawable/shape_round.xml create mode 100644 app/src/module_community/res/drawable/topic_up_drawable.xml create mode 100644 app/src/module_community/res/layout/activity_dynamic_detail.xml create mode 100644 app/src/module_community/res/layout/activity_publish.xml create mode 100644 app/src/module_community/res/layout/dialog_dy_publish_success.xml create mode 100644 app/src/module_community/res/layout/dy_empty_dynamic_comment.xml create mode 100644 app/src/module_community/res/layout/dy_footer_loadmore.xml create mode 100644 app/src/module_community/res/layout/fragment_square.xml create mode 100644 app/src/module_community/res/layout/fragment_square_dynamic.xml create mode 100644 app/src/module_community/res/layout/frg_user_dynamic.xml create mode 100644 app/src/module_community/res/layout/frg_worlds_choose.xml create mode 100644 app/src/module_community/res/layout/head_dynamic_detail.xml create mode 100644 app/src/module_community/res/layout/item_dy_comment.xml create mode 100644 app/src/module_community/res/layout/item_dy_reply.xml create mode 100644 app/src/module_community/res/layout/item_dynamic_image.xml create mode 100644 app/src/module_community/res/layout/item_dynamic_sys.xml create mode 100644 app/src/module_community/res/layout/item_grid_image_widget.xml create mode 100644 app/src/module_community/res/layout/item_label_mini_world.xml rename app/src/{main => module_community}/res/layout/item_publish_image.xml (100%) create mode 100644 app/src/module_community/res/layout/item_reply_footer_view.xml create mode 100644 app/src/module_community/res/layout/item_square_dynamic.xml create mode 100644 app/src/module_community/res/layout/item_user_dynamic_image.xml create mode 100644 app/src/module_community/res/layout/item_user_dynamic_list.xml create mode 100644 app/src/module_community/res/layout/item_world_dynamic.xml create mode 100644 app/src/module_community/res/layout/item_worlds_choose.xml create mode 100644 app/src/module_community/res/layout/layout_dy_nick_detail.xml create mode 100644 app/src/module_community/res/layout/popup_dy_comment.xml create mode 100644 app/src/module_community/res/layout/view_holder_world_dynamic_share.xml create mode 100644 app/src/module_community/res/layout/widget_grid_image.xml create mode 100644 app/src/module_community/res/values-ar/strings.xml create mode 100644 app/src/module_community/res/values-zh-rTW/strings.xml create mode 100644 app/src/module_community/res/values/attrs.xml create mode 100644 app/src/module_community/res/values/dimens.xml create mode 100644 app/src/module_community/res/values/strings.xml rename {app/src/main/java/com/chwl/app => library/src/module_common/java/com/chwl/library}/common/photo/PhotoProvider.kt (87%) diff --git a/app/build.gradle b/app/build.gradle index 83cfd17b1..35a6ab9cf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -117,6 +117,7 @@ android { 'src/module_treasure_box/java', 'src/module_public_chat/java', 'src/module_game/java', + 'src/module_community/java', ] @@ -133,6 +134,7 @@ android { 'src/module_treasure_box/res', 'src/module_public_chat/res', 'src/module_game/res', + 'src/module_community/res', ] diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 34bb2d8b1..362dfab7c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -934,6 +934,15 @@ android:launchMode="singleTask" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan" /> + + \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/MainActivity.java b/app/src/main/java/com/chwl/app/MainActivity.java index 51cb6c87c..9f6890f80 100644 --- a/app/src/main/java/com/chwl/app/MainActivity.java +++ b/app/src/main/java/com/chwl/app/MainActivity.java @@ -25,6 +25,7 @@ import androidx.lifecycle.ViewModelProvider; import com.chwl.app.base.GlobalViewModelOwner; import com.chwl.app.common.widget.dialog.DialogManager; +import com.chwl.app.community.square.SquareFragment; import com.chwl.app.game.core.GameStateAbility; import com.chwl.app.game.data.GameModel2; import com.chwl.app.game.ui.game.GameActivity; @@ -143,7 +144,7 @@ public class MainActivity extends BaseMvpActivity private MainTabLayout mMainTabLayout; private AnchorCardView anchorCardView; private View viewClose; - private int mCurrentTabType = MainTabType.TAB_TYPE_STAR; + private int mCurrentTabType = MainTabType.TAB_TYPE_HOME; /** * 房间最小化动画,换成属性动画,原先的补间动画影响了activity的生命周期 */ @@ -162,9 +163,9 @@ public class MainActivity extends BaseMvpActivity private Runnable touchRunnable; { - fragmentArray.put(MainTabType.TAB_TYPE_STAR, new StarFragment()); - fragmentArray.put(MainTabType.TAB_TYPE_GAME, new GameHomeFragment()); fragmentArray.put(MainTabType.TAB_TYPE_HOME, new HomeFragment()); + fragmentArray.put(MainTabType.TAB_TYPE_GAME, new GameHomeFragment()); + fragmentArray.put(MainTabType.TAB_TYPE_SQUARE, new SquareFragment()); fragmentArray.put(MainTabType.TAB_TYPE_MSG, new ContactsListFragment()); fragmentArray.put(MainTabType.TAB_TYPE_ME, new MeFragment()); } diff --git a/app/src/main/java/com/chwl/app/home/adapter/CommunityNoticeAdapter.java b/app/src/main/java/com/chwl/app/home/adapter/CommunityNoticeAdapter.java index d2349809a..254ce4331 100644 --- a/app/src/main/java/com/chwl/app/home/adapter/CommunityNoticeAdapter.java +++ b/app/src/main/java/com/chwl/app/home/adapter/CommunityNoticeAdapter.java @@ -1,6 +1,8 @@ package com.chwl.app.home.adapter; + import android.text.TextUtils; +import android.widget.TextView; import com.chad.library.adapter.base.BaseQuickAdapter; import com.chad.library.adapter.base.BaseViewHolder; @@ -59,7 +61,8 @@ public class CommunityNoticeAdapter extends BaseQuickAdapter { + + private Context context; + @Setter + private int mTwoImageHeight; + @Setter + private int mThreeImageHeight; + + private int imageWidth; + + private int bigImageWidth; + + @Setter + private int singleImageHeight; + + public DynamicImageAdapter(int layoutResId, @Nullable List data) { + super(layoutResId, data); + context = BasicConfig.INSTANCE.getAppContext(); + imageWidth = UIUtil.getScreenWidth(context) * 2 / 5; + bigImageWidth = UIUtil.getScreenWidth(context); + + mTwoImageHeight = (ScreenUtils.getScreenWidth(context) - UIUtil.dip2px(context, 50F)) / 2; + mThreeImageHeight = (ScreenUtils.getScreenWidth(context) - UIUtil.dip2px(context, 60F)) / 3; + } + + @Override + protected void convert(BaseViewHolder helper, DynamicMedia item) { + ImageView ivPhoto = helper.getView(R.id.riv_photo); + helper.setGone(R.id.iv_gif_tag, item.isGif()); + ViewGroup.LayoutParams layoutParams = ivPhoto.getLayoutParams(); + if (helper.itemView instanceof ConstraintLayout && getData().size() > 1) { + ImageLoadUtilsV2.loadImage(ivPhoto, item.getResUrl(), imageWidth); + } else { + switch (getData().size()) { + case 1: + layoutParams.height = singleImageHeight; + ivPhoto.setLayoutParams(layoutParams); + ImageLoadUtilsV2.loadImage(ivPhoto, item.getResUrl(), bigImageWidth); + break; + case 2: + layoutParams.height = mTwoImageHeight; + ivPhoto.setLayoutParams(layoutParams); + ImageLoadUtilsV2.loadImage(ivPhoto, item.getResUrl(), imageWidth); + break; + case 3: + default: + layoutParams.height = mThreeImageHeight; + ivPhoto.setLayoutParams(layoutParams); + ImageLoadUtilsV2.loadImage(ivPhoto, item.getResUrl(), imageWidth); + break; + } + } + } +} diff --git a/app/src/main/java/com/chwl/app/ui/im/ImInitHelper.java b/app/src/main/java/com/chwl/app/ui/im/ImInitHelper.java index edfd74bd3..74369a427 100644 --- a/app/src/main/java/com/chwl/app/ui/im/ImInitHelper.java +++ b/app/src/main/java/com/chwl/app/ui/im/ImInitHelper.java @@ -2,7 +2,11 @@ package com.chwl.app.ui.im; import android.content.Context; +import com.chwl.app.community.holder.DynamicSysHolder; +import com.chwl.app.community.im.WorldDynamicShareViewHolder; import com.chwl.app.module_hall.im.msgholder.FamilyMsgViewHolder; +import com.chwl.core.community.attachment.DynamicSysAttachment; +import com.chwl.core.community.im.WorldDynamicAttachment; import com.chwl.core.module_hall.im.FamilyAttachment; import com.netease.nim.uikit.api.NimUIKit; import com.netease.nim.uikit.api.model.contact.ContactEventListener; @@ -151,6 +155,10 @@ public class ImInitHelper { //瓜分钻石 三级 NimUIKit.registerMsgItemViewHolder(CarveUpGoldThirdLevelAttachment.class, MsgViewHolderText.class); + // 社区动态 + NimUIKit.registerMsgItemViewHolder(DynamicSysAttachment.class, DynamicSysHolder.class); + NimUIKit.registerMsgItemViewHolder(WorldDynamicAttachment.class, WorldDynamicShareViewHolder.class); + NimUIKit.registerMsgItemViewHolder(ChatHintAttachment.class, MsgViewHolderChatHint.class); //技能卡 diff --git a/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java b/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java index 9f9ae89c6..244008d20 100644 --- a/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java +++ b/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoActivity.java @@ -22,6 +22,7 @@ import androidx.viewpager2.widget.ViewPager2; import com.chwl.app.avroom.adapter.CommonVPAdapter; import com.chwl.app.ui.user.adapter.UserInfoTopAlbumAdapter; import com.chwl.app.ui.user.fragment.UserInfoDataFragment; +import com.chwl.app.ui.user.fragment.UserInfoDynamicFragment; import com.chwl.app.utils.AppBarStateChangeListener; import com.chwl.core.decoration.headwear.bean.HeadWearInfo; import com.chwl.core.noble.NobleUtil; @@ -201,12 +202,12 @@ public class UserInfoActivity extends BaseBindingActivity fragmentList = new ArrayList<>(1); + List fragmentList = new ArrayList<>(2); fragmentList.add(new UserInfoDataFragment()); -// fragmentList.add(new UserInfoGiftWallFragment()); - final List tagList = new ArrayList<>(1); + fragmentList.add(new UserInfoDynamicFragment()); + final List tagList = new ArrayList<>(2); tagList.add(getString(R.string.me_data)); -// tagList.add(getString(R.string.me_gift_wall)); + tagList.add(getString(R.string.me_dynamic)); CommonNavigator commonNavigator = new CommonNavigator(context); commonNavigator.setTitleWrapContent(false); UserInfoIndicatorAdapter magicIndicatorAdapter = new UserInfoIndicatorAdapter(context, tagList); diff --git a/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoModifyActivity.kt b/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoModifyActivity.kt index caba93c71..e0150e9ae 100644 --- a/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoModifyActivity.kt +++ b/app/src/main/java/com/chwl/app/ui/user/activity/UserInfoModifyActivity.kt @@ -35,7 +35,6 @@ import com.chwl.app.ui.widget.dialog.CommonTipDialog import com.chwl.app.utils.RegexUtil import com.chwl.core.auth.AuthModel import com.chwl.core.file.FileModel -import com.chwl.core.file.cos.CosException import com.chwl.core.user.UserModel import com.chwl.core.user.bean.UserInfo import com.chwl.core.user.bean.UserPhoto diff --git a/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoDynamicAdapter.java b/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoDynamicAdapter.java new file mode 100644 index 000000000..8c73b06b7 --- /dev/null +++ b/app/src/main/java/com/chwl/app/ui/user/adapter/UserInfoDynamicAdapter.java @@ -0,0 +1,249 @@ +package com.chwl.app.ui.user.adapter; + + +import android.app.Activity; +import android.content.Context; +import android.text.TextUtils; +import android.util.SparseBooleanArray; +import android.util.SparseIntArray; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.chwl.app.R; +import com.chwl.app.community.dynamic.view.DynamicDetailActivity; +import com.chwl.app.community.helper.CalcSize; +import com.chwl.app.community.helper.DynamicUiHelper; +import com.chwl.app.community.helper.ImageUiHelper; +import com.chwl.app.photo.DynamicImageAdapter; +import com.chwl.app.community.utils.ObjectTypeHelper; +import com.chwl.app.community.widget.ExpandableTextView; +import com.chwl.app.photo.BigPhotoActivity; +import com.chwl.app.photo.PagerOption; +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil; +import com.chwl.app.utils.TimeUiUtils; +import com.chwl.core.community.bean.DynamicMedia; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.dynamic.DynamicModel; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; +import com.netease.nim.uikit.common.util.log.LogUtil; + +import java.util.List; + +/** + * create by lvzebiao @2019/11/13 + */ +public class UserInfoDynamicAdapter extends BaseQuickAdapter { + + private SparseBooleanArray mCollapsedStatus = new SparseBooleanArray(); + private SparseIntArray mCollapsedHeightStatus = new SparseIntArray(2); + + private Context context; + + private long worldId; + + private int iconWidth; + + private int iconHeight; + + /** + * 单图情况下的边界 + */ + private int imageBorder; + /** + * 图片的边界值 + */ + private int divider; + + public UserInfoDynamicAdapter(Context context) { + super(R.layout.item_userinfo_dynamic); + this.context = context; + iconWidth = UIUtil.dip2px(context, 32); + iconHeight = UIUtil.dip2px(context, 15); + //0.68 + imageBorder = UIUtil.getScreenWidth(context) * ImageUiHelper.BORDER_MIN / ImageUiHelper.BORDER_MAX; + divider = UIUtil.dip2px(context, 10); + } + + @Override + protected void convert(BaseViewHolder helper, WorldDynamicBean item) { + //这个值,有没有文本UI部分,改变图片部分的margin + boolean noTextUi = TextUtils.isEmpty(item.getContent()); + RecyclerView rvImage = helper.getView(R.id.rv_image); + List dynamicMediaList = item.getDynamicResList(); + if (item.getType() == WorldDynamicBean.TYPE_IMAGE + && dynamicMediaList != null && dynamicMediaList.size() > 0) { + rvImage.setVisibility(View.VISIBLE); + initRecyclerView(rvImage, dynamicMediaList, noTextUi); + } else { + rvImage.setVisibility(View.GONE); + } + + //时间 + helper.setText(R.id.tv_time, TimeUiUtils.getDynamicUi(item.getPublishTime())); + + ExpandableTextView etvContent = helper.getView(R.id.etv_content); + etvContent.setEventType(1); + if (noTextUi) { + etvContent.setVisibility(View.GONE); + } else { + etvContent.setVisibility(View.VISIBLE); + CharSequence formatText = DynamicUiHelper.formatFirstDynamicContent( + item, etvContent.mTv, iconWidth, iconHeight); + etvContent.setText(formatText, mCollapsedStatus, helper.getAdapterPosition(), mCollapsedHeightStatus); + } + + helper.setGone(R.id.layout_root_mini_world, item.getTag() != null); + helper.setText(R.id.tv_mini_world_name, "#" + item.getTag()); + + //评论 + setCommentCount(helper, item.getCommentCount()); + + //点赞 + setLikeCount(helper, item.getLikeCount(), item.isLike(), false); + LinearLayout llLike = helper.getView(R.id.ll_like); + llLike.setEnabled(true); + llLike.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (item.getDynamicId() == 0) { + SingleToastUtil.showToast(ResUtil.getString(R.string.the_default_dynamic_cannot_be_liked)); + return; + } + llLike.setEnabled(false); + int status = item.isLike() ? 0 : 1; + DynamicModel.get().like(worldId, item.getDynamicId(), item.getUid(), status, 1) + .compose(RxHelper.bindContext(context)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + llLike.setEnabled(true); + if (error != null) { + SingleToastUtil.showToast(error); + } else { + LogUtil.print(mContext.getString(R.string.me_call_the_like_interface_to_complete)); + if (status == 1) { + item.setLikeCount(item.getLikeCount() + 1); + } else { + item.setLikeCount(item.getLikeCount() - 1); + } + item.setLike(status == 1); + setLikeCount(helper, item.getLikeCount(), item.isLike(), true); + } + } + }); + } + }); + //评论 + helper.getView(R.id.ll_comment).setOnClickListener(v -> { + if (item.getDynamicId() == 0) { + SingleToastUtil.showToast(ResUtil.getString(R.string.the_default_dynamic_cannot_be_commented)); + return; + } + DynamicDetailActivity.start(context, item.getDynamicId(), worldId, + helper.getAdapterPosition(), true, 1); + } + ); + helper.setVisible(R.id.iv_more, item.getDynamicId() != 0); + if (item.getDynamicId() != 0) { + helper.addOnClickListener(R.id.iv_more).addOnClickListener(R.id.ll_share); + } + + View.OnClickListener toDetailListener = v -> { + if (item.getDynamicId() == 0) { + return; + } + DynamicDetailActivity.start(context, item.getDynamicId(), worldId, + helper.getAdapterPosition(), false, 1); + }; + + if (etvContent.mTv != null) { + etvContent.mTv.setOnClickListener(toDetailListener); + } + //跳转去详情 + helper.itemView.setOnClickListener(toDetailListener); + helper.setGone(R.id.line_bottom, getItemCount() - 1 != helper.getLayoutPosition()); + } + + private void setLikeCount(BaseViewHolder helper, int likeCount, boolean isLike, boolean isAnim) { + TextView tvLike = helper.getView(R.id.tv_like); + String likeCountStr; + if (likeCount < 0) { + likeCountStr = "0"; + } else if (likeCount >= 1000) { + likeCountStr = "999+"; + } else { + likeCountStr = String.valueOf(likeCount); + } + tvLike.setText(likeCountStr); + + ImageView ivLikeAnim = helper.getView(R.id.iv_like_pic); + if (isLike) { + ivLikeAnim.setImageResource(R.drawable.icon_dy_list_like); + } else { + ivLikeAnim.setImageResource(R.drawable.icon_dy_list_like_false); + } + + } + + private void initRecyclerView(RecyclerView rvImage, List imageUrl, boolean noTextUi) { + if (imageUrl == null) { + return; + } + CalcSize calcSize = new CalcSize(imageBorder); + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) rvImage.getLayoutParams(); + if (imageUrl.size() > 1) { + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + } else { + //单图的情况,按比例显示 + DynamicMedia media = null; + if (imageUrl.size() > 0) { + media = imageUrl.get(0); + } + if (media == null) { + return; + } + calcSize = ImageUiHelper.calcImage(media, imageBorder); + params.width = calcSize.width + divider; + params.height = calcSize.height + divider; + } + rvImage.setLayoutParams(params); + rvImage.setNestedScrollingEnabled(false); + rvImage.setLayoutManager(new GridLayoutManager(mContext, imageUrl.size() > 2 ? 3 : imageUrl.size())); + DynamicImageAdapter adapter = new DynamicImageAdapter(R.layout.item_dynamic_image, imageUrl); + adapter.setSingleImageHeight(calcSize.height); + adapter.setOnItemClickListener((adapter1, view, position) -> { + PagerOption option = new PagerOption().setSave(true); + BigPhotoActivity.start((Activity) mContext, ObjectTypeHelper.mediaToCustomList(imageUrl), + position, option); + } + ); + rvImage.setAdapter(adapter); + } + + private void setCommentCount(BaseViewHolder helper, int commentCount) { + TextView tvComment = helper.getView(R.id.tv_comment); + String commentCountStr; + if (commentCount < 0) { + commentCountStr = "0"; + } else if (commentCount >= 1000) { + commentCountStr = "999+"; + } else { + commentCountStr = String.valueOf(commentCount); + } + tvComment.setText(commentCountStr); + } + +} diff --git a/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoDataFragment.kt b/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoDataFragment.kt index 24de7bdd2..24783de9a 100644 --- a/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoDataFragment.kt +++ b/app/src/main/java/com/chwl/app/ui/user/fragment/UserInfoDataFragment.kt @@ -68,7 +68,7 @@ class UserInfoDataFragment : BaseViewBindingFragment() { + + private val viewModel: UserInfoViewModel by activityViewModels() + + private var adapter: UserInfoDynamicAdapter? = null + override fun init() { + initView() + viewModel.userInfoDetailData.observe(this) { + updateList(it.dynamicInfo) + } + } + + private fun initView() { + adapter = UserInfoDynamicAdapter(requireContext()) + adapter?.setEnableLoadMore(false) + adapter?.emptyView = layoutInflater.inflate(R.layout.user_info_tab_empty, null) + binding.recyclerView.adapter = adapter + adapter?.setOnItemChildClickListener { adapter, view: View, pos: Int -> + val bean = + adapter?.getItem(pos) as? WorldDynamicBean ?: return@setOnItemChildClickListener + if (view.id == R.id.iv_more) { + val list: MutableList = ArrayList() + if (!UserModel.get().isMyseft(bean.uid)) { + val item = ButtonItem( + getString(R.string.me_shield_dynamic) + ) { + UserModel.get().addReport(bean.dynamicId, 0) + .subscribe(object : BeanObserver() { + override fun onErrorMsg(error: String) { + dialogManager.dismissDialog() + toast(error) + } + + override fun onSuccess(s: String) { + dialogManager.dismissDialog() + toast(ResUtil.getString(R.string.me_shield_success)) + val size = adapter?.data?.size ?: 0 + if (pos < size) { + if (bean == adapter?.getItem(pos)) { + adapter?.remove(pos) + } + } + } + }) + } + list.add(item) + } + if (!UserModel.get().isMyseft(bean.uid)) { + val blackListItem = ButtonItemFactory.createAddToBlackListItem( + dialogManager, bean.uid.toString() + ) + list.add(blackListItem) + } + if (!UserModel.get().isMyseft(bean.uid)) { + val item = ButtonItem( + getString(R.string.me_report_dynamic) + ) { + UIHelper.showReportPage( + mContext, bean.uid, + XConstants.REPORT_TYPE_DYNAMIC_SQUARE + ) + } + list.add(item) + } + if (UserModel.get().isMyseft(bean.uid) || + isThisWorldOwner(bean) + ) { + val item = ButtonItem( + getString(R.string.me_delete) + ) { deleteDynamic(pos, this.adapter) } + list.add(item) + } + dialogManager.showCommonPopupDialog(list, getString(R.string.cancel)) + } else if (view.id == R.id.ll_share) { +// ShareDynamicHelper(activity).share(bean) + } + } + } + + private fun deleteDynamic(pos: Int, adapter: UserInfoDynamicAdapter?) { + dialogManager.showOkCancelWithTitleDialog(getString(R.string.me_cannot_be_restored), + DialogManager.OkCancelDialogListener { + val bean = adapter?.getItem(pos) ?: return@OkCancelDialogListener + DynamicModel.get().delete(bean.worldId, bean.dynamicId) + .compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)) + .doOnSubscribe { dialogManager.showProgressDialog(mContext) } + .subscribe(object : DontWarnObserver() { + override fun accept(s: String?, error: String?) { + super.accept(s, error) + dialogManager.dismissDialog() + if (error != null) { + toast(error) + } else { + toast(getString(R.string.me_successfully_delete)) + if (pos < adapter.data.size) { + if (bean == adapter.getItem(pos)) { + adapter.remove(pos) + } + } + } + } + }) + }) + } + + /** + * 判断自己是不是该世界的创始人 + */ + private fun isThisWorldOwner(bean: WorldDynamicBean?): Boolean { + return bean != null && bean.worldUid == AuthModel.get().currentUid + } + + private fun updateList(list: List?) { + adapter?.setNewData(list) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/ui/user/viewmodel/UserInfoViewModel.kt b/app/src/main/java/com/chwl/app/ui/user/viewmodel/UserInfoViewModel.kt index 527a8c363..3b2024640 100644 --- a/app/src/main/java/com/chwl/app/ui/user/viewmodel/UserInfoViewModel.kt +++ b/app/src/main/java/com/chwl/app/ui/user/viewmodel/UserInfoViewModel.kt @@ -3,21 +3,16 @@ package com.chwl.app.ui.user.viewmodel import android.annotation.SuppressLint import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel import com.chwl.app.base.BaseViewModel import com.chwl.app.module_hall.HallDataManager import com.chwl.core.auth.AuthModel -import com.chwl.core.module_hall.hall.HallModel -import com.chwl.core.module_hall.hall.bean.ClanAndHallInfo import com.chwl.core.module_hall.hall.bean.UserClanInfo -import com.chwl.core.user.UserInfoUiMgr import com.chwl.core.user.UserModel import com.chwl.core.user.bean.GiftWallInfo import com.chwl.core.user.bean.UserDetailInfo import com.chwl.core.user.bean.UserInfo import com.chwl.core.utils.net.BeanObserver import com.chwl.core.utils.extension.toast -import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.Disposable class UserInfoViewModel : BaseViewModel() { @@ -46,7 +41,7 @@ class UserInfoViewModel : BaseViewModel() { } override fun onSuccess(info: UserInfo) { - _userInfoData.value = info + _userInfoData.postValue(info) } override fun onSubscribe(d: Disposable) { @@ -65,7 +60,7 @@ class UserInfoViewModel : BaseViewModel() { override fun onSuccess(info: UserDetailInfo) { info.let { mRoomUid = it.data.roomUid - _userInfoDetailData.value = it.data + _userInfoDetailData.postValue(it.data) } } diff --git a/app/src/main/java/com/chwl/app/ui/widget/MainRedPointTab.java b/app/src/main/java/com/chwl/app/ui/widget/MainRedPointTab.java index 4d2b83304..7e0fc6a24 100644 --- a/app/src/main/java/com/chwl/app/ui/widget/MainRedPointTab.java +++ b/app/src/main/java/com/chwl/app/ui/widget/MainRedPointTab.java @@ -139,8 +139,8 @@ public class MainRedPointTab extends RelativeLayout { private int getDefaultRes(int tabType, boolean select) { int resId = select ? R.drawable.ic_main_tab_home_pressed : R.drawable.ic_main_tab_home; switch (tabType) { - case MainTabType.TAB_TYPE_STAR: - resId = select ? R.drawable.ic_main_tab_star_pressed : R.drawable.ic_main_tab_star; + case MainTabType.TAB_TYPE_SQUARE: + resId = select ? R.drawable.ic_main_tab_square_pressed : R.drawable.ic_main_tab_square; break; case MainTabType.TAB_TYPE_GAME: resId = select ? R.drawable.ic_main_tab_game_pressed : R.drawable.ic_main_tab_game; diff --git a/app/src/main/java/com/chwl/app/ui/widget/MainTabLayout.java b/app/src/main/java/com/chwl/app/ui/widget/MainTabLayout.java index 253192fb2..01cef0d1a 100644 --- a/app/src/main/java/com/chwl/app/ui/widget/MainTabLayout.java +++ b/app/src/main/java/com/chwl/app/ui/widget/MainTabLayout.java @@ -25,7 +25,7 @@ public class MainTabLayout extends LinearLayout implements View.OnClickListener private final List tabViewList = new ArrayList<>(4); private MainRedPointTab homeTab; - private MainRedPointTab starTab; + private MainRedPointTab squareTab; private MainRedPointTab gameTab; private MainRedPointTab msgTab; private MainRedPointTab meTab; @@ -57,20 +57,20 @@ public class MainTabLayout extends LinearLayout implements View.OnClickListener inflate(context, R.layout.main_tab_layout, this); msgTab = findViewById(R.id.main_msg_tab); - starTab = findViewById(R.id.main_star_tab); + squareTab = findViewById(R.id.main_square_tab); gameTab = findViewById(R.id.main_game_tab); homeTab = findViewById(R.id.main_home_tab); meTab = findViewById(R.id.main_me_tab); homeTab.setOnClickListener(this); meTab.setOnClickListener(this); - starTab.setOnClickListener(this); + squareTab.setOnClickListener(this); gameTab.setOnClickListener(this); msgTab.setOnClickListener(this); - tabViewList.add(starTab); - tabViewList.add(gameTab); tabViewList.add(homeTab); + tabViewList.add(gameTab); + tabViewList.add(squareTab); tabViewList.add(msgTab); tabViewList.add(meTab); } @@ -106,8 +106,8 @@ public class MainTabLayout extends LinearLayout implements View.OnClickListener case R.id.main_home_tab: select(MainTabType.TAB_TYPE_HOME); break; - case R.id.main_star_tab: - select(MainTabType.TAB_TYPE_STAR); + case R.id.main_square_tab: + select(MainTabType.TAB_TYPE_SQUARE); break; case R.id.main_game_tab: select(MainTabType.TAB_TYPE_GAME); @@ -122,10 +122,10 @@ public class MainTabLayout extends LinearLayout implements View.OnClickListener } private void select(int tabType) { - if (tabType == 0) tabType = MainTabType.TAB_TYPE_STAR; + if (tabType == 0) tabType = MainTabType.TAB_TYPE_HOME; if (mLastPosition == tabType) return; msgTab.select(tabType == MainTabType.TAB_TYPE_MSG); - starTab.select(tabType == MainTabType.TAB_TYPE_STAR); + squareTab.select(tabType == MainTabType.TAB_TYPE_SQUARE); gameTab.select(tabType == MainTabType.TAB_TYPE_GAME); homeTab.select(tabType == MainTabType.TAB_TYPE_HOME); meTab.select(tabType == MainTabType.TAB_TYPE_ME); diff --git a/app/src/main/res/drawable-xxhdpi/base_status_empty.png b/app/src/main/res/drawable-xxhdpi/base_status_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..02ecbd92e94a783b58fbfe8620c8f7701a74a684 GIT binary patch literal 23306 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 Z{|}_p;o4y{{!#z{002ovPDHLkV1nI;@zDSP literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_main_tab_square.png b/app/src/main/res/drawable-xxhdpi/ic_main_tab_square.png new file mode 100644 index 0000000000000000000000000000000000000000..d0eaa4bbb5c105a024d0c4d575730949f651612b GIT binary patch literal 3987 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_main_tab_square_pressed.png b/app/src/main/res/drawable-xxhdpi/ic_main_tab_square_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..be87661c8ea815146706057801cc4d86cf009c96 GIT binary patch literal 8558 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_big_photo.xml b/app/src/main/res/layout/activity_big_photo.xml index 14ab4a038..c4f004153 100644 --- a/app/src/main/res/layout/activity_big_photo.xml +++ b/app/src/main/res/layout/activity_big_photo.xml @@ -9,6 +9,7 @@ android:id="@+id/title_bar" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/dp_30" app:layout_constraintTop_toTopOf="parent" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_tab_layout.xml b/app/src/main/res/layout/main_tab_layout.xml index 7810202b5..1f05a39f0 100644 --- a/app/src/main/res/layout/main_tab_layout.xml +++ b/app/src/main/res/layout/main_tab_layout.xml @@ -6,8 +6,15 @@ android:orientation="horizontal" tools:parentTag="LinearLayout"> + + + + + + + + + + + diff --git a/app/src/main/res/layout/user_info_tab_empty.xml b/app/src/main/res/layout/user_info_tab_empty.xml new file mode 100644 index 000000000..ab4a23d4b --- /dev/null +++ b/app/src/main/res/layout/user_info_tab_empty.xml @@ -0,0 +1,33 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 8aff7970d..afb5f021a 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -976,7 +976,7 @@ نقرة على وحدة ميزات مركز الفرد مباشر المعلومات - ديناميكيات + التحديثات جدار الهدايا حجرة الدرع التقرير diff --git a/app/src/module_community/java/com/chwl/app/community/ConstantValue.java b/app/src/module_community/java/com/chwl/app/community/ConstantValue.java new file mode 100644 index 000000000..44c0f318a --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/ConstantValue.java @@ -0,0 +1,10 @@ +package com.chwl.app.community; + +/** + * create by lvzebiao @2019/11/12 + */ +public class ConstantValue { + + public static final int CODE_CHOOSE_PHOTO = 12; + +} diff --git a/app/src/module_community/java/com/chwl/app/community/dynamic/adapter/CommentAdapter.java b/app/src/module_community/java/com/chwl/app/community/dynamic/adapter/CommentAdapter.java new file mode 100644 index 000000000..ba669476d --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/dynamic/adapter/CommentAdapter.java @@ -0,0 +1,165 @@ +package com.chwl.app.community.dynamic.adapter; + +import android.view.LayoutInflater; +import android.view.View; +import android.widget.TextView; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.chwl.app.R; +import com.chwl.app.UIHelper; +import com.chwl.app.ui.utils.ImageLoadUtilsV2; +import com.chwl.app.utils.RegexUtil; +import com.chwl.app.utils.TimeUiUtils; +import com.chwl.app.vip.util.VipHelper; +import com.chwl.core.community.bean.Comment; +import com.chwl.library.utils.ListUtils; + +import java.util.List; + +/** + * create by lvzebiao @2019/11/26 + */ +public class CommentAdapter extends BaseQuickAdapter { + + + public CommentAdapter() { + super(R.layout.item_dy_comment); + } + + @Override + protected void convert(BaseViewHolder helper, Comment item) { + ImageLoadUtilsV2.loadAvatar(helper.getView(R.id.iv_avatar), item.getAvatar()); + TextView tvNick = helper.getView(R.id.tv_nick); + tvNick.setText(RegexUtil.getPrintableString(item.getNick())); + VipHelper.loadVipIcon(helper.getView(R.id.iv_vip_icon), item.getUserVipInfoVO()); + int endIcon = 0; + if (item.isLandLordFlag()) { + endIcon = R.drawable.icon_dy_dynamic_publisher; + } + tvNick.setCompoundDrawablesWithIntrinsicBounds(0, 0, endIcon, 0); + helper.setText(R.id.tv_content, item.getContent()); + + helper.getView(R.id.iv_avatar).setOnClickListener(v -> + UIHelper.showUserInfoAct(mContext, item.getUid())); + + helper.setText(R.id.tv_time, TimeUiUtils.getDynamicUi(item.getPublishTime())); + + helper.addOnLongClickListener(R.id.tv_content); + helper.addOnClickListener(R.id.tv_content); + + + //===========================回复========================= + RecyclerView rvReply = helper.getView(R.id.rv_reply); + + View lineReplyBottom = helper.getView(R.id.line_reply_bottom); + if (item.isEmptyReply()) { + lineReplyBottom.setVisibility(View.GONE); + } else { + lineReplyBottom.setVisibility(View.VISIBLE); + } + CommentReplyAdapter commentReplyAdapter = new CommentReplyAdapter(item.getReplyInfo().getLeftCount() > 0); + rvReply.setLayoutManager(new LinearLayoutManager(mContext)); + rvReply.setAdapter(commentReplyAdapter); + + commentReplyAdapter.setNewData(item.getReplyList()); + + commentReplyAdapter.setOnItemChildClickListener(new OnItemChildClickListener() { + @Override + public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { + if (onCommentReplyItemChildClickListener != null) { + onCommentReplyItemChildClickListener.onCommentReplyItemChildClick(view, + helper.getAdapterPosition() - 1, position); + } + } + }); + + commentReplyAdapter.setOnItemChildLongClickListener(new OnItemChildLongClickListener() { + @Override + public boolean onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) { + if (onCommentReplyItemChildClickListener != null) { + onCommentReplyItemChildClickListener.onCommentReplyItemChildLongClick(view, + helper.getAdapterPosition() - 1, position); + } + return true; + } + }); + + + View mFooterView = LayoutInflater.from(mContext).inflate(R.layout.item_reply_footer_view, null); + + if (item.getReplyInfo().getLeftCount() > 0) { //剩余回复大于0 + ((TextView) mFooterView).setText(String.format(mContext.getResources().getString(R.string.dy_open_other_number), + String.valueOf(item.getReplyInfo().getLeftCount()))); + commentReplyAdapter.addFooterView(mFooterView); + } else { + commentReplyAdapter.removeAllFooterView(); + } + + mFooterView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + onCommentReplyItemChildClickListener.onLoadMoreClick( + item.getCommentId(), + item.getReplyInfo().getNextTimestamp(), + helper.getLayoutPosition() - 1); + } + }); + + + } + + private OnCommentReplyItemChildClickListener onCommentReplyItemChildClickListener; + + public interface OnCommentReplyItemChildClickListener { + + void onCommentReplyItemChildClick(View view, int groupPosition, int childPosition); + + void onCommentReplyItemChildLongClick(View view, int groupPosition, int childPosition); + + void onLoadMoreClick(long commentId, long nextReplyId, int groupPosition); + + } + + public void setOnCommentReplyItemChildClickListener(OnCommentReplyItemChildClickListener onCommentReplyItemChildClickListener) { + this.onCommentReplyItemChildClickListener = onCommentReplyItemChildClickListener; + } + + public long getItemCommentId(int pos) { + List list = getData(); + if (ListUtils.isListEmpty(list)) { + return 0; + } + if (pos >= 0 && pos < list.size()) { + Comment comment = list.get(pos); + if (comment != null) { + return comment.getCommentId(); + } + } + return 0; + } + + public Comment getDataItem(int pos) { + List list = getData(); + if (ListUtils.isListEmpty(list)) { + return null; + } + if (pos >= 0 && pos < list.size()) { + return list.get(pos); + } + return null; + } + + public void safeDelete(int pos) { + List list = getData(); + if (pos >= 0 && pos < list.size()) { + list.remove(pos); + notifyDataSetChanged(); + } + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/dynamic/adapter/CommentReplyAdapter.java b/app/src/module_community/java/com/chwl/app/community/dynamic/adapter/CommentReplyAdapter.java new file mode 100644 index 000000000..894498387 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/dynamic/adapter/CommentReplyAdapter.java @@ -0,0 +1,74 @@ +package com.chwl.app.community.dynamic.adapter; + +import android.text.style.ForegroundColorSpan; +import android.view.View; +import android.widget.TextView; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.chwl.app.R; +import com.chwl.app.UIHelper; +import com.chwl.app.ui.utils.ImageLoadUtilsV2; +import com.chwl.app.utils.RegexUtil; +import com.chwl.app.utils.SpannableBuilder; +import com.chwl.app.utils.TimeUiUtils; +import com.chwl.app.vip.util.VipHelper; +import com.chwl.core.community.bean.comment.Reply; + +/** + * create by lvzebiao @2019/11/27 + */ +public class CommentReplyAdapter extends BaseQuickAdapter { + + private boolean hasExpandFooter; + + public CommentReplyAdapter(boolean hasExpandFooter) { + super(R.layout.item_dy_reply); + this.hasExpandFooter = hasExpandFooter; + } + + @Override + protected void convert(BaseViewHolder helper, Reply item) { + + ImageLoadUtilsV2.loadAvatar(helper.getView(R.id.iv_avatar), item.getAvatar(), true); + TextView tvNick = helper.getView(R.id.tv_nick); + tvNick.setText(RegexUtil.getPrintableString(item.getNick())); + VipHelper.loadVipIcon(helper.getView(R.id.iv_vip_icon), item.getUserVipInfoVO()); + int endIcon = 0; + if (item.isLandLordFlag()) { + endIcon = R.drawable.icon_dy_dynamic_publisher; + } + tvNick.setCompoundDrawablesWithIntrinsicBounds(0, 0, endIcon, 0); + + SpannableBuilder builder = new SpannableBuilder(); + builder.append("@" + item.getToNick(), + new ForegroundColorSpan(mContext.getResources().getColor(R.color.color_7154EE))) + .append(" " + item.getContent(), + new ForegroundColorSpan(mContext.getResources().getColor(R.color.text_normal_c6c6e9))); + + helper.setText(R.id.tv_content, builder.build()); + + helper.getView(R.id.iv_avatar).setOnClickListener(v -> + UIHelper.showUserInfoAct(mContext, item.getUid())); + + helper.setText(R.id.tv_time, TimeUiUtils.getDynamicUi(item.getPublishTime())); + + helper.addOnClickListener(R.id.item_reply_constraintlayout) + .addOnClickListener(R.id.tv_content); + helper.addOnLongClickListener(R.id.tv_content); + + View line = helper.getView(R.id.view_line_reply); + if (hasExpandFooter) { + line.setVisibility(View.VISIBLE); + } else { + //没有回复项的时候,最后一项的线隐藏 + if (helper.getAdapterPosition() == getData().size() - 1) { + line.setVisibility(View.GONE); + } else { + line.setVisibility(View.VISIBLE); + } + } + + + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/dynamic/adapter/WorldDynamicAdapter.java b/app/src/module_community/java/com/chwl/app/community/dynamic/adapter/WorldDynamicAdapter.java new file mode 100644 index 000000000..a7f63bec7 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/dynamic/adapter/WorldDynamicAdapter.java @@ -0,0 +1,307 @@ +package com.chwl.app.community.dynamic.adapter; + +import android.app.Activity; +import android.content.Context; +import android.text.TextUtils; +import android.util.SparseBooleanArray; +import android.util.SparseIntArray; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.chwl.app.photo.BigPhotoActivity; +import com.chwl.app.photo.PagerOption; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nim.uikit.support.glide.GlideApp; +import com.chwl.app.R; +import com.chwl.app.UIHelper; +import com.chwl.app.community.dynamic.view.DynamicDetailActivity; +import com.chwl.app.community.helper.CalcSize; +import com.chwl.app.community.helper.DynamicUiHelper; +import com.chwl.app.community.helper.ImageUiHelper; +import com.chwl.app.photo.DynamicImageAdapter; +import com.chwl.app.community.utils.ObjectTypeHelper; +import com.chwl.app.community.utils.TopicUpTextWrapper; +import com.chwl.app.community.widget.DynamicNickDetailWidget; +import com.chwl.app.community.widget.ExpandableTextView; +import com.chwl.app.community.widget.TopicLabelWidget; +import com.chwl.app.ui.utils.ImageLoadUtilsV2; +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil; +import com.chwl.app.utils.NamePlateHelper; +import com.chwl.app.utils.TimeUiUtils; +import com.chwl.core.community.bean.DynamicMedia; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.dynamic.DynamicModel; +import com.chwl.core.noble.NobleUtil; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; + +import java.util.List; + +/** + * create by lvzebiao @2019/11/13 + */ +public class WorldDynamicAdapter extends BaseQuickAdapter { + + private SparseBooleanArray mCollapsedStatus = new SparseBooleanArray(); + private SparseIntArray mCollapsedHeightStatus = new SparseIntArray(2); + + private Context context; + + private long worldId; + + private int iconWidth; + + private int iconHeight; + + /** + * 有文本的图片布局的top-margin + */ + private int imageTmHasText; + /** + * 无文本的图片布局的top-margin + */ + private int imageTmNoText; + + /** + * 单图情况下的边界 + */ + private int imageBorder; + /** + * 图片的边界值 + */ + private int divider; + + public WorldDynamicAdapter(Context context, long worldId) { + super(R.layout.item_world_dynamic); + this.context = context; + this.worldId = worldId; + iconWidth = UIUtil.dip2px(context, 32); + iconHeight = UIUtil.dip2px(context, 15); + imageTmHasText = UIUtil.dip2px(context, 15f); + imageTmNoText = UIUtil.dip2px(context, 7.5f); + //0.68 + imageBorder = UIUtil.getScreenWidth(context) * ImageUiHelper.BORDER_MIN / ImageUiHelper.BORDER_MAX; + divider = UIUtil.dip2px(context, 10); + } + + @Override + protected void convert(BaseViewHolder helper, WorldDynamicBean item) { + //这个值,有没有文本UI部分,改变图片部分的margin + boolean noTextUi = TextUtils.isEmpty(item.getContent()); + + helper.setText(R.id.tv_nick, item.getNick()); + RecyclerView rvImage = helper.getView(R.id.rv_image); + List dynamicMediaList = item.getDynamicResList(); + if (item.getType() == WorldDynamicBean.TYPE_IMAGE + && dynamicMediaList != null && dynamicMediaList.size() > 0) { + rvImage.setVisibility(View.VISIBLE); + initRecyclerView(rvImage, dynamicMediaList, noTextUi); + } else { + rvImage.setVisibility(View.GONE); + } + //头饰 贵族头饰 + ImageView ivHeadWear = helper.getView(R.id.iv_head_wear); + GlideApp.with(ivHeadWear.getContext()).clear(ivHeadWear); + String headwearPic = item.getHeadwearPic(); + String micDecorate = item.getMicDecorate(); + if (!TextUtils.isEmpty(headwearPic)) { + NobleUtil.loadHeadWear(headwearPic, ivHeadWear); + } else if (!TextUtils.isEmpty(micDecorate)) { + NobleUtil.loadResource(micDecorate, ivHeadWear); + } else { + ivHeadWear.setImageDrawable(null); + } + + //头像 + ImageLoadUtilsV2.loadImage(helper.getView(R.id.iv_avatar), item.getAvatar()); + + DynamicNickDetailWidget widget = helper.getView(R.id.widget_nick_detail); + widget.setData(item); + View inOfficialMask = helper.getView(R.id.in_official_mask); + NamePlateHelper.INSTANCE.load(inOfficialMask, inOfficialMask.findViewById(R.id.tv_official_mask), inOfficialMask.findViewById(R.id.iv_official_mask), item.getNameplateWord(), item.getNameplatePic(), item.isCustomWord()); + + //时间 + final String time = TimeUiUtils.getDynamicUi(item.getPublishTime()); + helper.setGone(R.id.tv_time, !TextUtils.isEmpty(time)); + helper.setText(R.id.tv_time, time); + + ExpandableTextView etvContent = helper.getView(R.id.etv_content); + etvContent.setEventType(1); + if (noTextUi && item.getTopicTop() == 0) { + etvContent.setVisibility(View.GONE); + } else { + etvContent.setVisibility(View.VISIBLE); + CharSequence formatText = DynamicUiHelper.formatFirstDynamicContent( + item, etvContent.mTv, iconWidth, iconHeight); + if (item.getTopicTop() == 1) { + //置顶 + formatText = TopicUpTextWrapper.INSTANCE.wrapUp(formatText, context); + } + etvContent.setText(formatText, mCollapsedStatus, helper.getAdapterPosition(), mCollapsedHeightStatus); + } + //标签 + final List labels = item.getLabelList(); + if (labels != null) { + ((TopicLabelWidget) helper.getView(R.id.topicView)).setLabels(labels); + } + + final String worldName = item.getWorldName(); + helper.setText(R.id.tv_mini_world_name, "#" + worldName); + helper.setGone(R.id.tv_mini_world_name, !TextUtils.isEmpty(worldName)); + helper.setGone(R.id.space_view, !TextUtils.isEmpty(time) || !TextUtils.isEmpty(worldName)); + //评论 + setCommentCount(helper, item.getCommentCount()); + + //点赞 + setLikeCount(helper, item.getLikeCount(), item.isLike(), false); + LinearLayout llLike = helper.getView(R.id.ll_like); + llLike.setEnabled(true); + llLike.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + llLike.setEnabled(false); + int status = item.isLike() ? 0 : 1; + DynamicModel.get().like(worldId, item.getDynamicId(), item.getUid(), status, 1) + .compose(RxHelper.bindContext(context)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + llLike.setEnabled(true); + if (error != null) { + SingleToastUtil.showToast(error); + } else { + LogUtil.print(ResUtil.getString(R.string.dynamic_adapter_worlddynamicadapter_01)); + if (status == 1) { + item.setLikeCount(item.getLikeCount() + 1); + } else { + item.setLikeCount(item.getLikeCount() - 1); + } + item.setLike(status == 1); + setLikeCount(helper, item.getLikeCount(), item.isLike(), true); + } + } + }); + } + }); + //评论 + helper.getView(R.id.ll_comment).setOnClickListener(v -> { + DynamicDetailActivity.start(context, item.getDynamicId(), worldId, + helper.getAdapterPosition(), true, 1); + } + ); + + View.OnClickListener toDetailListener = v -> + DynamicDetailActivity.start(context, item.getDynamicId(), worldId, + helper.getAdapterPosition(), false, 1); + + if (etvContent.mTv != null) { + etvContent.mTv.setOnClickListener(toDetailListener); + } + + //跳转去详情 + helper.itemView.setOnClickListener(toDetailListener); + + helper.addOnClickListener(R.id.iv_more) + .addOnClickListener(R.id.ll_share); + + View.OnClickListener userInfoActClick = v -> UIHelper.showUserInfoAct(context, item.getUid()); + helper.getView(R.id.iv_avatar).setOnClickListener(userInfoActClick); + helper.getView(R.id.widget_nick_detail).setOnClickListener(userInfoActClick); + + } + + private void setLikeCount(BaseViewHolder helper, int likeCount, boolean isLike, boolean isAnim) { + TextView tvLike = helper.getView(R.id.tv_like); + String likeCountStr; + if (likeCount < 0) { + likeCountStr = "0"; + } else if (likeCount >= 1000) { + likeCountStr = "999+"; + } else { + likeCountStr = String.valueOf(likeCount); + } + tvLike.setText(likeCountStr); + + ImageView ivLikeAnim = helper.getView(R.id.iv_like_pic); + if (isLike) { +// if (isAnim) { +// AnimationDrawable drawable = (AnimationDrawable) context.getResources() +// .getDrawable(R.drawable.anim_list_dy_like); +// ivLikeAnim.setImageDrawable(drawable); +// drawable.stop(); +// drawable.start(); +// } else { + ivLikeAnim.setImageResource(R.drawable.icon_dy_list_like); +// } + } else { + ivLikeAnim.setImageResource(R.drawable.icon_dy_list_like_false); + } + + } + + private void initRecyclerView(RecyclerView rvImage, List imageUrl, boolean noTextUi) { + if (imageUrl == null) { + return; + } + CalcSize calcSize = new CalcSize(imageBorder); + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) rvImage.getLayoutParams(); + if (imageUrl.size() > 1) { + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + } else { + //单图的情况,按比例显示 + DynamicMedia media = null; + if (imageUrl.size() > 0) { + media = imageUrl.get(0); + } + if (media == null) { + return; + } + calcSize = ImageUiHelper.calcImage(media, imageBorder); + params.width = calcSize.width + divider; + params.height = calcSize.height + divider; + } + if (noTextUi) { + params.topMargin = imageTmNoText; + } else { + params.topMargin = imageTmHasText; + } + rvImage.setLayoutParams(params); + rvImage.setNestedScrollingEnabled(false); + rvImage.setLayoutManager(new GridLayoutManager(mContext, imageUrl.size() > 2 ? 3 : imageUrl.size())); + DynamicImageAdapter adapter = new DynamicImageAdapter(R.layout.item_dynamic_image, imageUrl); + adapter.setSingleImageHeight(calcSize.height); + adapter.setOnItemClickListener((adapter1, view, position) -> { + PagerOption option = new PagerOption().setSave(true); + BigPhotoActivity.start((Activity) mContext, ObjectTypeHelper.mediaToCustomList(imageUrl), + position, option); + } + ); + rvImage.setAdapter(adapter); + } + + private void setCommentCount(BaseViewHolder helper, int commentCount) { + TextView tvComment = helper.getView(R.id.tv_comment); + String commentCountStr; + if (commentCount < 0) { + commentCountStr = "0"; + } else if (commentCount >= 1000) { + commentCountStr = "999+"; + } else { + commentCountStr = String.valueOf(commentCount); + } + tvComment.setText(commentCountStr); + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/dynamic/view/DynamicDetailActivity.java b/app/src/module_community/java/com/chwl/app/community/dynamic/view/DynamicDetailActivity.java new file mode 100644 index 000000000..ac3d32d7d --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/dynamic/view/DynamicDetailActivity.java @@ -0,0 +1,1162 @@ +package com.chwl.app.community.dynamic.view; + +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.PopupWindow; +import android.widget.TextView; + +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.chwl.app.photo.BigPhotoActivity; +import com.chwl.app.photo.PagerOption; +import com.chwl.core.XConstants; +import com.chwl.core.utils.CoreTextUtils; +import com.coorchice.library.utils.LogUtils; +import com.netease.nim.uikit.StatusBarUtil; +import com.netease.nim.uikit.business.session.emoji.IEmoticonSelectedListener; +import com.netease.nim.uikit.business.session.emoji.MoonUtil; +import com.trello.rxlifecycle3.android.ActivityEvent; +import com.chwl.app.R; +import com.chwl.app.UIHelper; +import com.chwl.app.avroom.ButtonItemFactory; +import com.chwl.app.base.BaseViewBindingActivity; +import com.chwl.app.common.widget.CircleImageView; +import com.chwl.app.common.widget.dialog.DialogManager; +import com.chwl.app.community.dynamic.adapter.CommentAdapter; +import com.chwl.app.community.helper.CalcSize; +import com.chwl.app.community.helper.DynamicUiHelper; +import com.chwl.app.community.helper.ImageUiHelper; +import com.chwl.app.community.helper.ShareDynamicHelper; +import com.chwl.app.photo.DynamicImageAdapter; +import com.chwl.app.community.utils.ObjectTypeHelper; +import com.chwl.app.community.widget.DynamicNickDetailWidget; +import com.chwl.app.community.widget.ExpandableTextView; +import com.chwl.app.databinding.ActivityDynamicDetailBinding; +import com.chwl.app.ui.utils.ImageLoadUtilsV2; +import com.chwl.app.ui.widget.ButtonItem; +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil; +import com.chwl.app.utils.RegexUtil; +import com.chwl.app.utils.SpannableBuilder; +import com.chwl.app.utils.TimeUiUtils; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.community.bean.Comment; +import com.chwl.core.community.bean.CommentResult; +import com.chwl.core.community.bean.DynamicMedia; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.bean.comment.PopupParams; +import com.chwl.core.community.bean.comment.Reply; +import com.chwl.core.community.bean.comment.ReplyResult; +import com.chwl.core.community.dynamic.DynamicDetailModel; +import com.chwl.core.community.dynamic.DynamicModel; +import com.chwl.core.community.event.DynamicDetailFinishEvent; +import com.chwl.core.community.event.DynamicRefreshEvent; +import com.chwl.core.noble.NobleUtil; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.net.BeanObserver; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.LogUtil; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; +import com.chwl.library.utils.keyboard.KeyboardVisibilityEvent; + +import org.greenrobot.eventbus.EventBus; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; + +/** + * create by lvzebiao @2019/11/25 + */ +public class DynamicDetailActivity extends BaseViewBindingActivity + implements IEmoticonSelectedListener, View.OnClickListener { + + private final static String EXTRA_DYNAMIC_ID = "extra_dynamic_id"; + private final static String EXTRA_WORLD_ID = "extra_world_id"; + private final static String EXTRA_NEED_KEYBOARD = "extra_need_keyboard"; + private final static String EXTRA_LIST_POSITION = "extra_list_position"; + + CircleImageView ivAvatar; + ImageView ivHeadWear; + DynamicNickDetailWidget widgetNickDetail; + TextView tvTime; + ImageView ivMore; + RecyclerView rvImage; + ExpandableTextView etvContent; + TextView tvCommentCount; + ConstraintLayout clOption; + ImageView ivLikePic; + TextView tvLikeCount; + ImageView ivCommentPic; + ImageView ivSharePic; + TextView tvCommentCountOption; + TextView tvFlagMiniWorld; + ConstraintLayout layoutRootMiniWorld; + TextView tvMiniWorldName; + private View viewLineDetailHeader; + + private long dynamicId; + + private long worldId; + + private CommentAdapter adapter; + /** + * 对评论进行回复 + */ + public final static int TYPE_TARGET_COMMENT = 1; + /** + * 对回复进行回复 + */ + public final static int TYPE_TARGET_REPLAY = 2; + + private int mReplyType; //0:评论动态, 评论及回复 1:对评论进行回复 2:对回复进行回复 + private int mReplyPosition = -1; + + private Reply cacheReply; + private boolean isErr = false; + + private WorldDynamicBean bean; + + private boolean isLoading; + + private boolean noMoreData; + + private String nextCommentId = null; + + private final static int COMMENT_SIZE = 10; + /** + * 动态被删除,标记为ture + */ + private boolean hasDeleteThisDynamic = false; + + /** + * @param event 统计事件 1-话题客态、2-个人主页、3-APP内分享、4-消息互动通知、5-linkedme 6-动态广场 + */ + public static void start(Context context, long dynamicId, long worldId, int listPosition, + boolean needKeyboard, int event) { + if (dynamicId == 0) { + LogUtils.e(ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_01)); + return; + } + String label = ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_02); + switch (event) { + case 1: + label = ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_03); + break; + case 2: + label = ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_04); + break; + case 3: + label = ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_05); + break; + case 4: + label = ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_06); + break; + case 5: + label = "linkedme"; + break; + case 6: + label = ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_07); + break; + } + + Intent intent = new Intent(context, DynamicDetailActivity.class); + intent.putExtra(EXTRA_DYNAMIC_ID, dynamicId); + intent.putExtra(EXTRA_WORLD_ID, worldId); + intent.putExtra(EXTRA_NEED_KEYBOARD, needKeyboard); + intent.putExtra(EXTRA_LIST_POSITION, listPosition); + context.startActivity(intent); + } + + public static void start(Context context, long dynamicId, long worldId, boolean needKeyboard, int event) { + start(context, dynamicId, worldId, -1, needKeyboard, event); + } + + public static void start(Context context, long dynamicId, long worldId, int event) { + start(context, dynamicId, worldId, false, event); + } + + private View mHeaderView; + + @Override + public void init() { + dynamicId = getIntent().getLongExtra(EXTRA_DYNAMIC_ID, 0L); + worldId = getIntent().getLongExtra(EXTRA_WORLD_ID, 0L); + initWhiteTitleBar(ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_09)); + initRecyclerView(); + initView(); + loadComment(true, true); + //是否需要弹起键盘 + if (getIntent().getBooleanExtra(EXTRA_NEED_KEYBOARD, false)) { + Single.timer(200, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .doOnSuccess(aLong -> showToCommentDynamicLayout()) + .subscribe(); + } + } + + private void initView() { + binding.tvSend.setOnClickListener(this); + binding.ivEmoji.setOnClickListener(this); + + binding.etReply.addTextChangedListener(new TextWatcher() { + + private int start; + private int count; + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + this.start = start; + this.count = count; + } + + @Override + public void afterTextChanged(Editable s) { + MoonUtil.replaceEmoticons(context, s, start, count); + + int editEnd = binding.etReply.getSelectionEnd(); + binding.etReply.removeTextChangedListener(this); + while (s.toString().length() > 500 && editEnd > 0) { + s.delete(editEnd - 1, editEnd); + editEnd--; + } + binding.etReply.setSelection(editEnd); + binding.etReply.addTextChangedListener(this); + + binding.tvSend.setEnabled(!CoreTextUtils.isEmptyText(s.toString())); + } + }); + + KeyboardVisibilityEvent.registerEventListener(this, isOpen -> { + isShowKeyboad = isOpen; + if (isOpen) { + binding.emoticonPickerView.setVisibility(View.GONE); + } else { + binding.emoticonPickerView.postDelayed(() -> { + if (binding.emoticonPickerView.getVisibility() == View.GONE) { + if (currNeedKeyboard) { + currNeedKeyboard = false; + Single.timer(200, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .doOnSuccess(aLong -> { + if (!currNeedKeyboard && !isShowKeyboad) { + clOption.setVisibility(View.VISIBLE); + mReplyPosition = -1; + } + }) + .subscribe(); + return; + } + clOption.setVisibility(View.VISIBLE); + mReplyPosition = -1; + } + currNeedKeyboard = false; + }, 210); + + } + }); + + binding.etReply.setOnFocusChangeListener((v, hasFocus) -> { + if (hasFocus) { + hideEmojiView(); + } + }); + + } + + private void initHeaderView() { + mHeaderView = LayoutInflater.from(this).inflate(R.layout.head_dynamic_detail, null); + ivAvatar = mHeaderView.findViewById(R.id.iv_avatar); + ivHeadWear = mHeaderView.findViewById(R.id.iv_head_wear); + widgetNickDetail = mHeaderView.findViewById(R.id.widget_nick_detail); + tvTime = mHeaderView.findViewById(R.id.tv_time_detail); + ivMore = mHeaderView.findViewById(R.id.iv_more); + etvContent = mHeaderView.findViewById(R.id.etv_content); + rvImage = mHeaderView.findViewById(R.id.rv_image); + tvCommentCount = mHeaderView.findViewById(R.id.tv_comment_count); + clOption = mHeaderView.findViewById(R.id.cl_option); + ivLikePic = mHeaderView.findViewById(R.id.iv_like_pic); + tvLikeCount = mHeaderView.findViewById(R.id.tv_like_count); + ivCommentPic = mHeaderView.findViewById(R.id.iv_comment_pic); + ivSharePic = mHeaderView.findViewById(R.id.iv_share_pic); + tvCommentCountOption = mHeaderView.findViewById(R.id.tv_comment_count_option); + viewLineDetailHeader = mHeaderView.findViewById(R.id.view_line_detail_header); + tvFlagMiniWorld = mHeaderView.findViewById(R.id.tv_flag_mini_world); + layoutRootMiniWorld = mHeaderView.findViewById(R.id.layout_root_mini_world); + tvMiniWorldName = mHeaderView.findViewById(R.id.tv_mini_world_name); + viewLineDetailHeader.setVisibility(View.VISIBLE); + } + + private boolean currNeedKeyboard = false; + + private boolean isShowKeyboad = false; + + private void initRecyclerView() { + initHeaderView(); + binding.rvListComment.setLayoutManager(new LinearLayoutManager(context)); + adapter = new CommentAdapter(); + adapter.setHeaderAndEmpty(true); + adapter.setHeaderView(mHeaderView); + adapter.setOnLoadMoreListener(() -> { + if (isLoading || noMoreData) { + return; + } + LogUtil.print("onLoadMoreRequested..."); + binding.rvListComment.postDelayed(new Runnable() { + @Override + public void run() { + if (ListUtils.isListEmpty(adapter.getData())) { + adapter.loadMoreEnd(); + } else { + if (!isErr) { + //成功获取更多数据 + LogUtil.print(ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_010)); + loadComment(false, false); + } else { + //获取更多数据失败 + isErr = true; + adapter.loadMoreFail(); + } + } + } + }, 1000); + }, binding.rvListComment); + + + adapter.setOnItemClickListener((a, view, position) -> { + + LogUtil.print(ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_011) + position); + + clickOneLevelComment(position); + }); + + adapter.setOnItemChildClickListener((adapter, view, position) -> { + if (view.getId() == R.id.tv_content) { + LogUtil.print(ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_012)); + clickOneLevelComment(position); + } + }); + adapter.setOnItemChildLongClickListener((a, view, position) -> { + + Comment comment = adapter.getDataItem(position); + if (comment == null) { + return false; + } + PopupParams params = new PopupParams(); + params.setType(1); + params.setGroupPostion(position); + params.setCopyContent(comment.getContent()); + params.setDeteleId(comment.getCommentId()); + params.setCommentOwnerUid(comment.getUid()); + showCopyPopup(view, params); + return true; + }); + binding.rvListComment.setAdapter(adapter); + + + //动态详情回复项的点击事件 + adapter.setOnCommentReplyItemChildClickListener(new CommentAdapter.OnCommentReplyItemChildClickListener() { + @Override + public void onCommentReplyItemChildClick(View view, int groupPosition, int childPosition) { + + LogUtil.print("groupPosition:" + groupPosition); + + LogUtil.print("childPosition:" + childPosition); + + Comment comment = adapter.getDataItem(groupPosition); + if (comment == null) { + return; + } + cacheReply = comment.getItemReply(childPosition); + if (cacheReply == null) { + return; + } + if (view.getId() == R.id.item_reply_constraintlayout || view.getId() == R.id.tv_content) { //整个item项,回复事件 + if (!UserModel.get().isMyseft(cacheReply.getUid()) && isBindPhone()) { + mReplyType = TYPE_TARGET_REPLAY; + mReplyPosition = groupPosition; + clOption.setVisibility(View.INVISIBLE); + binding.llReply.setVisibility(View.VISIBLE); + String nick = cacheReply.getNick(); + binding.etReply.setHint(String.format(getString(R.string.dy_reply_someone), + RegexUtil.getPrintableString(nick))); + binding.etReply.requestFocus(); + currNeedKeyboard = true; + showIME(binding.etReply); + } + } + } + + @Override + public void onCommentReplyItemChildLongClick(View view, int groupPosition, int childPosition) { + if (view.getId() == R.id.tv_content) { + Comment comment = adapter.getDataItem(groupPosition); + if (comment == null) { + return; + } + List list = comment.getReplyList(); + Reply reply = null; + if (childPosition >= 0 && childPosition < list.size()) { + reply = list.get(childPosition); + } + if (reply == null) { + return; + } + PopupParams params = new PopupParams(); + params.setType(2); + params.setGroupPostion(groupPosition); + params.setChildPosition(childPosition); + params.setCopyContent(reply.getContent()); + params.setCommentOwnerUid(reply.getUid()); + params.setDeteleId(reply.getReplyId()); + showCopyPopup(view, params); + } + } + + @Override + public void onLoadMoreClick(long commentId, long timestamp, int groupPosition) { + DynamicDetailModel.get().getReplyList(dynamicId, commentId, 5, String.valueOf(timestamp)) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(ReplyResult replyResult, String error) { + super.accept(replyResult, error); + if (error != null) { + toast(error); + return; + } + getMoreReplySuccess(replyResult, groupPosition); + } + }); + } + }); + + //刷新 + binding.refreshLayout.setOnRefreshListener(() -> { + if (isLoading) { + return; + } + loadComment(true, true); + }); + + } + + private void clickOneLevelComment(int position) { + if (!isBindPhone()) { + return; + } + mReplyType = TYPE_TARGET_COMMENT; + mReplyPosition = position; + clOption.setVisibility(View.INVISIBLE); + binding.llReply.setVisibility(View.VISIBLE); + Comment bean = adapter.getData().get(position); + binding.etReply.setHint(String.format(getString(R.string.dy_reply_someone), bean.getNick())); + binding.etReply.requestFocus(); + currNeedKeyboard = true; + showIME(binding.etReply); + } + + private void loadComment(boolean isRefresh, boolean reloadDetail) { + if (reloadDetail) { + loadDetail(); + } + if (isLoading) { + return; + } + isLoading = true; + if (isRefresh) { + isErr = false; + noMoreData = false; + nextCommentId = null; + } + DynamicDetailModel.get().getCommentList(dynamicId, nextCommentId, COMMENT_SIZE) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(CommentResult commentResult, String error) { + super.accept(commentResult, error); + binding.refreshLayout.setRefreshing(false); + isLoading = false; + if (error != null) { + isErr = true; + } else { + isErr = false; + } + List list = null; + if (commentResult != null) { + list = commentResult.getCommentList(); + nextCommentId = String.valueOf(commentResult.getNextTimestamp()); + } + + if (list == null) { + list = new ArrayList<>(); + } + + if (isRefresh) { + adapter.setNewData(list); + adapter.disableLoadMoreIfNotFullPage(binding.rvListComment); + } else { + adapter.addData(list); + } + + if (ListUtils.isListEmpty(list)) { + noMoreData = true; + } + + if (!ListUtils.isListEmpty(adapter.getData()) && ListUtils.isListEmpty(list)) { + adapter.loadMoreEnd(); + } else { + adapter.loadMoreComplete(); + } + + viewLineDetailHeader.setVisibility(View.VISIBLE); + if (adapter.getData().isEmpty()) { + viewLineDetailHeader.setVisibility(View.INVISIBLE); + View emptyView = getLayoutInflater().inflate(R.layout.dy_empty_dynamic_comment, null); + + ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + UIUtil.dip2px(context, 260)); + emptyView.setLayoutParams(layoutParams); + ((ImageView) emptyView.findViewById(R.id.no_data_icon)) + .setImageResource(R.drawable.icon_common_failure); + ((TextView) emptyView.findViewById(R.id.no_data_text)) + .setText(R.string.dy_empty_comment_tips); + adapter.setEmptyView(emptyView); + } + + } + }); + } + + private void showCopyPopup(View v, PopupParams params) { + + View view = LayoutInflater.from(this).inflate(R.layout.popup_dy_comment, null); + PopupWindow popupWindow = new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + TextView tvCopy = view.findViewById(R.id.tv_copy); + tvCopy.setOnClickListener(v1 -> { + ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + cm.setText(params.getCopyContent()); + toast(R.string.copy_success); + popupWindow.dismiss(); + }); + View llContainer = view.findViewById(R.id.ll_container); + TextView tvDelete = view.findViewById(R.id.tv_delete); + TextView tvReport = view.findViewById(R.id.tv_report); + + //如果是帖子发布者uid + long dynamicOwnerUid = 0; + if (bean != null) { + dynamicOwnerUid = bean.getUid(); + } + //这里就不画.9图了,直接采用2张不同背景图来处理 + llContainer.setBackgroundResource(R.drawable.bg_dy_popup_comment); + tvDelete.setVisibility(View.GONE); + tvReport.setVisibility(View.GONE); + if (UserModel.get().isMyseft(dynamicOwnerUid)) { + tvDelete.setVisibility(View.VISIBLE); + if (!UserModel.get().isMyseft(params.getCommentOwnerUid())) { + //如果是自己发的动态,但是不是自己的评论,举报 删除都有 + tvReport.setVisibility(View.VISIBLE); + llContainer.setBackgroundResource(R.drawable.bg_dy_popup_comment_three); + } + } else { + if (UserModel.get().isMyseft(params.getCommentOwnerUid())) { + tvDelete.setVisibility(View.VISIBLE); + } else { + tvReport.setVisibility(View.VISIBLE); + } + } + + tvDelete.setOnClickListener(v1 -> { + popupWindow.dismiss(); + DynamicDetailModel.get().deleteComment(params.getDeteleId()) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + if (error != null) { + toast(error); + return; + } + deleteCommentSuccess(params); + } + }); + }); + + tvReport.setOnClickListener(v1 -> { + popupWindow.dismiss(); + UIHelper.showReportPage(context, params.getCommentOwnerUid(), XConstants.REPORT_TYPE_DYNAMICCOMMENT); + }); + + popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + popupWindow.setOutsideTouchable(true); + popupWindow.getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + int[] vLoc = new int[2]; + v.getLocationInWindow(vLoc); + int offsetHeight = 0; + int minHeight = UIUtil.dip2px(context, 120f); + if (vLoc[1] < minHeight) { + offsetHeight = minHeight - vLoc[1]; + } + popupWindow.showAsDropDown(v, UIUtil.dip2px(context, 40), -v.getHeight() + - popupWindow.getContentView().getMeasuredHeight() + offsetHeight); + + } + + + private void loadDetail() { + DynamicDetailModel.get().getDetail(dynamicId, worldId) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(WorldDynamicBean bean, String error) { + super.accept(bean, error); + if (error != null) { + toast(error); + finish(); + return; + } + showDynamicDetails(bean); + } + }); + } + + private void showDynamicDetails(WorldDynamicBean info) { + bean = info; + if (bean == null) { + return; + } + ImageLoadUtilsV2.loadAvatar(ivAvatar, bean.getAvatar()); + widgetNickDetail.setData(bean); + + //更多 + ivMore.setOnClickListener(v -> { + header_more(); + }); + + + tvTime.setText(TimeUiUtils.getDynamicUi(bean.getPublishTime())); + etvContent.setVisibility(View.GONE); + etvContent.setEventType(3); + if (!TextUtils.isEmpty(bean.getContent())) { + etvContent.setVisibility(View.VISIBLE); + int iconWidth = UIUtil.dip2px(context, 32); + int iconHeight = UIUtil.dip2px(context, 15); + CharSequence formatText = DynamicUiHelper.formatFirstDynamicContent( + bean, etvContent.mTv, iconWidth, iconHeight); + etvContent.setText(formatText); + } + + initImageRv(); + + setLikeCount(false); + + updateCommentCount(); + + //头饰 贵族头饰 + String headwearEffect = bean.getHeadwearEffect(); + String headwearPic = bean.getHeadwearPic(); + String micDecorate = bean.getMicDecorate(); + if (!TextUtils.isEmpty(headwearEffect)) { + NobleUtil.loadHeadWear(headwearEffect, ivHeadWear); + } else if (!TextUtils.isEmpty(headwearPic)) { + NobleUtil.loadHeadWear(headwearPic, ivHeadWear); + } else if (!TextUtils.isEmpty(micDecorate)) { + NobleUtil.loadResource(micDecorate, ivHeadWear); + } else { + ivHeadWear.setImageDrawable(null); + } + + View.OnClickListener infoListener = v -> { + if (bean == null) { + return; + } + UIHelper.showUserInfoAct(context, bean.getUid()); + }; + ivHeadWear.setOnClickListener(infoListener); + widgetNickDetail.setOnClickListener(infoListener); + + //话题显示 + layoutRootMiniWorld.setVisibility(View.GONE); +// layoutRootMiniWorld.setVisibility(bean.getWorldId() > 0 ? View.VISIBLE : View.GONE); +// if (!TextUtils.isEmpty(bean.getWorldName())) { +// tvMiniWorldName.setText("#" + bean.getWorldName()); +// } +// //去看看 +// tvFlagMiniWorld.setVisibility(bean.isInWorld() ? View.GONE : View.GONE); + + +// tvMiniWorldName.setOnClickListener(v -> { +// TopicMainActivity.start(context, String.valueOf(bean.getWorldId())); +// }); + + //点赞 + ivLikePic.setOnClickListener(v -> { + header_like(); + }); + + //评论 + ivCommentPic.setOnClickListener(v -> { + showToCommentDynamicLayout(); + }); + + //分享动态 + ivSharePic.setOnClickListener(v -> { + new ShareDynamicHelper(DynamicDetailActivity.this) + .share(bean, worldId); + }); + + } + + /** + * header - 更多 + */ + private void header_more() { + List list = new ArrayList<>(); + if (!UserModel.get().isMyseft(bean.getUid())) { + ButtonItem item = new ButtonItem(getString(R.string.me_shield_dynamic), () -> { + UserModel.get().addReport(bean.getDynamicId(), 0) + .subscribe(new BeanObserver() { + @Override + public void onErrorMsg(String error) { + getDialogManager().dismissDialog(); + toast(error); + } + + @Override + public void onSuccess(String s) { + getDialogManager().dismissDialog(); + toast(ResUtil.getString(R.string.me_shield_success)); + EventBus.getDefault().post(new DynamicRefreshEvent()); + finish(); + } + }); + }); + list.add(item); + } + if (!UserModel.get().isMyseft(bean.getUid())) { + ButtonItem blackListItem = ButtonItemFactory.createAddToBlackListItem( + getDialogManager(), String.valueOf(bean.getUid())); + list.add(blackListItem); + } + if (!UserModel.get().isMyseft(bean.getUid())) { + ButtonItem item = new ButtonItem(getString(R.string.me_report_dynamic), () -> { + UIHelper.showReportPage(context, bean.getUid(), + XConstants.REPORT_TYPE_WORLDDYNAMIC); + }); + list.add(item); + } + if (UserModel.get().isMyseft(bean.getUid()) || + isThisWorldOwner(bean)) { + ButtonItem item = new ButtonItem(ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_020), () -> deleteDynamic(bean)); + list.add(item); + } + getDialogManager().showCommonPopupDialog(list, getString(R.string.cancel)); + } + + /** + * header - 点赞 + */ + private void header_like() { + ivLikePic.setEnabled(false); + int status = bean.isLike() ? 0 : 1; + DynamicModel.get().like(worldId, dynamicId, bean.getUid(), status, 3) + .compose(RxHelper.bindContext(context)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + ivLikePic.setEnabled(true); + if (error != null) { + SingleToastUtil.showToast(error); + } else { + if (bean == null) { + return; + } + if (status == 1) { + bean.setLikeCount(bean.getLikeCount() + 1); + } else { + bean.setLikeCount(bean.getLikeCount() - 1); + } + bean.setLike(status == 1); + setLikeCount(true); + } + } + }); + } + + private void deleteDynamic(WorldDynamicBean bean) { + getDialogManager().showOkCancelWithTitleDialog(ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_023), + new DialogManager.OkCancelDialogListener() { + @Override + public void onOk() { + if (bean == null) { + return; + } + DynamicModel.get().delete(worldId, bean.getDynamicId()) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + if (error != null) { + toast(error); + } else { + toast(R.string.delete_success); + hasDeleteThisDynamic = true; + finish(); + } + } + }); + + } + }); + } + + private boolean isThisWorldOwner(WorldDynamicBean bean) { + return bean != null && AuthModel.get().getCurrentUid() == bean.getWorldUid(); + } + + private void initImageRv() { + List imageUrl = bean.getDynamicResList(); + if (ListUtils.isListEmpty(imageUrl)) { + rvImage.setVisibility(View.GONE); + return; + } + rvImage.setVisibility(View.VISIBLE); + rvImage.setNestedScrollingEnabled(false); + rvImage.setLayoutManager(new GridLayoutManager(this, imageUrl.size() > 2 ? 3 : imageUrl.size())); + + int imageBorder = UIUtil.getScreenWidth(context) * + ImageUiHelper.BORDER_MIN / ImageUiHelper.BORDER_MAX; + int divider = UIUtil.dip2px(context, 10); + CalcSize calcSize = new CalcSize(imageBorder); + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) rvImage.getLayoutParams(); + if (imageUrl.size() > 1) { + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + } else { + //单图的情况,按比例显示 + DynamicMedia media = null; + if (imageUrl.size() > 0) { + media = imageUrl.get(0); + } + if (media == null) { + return; + } + calcSize = ImageUiHelper.calcImage(media, imageBorder); + params.width = calcSize.width + divider; + params.height = calcSize.height + divider; + } + rvImage.setLayoutParams(params); + + DynamicImageAdapter adapter = new DynamicImageAdapter(R.layout.item_dynamic_image, imageUrl); + adapter.setSingleImageHeight(calcSize.height); + adapter.setOnItemClickListener((adapter1, view, position) -> { + PagerOption option = new PagerOption().setSave(true); + BigPhotoActivity.start(DynamicDetailActivity.this, ObjectTypeHelper.mediaToCustomList(imageUrl), + position, option); + } + ); + rvImage.setAdapter(adapter); + } + + private void setLikeCount(boolean isAnim) { + int likeCount = bean.getLikeCount(); + String likeCountStr; + if (likeCount < 0) { + likeCountStr = "0"; + } else if (likeCount >= 100000) { + likeCountStr = "99999+"; + } else { + likeCountStr = String.valueOf(likeCount); + } + tvLikeCount.setText(likeCountStr); + + if (bean.isLike()) { + ivLikePic.setImageResource(R.drawable.icon_dy_list_like); + } else { + ivLikePic.setImageResource(R.drawable.icon_dy_list_like_false); + } + } + + private void updateCommentCount() { + if (bean == null) { + return; + } + SpannableBuilder builder = new SpannableBuilder(); + if (bean.getCommentCount() < 0) { + bean.setCommentCount(0); + } + String commentCountStr = String.valueOf(bean.getCommentCount()); + if (bean.getCommentCount() >= 100000) { + commentCountStr = "99999+"; + } + String comment = ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_024) + commentCountStr + ")"; + tvCommentCount.setText(comment); + tvCommentCountOption.setText(commentCountStr); + } + + @Override + public void onClick(View view) { + if (bean == null) { + return; + } + switch (view.getId()) { + + case R.id.tv_send: + binding.tvSend.setEnabled(false); + String content = binding.etReply.getText().toString(); + if (mReplyType == TYPE_TARGET_COMMENT || mReplyType == TYPE_TARGET_REPLAY) { + //对一级评论回复 + long paramId = 0; + if (mReplyType == TYPE_TARGET_REPLAY) { + if (cacheReply != null) { + paramId = cacheReply.getReplyId(); + } + } else { + paramId = adapter.getItemCommentId(mReplyPosition); + } + DynamicDetailModel.get().reply(dynamicId, paramId, content) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(Reply reply, String error) { + super.accept(reply, error); + if (error != null) { + toast(error); + return; + } + replySuccess(reply, mReplyPosition); + } + }); + } else { + DynamicDetailModel.get().publishComment(dynamicId, content) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + if (error != null) { + toast(error); + return; + } + onAddCommentSuccess(); + } + }); + } + break; + + case R.id.iv_emoji: + showEmojiView(); + break; + } + } + + private void onAddCommentSuccess() { + toast(ResUtil.getString(R.string.dynamic_view_dynamicdetailactivity_026)); + recoverBottomView(); + loadComment(true, false); + if (bean != null) { + bean.setCommentCount(bean.getCommentCount() + 1); + updateCommentCount(); + } + } + + private void recoverBottomView() { + hideIME(binding.etReply); + mReplyType = 0; + binding.etReply.setHint(R.string.dy_pub_comment); + binding.etReply.setText(""); + clOption.setVisibility(View.VISIBLE); + binding.emoticonPickerView.setVisibility(View.GONE); + } + + private void replySuccess(Reply result, int replyPosition) { + recoverBottomView(); + Comment listBean = adapter.getDataItem(mReplyPosition); + if (listBean == null) { + return; + } + if (result.getParentId() != listBean.getCommentId()) { + //一般是通过 + return; + } + if (listBean.getReplyInfo().getLeftCount() <= 0) { + //如果已经没有下一页回复了,回复成功后,直接添加一项 + listBean.addReply(result); + } + //更新下,剩余的回复数量 + int newLeftCount = result.getReplyCount() - listBean.getReplyList().size(); + if (newLeftCount < 0) { + newLeftCount = 0; + } + listBean.getReplyInfo().setLeftCount(newLeftCount); + adapter.notifyItemChanged(replyPosition + 1); + if (bean != null) { + bean.setCommentCount(bean.getCommentCount() + 1); + updateCommentCount(); + } + } + + public void getMoreReplySuccess(ReplyResult newReplyInfo, int groupPosition) { + Comment listBean = adapter.getDataItem(groupPosition); + if (listBean == null) { + return; + } + ReplyResult oldReplyInfo = listBean.getReplyInfo(); + oldReplyInfo.setLeftCount(newReplyInfo.getLeftCount()); + oldReplyInfo.setNextTimestamp(newReplyInfo.getNextTimestamp()); + List oldReplyList = oldReplyInfo.getReplyList(); + if (!ListUtils.isListEmpty(newReplyInfo.getReplyList())) { + oldReplyList.addAll(newReplyInfo.getReplyList()); + } + adapter.notifyItemChanged(groupPosition + 1); + } + + + @Override + public void onEmojiSelected(String key) { + try { + Editable mEditable = binding.etReply.getText(); + if (key.equals("/DEL")) { + binding.etReply.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL)); + } else { + int start = binding.etReply.getSelectionStart(); + int end = binding.etReply.getSelectionEnd(); + start = (start < 0 ? 0 : start); + end = (start < 0 ? 0 : end); + mEditable.replace(start, end, key); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + @Override + public void onStickerSelected(String categoryName, String stickerName) { + + } + + private void deleteCommentSuccess(PopupParams params) { + toast(R.string.delete_success); + if (params.getType() == 1) { + //删除评论 + if (bean != null) { + Comment comment = adapter.getDataItem(params.getGroupPostion()); + if (comment == null) { + return; + } + ReplyResult result = comment.getReplyInfo(); + int replyCount = result.getLeftCount(); + if (!ListUtils.isListEmpty(result.getReplyList())) { + replyCount += result.getReplyList().size(); + } + bean.setCommentCount(bean.getCommentCount() - replyCount - 1); + updateCommentCount(); + } + adapter.safeDelete(params.getGroupPostion()); + } else if (params.getType() == 2) { + //删除评论中的回复 + if (bean != null) { + bean.setCommentCount(bean.getCommentCount() - 1); + updateCommentCount(); + } + Comment comment = adapter.getDataItem(params.getGroupPostion()); + if (comment == null) { + return; + } + List list = comment.getReplyList(); + if (params.getChildPosition() >= 0 && params.getChildPosition() < list.size()) { + list.remove(params.getChildPosition()); + adapter.notifyDataSetChanged(); + } + } + } + + private void hideEmojiView() { + binding.emoticonPickerView.setVisibility(View.GONE); + } + + private void showEmojiView() { + binding.etReply.clearFocus(); + hideIME(binding.etReply); + binding.emoticonPickerView.postDelayed(() -> { + binding.emoticonPickerView.setVisibility(View.VISIBLE); + binding.emoticonPickerView.show(this); + }, 200); + } + + /** + * 展示对动态进行评论的输入布局 + */ + private void showToCommentDynamicLayout() { + if (!isBindPhone()) { + return; + } + mReplyType = 0; + mReplyPosition = -1; + clOption.setVisibility(View.INVISIBLE); + binding.llReply.setVisibility(View.VISIBLE); + binding.etReply.requestFocus(); + binding.etReply.setHint(R.string.dy_pub_comment); + showIME(binding.etReply); + } + + @Override + public void finish() { + int listPosition = getIntent().getIntExtra(EXTRA_LIST_POSITION, -1); + if (listPosition >= 0 && bean != null) { + EventBus.getDefault().post(new DynamicDetailFinishEvent(listPosition, bean, hasDeleteThisDynamic)); + } + super.finish(); + } + + private boolean isBindPhone() { + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + if (userInfo == null) { + SingleToastUtil.showToast(ResUtil.getString(R.string.yizhuan_xchat_android_constants_xchatconstants_016)); + return false; + } + return true; + } + + @Override + protected boolean needSteepStateBar() { + return true; + } + + @Override + protected void setStatusBar() { + super.setStatusBar(); + StatusBarUtil.transparencyBar(this); + StatusBarUtil.StatusBarLightMode(this); + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/helper/CalcSize.java b/app/src/module_community/java/com/chwl/app/community/helper/CalcSize.java new file mode 100644 index 000000000..8a1e74534 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/helper/CalcSize.java @@ -0,0 +1,24 @@ +package com.chwl.app.community.helper; + +import androidx.annotation.Keep; + +/** + * create by lvzebiao @2020/1/3 + */ +@Keep +public class CalcSize { + + public CalcSize(int size) { + width = size; + height = size; + } + + public CalcSize() { + this(0); + } + + public int width; + + public int height; + +} diff --git a/app/src/module_community/java/com/chwl/app/community/helper/DynamicUiHelper.java b/app/src/module_community/java/com/chwl/app/community/helper/DynamicUiHelper.java new file mode 100644 index 000000000..01dcc458b --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/helper/DynamicUiHelper.java @@ -0,0 +1,30 @@ +package com.chwl.app.community.helper; + +import android.text.TextUtils; +import android.widget.TextView; + +import com.chwl.app.avroom.widget.MessageView; +import com.chwl.app.ui.widget.TextSpannableBuilder; +import com.chwl.core.community.bean.WorldDynamicBean; + +/** + * create by lvzebiao @2019/12/4 + */ +public class DynamicUiHelper { + + public static CharSequence formatFirstDynamicContent(WorldDynamicBean item, TextView textView, + int iconWidth, int iconHeight) { + TextSpannableBuilder builder = new TextSpannableBuilder(textView); +// if (item.isFirstDynamic()) { +// builder.append(textView.getResources().getDrawable(R.drawable.icon_dy_first_dynamic), iconWidth, +// iconHeight); +// } + if (!TextUtils.isEmpty(item.getContent())) { + builder.append(item.getContent()); + } else { + builder.append(" "); + } + return builder.build(); + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/helper/ImageUiHelper.java b/app/src/module_community/java/com/chwl/app/community/helper/ImageUiHelper.java new file mode 100644 index 000000000..95f5fd88b --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/helper/ImageUiHelper.java @@ -0,0 +1,73 @@ +package com.chwl.app.community.helper; + +import com.chwl.core.community.bean.DynamicMedia; + +/** + * create by lvzebiao @2020/1/3 + */ +public class ImageUiHelper { + /** + * 图片最大宽度和父布局比例 + * 0.68 + */ + public final static int BORDER_MIN = 68; + /** + * 图片最大宽度和父布局比例 + * 0.68 + */ + public final static int BORDER_MAX = 100; + + /** + * 比例最大2.5,我们用分子分母来表示 + */ + public final static int OFFSET_MIN = 2; + + /** + * 比例最大2.5,我们用分子分母来表示 + */ + public final static int OFFSET_MAX = 5; + + /** + * + * @param width - + * @param height - + * @param border 图片展示的最大边界 + * @return - + */ + public static CalcSize calcImage(int width, int height, int border) { + CalcSize calcSize = new CalcSize(); + int singleImageWidth = border; //单图宽 + int singleImageHeight = border; //单图高 + if (width >= height) { + //横图的情况 + if (height * OFFSET_MAX <= width * OFFSET_MIN) { + singleImageHeight = border * OFFSET_MIN / OFFSET_MAX; + } else { + if (width > 0) { + singleImageHeight = border * height / width; + } + } + } else { + //竖图的情况 + //判断比例是否超过2.5 + if (width * OFFSET_MAX <= height * OFFSET_MIN) { + singleImageWidth = border * OFFSET_MIN / OFFSET_MAX; + } else { + if (height > 0) { + singleImageWidth = border * width / height; + } + } + } + calcSize.width = singleImageWidth; + calcSize.height = singleImageHeight; + return calcSize; + } + + public static CalcSize calcImage(DynamicMedia media, int border) { + if (media == null) { + return new CalcSize(); + } + return calcImage(media.getWidth(), media.getHeight(), border); + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/helper/ShareDynamicHelper.java b/app/src/module_community/java/com/chwl/app/community/helper/ShareDynamicHelper.java new file mode 100644 index 000000000..bf9f5affd --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/helper/ShareDynamicHelper.java @@ -0,0 +1,30 @@ +package com.chwl.app.community.helper; + +import android.app.Activity; +import com.chwl.app.R; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; + +/** + * create by lvzebiao @2019/11/28 + */ +public class ShareDynamicHelper { + + private Activity activity; + + public ShareDynamicHelper(Activity activity) { + this.activity = activity; + } + + public void share(WorldDynamicBean bean) { + share(bean, bean.getWorldId()); + } + + public void share(WorldDynamicBean bean, long worldId) { + if (bean.isChecking()) { + SingleToastUtil.showToast(ResUtil.getString(R.string.community_helper_sharedynamichelper_01)); + return; + } + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/holder/DynamicSysHolder.java b/app/src/module_community/java/com/chwl/app/community/holder/DynamicSysHolder.java new file mode 100644 index 000000000..be12dd20a --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/holder/DynamicSysHolder.java @@ -0,0 +1,133 @@ +package com.chwl.app.community.holder; + +import android.graphics.Color; +import android.text.SpannableStringBuilder; +import android.text.Spanned; +import android.text.TextPaint; +import android.text.style.AbsoluteSizeSpan; +import android.text.style.ForegroundColorSpan; +import android.text.style.MetricAffectingSpan; +import android.widget.TextView; + +import androidx.annotation.Keep; + +import com.alibaba.fastjson.JSON; +import com.chwl.core.msg.sys.bean.ErbanSysMsgComponent; +import com.chwl.core.msg.sys.bean.ErbanSysMsgInfo; +import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase; +import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter; +import com.chwl.app.R; +import com.chwl.app.ui.im.RouterHandler; +import com.chwl.core.community.attachment.DynamicSysAttachment; +import com.chwl.core.msg.sys.ErbanSysMsgLayout; +import com.chwl.library.utils.SizeUtils; + +import java.util.List; +import java.util.Objects; + +@Keep +public class DynamicSysHolder extends MsgViewHolderBase { + private TextView tvTime; + private TextView tvContent; + private TextView tvTitle; + + public DynamicSysHolder(BaseMultiItemFetchLoadAdapter adapter) { + super(adapter); + } + + @Override + protected int getContentResId() { + return R.layout.item_dynamic_sys; + } + + @Override + protected void inflateContentView() { + tvTitle = findViewById(R.id.tv_notice_label); + tvTime = findViewById(R.id.tv_time_dynamic_is_pass); + tvContent = findViewById(R.id.tv_content_dynamic_is_pass); + } + + private ErbanSysMsgInfo erbanSysMsgInfo; + @Override + protected void bindContentView() { + DynamicSysAttachment dynamicSysAttachment = (DynamicSysAttachment) message.getAttachment(); + if (dynamicSysAttachment == null) { + return; + } + erbanSysMsgInfo = dynamicSysAttachment.getErbanSysMsgInfo(); + if (erbanSysMsgInfo == null) { + return; + } + + String layout = erbanSysMsgInfo.getLayout(); + ErbanSysMsgLayout erbanSysMsgLayout; + try { + erbanSysMsgLayout = JSON.parseObject(layout, ErbanSysMsgLayout.class); + + } catch (Exception ex) { // json解析出错 + ex.printStackTrace(); + return; + } + // title + setupView(tvTitle, erbanSysMsgLayout.getTitle()); + // timestamp + setupView(tvTime, erbanSysMsgLayout.getTime()); + // content + List erbanSysMsgLayoutContent = erbanSysMsgLayout.getContents(); + if (erbanSysMsgLayoutContent != null) { + SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(); + for (ErbanSysMsgComponent erbanSysMsgComponent : erbanSysMsgLayoutContent) { + int start = spannableStringBuilder.length(); + String msgBody = erbanSysMsgComponent.getContent(); + if (Objects.equals(msgBody, "/r/n")) { + msgBody = "\r\n"; + spannableStringBuilder.append(msgBody); + continue; + } + spannableStringBuilder.append(msgBody); + if (erbanSysMsgComponent.getFontColor() != null) { + spannableStringBuilder.setSpan(new ForegroundColorSpan(Color.parseColor(erbanSysMsgComponent.getFontColor())), + start, spannableStringBuilder.length(), + Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } + if (erbanSysMsgComponent.getFontSize() > 0) { + spannableStringBuilder.setSpan(new AbsoluteSizeSpan(SizeUtils.sp2px(tvContent.getContext(), erbanSysMsgComponent.getFontSize() + 0.5F)), + start, spannableStringBuilder.length(), + Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } + spannableStringBuilder.setSpan( + new MetricAffectingSpan() { + @Override + public void updateMeasureState(TextPaint p) { + + } + + @Override + public void updateDrawState(TextPaint tp) { + tp.setFakeBoldText(erbanSysMsgComponent.isFontBold()); + } + }, + start, spannableStringBuilder.length(), + Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + } + tvContent.setText(spannableStringBuilder); + } + + } + + public void setupView(TextView view, ErbanSysMsgComponent erbanSysMsgComponent) { + if (erbanSysMsgComponent != null) { + setupComponent(view, erbanSysMsgComponent.getContent(), erbanSysMsgComponent.getFontColor(), erbanSysMsgComponent.getFontSize(), + erbanSysMsgComponent.getRouterType(), erbanSysMsgComponent.getRouterValue()); + } + } + + public void setupComponent(TextView view, String text, String textColor, float fontSize, int routerType, int routerValue) { + view.setText(text); + view.setTextColor(Color.parseColor(textColor)); + view.setTextSize(fontSize); + if (routerType > 0) { + view.setOnClickListener(v -> RouterHandler.handle(context, routerType, String.valueOf(routerValue))); + } + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/im/WorldDynamicShareViewHolder.java b/app/src/module_community/java/com/chwl/app/community/im/WorldDynamicShareViewHolder.java new file mode 100644 index 000000000..0040a4c4d --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/im/WorldDynamicShareViewHolder.java @@ -0,0 +1,103 @@ +package com.chwl.app.community.im; + +import android.text.TextUtils; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Keep; + +import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase; +import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter; +import com.chwl.app.R; +import com.chwl.app.community.dynamic.view.DynamicDetailActivity; +import com.chwl.app.ui.utils.ImageLoadUtilsV2; +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil; +import com.chwl.core.community.im.DynamicImMsg; +import com.chwl.core.community.im.WorldDynamicAttachment; +import com.chwl.library.utils.ResUtil; + +/** + * create by lvzebiao @2019/11/25 + */ +@Keep +public class WorldDynamicShareViewHolder extends MsgViewHolderBase { + + private ImageView rivCover; + + private TextView tvTitle; + + private TextView tvContent; + + private TextView tvShareText; + + private ViewGroup container; + + public WorldDynamicShareViewHolder(BaseMultiItemFetchLoadAdapter adapter) { + super(adapter); + } + + @Override + protected int getContentResId() { + return R.layout.view_holder_world_dynamic_share; + } + + @Override + protected void inflateContentView() { + rivCover = findViewById(R.id.riv_cover); + tvTitle = findViewById(R.id.tv_title); + tvContent = findViewById(R.id.tv_content); + tvShareText = findViewById(R.id.tv_share_text); + container = findViewById(R.id.cl_container_dynamic); + int layoutWidth = UIUtil.getScreenWidth(context) - UIUtil.dip2px(context, 150); + ViewGroup.LayoutParams params = container.getLayoutParams(); + params.width = layoutWidth; + container.setLayoutParams(params); + if (isReceivedMessage()) { + tvTitle.setTextColor(context.getResources().getColor(R.color.color_333333)); + tvShareText.setTextColor(context.getResources().getColor(R.color.color_333333)); + tvContent.setTextColor(context.getResources().getColor(R.color.color_9E9E9E)); + } else { + tvTitle.setTextColor(context.getResources().getColor(R.color.white)); + tvShareText.setTextColor(context.getResources().getColor(R.color.white)); + tvContent.setTextColor(context.getResources().getColor(R.color.white_transparent_80)); + } + } + + @Override + protected void bindContentView() { + try { + if (!(message.getAttachment() instanceof WorldDynamicAttachment)) { + return; + } + WorldDynamicAttachment worldDynamicAttachment = (WorldDynamicAttachment) message.getAttachment(); + if (worldDynamicAttachment == null) { + return; + } + DynamicImMsg dynamicImMsg = worldDynamicAttachment.getDynamicImMsg(); + ImageLoadUtilsV2.loadAvatar(rivCover, dynamicImMsg.getImageUrl()); + + String nick = dynamicImMsg.getNick(); + if (TextUtils.isEmpty(nick)) { + nick = ""; + } else if (nick.length() >= 4) { + try { + nick = nick.substring(0, 2) + "..."; + } catch (Exception ex) { + ex.printStackTrace(); + } + } + tvTitle.setText(nick); + String content = dynamicImMsg.getContent(); + if (TextUtils.isEmpty(dynamicImMsg.getContent())) { + content = ResUtil.getString(R.string.community_im_worlddynamicshareviewholder_01); + } + tvContent.setText(content); + container.setOnClickListener(v -> + DynamicDetailActivity.start(context, dynamicImMsg.getDynamicId(), dynamicImMsg.getWorldId(), 3)); + } catch (Exception ex) { + ex.printStackTrace(); + } + + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/publish/ImageAdapter.java b/app/src/module_community/java/com/chwl/app/community/publish/ImageAdapter.java new file mode 100644 index 000000000..7867f8169 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/publish/ImageAdapter.java @@ -0,0 +1,46 @@ +package com.chwl.app.community.publish; + +import android.widget.ImageView; + +import androidx.annotation.Nullable; + +import com.bumptech.glide.load.resource.bitmap.CenterCrop; +import com.bumptech.glide.load.resource.bitmap.RoundedCorners; +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.netease.nim.uikit.support.glide.GlideApp; +import com.chwl.app.R; +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil; +import com.chwl.core.community.bean.PublishItem; + +import java.util.List; + +public class ImageAdapter extends BaseQuickAdapter { + + + public ImageAdapter(int layoutResId, @Nullable List data) { + super(layoutResId, data); + } + + @Override + protected void convert(BaseViewHolder helper, PublishItem item) { + helper.addOnClickListener(R.id.iv_delete); + helper.setVisible(R.id.iv_delete, !item.isAddItem()); + ImageView ivPhoto = helper.getView(R.id.iv_photo); + if (item.getButtonType() == PublishItem.BUTTON_TYPE_ADD_ITEM) { + ivPhoto.setImageResource(R.drawable.icon_dy_add_image); + } else { + GlideApp.with(ivPhoto.getContext()) + .asBitmap() + .load(item.getPath()) + .transform(new CenterCrop(), + new RoundedCorners(UIUtil.dip2px(ivPhoto.getContext(), 8))) + .placeholder(R.drawable.default_cover) + .error(R.drawable.default_cover) + .into(ivPhoto); + } + + helper.setGone(R.id.iv_gif_tag, item.getFileTag() == 1); + + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/publish/presenter/PublishPresenter.java b/app/src/module_community/java/com/chwl/app/community/publish/presenter/PublishPresenter.java new file mode 100644 index 000000000..8f3d88669 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/publish/presenter/PublishPresenter.java @@ -0,0 +1,222 @@ +package com.chwl.app.community.publish.presenter; + +import android.text.TextUtils; + +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.chwl.app.R; +import com.chwl.app.base.BaseMvpPresenter; +import com.chwl.app.community.publish.view.IPublishView; +import com.chwl.core.Constants; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.community.ImageUploadConfig; +import com.chwl.core.community.PublishModel; +import com.chwl.core.community.bean.DynamicMedia; +import com.chwl.core.community.bean.MiniWorldChooseInfo; +import com.chwl.core.community.bean.PublishBody; +import com.chwl.core.file.FileModel; +import com.chwl.core.utils.DirectoryHelper; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.base.PresenterEvent; +import com.chwl.library.utils.ListUtils; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.file.JXFileUtils; +import com.chwl.library.utils.image.JXImageUtils; +import com.example.matisse.internal.entity.CustomItem; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.Single; +import io.reactivex.SingleObserver; +import io.reactivex.SingleOnSubscribe; +import io.reactivex.SingleSource; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.functions.Function; + +/** + * create by lvzebiao @2019/11/12 + */ +public class PublishPresenter extends BaseMvpPresenter { + + private PublishBody publishBody; + private Disposable mImageUploadSubscribe; + + private boolean isOriginalImage; + + private MiniWorldChooseInfo miniWorldChooseInfo = new MiniWorldChooseInfo(); + + public void publishDy(List list, long worldId, String content, boolean isOriginalImage) { + publishBody = new PublishBody(); + List uploadList = new ArrayList<>(list); + int type = ListUtils.isListEmpty(uploadList) ? 0 : 2; + publishBody.setType(type); + publishBody.setUid(AuthModel.get().getCurrentUid()); + publishBody.setContent(content); + if (worldId > 0) { + publishBody.setWorldId(worldId); + } + this.isOriginalImage = isOriginalImage; + uploadImage(uploadList) + .flatMap((Function>) s -> + PublishModel.get().publish(publishBody)) + .subscribe(new DontWarnObserver() { + @Override + public void acceptThrowable(String s, Throwable throwable) { + super.acceptThrowable(s, throwable); + if (throwable != null) { + throwable.printStackTrace(); + dealUploadFileError(throwable); + } else { + if (getMvpView() != null) { + getMvpView().onPublishSuccess(); + } + } + } + }); + } + + private Single uploadImage(List imagePaths) { + upload(imagePaths); + return Single.create(emitter -> + mImageUploadSubscribe = Observable.interval(500, TimeUnit.MILLISECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .filter(aLong -> imagePaths != null && imagePaths.size() == 0) + .subscribe(aLong -> { + emitter.onSuccess(""); + if (mImageUploadSubscribe != null) { + mImageUploadSubscribe.dispose(); + } + })); + } + + private void upload(List imagePaths) { + if (imagePaths == null || imagePaths.size() == 0) { + return; + } + DynamicMedia item = imagePaths.get(0); + String file = item.getLocalFilePath(); + Single.create((SingleOnSubscribe) e -> { + long fileLength = JXFileUtils.getFileLength(file); + LogUtil.print(ResUtil.getString(R.string.publish_presenter_publishpresenter_01) + fileLength); + String compressFile = null; + if (!isOriginalImage && fileLength > ImageUploadConfig.MAX_FILE_SIZE) { + JXImageUtils.CompressResult result = JXImageUtils.compressImagePxAndQuality( + file, DirectoryHelper.get().getDynamicDir(), + "dynamic_" + System.currentTimeMillis() + ".jpg", + ImageUploadConfig.EXPECT_MIN_WIDTH, + ImageUploadConfig.EXPECT_COMPRESS_SIZE); + if (result != null) { + compressFile = result.getPath(); + if (result.getWidth() > 0 && item.getWidth() != result.getWidth()) { + item.setWidth(result.getWidth()); + } + if (result.getHeight() > 0 && item.getHeight() != result.getHeight()) { + item.setHeight(result.getHeight()); + } + if (result.getFormat() != null) { + item.setFormat(result.getFormat()); + } + } + LogUtil.print(ResUtil.getString(R.string.publish_presenter_publishpresenter_02) + compressFile); + } + if (!TextUtils.isEmpty(compressFile)) { + e.onSuccess(compressFile); + } else if (!TextUtils.isEmpty(file)) { + e.onSuccess(file); + } else { + e.onError(new Throwable(ResUtil.getString(R.string.publish_presenter_publishpresenter_03))); + } + }) + .compose(RxHelper.handleSchedulers()) + .flatMap((Function>) + path -> FileModel.get().uploadFile(path)) + .compose(bindUntilEvent(PresenterEvent.DESTROY)) + .subscribe(new DontWarnObserver() { + @Override + public void acceptThrowable(String url, Throwable throwable) { + super.acceptThrowable(url, throwable); + if (throwable != null) { + throwable.printStackTrace(); + if (mImageUploadSubscribe != null) { + mImageUploadSubscribe.dispose(); + } + dealUploadFileError(throwable); + } else { + item.setResUrl(url); + LogUtil.print(ResUtil.getString(R.string.publish_presenter_publishpresenter_04), item); + publishBody.addDynamicMedia(item); + imagePaths.remove(0); + upload(imagePaths); + } + } + }); + + } + + public void recommendWorlds() { + PublishModel.get().squareWorld(Constants.TYPE_RECOMMEND, 1, 5) + .compose(bindToLifecycle()).subscribe(new SingleObserver>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onSuccess(List miniWorldChooseInfos) { + if (miniWorldChooseInfos != null) { + if (mMvpView != null) { + mMvpView.recommendWorldsSuccess(miniWorldChooseInfos); + } + } else { + if (mMvpView != null) { + mMvpView.recommendWorldsFails(ResUtil.getString(R.string.publish_presenter_publishpresenter_05)); + } + } + + } + + @Override + public void onError(Throwable e) { + if (mMvpView != null) { + mMvpView.recommendWorldsFails(e.getMessage()); + } + + } + }); + } + + private void dealUploadFileError(Throwable e) { + if (getMvpView() != null) { + getMvpView().onPublishFailed(e); + } + } + + public void setWorldId(long worldId) { + if (miniWorldChooseInfo != null) { + miniWorldChooseInfo.setWorldId(worldId); + } + } + + public void setIsInWorld(boolean isInWorld) { + if (miniWorldChooseInfo != null) { + miniWorldChooseInfo.setInWorld(isInWorld); + } + } + + public void setMiniWorldChooseInfo(MiniWorldChooseInfo miniWorldChooseInfo) { + this.miniWorldChooseInfo = miniWorldChooseInfo; + } + + public long getWorldId() { + return miniWorldChooseInfo != null ? miniWorldChooseInfo.getWorldId() : 0; + } + + public boolean isInWorld() { + return miniWorldChooseInfo != null && miniWorldChooseInfo.isInWorld(); + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/publish/presenter/WorldChoosePresenter.java b/app/src/module_community/java/com/chwl/app/community/publish/presenter/WorldChoosePresenter.java new file mode 100644 index 000000000..b1c170205 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/publish/presenter/WorldChoosePresenter.java @@ -0,0 +1,62 @@ +package com.chwl.app.community.publish.presenter; + +import androidx.annotation.Keep; + +import com.chwl.app.R; +import com.chwl.app.base.BaseMvpPresenter; +import com.chwl.app.community.publish.view.IWorldsChooseView; +import com.chwl.core.Constants; +import com.chwl.core.community.PublishModel; +import com.chwl.core.community.bean.MiniWorldChooseInfo; +import com.chwl.library.utils.ResUtil; + +import java.util.List; + +import io.reactivex.SingleObserver; +import io.reactivex.disposables.Disposable; +@Keep +public class WorldChoosePresenter extends BaseMvpPresenter { + + private int page = 0; + + public void loadData(boolean isRefresh, byte type) { + if (isRefresh) { + page = 1; + } else { + page++; + } + + PublishModel.get().squareWorld(type, page, Constants.PAGE_SIZE) + .compose(bindToLifecycle()).subscribe(new SingleObserver>() { + @Override + public void onSubscribe(Disposable d) { + + } + + @Override + public void onSuccess(List miniWorldChooseInfos) { + if (miniWorldChooseInfos != null) { + if (mMvpView != null) { + mMvpView.squareWorldsSuccess(miniWorldChooseInfos); + } + } else { + if (mMvpView != null) { + mMvpView.squareWorldsFails(ResUtil.getString(R.string.publish_presenter_worldchoosepresenter_01)); + } + } + } + + @Override + public void onError(Throwable e) { + if (mMvpView != null) { + mMvpView.squareWorldsFails(e.getMessage()); + } + + } + }); + } + + public int getPage() { + return page; + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/publish/view/IPublishView.java b/app/src/module_community/java/com/chwl/app/community/publish/view/IPublishView.java new file mode 100644 index 000000000..05fe44421 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/publish/view/IPublishView.java @@ -0,0 +1,20 @@ +package com.chwl.app.community.publish.view; + +import com.chwl.core.community.bean.MiniWorldChooseInfo; +import com.chwl.library.base.IMvpBaseView; + +import java.util.List; + +/** + * create by lvzebiao @2019/11/12 + */ +public interface IPublishView extends IMvpBaseView { + + void onPublishSuccess(); + + void onPublishFailed(Throwable throwable); + + void recommendWorldsSuccess(List list); + void recommendWorldsFails(String error); + +} diff --git a/app/src/module_community/java/com/chwl/app/community/publish/view/IWorldsChooseView.java b/app/src/module_community/java/com/chwl/app/community/publish/view/IWorldsChooseView.java new file mode 100644 index 000000000..98ff2b322 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/publish/view/IWorldsChooseView.java @@ -0,0 +1,11 @@ +package com.chwl.app.community.publish.view; + +import com.chwl.core.community.bean.MiniWorldChooseInfo; +import com.chwl.library.base.IMvpBaseView; + +import java.util.List; + +public interface IWorldsChooseView extends IMvpBaseView { + void squareWorldsSuccess(List list); + void squareWorldsFails(String error); +} diff --git a/app/src/module_community/java/com/chwl/app/community/publish/view/PublishActivity.java b/app/src/module_community/java/com/chwl/app/community/publish/view/PublishActivity.java new file mode 100644 index 000000000..d1d2c2b53 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/publish/view/PublishActivity.java @@ -0,0 +1,656 @@ + +package com.chwl.app.community.publish.view; + +import android.Manifest; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.chwl.app.photo.BigPhotoActivity; +import com.chwl.app.photo.PagerOption; +import com.chwl.core.utils.CoreTextUtils; +import com.example.matisse.Matisse; +import com.google.android.flexbox.FlexboxLayout; +import com.hjq.toast.ToastUtils; +import com.netease.nim.uikit.StatusBarUtil; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.trello.rxlifecycle3.android.ActivityEvent; +import com.chwl.app.R; +import com.chwl.app.base.BaseMvpActivity; +import com.chwl.app.common.widget.dialog.DialogManager; +import com.chwl.app.community.ConstantValue; +import com.chwl.app.community.publish.ImageAdapter; +import com.chwl.app.community.publish.presenter.PublishPresenter; +import com.chwl.app.community.utils.ObjectTypeHelper; +import com.chwl.app.ui.widget.dialog.CommonTipDialog; +import com.chwl.app.ui.widget.recyclerview.decoration.GridSpacingItemDecoration; +import com.chwl.core.Constants; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.community.bean.MiniWorldChooseInfo; +import com.chwl.core.community.bean.PublishItem; +import com.chwl.core.miniworld.model.MiniWorldModel; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.bean.UserInfo; +import com.chwl.core.utils.SharedPreferenceUtils; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.library.base.factory.CreatePresenter; +import com.chwl.library.common.photo.PhotoProvider; +import com.chwl.library.common.util.PhotoCompressUtil; +import com.chwl.library.common.util.PhotosCompressCallback; +import com.chwl.library.easypermisssion.EasyPermissions; +import com.chwl.library.easyphoto.models.album.entity.Photo; +import com.chwl.library.easyphoto.utils.settings.SettingsUtils; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; +import com.example.matisse.internal.entity.CustomItem; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; +import kotlinx.coroutines.Job; + +/** + * create by lvzebiao @2019/11/11 + */ +@CreatePresenter(PublishPresenter.class) +public class PublishActivity extends BaseMvpActivity + implements IPublishView, WorldsChooseFrg.ChooseWorldCallback, EasyPermissions.PermissionCallbacks, + View.OnClickListener { + + private final static String KEY_SP_ORIGINAL_IMAGE = "key_sp_original_image"; + private final static int PERMISSION_CODE_STORAGE = 12; + private final static int REQUEST_CODE_STORAGE = 42; + private final static int REQUEST_CODE_OPEN_PHOTO_PROVIDER = 111; // 从相册中选择 + private final static int maxSelect = 9; + + private RecyclerView rvImages; + private TextView tvPublish; + private EditText etContent; + private TextView tvMiniWorldName; + private TextView tvInputLimit; + + private TextView tvChoose; + private LinearLayout llGroupChoose; + private TextView tvLabelReChoose; + private LinearLayout llMiniWorld; + private FlexboxLayout flGroup; + private RelativeLayout rlChooseGroup; + private ImageView ivClose; + + private ImageAdapter imageAdapter; + + private List imageShowList = new ArrayList<>(); + + private List uploadList = new ArrayList<>(); + + private boolean isOriginalImage; + + // 话题客态页进入(话题进入不让修改话题标签) + private boolean fromWorld; + + private Job mJob = null; + + public static void start(DialogManager manager, long worldId) { + if (beforeStart(manager)) { + return; + } + Context context = manager.getContext(); + Intent intent = new Intent(context, PublishActivity.class); + intent.putExtra("worldId", worldId); + context.startActivity(intent); + } + + /** + * 非话题页面进入 + */ + public static void start(DialogManager manager) { + if (beforeStart(manager)) { + return; + } + Context context = manager.getContext(); + Intent intent = new Intent(context, PublishActivity.class); + context.startActivity(intent); + } + + private static boolean beforeStart(DialogManager manager) { + UserInfo userInfo = UserModel.get().getCacheLoginUserInfo(); + if (userInfo == null) { + SingleToastUtil.showToast(ResUtil.getString(R.string.yizhuan_xchat_android_constants_xchatconstants_016)); + return true; + + } else { + return false; + } + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_publish); + + findView(); + initListener(); + + long worldId = getIntent().getLongExtra("worldId", 0L); + if (worldId > 0) { + fromWorld = true; + getMvpPresenter().setWorldId(worldId); + getMvpPresenter().setIsInWorld(true); + } + + isOriginalImage = (boolean) SharedPreferenceUtils.get(KEY_SP_ORIGINAL_IMAGE, false); + initWhiteTitleBar(getString(R.string.pic_text_publish)); + initGridImages(); + updateImagesData(); + initEditContent(); + initOtherView(); + +// if (!fromWorld) { +// getMvpPresenter().recommendWorlds(); +// } else { // 话题进入,关闭多余的控件 +// llGroupChoose.setVisibility(View.GONE); +// tvChoose.setVisibility(View.GONE); +// ivClose.setVisibility(View.GONE); +// +// flGroup.setVisibility(View.GONE); +// } + rlChooseGroup.setVisibility(View.GONE); + flGroup.setVisibility(View.GONE); + } + + private void findView() { + rvImages = findViewById(R.id.rv_images); + tvPublish = findViewById(R.id.tv_publish); + etContent = findViewById(R.id.et_content); + tvMiniWorldName = findViewById(R.id.tv_mini_world_name); + tvInputLimit = findViewById(R.id.tv_input_limit); + tvChoose = findViewById(R.id.tv_choose); + llGroupChoose = findViewById(R.id.ll_group_choose); + tvLabelReChoose = findViewById(R.id.tv_label_re_choose); + llMiniWorld = findViewById(R.id.ll_miniworld); + flGroup = findViewById(R.id.fl_group); + rlChooseGroup = findViewById(R.id.rl_choose_group); + ivClose = findViewById(R.id.iv_close); + } + + private void initListener() { + tvPublish.setOnClickListener(this); + ivClose.setOnClickListener(this); + llGroupChoose.setOnClickListener(this); + rlChooseGroup.setOnClickListener(this); + } + + private void initGridImages() { + GridLayoutManager gridLayoutManager = new GridLayoutManager(context, 3); + rvImages.setLayoutManager(gridLayoutManager); + rvImages.addItemDecoration(new GridSpacingItemDecoration(context, 3, 10)); + imageAdapter = new ImageAdapter(R.layout.item_publish_image, imageShowList); + imageAdapter.setOnItemClickListener((adapter, view, position) -> { + PublishItem item = imageShowList.get(position); + if (item.isAddItem()) { + checkStoragePermission(); + } else { + BigPhotoActivity.startCanDelete(PublishActivity.this, (ArrayList) uploadList, + position, new PagerOption().setDelete(true)); + } + }); + imageAdapter.setOnItemChildClickListener((adapter, view, position) -> { + if (position < uploadList.size()) { + getDialogManager().showOkCancelDialog(ResUtil.getString(R.string.publish_view_publishactivity_02), () -> { + uploadList.remove(position); + updateImagesData(); + imageAdapter.notifyDataSetChanged(); + toast(ResUtil.getString(R.string.publish_view_publishactivity_03)); + }); + } + }); + rvImages.setAdapter(imageAdapter); + updateImagesData(); + } + + private void updateImagesData() { + List tmp = new ArrayList<>(); + for (int i = 0; i < uploadList.size(); i++) { + CustomItem item = uploadList.get(i); + if (item.getFileType() == 0 || item.getFileType() == 1) { + PublishItem publishItem = new PublishItem(i, PublishItem.BUTTON_TYPE_SHOW_PIC, + item.getPath(), item.isGif() ? 1 : 0); + tmp.add(publishItem); + } + } + imageShowList.clear(); + imageShowList.addAll(tmp); + if (uploadList.size() < 9) { + imageShowList.add(new PublishItem(-1, PublishItem.BUTTON_TYPE_ADD_ITEM, null, 0)); + } + imageAdapter.notifyDataSetChanged(); + updatePublishStatus(); + } + + private void initEditContent() { + etContent.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + } + + @Override + public void afterTextChanged(Editable s) { + tvInputLimit.setText(s.length() + "/500"); + updatePublishStatus(); + String inputText = s.toString().trim(); + tvPublish.setTextColor(!TextUtils.isEmpty(inputText) ? getResources().getColor(R.color.color_7154EE) : getResources().getColor(R.color.color_999999)); + tvPublish.setEnabled(!TextUtils.isEmpty(inputText)); + } + }); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + case R.id.tv_publish: + publish(); + break; + + case R.id.iv_close: + showChooseView(); + break; + } + } + + + private void publish() { + tvPublish.setEnabled(false); + getDialogManager().showProgressDialog(context); + getMvpPresenter().publishDy( + ObjectTypeHelper.customToMediaList(uploadList), + getMvpPresenter().getWorldId(), etContent.getText().toString(), isOriginalImage); + } + + private void updatePublishStatus() { + tvPublish.setEnabled(!(uploadList.size() == 0 && + CoreTextUtils.isEmptyText(etContent.getText().toString()))); + } + + private void initOtherView() { + //话题名称 + long worldId = getMvpPresenter().getWorldId(); + if (worldId > 0) { + MiniWorldModel.getInstance().getWorldDetailInfo(String.valueOf(worldId), + String.valueOf(AuthModel.get().getCurrentUid())) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .doOnSuccess(info -> { + if (info != null && !TextUtils.isEmpty(info.getName())) { + showReChooseView(info.getName()); + } + }) + .subscribe(); + } + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == REQUEST_CODE_STORAGE) { + checkStoragePermission(); + } else if (resultCode == RESULT_OK) { + switch (requestCode) { + case REQUEST_CODE_OPEN_PHOTO_PROVIDER: + if (data == null) { + return; + } + PhotoProvider.getResultPathListAsync(data, new Function1, Unit>() { + @Override + public Unit invoke(List list) { + if (list.isEmpty()) { + return null; + } else { + if (mJob != null) { + mJob.cancel(null); + } + ArrayList pathList = new ArrayList<>(); + for (Photo photo : list) { + pathList.add(photo.path); + } + mJob = PhotoCompressUtil.compress(PublishActivity.this, pathList, + PhotoCompressUtil.getCompressCachePath("publish") + , new PhotosCompressCallback() { + @Override + public void onSuccess(@NonNull ArrayList compressedImgList) { + List pathResult = new ArrayList<>(); + for (int i = 0; i < compressedImgList.size(); i++) { + if (i < list.size()) { + Photo photo = list.get(i); + String format = "image/jpeg"; + if (photo.type != null) { + format = photo.type; + } + pathResult.add(new CustomItem(compressedImgList.get(i), CustomItem.IMAGE_NORMAL, format, photo.width, photo.height)); + } + } + if (pathResult.size() == 0) { + return; + } + LogUtil.print(pathResult); + + uploadList.addAll(pathResult); + updateImagesData(); + + isOriginalImage = false; + LogUtil.print("isOriginalImage:" + isOriginalImage); + SharedPreferenceUtils.put(KEY_SP_ORIGINAL_IMAGE, isOriginalImage); + } + + @Override + public void onFail(@NonNull Throwable e) { + toast(getString(R.string.picker_image_error)); + } + }, 200, false, Constants.UPLOAD_IMAGE_MAX_SIZE, Constants.UPLOAD_IMAGE_MAX_FILE_LENGTH); + } + return null; + } + }); + break; + + case ConstantValue.CODE_CHOOSE_PHOTO: + String mimeType = Matisse.obtainMineResult(data); + List pathResult = Matisse.obtainPathResult(data); + if ("video".equals(mimeType)) { + toast(ResUtil.getString(R.string.publish_view_publishactivity_04)); + return; + } + if (pathResult == null) { + return; + } + LogUtil.print(pathResult); + + uploadList.addAll(pathResult); + updateImagesData(); + + isOriginalImage = Matisse.obtainOriginalImageResult(data); + LogUtil.print("isOriginalImage:" + isOriginalImage); + SharedPreferenceUtils.put(KEY_SP_ORIGINAL_IMAGE, isOriginalImage); + + break; + + case BigPhotoActivity.CODE_DELETE_PHOTO: + List newList = data.getParcelableArrayListExtra( + BigPhotoActivity.KEY_IMG_URL); + uploadList.clear(); + uploadList.addAll(newList); + updateImagesData(); + break; + + } + } + } + + @Override + public void onPublishSuccess() { + hideIME(etContent); + getDialogManager().dismissDialog(); + tvPublish.setEnabled(true); + getDialogManager().showCustomViewDialog(R.layout.dialog_dy_publish_success); + getDialogManager().getDialog().setCanceledOnTouchOutside(true); + getDialogManager().getDialog().setOnDismissListener(dialog -> finish()); + getDialogManager().getDialog().setOnKeyListener((dialog, keyCode, event) -> { + if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 + && event.getAction() == KeyEvent.ACTION_DOWN) { + hideDialogAndFinish(); + return true; + } + return false; + }); + Single.timer(3, TimeUnit.SECONDS, AndroidSchedulers.mainThread()) + .compose(bindUntilEvent(ActivityEvent.DESTROY)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(Long aLong, String error) { + super.accept(aLong, error); + if (error == null) { + hideDialogAndFinish(); + } + } + }); + + } + + private void hideDialogAndFinish() { + getDialogManager().dismissDialog(); + finish(); + } + + @Override + public void onPublishFailed(Throwable throwable) { + tvPublish.setEnabled(true); + getDialogManager().dismissDialog(); + toast(throwable.getMessage()); + } + + @Override + public void recommendWorldsSuccess(List list) { + addMiniWorldList(list); + } + + @Override + public void recommendWorldsFails(String error) { + flGroup.setVisibility(View.GONE); + + toast(error); + } + + private void handleFinish() { + if (!tvPublish.isEnabled()) { + finish(); + return; + } + getDialogManager().showOkCancelWithTitleDialog(ResUtil.getString(R.string.publish_view_publishactivity_06), ResUtil.getString(R.string.publish_view_publishactivity_07), + ResUtil.getString(R.string.publish_view_publishactivity_08), ResUtil.getString(R.string.publish_view_publishactivity_09), new DialogManager.OkCancelDialogListener() { + + @Override + public void onCancel() { + finish(); + } + + @Override + public void onOk() { + + } + + }); + } + + @Override + protected void onLeftClickListener() { + handleFinish(); + } + + @Override + public void onBackPressed() { + handleFinish(); + } + + private void showChooseView() { + rlChooseGroup.setEnabled(true); + llGroupChoose.setEnabled(false); + + tvChoose.setVisibility(View.VISIBLE); + tvLabelReChoose.setVisibility(View.GONE); + + llMiniWorld.setVisibility(View.GONE); + tvMiniWorldName.setText(""); + + getMvpPresenter().setMiniWorldChooseInfo(new MiniWorldChooseInfo()); + } + + private void showReChooseView(String worldName) { + rlChooseGroup.setEnabled(false); + llGroupChoose.setEnabled(true); + + tvChoose.setVisibility(View.GONE); + tvLabelReChoose.setVisibility(View.VISIBLE); + tvMiniWorldName.setText("#" + worldName); + + llMiniWorld.setVisibility(View.VISIBLE); + } + + private List miniWorldChooseInfoList; + + private void addMiniWorldList(List list) { + miniWorldChooseInfoList = list; + flGroup.removeAllViews(); + + if (miniWorldChooseInfoList != null && miniWorldChooseInfoList.size() > 0) { + for (MiniWorldChooseInfo item : miniWorldChooseInfoList) { + TextView textView = (TextView) LayoutInflater.from(this).inflate(R.layout.item_label_mini_world, flGroup, false); + textView.setText(item.getWorldName()); + textView.setTag(item.getWorldId()); + textView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + TextView tv = (TextView) v; + + if (miniWorldChooseInfoList != null && tv != null) { + for (MiniWorldChooseInfo sub : miniWorldChooseInfoList) { + Long tag = (Long) tv.getTag(); + long worldid = sub.getWorldId(); + if (worldid == tag) { + getMvpPresenter().setMiniWorldChooseInfo(sub); + showReChooseView(sub.getWorldName()); + break; + } + + } + } + + } + }); + + flGroup.addView(textView); + } + + } else { + flGroup.setVisibility(View.GONE); + } + } + + @Override + public void callback(MiniWorldChooseInfo miniWorldChooseInfo) { + getMvpPresenter().setMiniWorldChooseInfo(miniWorldChooseInfo); + if (miniWorldChooseInfo == null) { + showChooseView(); + } else { + showReChooseView(miniWorldChooseInfo.getWorldName()); + } + + } + + @Override + protected boolean needSteepStateBar() { + return true; + } + + @Override + protected void setStatusBar() { + StatusBarUtil.transparencyBar(this); + StatusBarUtil.StatusBarLightMode(this); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); + } + + @Override + public void onPermissionsGranted(int requestCode, @NonNull List perms) { + if (requestCode == PERMISSION_CODE_STORAGE) { + checkStoragePermission(); + } + } + + @Override + public void onPermissionsDenied(int requestCode, @NonNull List perms) { + if (requestCode == PERMISSION_CODE_STORAGE) { + String requestTip = getString(R.string.permission_storage_denied); + CommonTipDialog mPrivacyDialog = new CommonTipDialog(context); + mPrivacyDialog.setTipMsg(requestTip); + mPrivacyDialog.setOkText(getString(R.string.room_perform_go_update)); + mPrivacyDialog.setOnActionListener(new CommonTipDialog.OnActionListener() { + @Override + public void onOk() { + //同意跳到应用详情页面 + SettingsUtils.startMyApplicationDetailsForResult(PublishActivity.this, + getPackageName()); + } + + @Override + public void onCancel() { + CommonTipDialog.OnActionListener.super.onCancel(); + //取消跳到应用详情页面 + ToastUtils.show(getString(R.string.permission_storage_refused)); + } + }); + mPrivacyDialog.show(); + } + } + + private void checkStoragePermission() { + if (!EasyPermissions.hasPermissions( + this, + Build.VERSION.SDK_INT >= 33 ? Manifest.permission.READ_MEDIA_IMAGES : Manifest.permission.READ_EXTERNAL_STORAGE + ) + ) { + EasyPermissions.requestPermissions( + this, + getString(R.string.permission_storage_rationale), + PERMISSION_CODE_STORAGE, + Build.VERSION.SDK_INT >= 33 ? Manifest.permission.READ_MEDIA_IMAGES : Manifest.permission.READ_EXTERNAL_STORAGE + ); + } else { + PhotoProvider.photoProvider( + this, + maxSelect - uploadList.size(), + true, + REQUEST_CODE_OPEN_PHOTO_PROVIDER, + true, + true + ); + } + } + + @Override + protected void onDestroy() { + super.onDestroy(); + if (mJob != null) { + mJob.cancel(null); + } + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/publish/view/WorldChooseAdapter.java b/app/src/module_community/java/com/chwl/app/community/publish/view/WorldChooseAdapter.java new file mode 100644 index 000000000..d0bbe74ec --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/publish/view/WorldChooseAdapter.java @@ -0,0 +1,31 @@ +package com.chwl.app.community.publish.view; + +import android.widget.ImageView; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.chwl.app.R; +import com.chwl.app.ui.utils.ImageLoadUtilsV2; +import com.chwl.core.community.bean.MiniWorldChooseInfo; + +public class WorldChooseAdapter extends BaseQuickAdapter { + + public WorldChooseAdapter() { + super(R.layout.item_worlds_choose, null); + } + + @Override + protected void convert(BaseViewHolder helper, MiniWorldChooseInfo item) { + if (item == null) { + return; + } + + helper.setText(R.id.tv_world_name, item.getWorldName() + "") + .setText(R.id.tv_world_desc, item.getDescription() + ""); + + ImageView imageView = helper.getView(R.id.rriv_world); + ImageLoadUtilsV2.loadImage(imageView, item.getIcon()); + helper.addOnClickListener(R.id.cl_container); + + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/publish/view/WorldsChooseFrg.java b/app/src/module_community/java/com/chwl/app/community/publish/view/WorldsChooseFrg.java new file mode 100644 index 000000000..eb366d2c8 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/publish/view/WorldsChooseFrg.java @@ -0,0 +1,147 @@ +package com.chwl.app.community.publish.view; + +import android.os.Bundle; +import android.view.View; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chwl.app.R; +import com.chwl.app.base.BaseMvpFragment; +import com.chwl.app.community.publish.presenter.WorldChoosePresenter; +import com.chwl.app.ui.widget.recyclerview.decoration.HorizontalDecoration; +import com.chwl.core.Constants; +import com.chwl.core.community.bean.MiniWorldChooseInfo; +import com.chwl.library.base.factory.CreatePresenter; +import com.chwl.library.utils.SizeUtils; + +import java.util.List; + +@CreatePresenter(WorldChoosePresenter.class) +public class WorldsChooseFrg extends BaseMvpFragment implements IWorldsChooseView { + private SwipeRefreshLayout swipeRefreshLayout; + private RecyclerView recyclerView; + private WorldChooseAdapter mAdapter; + + private byte mType; + + public static WorldsChooseFrg newInstance(byte type) { + WorldsChooseFrg fragment = new WorldsChooseFrg(); + Bundle args = new Bundle(); + args.putByte("type", type); + fragment.setArguments(args); + return fragment; + } + + @Override + public int getRootLayoutId() { + return R.layout.frg_worlds_choose; + } + + @Override + public void onFindViews() { + swipeRefreshLayout = mView.findViewById(R.id.swipe_refresh); + recyclerView = mView.findViewById(R.id.recycler_view); + } + + @Override + public void onSetListener() { + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + mAdapter.setEnableLoadMore(true); + loadData(true); + } + }); + } + + @Override + public void initiate() { + Bundle bundle = getArguments(); + if (bundle != null) { + mType = bundle.getByte("type", Constants.TYPE_ALL); + } else { + mType = Constants.TYPE_ALL; + } + + recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); + mAdapter = new WorldChooseAdapter(); + mAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() { + @Override + public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { + List list = adapter.getData(); + + if (list.size() > 0 && position < list.size()) { + MiniWorldChooseInfo miniWorldChooseInfo = list.get(position); + if (mChooseWorldCallback != null) { + mChooseWorldCallback.callback(miniWorldChooseInfo); + } + } + } + }); + recyclerView.setAdapter(mAdapter); + recyclerView.addItemDecoration(new HorizontalDecoration(SizeUtils.dp2px(mContext, 25), false, true)); + + loadData(true); + } + + private void loadData(boolean isRefresh) { + getMvpPresenter().loadData(isRefresh, mType); + } + + private ChooseWorldCallback mChooseWorldCallback; + + public WorldsChooseFrg setmChooseWorldCallback(ChooseWorldCallback chooseWorldCallback) { + this.mChooseWorldCallback = chooseWorldCallback; + return this; + } + + @Override + public void squareWorldsSuccess(List list) { + hideStatus(); + + if (mAdapter != null) { + int page = getMvpPresenter().getPage(); + if (page <= 1) { + swipeRefreshLayout.setRefreshing(false); + + if (list == null || list.size() == 0) { + showNoData(); + } else { + mAdapter.setNewData(list); + } + + } else { + mAdapter.addData(list); + + if (list.size() == 0) { + mAdapter.loadMoreComplete(); + mAdapter.loadMoreEnd(); + mAdapter.setEnableLoadMore(false); + } + } + } + } + + @Override + public void onReloadData() { + super.onReloadData(); + loadData(true); + } + + @Override + public void squareWorldsFails(String error) { + hideStatus(); + + int page = getMvpPresenter().getPage(); + if (page <= 1) { + showNoData(); + } + } + + public interface ChooseWorldCallback { + void callback(MiniWorldChooseInfo miniWorldChooseInfo); + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/square/SquareDynamicFragment.java b/app/src/module_community/java/com/chwl/app/community/square/SquareDynamicFragment.java new file mode 100644 index 000000000..12a2b0a2d --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/square/SquareDynamicFragment.java @@ -0,0 +1,313 @@ +package com.chwl.app.community.square; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import androidx.viewpager.widget.ViewPager; + +import com.chwl.app.base.BaseFragment; +import com.chwl.core.XConstants; +import com.trello.rxlifecycle3.android.FragmentEvent; +import com.chwl.app.R; +import com.chwl.app.UIHelper; +import com.chwl.app.avroom.ButtonItemFactory; +import com.chwl.app.avroom.activity.AVRoomActivity; +import com.chwl.app.common.EmptyViewHelper; +import com.chwl.app.common.widget.dialog.DialogManager; +import com.chwl.app.community.helper.ShareDynamicHelper; +import com.chwl.app.community.square.adapter.SquareDynamicAdapter; +import com.chwl.app.ui.widget.ButtonItem; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.community.CommunityConstant; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.bean.WorldDynamicListResult; +import com.chwl.core.community.dynamic.DynamicModel; +import com.chwl.core.community.event.DynamicPublishEvent; +import com.chwl.core.community.event.DynamicRefreshEvent; +import com.chwl.core.community.square.SquareModel; +import com.chwl.core.user.UserModel; +import com.chwl.core.user.event.LoadLoginUserInfoEvent; +import com.chwl.core.utils.net.BeanObserver; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.library.utils.ResUtil; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import io.reactivex.Single; + +/** + * create by lvzebiao @2020/1/7 + */ +public class SquareDynamicFragment extends BaseFragment { + + public static final String EXTRA_SQUARE_TYPE = "square_type"; + + private RecyclerView recyclerView; + private SwipeRefreshLayout refreshLayout; + /** + * 话题类型ID + * 全部 0 + * 推荐 1 + */ + private static final String TOPIC_CATEGORY_ID = "1"; + + private String nextDynamicId; + + private int page = 1; + + private SquareDynamicAdapter adapter; + + private int squareType; + + public static SquareDynamicFragment newInstance(int type) { + SquareDynamicFragment fragment = new SquareDynamicFragment(); + Bundle bundle = new Bundle(); + bundle.putInt(EXTRA_SQUARE_TYPE, type); + fragment.setArguments(bundle); + return fragment; + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + mView = inflater.inflate(R.layout.fragment_square_dynamic, container, false); + EventBus.getDefault().register(this); + return mView; + } + + @Override + public void onFindViews() { + recyclerView = mView.findViewById(R.id.recycler_view); + refreshLayout = mView.findViewById(R.id.refresh_layout); + } + + @Override + public void onSetListener() { + + } + + @Override + public void initiate() { + Bundle bundle = getArguments(); + if (bundle != null) { + squareType = bundle.getInt(EXTRA_SQUARE_TYPE, SquareFragment.TAB_TYPE_RECOMMEND); + } + recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); + adapter = new SquareDynamicAdapter(getActivity()); + recyclerView.setAdapter(adapter); + adapter.setPreLoadNumber(2); + adapter.setHeaderAndEmpty(true); + adapter.setOnLoadMoreListener(() -> loadData(false), recyclerView); + adapter.setOnItemChildClickListener((baseQuickAdapter, view, pos) -> { + WorldDynamicBean bean = adapter.getItem(pos); + if (bean == null) { + return; + } + if (view.getId() == R.id.iv_more) { + List list = new ArrayList<>(); + if (!UserModel.get().isMyseft(bean.getUid())) { + ButtonItem item = new ButtonItem(getString(R.string.me_shield_dynamic), () -> { + UserModel.get().addReport(bean.getDynamicId(), 0) + .subscribe(new BeanObserver() { + @Override + public void onErrorMsg(String error) { + getDialogManager().dismissDialog(); + toast(error); + } + + @Override + public void onSuccess(String s) { + getDialogManager().dismissDialog(); + toast(ResUtil.getString(R.string.me_shield_success)); + adapter.remove(pos); + } + }); + }); + list.add(item); + } + if (!UserModel.get().isMyseft(bean.getUid())) { + ButtonItem blackListItem = ButtonItemFactory.createAddToBlackListItem( + getDialogManager(), String.valueOf(bean.getUid())); + list.add(blackListItem); + } + if (!UserModel.get().isMyseft(bean.getUid())) { + ButtonItem item = new ButtonItem(getString(R.string.me_report_dynamic), () -> { + UIHelper.showReportPage(getActivity(), bean.getUid(), + XConstants.REPORT_TYPE_DYNAMIC_SQUARE); + }); + list.add(item); + } + if (UserModel.get().isMyseft(bean.getUid()) || + isThisWorldOwner(bean)) { + ButtonItem item = new ButtonItem(getString(R.string.me_delete), () -> deleteDynamic(pos)); + list.add(item); + } + getDialogManager().showCommonPopupDialog(list, getString(R.string.cancel)); + } else if (view.getId() == R.id.ll_share) { + new ShareDynamicHelper(getActivity()).share(bean); + } else if (view.getId() == R.id.iv_in_room) { + if (bean.getInRoomUid() == null) { + return; + } + AVRoomActivity.start(mContext, bean.getInRoomUid()); + } + }); + + refreshLayout = mView.findViewById(R.id.refresh_layout); + refreshLayout.setOnRefreshListener(() -> { + loadData(true); + }); + + loadData(true); + } + + private void loadData(boolean isRefresh) { + if (isRefresh) { + nextDynamicId = null; + page = 1; + } else { + page++; + } + + Single single = null; + //推荐动态返回的是直接一个list,但是为了便于统一和关注动态列表的逻辑,我们包多一层 + //返回WorldDynamicListResult + if (squareType == SquareFragment.TAB_TYPE_ATTENT) { + single = SquareModel.get().getFollowerDynamics(nextDynamicId, + CommunityConstant.DYNAMIC_PAGE_SIZE); + } else if (squareType == SquareFragment.TAB_TYPE_RECOMMEND) { + single = SquareModel.get().getRecommendDynamics(page, CommunityConstant.DYNAMIC_PAGE_SIZE) + .map(list -> { + WorldDynamicListResult result = new WorldDynamicListResult(); + result.setDynamicList(list); + return result; + }); + } else { + single = SquareModel.get().getLatestDynamics(page, CommunityConstant.DYNAMIC_PAGE_SIZE, nextDynamicId); + } + + single.compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(WorldDynamicListResult result, String error) { + super.accept(result, error); + refreshLayout.setRefreshing(false); + if (error != null) { + if (!isRefresh) adapter.loadMoreFail(); + return; + } + //接口访问正确的处理 + nextDynamicId = String.valueOf(result.getNextDynamicId()); + List list = result.getDynamicList(); + if (list == null) { + list = new ArrayList<>(); + } + if (isRefresh) { + adapter.setNewData(list); + adapter.disableLoadMoreIfNotFullPage(); + if (list.isEmpty()) { + String emptyTips = getString(R.string.no_dynamic); + if (squareType == SquareFragment.TAB_TYPE_ATTENT) { + emptyTips = getString(R.string.recommend_to_have_a_look); + } + adapter.setEmptyView(EmptyViewHelper.createEmptyTextView(getContext(), emptyTips)); + } + } else { + if (list.isEmpty()) { + adapter.loadMoreEnd(true); + } else { + adapter.addData(list); + adapter.loadMoreComplete(); + } + } + } + }); + } + + /** + * 判断自己是不是该世界的创始人 + */ + private boolean isThisWorldOwner(WorldDynamicBean bean) { + return bean != null && bean.getWorldUid() == AuthModel.get().getCurrentUid(); + } + + private void deleteDynamic(int pos) { + getDialogManager().showOkCancelWithTitleDialog(getString(R.string.me_cannot_be_restored), + new DialogManager.OkCancelDialogListener() { + @Override + public void onOk() { + WorldDynamicBean bean = adapter.getItem(pos); + if (bean == null) { + return; + } + DynamicModel.get().delete(bean.getWorldId(), bean.getDynamicId()) + .compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + if (error != null) { + toast(error); + } else { + toast(getString(R.string.me_successfully_delete)); + if (pos < adapter.getData().size()) { + if (Objects.equals(bean, adapter.getItem(pos))) { + adapter.remove(pos); + } + } + } + } + }); + + } + }); + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onDynamicPublishEvent(DynamicPublishEvent event) { + if (squareType == SquareFragment.TAB_TYPE_ATTENT) { + loadData(true); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLoadLoginUserInfoEvent(LoadLoginUserInfoEvent event) { + if (squareType == SquareFragment.TAB_TYPE_ATTENT) { + loadData(true); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onDynamicRefreshEvent(DynamicRefreshEvent event) { + loadData(true); + } + + @Override + public int getRootLayoutId() { + return 0; + } + + @Override + public void onDestroyView() { + EventBus.getDefault().unregister(this); + super.onDestroyView(); + } + + @Override + public void showNoData() { + + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/square/SquareFragment.java b/app/src/module_community/java/com/chwl/app/community/square/SquareFragment.java new file mode 100644 index 000000000..bcbfbb484 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/square/SquareFragment.java @@ -0,0 +1,193 @@ +package com.chwl.app.community.square; + +import static android.view.View.GONE; +import static android.view.View.VISIBLE; + +import android.annotation.SuppressLint; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.viewpager2.widget.ViewPager2; + +import com.chwl.app.R; +import com.chwl.app.avroom.adapter.CommonVPAdapter; +import com.chwl.app.base.BaseFragment; +import com.chwl.app.common.widget.DragLayout; +import com.chwl.app.community.publish.view.PublishActivity; +import com.chwl.app.home.activity.CommunityNoticeAct; +import com.chwl.app.ui.user.adapter.ContactsIndicatorAdapter; +import com.chwl.app.ui.widget.magicindicator.MagicIndicator; +import com.chwl.app.ui.widget.magicindicator.ViewPagerHelper; +import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.community.event.UnReadCountEvent; +import com.chwl.core.home.model.HomeModel; +import com.chwl.core.user.event.LoadLoginUserInfoEvent; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.ArrayList; +import java.util.List; + +/** + * create by lvzebiao @2020/1/7 + */ + +public class SquareFragment extends BaseFragment implements ContactsIndicatorAdapter.OnItemSelectListener, View.OnClickListener { + public static final String TAG = "SquareFragment"; + /** + * 关注 + */ + public static final int TAB_TYPE_ATTENT = 0; + /** + * 推荐 + */ + public static final int TAB_TYPE_RECOMMEND = 1; + /** + * 最新 + */ + public static final int TAB_TYPE_NEW = 2; + + private MagicIndicator magicIndicator; + private ViewPager2 viewPager; + private DragLayout ivSquarePublish; + private FrameLayout flContactList; + private View tvCommunityUnread; + + public static SquareFragment newInstance() { + return new SquareFragment(); + } + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + mView = inflater.inflate(R.layout.fragment_square, container, false); + magicIndicator = mView.findViewById(R.id.magic_indicator); + viewPager = mView.findViewById(R.id.view_pager); + ivSquarePublish = mView.findViewById(R.id.iv_square_publish); + flContactList = mView.findViewById(R.id.fl_contact_list); + tvCommunityUnread = mView.findViewById(R.id.msg_number); + EventBus.getDefault().register(this); + return mView; + } + + @Override + public void initiate() { + List fragmentPos = new ArrayList<>(); + fragmentPos.add(TAB_TYPE_ATTENT); + fragmentPos.add(TAB_TYPE_RECOMMEND); + fragmentPos.add(TAB_TYPE_NEW); + List tagList = new ArrayList<>(); + List fragmentList = new ArrayList<>(); + for (Integer integer : fragmentPos) { + if (integer == TAB_TYPE_ATTENT) { + tagList.add(getResources().getString(R.string.dys_tab_attent)); + } else if (integer == TAB_TYPE_RECOMMEND) { + tagList.add(getResources().getString(R.string.dys_tab_recommend)); + } else if (integer == TAB_TYPE_NEW) { + tagList.add(getResources().getString(R.string.dys_tab_new)); + } + fragmentList.add(SquareDynamicFragment.newInstance(integer)); + } + + getUnReadCount(); + + //init viewpager + + viewPager.setAdapter(new CommonVPAdapter(getChildFragmentManager(), getLifecycle(), fragmentList)); + viewPager.setOffscreenPageLimit(3); + viewPager.setUserInputEnabled(false); + + CommonNavigator commonNavigator = new CommonNavigator(getContext()); + ContactsIndicatorAdapter magicIndicatorAdapter = new ContactsIndicatorAdapter(getContext(), tagList); + magicIndicatorAdapter.setOnItemSelectListener(this); + commonNavigator.setTitleWrapContent(true); + commonNavigator.setAdapter(magicIndicatorAdapter); + magicIndicator.setNavigator(commonNavigator); + commonNavigator.getTitleContainer().setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE); + //init indicator + ViewPagerHelper.bind(magicIndicator, viewPager); + viewPager.post(new Runnable() { + @Override + public void run() { + viewPager.setCurrentItem(TAB_TYPE_RECOMMEND); + } + }); +// magicIndicator.onPageSelected(TAB_TYPE_RECOMMEND); + } + + @Override + public void onItemSelect(int position, TextView view) { + viewPager.setCurrentItem(position); + } + + @Override + public void onSetListener() { + if (ivSquarePublish != null) { + ivSquarePublish.setOnClickListener(this); + } + if (flContactList != null) { + flContactList.setOnClickListener(this); + } + if (ivSquarePublish != null) { + ivSquarePublish.setOnClickListener(this); + } + } + + @Override + public void onClick(View v) { + switch (v.getId()) { + case R.id.iv_square_publish: + PublishActivity.start(getDialogManager()); + break; + + case R.id.fl_contact_list: + CommunityNoticeAct.start(mContext); + break; + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onUnReadCount(UnReadCountEvent event) { + setNumber(event.getTotal()); + } + + @SuppressLint("SetTextI18n") + public void setNumber(int number) { + tvCommunityUnread.setVisibility(number <= 0 ? GONE : VISIBLE); + } + + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onLoginUserInfoUpdateEvent(LoadLoginUserInfoEvent event) { + getUnReadCount(); + } + + @SuppressWarnings("CheckResult") + private void getUnReadCount() { + HomeModel.INSTANCE.getUnreadCount(AuthModel.get().getCurrentUid()) + .compose(bindToLifecycle()) + .subscribe((integer, throwable) -> { + if (integer != null) { + EventBus.getDefault().post(new UnReadCountEvent(integer)); + } + }); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + EventBus.getDefault().unregister(this); + } + +} + diff --git a/app/src/module_community/java/com/chwl/app/community/square/adapter/SquareDynamicAdapter.java b/app/src/module_community/java/com/chwl/app/community/square/adapter/SquareDynamicAdapter.java new file mode 100644 index 000000000..64812c625 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/square/adapter/SquareDynamicAdapter.java @@ -0,0 +1,250 @@ +package com.chwl.app.community.square.adapter; + +import android.content.Context; +import android.text.TextUtils; +import android.util.SparseBooleanArray; +import android.util.SparseIntArray; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.netease.nim.uikit.support.glide.GlideApp; +import com.chwl.app.R; +import com.chwl.app.UIHelper; +import com.chwl.app.community.dynamic.view.DynamicDetailActivity; +import com.chwl.app.community.helper.DynamicUiHelper; +import com.chwl.app.community.utils.TopicUpTextWrapper; +import com.chwl.app.community.widget.DynamicNickDetailWidget; +import com.chwl.app.community.widget.ExpandableTextView; +import com.chwl.app.community.widget.GridImageWidget; +import com.chwl.app.community.widget.TopicLabelWidget; +import com.chwl.app.ui.utils.ImageLoadUtilsV2; +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil; +import com.chwl.app.utils.TimeUiUtils; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.dynamic.DynamicModel; +import com.chwl.core.noble.NobleUtil; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.SingleToastUtil; + +import java.util.List; + +/** + * create by lvzebiao @2019/11/13 + */ +public class SquareDynamicAdapter extends BaseQuickAdapter { + + private SparseBooleanArray mCollapsedStatus = new SparseBooleanArray(); + private SparseIntArray mCollapsedHeightStatus = new SparseIntArray(2); + + private Context context; + + private int iconWidth; + + private int iconHeight; + + /** + * 有文本的图片布局的top-margin + */ + private int imageTmHasText; + /** + * 无文本的图片布局的top-margin + */ + private int imageTmNoText; + /** + * 图片的边界值 + */ + private int dividerDp; + + private int rvWidth; + + + public SquareDynamicAdapter(Context context) { + super(R.layout.item_square_dynamic); + this.context = context; + iconWidth = UIUtil.dip2px(context, 32); + iconHeight = UIUtil.dip2px(context, 15); + imageTmHasText = UIUtil.dip2px(context, 12f); + imageTmNoText = UIUtil.dip2px(context, 7.5f); + //0.68 + int screenWidth = UIUtil.getScreenWidth(context); + dividerDp = 9; + rvWidth = screenWidth - UIUtil.dip2px(context, 86); + } + + @Override + protected void convert(BaseViewHolder helper, WorldDynamicBean item) { + //这个值,有没有文本UI部分,改变图片部分的margin + boolean noTextUi = TextUtils.isEmpty(item.getContent()); + + helper.setText(R.id.tv_nick, item.getNick()); + GridImageWidget widgetImage = helper.getView(R.id.widget_image); + widgetImage.setDividerDp(dividerDp); + widgetImage.setRvWidth(rvWidth); + widgetImage.setData(item, noTextUi ? imageTmNoText : imageTmHasText); + + //头饰 贵族头饰 + ImageView ivHeadWear = helper.getView(R.id.iv_head_wear); + GlideApp.with(ivHeadWear.getContext()).clear(ivHeadWear); + String headwearEffect = item.getHeadwearEffect(); + String headwearPic = item.getHeadwearPic(); + String micDecorate = item.getMicDecorate(); + if (TextUtils.isEmpty(headwearEffect) && TextUtils.isEmpty(headwearPic) && TextUtils.isEmpty(micDecorate)) { + ivHeadWear.setVisibility(View.GONE); + } else { + ivHeadWear.setVisibility(View.VISIBLE); + } + + if (!TextUtils.isEmpty(headwearEffect)) { + NobleUtil.loadHeadWear(headwearEffect, ivHeadWear); + } else if (!TextUtils.isEmpty(headwearPic)) { + NobleUtil.loadHeadWear(headwearPic, ivHeadWear); + } else if (!TextUtils.isEmpty(micDecorate)) { + NobleUtil.loadResource(micDecorate, ivHeadWear); + } else { + ivHeadWear.setImageDrawable(null); + } + + //头像 + ImageLoadUtilsV2.loadImage(helper.getView(R.id.iv_avatar), item.getAvatar()); + + DynamicNickDetailWidget widget = helper.getView(R.id.widget_nick_detail); + widget.setData(item); + //widget.setTime(item.getPublishTime()); + final String time = TimeUiUtils.getDynamicUi(item.getPublishTime()); + helper.setGone(R.id.tv_time_publish, !TextUtils.isEmpty(time)); + helper.setText(R.id.tv_time_publish, time); + helper.setGone(R.id.iv_in_room, item.getInRoomUid() != null); + + ExpandableTextView etvContent = helper.getView(R.id.etv_content); + etvContent.setEventType(4); + if (noTextUi && item.getSquareTop() == 0) { + etvContent.setVisibility(View.GONE); + } else { + etvContent.setVisibility(View.VISIBLE); + CharSequence formatText = DynamicUiHelper.formatFirstDynamicContent( + item, etvContent.mTv, iconWidth, iconHeight); + if (item.getSquareTop() == 1) { + //置顶 + formatText = TopicUpTextWrapper.INSTANCE.wrapUp(formatText, context); + } + etvContent.setText(formatText, mCollapsedStatus, helper.getAdapterPosition(), mCollapsedHeightStatus); + } + + //标签 + final List labels = item.getLabelList(); + if (labels != null) { + ((TopicLabelWidget) helper.getView(R.id.topicView)).setLabels(labels); + } + + //评论 + setCommentCount(helper, item.getCommentCount()); + + //点赞 + setLikeCount(helper, item.getLikeCount(), item.isLike(), false); + LinearLayout llLike = helper.getView(R.id.ll_like); + llLike.setEnabled(true); + llLike.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + llLike.setEnabled(false); + int status = item.isLike() ? 0 : 1; + DynamicModel.get().like(item.getWorldId(), item.getDynamicId(), item.getUid(), status, 4) + .compose(RxHelper.bindContext(context)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + llLike.setEnabled(true); + if (error != null) { + SingleToastUtil.showToast(error); + } else { + LogUtil.print(ResUtil.getString(R.string.square_adapter_squaredynamicadapter_01)); + if (status == 1) { + item.setLikeCount(item.getLikeCount() + 1); + } else { + item.setLikeCount(item.getLikeCount() - 1); + } + item.setLike(status == 1); + setLikeCount(helper, item.getLikeCount(), item.isLike(), true); + } + } + }); + } + }); + //评论 + helper.getView(R.id.ll_comment).setOnClickListener(v -> { + DynamicDetailActivity.start(context, item.getDynamicId(), item.getWorldId(), + helper.getAdapterPosition(), true, 6); + } + ); + + View.OnClickListener toDetailListener = v -> + DynamicDetailActivity.start(context, item.getDynamicId(), item.getWorldId(), + helper.getAdapterPosition(), false, 6); + + if (etvContent.mTv != null) { + etvContent.mTv.setOnClickListener(toDetailListener); + } + + //跳转去详情 + helper.itemView.setOnClickListener(toDetailListener); + + helper.addOnClickListener(R.id.iv_more) + .addOnClickListener(R.id.ll_share) + .addOnClickListener(R.id.iv_in_room); + + View.OnClickListener userInfoActClick = v -> UIHelper.showUserInfoAct(context, item.getUid()); + helper.getView(R.id.iv_avatar).setOnClickListener(userInfoActClick); + helper.getView(R.id.widget_nick_detail).setOnClickListener(userInfoActClick); + + //话题 + helper.setGone(R.id.tv_mini_world_name, false); + helper.setGone(R.id.space_view, false); +// helper.setGone(R.id.tv_mini_world_name, item.getWorldId() > 0); +// helper.setGone(R.id.space_view, item.getWorldId() > 0); +// helper.setText(R.id.tv_mini_world_name, item.getWorldName()); +// helper.getView(R.id.tv_mini_world_name).setOnClickListener(v -> { +// TopicMainActivity.start(context, String.valueOf(item.getWorldId())); +// }); + } + + private void setLikeCount(BaseViewHolder helper, int likeCount, boolean isLike, boolean isAnim) { + TextView tvLike = helper.getView(R.id.tv_like); + String likeCountStr; + if (likeCount < 0) { + likeCountStr = "0"; + } else if (likeCount >= 1000) { + likeCountStr = "999+"; + } else { + likeCountStr = String.valueOf(likeCount); + } + tvLike.setText(likeCountStr); + + ImageView ivLikeAnim = helper.getView(R.id.iv_like_pic); + if (isLike) { + ivLikeAnim.setImageResource(R.drawable.icon_square_dynamic_like_checked); + } else { + ivLikeAnim.setImageResource(R.drawable.icon_square_dynamic_like_normal); + } + } + + private void setCommentCount(BaseViewHolder helper, int commentCount) { + TextView tvComment = helper.getView(R.id.tv_comment); + String commentCountStr; + if (commentCount < 0) { + commentCountStr = "0"; + } else if (commentCount >= 1000) { + commentCountStr = "999+"; + } else { + commentCountStr = String.valueOf(commentCount); + } + tvComment.setText(commentCountStr); + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/user_dynamic/IUserDynamicView.java b/app/src/module_community/java/com/chwl/app/community/user_dynamic/IUserDynamicView.java new file mode 100644 index 000000000..e03531daf --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/user_dynamic/IUserDynamicView.java @@ -0,0 +1,17 @@ +package com.chwl.app.community.user_dynamic; + +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.library.base.IMvpBaseView; + +import java.util.List; + +public interface IUserDynamicView extends IMvpBaseView { + void refreshSuccess(List list); + void refreshFail(String error); + + void loadSuccess(List list); + void loadFail(String error); + + void deleteSuccess(long successId); + void deleteFail(String error); +} diff --git a/app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicAdapter.java b/app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicAdapter.java new file mode 100644 index 000000000..cd7f92bbe --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicAdapter.java @@ -0,0 +1,285 @@ +package com.chwl.app.community.user_dynamic; + +import android.app.Activity; +import android.content.Context; +import android.graphics.drawable.AnimationDrawable; +import android.text.TextUtils; +import android.util.SparseBooleanArray; +import android.util.SparseIntArray; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.chad.library.adapter.base.BaseMultiItemQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.chwl.app.photo.BigPhotoActivity; +import com.chwl.app.photo.PagerOption; +import com.netease.nim.uikit.common.util.log.LogUtil; +import com.chwl.app.R; +import com.chwl.app.community.helper.CalcSize; +import com.chwl.app.community.helper.ImageUiHelper; +import com.chwl.app.photo.DynamicImageAdapter; +import com.chwl.app.community.utils.ObjectTypeHelper; +import com.chwl.app.community.widget.ExpandableTextView; +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil; +import com.chwl.app.ui.widget.recyclerview.decoration.GridSpacingItemDecoration; +import com.chwl.core.community.bean.DynamicMedia; +import com.chwl.core.community.bean.UserDynamicItem; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.dynamic.DynamicModel; +import com.chwl.core.utils.net.DontWarnObserver; +import com.chwl.core.utils.net.RxHelper; +import com.chwl.library.utils.ResUtil; +import com.chwl.library.utils.ScreenUtils; +import com.chwl.library.utils.SingleToastUtil; +import com.chwl.library.utils.TimeUtils; + +import java.util.ArrayList; +import java.util.List; + +public class UserDynamicAdapter extends BaseMultiItemQuickAdapter { + private long currentUid; + private SparseBooleanArray mCollapsedStatus = new SparseBooleanArray(); + private SparseIntArray mCollapsedHeightStatus = new SparseIntArray(2); + + private int imageBorder; + /** + * 这个divider是因为使用的分割线 + * 默认为top和bottom添加了5dp + */ + private int divider; + + // 图片宽高一致 + private int mTwoImageHeight; + private int mThreeImageHeight; + + public UserDynamicAdapter(Context context, long currentUid) { + super(new ArrayList<>()); + this.currentUid = currentUid; + addItemType(UserDynamicItem.TYPE_DYNAMIC, R.layout.item_user_dynamic_list); + addItemType(UserDynamicItem.TYPE_EMPTY, R.layout.item_empty_list); + addItemType(UserDynamicItem.TYPE_FIRST_DIVIDER, R.layout.layout_divider_12); + imageBorder = (UIUtil.getScreenWidth(context) - UIUtil.dip2px(context, 17+29)) + * ImageUiHelper.BORDER_MIN / ImageUiHelper.BORDER_MAX; + divider = UIUtil.dip2px(context, 10); + + mTwoImageHeight = (ScreenUtils.getScreenWidth(context) - UIUtil.dip2px(context, 17 + 29 + 22.5 + 20 + 10)) / 2; + mThreeImageHeight = (ScreenUtils.getScreenWidth(context) - UIUtil.dip2px(context, 17 + 29 + 22.5 + 20 + 20)) / 3; + } + + @Override + protected void convert(BaseViewHolder helper, UserDynamicItem item) { + + if (item == null) { + return; + } + + switch (item.getItemType()) { + case UserDynamicItem.TYPE_DYNAMIC: + setDynamic(helper, item); + break; + + case UserDynamicItem.TYPE_EMPTY: + break; + } + } + + private void setDynamic(BaseViewHolder helper, UserDynamicItem item) { + WorldDynamicBean userDynamicInfo = (WorldDynamicBean) item.getData(); + if (userDynamicInfo == null) { + return; + } + + List list = getData(); + int position = list.indexOf(item); + helper.setGone(R.id.v_divider_user_dynamic, position != (list.size() - 1)); + + helper.setGone(R.id.rv_img, false); + helper.setGone(R.id.fl_multi_media_dynamic_list, false); + + switch (userDynamicInfo.getType()) { + case 0: + helper.setImageResource(R.id.iv_type_img_dynamic_list, R.drawable.ic_text_dynamic); + break; + case 1: + helper.setImageResource(R.id.iv_type_img_dynamic_list, R.drawable.ic_voice_dynamic); + break; + case 2: + helper.setImageResource(R.id.iv_type_img_dynamic_list, R.drawable.ic_img_dynamic) + .setGone(R.id.fl_multi_media_dynamic_list, true); + setPhoto(helper, userDynamicInfo); + break; + case 3: + helper.setImageResource(R.id.iv_type_img_dynamic_list, R.drawable.ic_video_dynamic); + break; + } + + if (userDynamicInfo.isSystemDynamic()) { // 系统为未发布过动态的用户自动生成的动态 + helper.setImageResource(R.id.iv_type_img_dynamic_list, R.drawable.ic_text_dynamic) + .setGone(R.id.cl_bottom_user_dynamic_list, false); + } else { + helper.setGone(R.id.cl_bottom_user_dynamic_list, true); + } + + + String time = TimeUtils.getTimeStringFromMillis(userDynamicInfo.getPublishTime()); + if (!TextUtils.isEmpty(time)) { + helper.setText(R.id.tv_time_dynamic_list, time); + } + + if (!TextUtils.isEmpty(userDynamicInfo.getTag())) { + helper.setText(R.id.tv_name_mini_world, userDynamicInfo.getTag()) + .setVisible(R.id.tv_name_mini_world, true); + } else { + helper.setVisible(R.id.tv_name_mini_world, false); + } + + ExpandableTextView etvTranslateContent = helper.getView(R.id.tv_content_dynamic_list); + etvTranslateContent.setEventType(2); + String content = userDynamicInfo.getContent(); + if (TextUtils.isEmpty(content)) { + etvTranslateContent.setVisibility(View.GONE); + } else { + etvTranslateContent.setVisibility(View.VISIBLE); + etvTranslateContent.setText(content, mCollapsedStatus, helper.getAdapterPosition(), mCollapsedHeightStatus); + } + + helper.setText(R.id.tv_comment_user_dynamic_list, getNumString(userDynamicInfo.getCommentCount())); + + helper.addOnClickListener(R.id.tv_comment_user_dynamic_list) + .addOnClickListener(R.id.iv_share_user_dynamic_list) + .addOnClickListener(R.id.iv_more_user_dynamic_list) + .addOnClickListener(R.id.cl_item_dynamic_list) + .addOnClickListener(R.id.tv_name_mini_world); + + setLikeCount(helper, userDynamicInfo.getLikeCount(), userDynamicInfo.isLike(), false); + LinearLayout llLike = helper.getView(R.id.ll_like_user_dynamic_list); + long worldId = userDynamicInfo.getWorldId(); + long dynamicId = userDynamicInfo.getDynamicId(); + // 点赞 + llLike.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + llLike.setEnabled(false); + int status = userDynamicInfo.isLike() ? 0 : 1; + DynamicModel.get().like(worldId, dynamicId, currentUid, status, 2) + .compose(RxHelper.bindContext(mContext)) + .subscribe(new DontWarnObserver() { + @Override + public void accept(String s, String error) { + super.accept(s, error); + llLike.setEnabled(true); + if (error != null) { + SingleToastUtil.showToast(error); + } else { + LogUtil.print(ResUtil.getString(R.string.community_user_dynamic_userdynamicadapter_01)); + if (status == 1) { + userDynamicInfo.setLikeCount(userDynamicInfo.getLikeCount() + 1); + } else { + userDynamicInfo.setLikeCount(userDynamicInfo.getLikeCount() - 1); + } + userDynamicInfo.setLike(status == 1); + setLikeCount(helper, userDynamicInfo.getLikeCount(), userDynamicInfo.isLike(), true); + } + } + }); + } + }); + + } + + private void setPhoto(BaseViewHolder helper, WorldDynamicBean userDynamicInfo) { + RecyclerView rvImage = helper.getView(R.id.rv_img); + rvImage.setNestedScrollingEnabled(false); + try { + rvImage.removeItemDecorationAt(0); + + } catch (Exception ex) { + ex.printStackTrace(); + } + List imageUrl = userDynamicInfo.getDynamicResList(); + if (imageUrl != null && imageUrl.size() > 0) { + CalcSize calcSize = new CalcSize(imageBorder); + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) rvImage.getLayoutParams(); + if (imageUrl.size() > 1) { + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + } else { + //单图的情况,按比例显示 + DynamicMedia media = null; + if (imageUrl.size() > 0) { + media = imageUrl.get(0); + } + if (media == null) { + return; + } + calcSize = ImageUiHelper.calcImage(media, imageBorder); + params.width = calcSize.width; + params.height = calcSize.height + divider; + } + rvImage.setLayoutParams(params); + + rvImage.setVisibility(View.VISIBLE); + rvImage.setLayoutManager(new GridLayoutManager(mContext, imageUrl.size() > 2 ? 3 : imageUrl.size())); + rvImage.addItemDecoration(new GridSpacingItemDecoration(mContext, imageUrl.size() > 2 ? 3 : imageUrl.size(), 10)); + DynamicImageAdapter adapter = new DynamicImageAdapter(R.layout.item_user_dynamic_image, imageUrl); + adapter.setSingleImageHeight(calcSize.height); + adapter.setMTwoImageHeight(mTwoImageHeight); + adapter.setMThreeImageHeight(mThreeImageHeight); + adapter.setOnItemClickListener((adapter1, view, position) -> { + PagerOption option = new PagerOption().setSave(true); + BigPhotoActivity.start((Activity) mContext, ObjectTypeHelper.mediaToCustomList(imageUrl), + position, option); + } + ); + rvImage.setAdapter(adapter); + + } else { + rvImage.setVisibility(View.GONE); + + } + + } + + private String getNumString(int count) { + String countStr; + if (count < 0) { + countStr = "0"; + } else if (count >= 1000) { + countStr = "999+"; + } else { + countStr = String.valueOf(count); + } + + return countStr; + + } + + private void setLikeCount(BaseViewHolder helper, int likeCount, boolean isLike, boolean isAnim) { + TextView tvLike = helper.getView(R.id.tv_like_user_dynamic_list); + String likeCountStr = getNumString(likeCount); + tvLike.setText(likeCountStr); + + ImageView ivLikeAnim = helper.getView(R.id.iv_like_anim); + if (isLike) { + if (isAnim) { + AnimationDrawable drawable = (AnimationDrawable) mContext.getResources() + .getDrawable(R.drawable.anim_list_dy_like); + ivLikeAnim.setImageDrawable(drawable); + drawable.stop(); + drawable.start(); + } else { + ivLikeAnim.setImageResource(R.drawable.icon_dy_list_like_00013); + } + } else { + ivLikeAnim.setImageResource(R.drawable.icon_dy_list_like_false); + } + + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicFrg.java b/app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicFrg.java new file mode 100644 index 000000000..2f956da02 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicFrg.java @@ -0,0 +1,258 @@ +package com.chwl.app.community.user_dynamic; + +import android.os.Bundle; +import android.view.View; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chwl.app.R; +import com.chwl.app.UIHelper; +import com.chwl.app.base.BaseMvpFragment; +import com.chwl.app.common.widget.dialog.DialogManager; +import com.chwl.app.community.dynamic.view.DynamicDetailActivity; +import com.chwl.app.community.helper.ShareDynamicHelper; +import com.chwl.app.ui.widget.ButtonItem; +import com.chwl.core.XConstants; +import com.chwl.core.auth.AuthModel; +import com.chwl.core.community.bean.UserDynamicItem; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.library.base.factory.CreatePresenter; +import com.chwl.library.utils.ResUtil; + +import java.util.ArrayList; +import java.util.List; + +@CreatePresenter(UserDynamicPresenter.class) +public class UserDynamicFrg extends BaseMvpFragment implements IUserDynamicView { + + private UserDynamicAdapter mUserDynamicAdapter; + + private RecyclerView recyclerView; + private SwipeRefreshLayout swipeRefreshLayout; + + private WorldDynamicBean currentUserDynamic; + + public static UserDynamicFrg newInstance(long userId) { + UserDynamicFrg userDynamicFrg = new UserDynamicFrg(); + Bundle bundle = new Bundle(); + bundle.putLong("userId", userId); + userDynamicFrg.setArguments(bundle); + return userDynamicFrg; + } + + @Override + protected void onInitArguments(Bundle bundle) { + super.onInitArguments(bundle); + if (bundle != null) { + long userId = bundle.getLong("userId", 0); + getMvpPresenter().setUserId(userId); + } + } + + @Override + public int getRootLayoutId() { + return R.layout.frg_user_dynamic; + } + + @Override + public void onFindViews() { + recyclerView = mView.findViewById(R.id.recycler_view); + swipeRefreshLayout = mView.findViewById(R.id.srl_user_dynamic); + } + + @Override + public void onSetListener() { + + } + + @Override + public void initiate() { + getMvpPresenter().setFromUid(AuthModel.get().getCurrentUid()); + + swipeRefreshLayout.setOnRefreshListener(() -> getMvpPresenter().refreshData()); + + mUserDynamicAdapter = new UserDynamicAdapter(getActivity(), getMvpPresenter().getUserId()); + mUserDynamicAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() { + @Override + public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { + + List list = adapter.getData(); + if (position < list.size()) { + UserDynamicItem userDynamicItem = list.get(position); + if (userDynamicItem.getItemType() == UserDynamicItem.TYPE_DYNAMIC) { + WorldDynamicBean userDynamicInfo = (WorldDynamicBean) userDynamicItem.getData(); + if (userDynamicInfo != null) { + currentUserDynamic = userDynamicInfo; + + switch (view.getId()) { + // 点赞在adapter + case R.id.tv_comment_user_dynamic_list:// 评论 + DynamicDetailActivity.start(mContext, userDynamicInfo.getDynamicId(), + userDynamicInfo.getWorldId(), true, 2); + break; + + case R.id.iv_share_user_dynamic_list:// 分享 + if (currentUserDynamic.getStatus() == 1) { + new ShareDynamicHelper(getActivity()).share(userDynamicInfo, userDynamicInfo.getWorldId()); + } else if (currentUserDynamic.getStatus() == 0) { + toast(ResUtil.getString(R.string.community_user_dynamic_userdynamicfrg_03)); + } else if (currentUserDynamic.getStatus() == 2) { + toast(ResUtil.getString(R.string.community_user_dynamic_userdynamicfrg_04)); + } + break; + + case R.id.iv_more_user_dynamic_list: // 更多 + showMoreOptions(); + break; + +// case R.id.tv_name_mini_world: // 话题 +// TopicMainActivity.start(mContext, +// String.valueOf(currentUserDynamic.getWorldId())); +// break; + + case R.id.cl_item_dynamic_list: // 动态详情 + if (!userDynamicInfo.isSystemDynamic()) { + DynamicDetailActivity.start(mContext, userDynamicInfo.getDynamicId(), + userDynamicInfo.getWorldId(), 2); + } + break; + } + + } + } + } + } + }); + recyclerView.setLayoutManager(new LinearLayoutManager(mContext, + LinearLayoutManager.VERTICAL, false)); + recyclerView.setAdapter(mUserDynamicAdapter); + mUserDynamicAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() { + @Override + public void onLoadMoreRequested() { + getMvpPresenter().loadMore(); + + } + }, recyclerView); + + getMvpPresenter().refreshData(); + } + + @Override + public void refreshSuccess(List list) { + swipeRefreshLayout.setRefreshing(false); + if (mUserDynamicAdapter != null) { +// mUserDynamicAdapter.resetStatus(); + List tempList = getMvpPresenter().modifyData(list, true); + mUserDynamicAdapter.setNewData(tempList); + mUserDynamicAdapter.loadMoreComplete(); + } + + } + + @Override + public void refreshFail(String error) { + swipeRefreshLayout.setRefreshing(false); + List userDynamicItems = new ArrayList<>(1); + userDynamicItems.add(new UserDynamicItem(UserDynamicItem.TYPE_EMPTY)); + if (mUserDynamicAdapter != null) { + mUserDynamicAdapter.setNewData(userDynamicItems); + mUserDynamicAdapter.setEnableLoadMore(false); + } + + } + + @Override + public void loadSuccess(List list) { + mUserDynamicAdapter.loadMoreComplete(); + if (mUserDynamicAdapter != null) { + List tempList = getMvpPresenter().modifyData(list, false); + mUserDynamicAdapter.addData(tempList); + } + + } + + @Override + public void loadFail(String error) { + mUserDynamicAdapter.loadMoreComplete(); + mUserDynamicAdapter.loadMoreEnd(); + } + + @Override + public void deleteSuccess(long dynamicId) { + + if (mUserDynamicAdapter != null) { + List list = mUserDynamicAdapter.getData(); + + int currentPosition = -1; + for (int i = 0; i < list.size(); i++) { + WorldDynamicBean userDynamicInfo = (WorldDynamicBean) (list.get(i)).getData(); + // 第一个item为分割线,需要判断data是否为空 + if (userDynamicInfo != null && userDynamicInfo.getDynamicId() == dynamicId) { + currentPosition = i; + break; + } + } + + if (currentPosition > -1 && currentPosition < list.size()) { + mUserDynamicAdapter.remove(currentPosition); + } + } + + } + + @Override + public void deleteFail(String error) { + toast(error); + } + + private void showMoreOptions() { + if (getMvpPresenter().isOwner()) { + showDeleteOption(); + + } else { + showReportOption(); + } + + } + + private void showReportOption() { + ButtonItem buttonItem1 = new ButtonItem(ResUtil.getString(R.string.community_user_dynamic_userdynamicfrg_09), () -> { + if (currentUserDynamic != null) { + UIHelper.showReportPage(mContext, currentUserDynamic.getUid(), + XConstants.REPORT_TYPE_PERSONAL_DYNAMIC); + } + }); + List buttonItems = new ArrayList<>(); + buttonItems.add(buttonItem1); + getDialogManager().showCommonPopupDialog(buttonItems, ResUtil.getString(R.string.community_user_dynamic_userdynamicfrg_010), false); + + } + + private void showDeleteOption() { + ButtonItem buttonItem1 = new ButtonItem(ResUtil.getString(R.string.community_user_dynamic_userdynamicfrg_011), () -> { + secondDeleteDialog(); + }); + List buttonItems = new ArrayList<>(); + buttonItems.add(buttonItem1); + getDialogManager().showCommonPopupDialog(buttonItems, ResUtil.getString(R.string.community_user_dynamic_userdynamicfrg_012), false); + } + + private void secondDeleteDialog() { + getDialogManager().showOkCancelDialog(ResUtil.getString(R.string.community_user_dynamic_userdynamicfrg_013), + ResUtil.getString(R.string.community_user_dynamic_userdynamicfrg_014), + ResUtil.getString(R.string.community_user_dynamic_userdynamicfrg_015), ResUtil.getString(R.string.community_user_dynamic_userdynamicfrg_016), + new DialogManager.OkCancelDialogListener() { + @Override + public void onOk() { + if (currentUserDynamic != null) { + getMvpPresenter().deleteDynamic(currentUserDynamic.getWorldId(), + currentUserDynamic.getDynamicId()); + } + } + }); + + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicPresenter.java b/app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicPresenter.java new file mode 100644 index 000000000..fbb50c264 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/user_dynamic/UserDynamicPresenter.java @@ -0,0 +1,146 @@ +package com.chwl.app.community.user_dynamic; + +import android.annotation.SuppressLint; + +import androidx.annotation.Keep; + +import com.chwl.app.R; +import com.chwl.app.base.BaseMvpPresenter; +import com.chwl.core.Constants; +import com.chwl.core.community.bean.UserDynamicItem; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.core.community.dynamic.DynamicModel; +import com.chwl.core.user.UserDynamicModel; +import com.chwl.library.utils.ResUtil; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.functions.BiConsumer; + +@Keep +public class UserDynamicPresenter extends BaseMvpPresenter { + + private int page = Constants.PAGE_START; + private int pageSize = Constants.PAGE_SIZE; + private String types = "0,2"; // 0-纯文本 1-语音 2-图片 3-视频 + private UserDynamicModel userDynamicModel = new UserDynamicModel(); + private long userId; + private long fromUid; + + @SuppressLint("CheckResult") + public void refreshData() { + page = Constants.PAGE_START; + + userDynamicModel.getMyDynamic(userId, types, page, pageSize, fromUid) + .compose(bindToLifecycle()) + .subscribe(new BiConsumer, Throwable>() { + @Override + public void accept(List userDynamicInfos, Throwable throwable) throws Exception { + if (throwable == null) { + if (userDynamicInfos != null && userDynamicInfos.size() > 0) { + if (mMvpView != null) { + mMvpView.refreshSuccess(userDynamicInfos); + } + } else { + if (mMvpView != null) { + mMvpView.refreshFail(ResUtil.getString(R.string.community_user_dynamic_userdynamicpresenter_01)); + } + + } + + } else { + if (mMvpView != null) { + mMvpView.refreshFail(throwable.getMessage()); + } + } + + } + }); + } + + @SuppressLint("CheckResult") + public void loadMore() { + page++; + + userDynamicModel.getMyDynamic(userId, types, page, pageSize, fromUid) + .compose(bindToLifecycle()) + .subscribe(new BiConsumer, Throwable>() { + @Override + public void accept(List userDynamicInfos, Throwable throwable) throws Exception { + if (throwable == null) { + if (userDynamicInfos != null && userDynamicInfos.size() > 0) { + if (mMvpView != null) { + mMvpView.loadSuccess(userDynamicInfos); + } + } else { + if (mMvpView != null) { + mMvpView.loadFail(ResUtil.getString(R.string.community_user_dynamic_userdynamicpresenter_02)); + } + } + + } else { + page--; + if (mMvpView != null) { + mMvpView.loadFail(throwable.getMessage()); + } + } + + } + }); + } + + public List modifyData(List list, boolean isFirst) { + List tempList = new ArrayList<>(); + if (isFirst) { + UserDynamicItem userDynamicItem = new UserDynamicItem(UserDynamicItem.TYPE_FIRST_DIVIDER); + tempList.add(userDynamicItem); + } + for (WorldDynamicBean userDynamicInfo : list) { + UserDynamicItem userDynamicItem = new UserDynamicItem(UserDynamicItem.TYPE_DYNAMIC, + userDynamicInfo); + tempList.add(userDynamicItem); + } + + return tempList; + } + + @SuppressLint("CheckResult") + public void deleteDynamic(long worldId, long dynamicId) { + DynamicModel.get().delete(worldId, dynamicId) + .compose(bindToLifecycle()) + .subscribe(new BiConsumer() { + @Override + public void accept(String s, Throwable throwable) throws Exception { + + if (throwable == null) { + if (mMvpView != null) { + mMvpView.deleteSuccess(dynamicId); + } + } else { + if (mMvpView != null) { + mMvpView.deleteFail(throwable.getMessage()); + } + } + + } + }); + } + + public void setUserId(long userId) { + this.userId = userId; + } + + public long getUserId() { + return userId; + } + + public void setFromUid(long fromUid) { + this.fromUid = fromUid; + } + + public boolean isOwner() { + return fromUid == userId; + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/utils/ObjectTypeHelper.java b/app/src/module_community/java/com/chwl/app/community/utils/ObjectTypeHelper.java new file mode 100644 index 000000000..933affb12 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/utils/ObjectTypeHelper.java @@ -0,0 +1,81 @@ +package com.chwl.app.community.utils; + +import com.chwl.core.community.bean.DynamicMedia; +import com.example.matisse.internal.entity.CustomItem; + +import java.util.ArrayList; +import java.util.List; + +/** + * create by lvzebiao @2019/11/19 + */ +public class ObjectTypeHelper { + + public static List customToStringList(List paramsList) { + List resultList = new ArrayList<>(); + if (paramsList == null) { + return resultList; + } + for (CustomItem item : paramsList) { + resultList.add(item.getPath()); + } + return resultList; + } + + public static List customToMediaList(List paramsList) { + List resultList = new ArrayList<>(); + if (paramsList == null) { + return resultList; + } + for (CustomItem item : paramsList) { + DynamicMedia media = new DynamicMedia(); + media.setLocalFilePath(item.getPath()); + media.setWidth(item.getWidth()); + media.setHeight(item.getHeight()); + media.setFormat(item.getFormat()); + resultList.add(media); + } + return resultList; + } + + public static List stringToCustomList(List paramsList) { + List resultList = new ArrayList<>(); + if (paramsList == null) { + return resultList; + } + for (String item : paramsList) { + resultList.add(new CustomItem(item, 0)); + } + return resultList; + } + + public static ArrayList mediaToCustomList(List paramsList) { + ArrayList resultList = new ArrayList<>(); + if (paramsList == null) { + return resultList; + } + for (DynamicMedia media : paramsList) { + CustomItem item = new CustomItem(); + item.setPath(media.getResUrl()); + item.setFileType(CustomItem.UNKOWN); + if (media.isJpgOrPng()) { + item.setFileType(CustomItem.IMAGE_NORMAL); + } else if (media.isGif()) { + item.setFileType(CustomItem.GIF); + } + item.setFormat(media.getFormat()); + resultList.add(item); + } + return resultList; + } + + public static ArrayList pathToCustomItems(String path) { + ArrayList resultList = new ArrayList<>(); + CustomItem item = new CustomItem(); + item.setPath(path); + item.setFileType(CustomItem.UNKOWN); + resultList.add(item); + return resultList; + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/utils/TopicUpTextWrapper.kt b/app/src/module_community/java/com/chwl/app/community/utils/TopicUpTextWrapper.kt new file mode 100644 index 000000000..2e92fffb2 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/utils/TopicUpTextWrapper.kt @@ -0,0 +1,34 @@ +package com.chwl.app.community.utils + +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.Drawable +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.ForegroundColorSpan +import com.chwl.app.R +import com.chwl.app.common.widget.CustomImageSpan +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil +import com.chwl.library.utils.ResUtil + +object TopicUpTextWrapper { + + //置顶 后期优化结构 + fun wrapUp(originText: CharSequence, context: Context): SpannableStringBuilder? { + val drawable: Drawable = context.resources.getDrawable(R.drawable.topic_up_drawable) + drawable.setBounds(0, 0, UIUtil.dip2px(context, 10.0), UIUtil.dip2px(context, 12.0)) + val builder = SpannableStringBuilder() + builder.append("-") + builder.append(ResUtil.getString(R.string.community_utils_topicuptextwrapper_01)) + builder.setSpan(CustomImageSpan(drawable), 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE) + builder.setSpan( + ForegroundColorSpan(Color.parseColor("#E84C46")), + 1, + builder.length, + Spanned.SPAN_INCLUSIVE_EXCLUSIVE + ) + builder.append(" ") + builder.append(originText) + return builder + } +} \ No newline at end of file diff --git a/app/src/module_community/java/com/chwl/app/community/widget/DynamicNickDetailWidget.java b/app/src/module_community/java/com/chwl/app/community/widget/DynamicNickDetailWidget.java new file mode 100644 index 000000000..e722a66d4 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/widget/DynamicNickDetailWidget.java @@ -0,0 +1,99 @@ +package com.chwl.app.community.widget; + +import android.content.Context; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.ColorInt; +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.netease.nim.uikit.support.glide.GlideApp; +import com.chwl.app.R; +import com.chwl.app.ui.utils.ImageLoadUtils; +import com.chwl.app.utils.NamePlateHelper; +import com.chwl.app.utils.RegexUtil; +import com.chwl.app.utils.TimeUiUtils; +import com.chwl.app.view.GenderAgeTextView; +import com.chwl.app.vip.util.VipHelper; +import com.chwl.core.user.bean.BaseUserInfo; +import com.chwl.library.widget.ShapeConstrainLayout; + +/** + * create by lvzebiao @2019/11/26 + */ +public class DynamicNickDetailWidget extends ShapeConstrainLayout { + + private TextView tvNick; + private GenderAgeTextView tvGenderAge; + private ImageView ivVipIcon; + + private ImageView ivUserWealthLevel; + private ImageView ivUserCharmLevel; + + private ConstraintLayout inOfficialMask; + + private TextView tvTime; + + private Context context; + + public DynamicNickDetailWidget(Context context) { + this(context, null); + } + + public DynamicNickDetailWidget(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public DynamicNickDetailWidget(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + this.context = context; + init(context); + } + + private void init(Context context) { + inflate(context, R.layout.layout_dy_nick_detail, this); + + tvNick = findViewById(R.id.tv_nick); + tvGenderAge = findViewById(R.id.tv_gender_age); + ivVipIcon = findViewById(R.id.iv_vip_icon); + ivUserWealthLevel = findViewById(R.id.iv_user_wealth_level); + ivUserCharmLevel = findViewById(R.id.iv_user_charm_level); + inOfficialMask = findViewById(R.id.in_official_mask); + tvTime = findViewById(R.id.tv_time); + } + + public void setNickColor(@ColorInt int color) { + if (tvNick != null) { + tvNick.setTextColor(color); + } + } + + public void setTimeColor(@ColorInt int color) { + if (tvTime != null) { + tvTime.setTextColor(color); + } + } + + public void setData(BaseUserInfo info) { + tvNick.setText(RegexUtil.getPrintableString(info.getNick())); + tvGenderAge.setText(String.valueOf(info.getAge())); + tvGenderAge.setGender(info.getGender()); + //财富等级 + ImageLoadUtils.loadImage(context, info.getExperLevelPic(), ivUserWealthLevel); + //魅力等级 + ImageLoadUtils.loadImage(context, info.getCharmLevelPic(), ivUserCharmLevel); + //铭牌 + NamePlateHelper.INSTANCE.load(inOfficialMask, inOfficialMask.findViewById(R.id.tv_official_mask), inOfficialMask.findViewById(R.id.iv_official_mask), info.getNameplateWord(), info.getNameplatePic(), info.isCustomWord()); + VipHelper.loadVipIcon(ivVipIcon, info.getUserVipInfoVO()); + } + + public void setTime(long time) { + tvTime.setVisibility(View.VISIBLE); + tvTime.setText(TimeUiUtils.getDynamicUi(time)); + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/widget/ExpandableTextView.java b/app/src/module_community/java/com/chwl/app/community/widget/ExpandableTextView.java new file mode 100644 index 000000000..b47bff879 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/widget/ExpandableTextView.java @@ -0,0 +1,533 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * Copyright 2014 Manabu Shimobe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.chwl.app.community.widget; + +import android.annotation.TargetApi; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.SparseBooleanArray; +import android.util.SparseIntArray; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.animation.Transformation; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import androidx.annotation.DrawableRes; +import androidx.annotation.IdRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.chwl.app.R; +import com.chwl.library.utils.ResUtil; + +import lombok.Setter; + + +public class ExpandableTextView extends LinearLayout implements View.OnClickListener { + + private static final String TAG = ExpandableTextView.class.getSimpleName(); + + private static final int EXPAND_INDICATOR_IMAGE_BUTTON = 0; + + private static final int EXPAND_INDICATOR_TEXT_VIEW = 1; + + private static final int DEFAULT_TOGGLE_TYPE = EXPAND_INDICATOR_IMAGE_BUTTON; + + /* The default number of lines */ + private static final int MAX_COLLAPSED_LINES = 8; + + /* The default animation duration */ + private static final int DEFAULT_ANIM_DURATION = 300; + + /* The default alpha value when the animation starts */ + private static final float DEFAULT_ANIM_ALPHA_START = 0.7f; + + public TextView mTv; + + protected View mToggleView; // View to expand/collapse + + private boolean mRelayout; + + private boolean mCollapsed = true; // Show short version as default. + + private int mCollapsedHeight; + + private int mTextHeightWithMaxLines; + + private int mMaxCollapsedLines; + + private int mMarginBetweenTxtAndBottom; + + private ExpandIndicatorController mExpandIndicatorController; + + private int mAnimationDuration; + + private float mAnimAlphaStart; + + private boolean mAnimating; + + @IdRes + private int mExpandableTextId = R.id.expandable_text; + + @IdRes + private int mExpandCollapseToggleId = R.id.expand_collapse; + + private boolean mExpandToggleOnTextClick; + + /* Listener for callback */ + private OnExpandStateChangeListener mListener; + + /* For saving collapsed status when used in ListView */ + private SparseBooleanArray mCollapsedStatus; + private int mPosition; + /** + * 用于列表,文字展开之后记录固定值:mCollapsedHeight, mMarginBetweenTxtAndBottom + * 点击收起按钮,避免固定值为0,文字不展示的情况 + */ + private SparseIntArray mCollapsedHeightStatus; + + private int mImageToggleId; + private ImageView mIvToggle; + /** + * 1、世界动态 2 个人主页 3-动态详情 4-动态广场 + */ + @Setter + private int eventType; + + public ExpandableTextView(Context context) { + this(context, null); + } + + public ExpandableTextView(Context context, AttributeSet attrs) { + super(context, attrs); + init(attrs); + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + public ExpandableTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(attrs); + } + + @Override + public void setOrientation(int orientation) { + if (LinearLayout.HORIZONTAL == orientation) { + throw new IllegalArgumentException("ExpandableTextView only supports Vertical Orientation."); + } + super.setOrientation(orientation); + } + + @Override + public void onClick(View view) { + if (mToggleView.getVisibility() != View.VISIBLE) { + return; + } + + mCollapsed = !mCollapsed; + mExpandIndicatorController.changeState(mCollapsed); + + if (mCollapsedStatus != null) { + mCollapsedStatus.put(mPosition, mCollapsed); + } + + // mark that the animation is in progress + mAnimating = true; + + Animation animation; + + if (mCollapsed) { + int height = getHeight(); + if (mCollapsedHeight == 0 && mCollapsedHeightStatus != null) { + mCollapsedHeight = mCollapsedHeightStatus.get(0); + } + + if (mMarginBetweenTxtAndBottom <= 0 && mCollapsedHeightStatus != null) { + mMarginBetweenTxtAndBottom = mCollapsedHeightStatus.get(1); + } + + animation = new ExpandCollapseAnimation(this, height, mCollapsedHeight); + } else { + String label = ResUtil.getString(R.string.community_widget_expandabletextview_01); + if (eventType == 2) { + label = ResUtil.getString(R.string.community_widget_expandabletextview_02); + } else if (eventType == 3) { + label = ResUtil.getString(R.string.community_widget_expandabletextview_03); + } else if (eventType == 4) { + label = ResUtil.getString(R.string.community_widget_expandabletextview_04); + } + + int height = getHeight(); + int tvHeight = mTv.getHeight(); + animation = new ExpandCollapseAnimation(this, height, height + + mTextHeightWithMaxLines - tvHeight); + + if (mCollapsedHeight > 0 && mCollapsedHeightStatus != null) { + mCollapsedHeightStatus.put(0, mCollapsedHeight); + } + if (mMarginBetweenTxtAndBottom > 0 && mCollapsedHeightStatus != null) { + mCollapsedHeightStatus.put(1, mMarginBetweenTxtAndBottom); + } + } + + animation.setFillAfter(true); + animation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + applyAlphaAnimation(mTv, mAnimAlphaStart); + } + + @Override + public void onAnimationEnd(Animation animation) { + // clear animation here to avoid repeated applyTransformation() calls + clearAnimation(); + // clear the animation flag + mAnimating = false; + + // notify the listener + if (mListener != null) { + mListener.onExpandStateChanged(mTv, !mCollapsed); + } + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + + clearAnimation(); + startAnimation(animation); + + if (mImageToggleId != 0) { + mIvToggle.animate().rotationBy(180).setDuration(DEFAULT_ANIM_DURATION).start(); + } + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + // while an animation is in progress, intercept all the touch events to children to + // prevent extra clicks during the animation + return mAnimating; + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + findViews(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // If no change, measure and return + if (!mRelayout || getVisibility() == View.GONE) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + return; + } + mRelayout = false; + + // Setup with optimistic case + // i.e. Everything fits. No button needed + mToggleView.setVisibility(View.GONE); + if (mIvToggle != null) { + mIvToggle.setVisibility(GONE); + } + mTv.setMaxLines(Integer.MAX_VALUE); + + // Measure + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + // If the text fits in collapsed mode, we are done. + if (mTv.getLineCount() <= mMaxCollapsedLines) { + return; + } + + // Saves the text height w/ max lines + mTextHeightWithMaxLines = getRealTextViewHeight(mTv); + + // Doesn't fit in collapsed mode. Collapse text view as needed. Show + // button. + if (mCollapsed) { + mTv.setMaxLines(mMaxCollapsedLines); + } + mToggleView.setVisibility(View.VISIBLE); + if (mIvToggle != null) { + mIvToggle.setVisibility(VISIBLE); + } + + // Re-measure with new setup + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + if (mCollapsed) { + // Gets the margin between the TextView's bottom and the ViewGroup's bottom + mTv.post(new Runnable() { + @Override + public void run() { + mMarginBetweenTxtAndBottom = getHeight() - mTv.getHeight(); + } + }); + // Saves the collapsed height of this ViewGroup + mCollapsedHeight = getMeasuredHeight(); + } + } + + public void setOnExpandStateChangeListener(@Nullable OnExpandStateChangeListener listener) { + mListener = listener; + } + + public void setText(@Nullable CharSequence text) { + mRelayout = true; + mTv.setText(text); + setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE); + clearAnimation(); + getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT; + requestLayout(); + } + + public void setText(@Nullable CharSequence text, @NonNull SparseBooleanArray collapsedStatus, int position) { + mCollapsedStatus = collapsedStatus; + mPosition = position; + boolean isCollapsed = collapsedStatus.get(position, true); + clearAnimation(); + mCollapsed = isCollapsed; + mExpandIndicatorController.changeState(mCollapsed); + setText(text); + } + + public void setText(@Nullable CharSequence text, @NonNull SparseBooleanArray collapsedStatus, int position, + @NonNull SparseIntArray mCollapsedHeightStatus) { + this.mCollapsedHeightStatus = mCollapsedHeightStatus; + setText(text, collapsedStatus, position); + } + + @Nullable + public CharSequence getText() { + if (mTv == null) { + return ""; + } + return mTv.getText(); + } + + private void init(AttributeSet attrs) { + TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.ExpandableTextView); + mMaxCollapsedLines = typedArray.getInt(R.styleable.ExpandableTextView_maxCollapsedLines, MAX_COLLAPSED_LINES); + mAnimationDuration = typedArray.getInt(R.styleable.ExpandableTextView_animDuration, DEFAULT_ANIM_DURATION); + mAnimAlphaStart = typedArray.getFloat(R.styleable.ExpandableTextView_animAlphaStart, DEFAULT_ANIM_ALPHA_START); + mExpandableTextId = typedArray.getResourceId(R.styleable.ExpandableTextView_expandableTextId, R.id.expandable_text); + mExpandCollapseToggleId = typedArray.getResourceId(R.styleable.ExpandableTextView_expandCollapseToggleId, R.id.expand_collapse); + mExpandToggleOnTextClick = typedArray.getBoolean(R.styleable.ExpandableTextView_expandToggleOnTextClick, true); + + mExpandIndicatorController = setupExpandToggleController(getContext(), typedArray); + + mImageToggleId = typedArray.getResourceId(R.styleable.ExpandableTextView_imageToggleId, 0); + + typedArray.recycle(); + + // enforces vertical orientation + setOrientation(LinearLayout.VERTICAL); + + // default visibility is gone + setVisibility(GONE); + } + + private void findViews() { + mTv = (TextView) findViewById(mExpandableTextId); + if (mExpandToggleOnTextClick) { + mTv.setOnClickListener(this); + } else { + mTv.setOnClickListener(null); + } + mToggleView = findViewById(mExpandCollapseToggleId); + mExpandIndicatorController.setView(mToggleView); + mExpandIndicatorController.changeState(mCollapsed); + mToggleView.setOnClickListener(this); + if (mImageToggleId != 0) { + mIvToggle = findViewById(mImageToggleId); + } + } + + private static boolean isPostHoneycomb() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; + } + + private static boolean isPostLolipop() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP; + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + private static void applyAlphaAnimation(View view, float alpha) { + if (isPostHoneycomb()) { + view.setAlpha(alpha); + } else { + AlphaAnimation alphaAnimation = new AlphaAnimation(alpha, alpha); + // make it instant + alphaAnimation.setDuration(0); + alphaAnimation.setFillAfter(true); + view.startAnimation(alphaAnimation); + } + } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private static Drawable getDrawable(@NonNull Context context, @DrawableRes int resId) { + Resources resources = context.getResources(); + if (isPostLolipop()) { + return resources.getDrawable(resId, context.getTheme()); + } else { + return resources.getDrawable(resId); + } + } + + private static int getRealTextViewHeight(@NonNull TextView textView) { + int textHeight = textView.getLayout().getLineTop(textView.getLineCount()); + int padding = textView.getCompoundPaddingTop() + textView.getCompoundPaddingBottom(); + return textHeight + padding; + } + + private static ExpandIndicatorController setupExpandToggleController(@NonNull Context context, TypedArray typedArray) { + final int expandToggleType = typedArray.getInt(R.styleable.ExpandableTextView_expandToggleType, DEFAULT_TOGGLE_TYPE); + final ExpandIndicatorController expandIndicatorController; + switch (expandToggleType) { + case EXPAND_INDICATOR_IMAGE_BUTTON: + Drawable expandDrawable = typedArray.getDrawable(R.styleable.ExpandableTextView_expandIndicator); + Drawable collapseDrawable = typedArray.getDrawable(R.styleable.ExpandableTextView_collapseIndicator); + + if (expandDrawable == null) { + expandDrawable = getDrawable(context, R.drawable.ic_back_dynamic); + } + if (collapseDrawable == null) { + collapseDrawable = getDrawable(context, R.drawable.ic_back_dynamic); + } + expandIndicatorController = new ImageButtonExpandController(expandDrawable, collapseDrawable); + break; + case EXPAND_INDICATOR_TEXT_VIEW: + String expandText = typedArray.getString(R.styleable.ExpandableTextView_expandIndicator); + String collapseText = typedArray.getString(R.styleable.ExpandableTextView_collapseIndicator); + expandIndicatorController = new TextViewExpandController(expandText, collapseText); + break; + default: + throw new IllegalStateException("Must be of enum: ExpandableTextView_expandToggleType, one of EXPAND_INDICATOR_IMAGE_BUTTON or EXPAND_INDICATOR_TEXT_VIEW."); + } + + return expandIndicatorController; + } + + class ExpandCollapseAnimation extends Animation { + private final View mTargetView; + private final int mStartHeight; + private final int mEndHeight; + + public ExpandCollapseAnimation(View view, int startHeight, int endHeight) { + mTargetView = view; + mStartHeight = startHeight; + mEndHeight = endHeight; + setDuration(mAnimationDuration); + } + + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + final int newHeight = (int) ((mEndHeight - mStartHeight) * interpolatedTime + mStartHeight); + mTv.setMaxHeight(newHeight - mMarginBetweenTxtAndBottom); + if (Float.compare(mAnimAlphaStart, 1.0f) != 0) { + applyAlphaAnimation(mTv, mAnimAlphaStart + interpolatedTime * (1.0f - mAnimAlphaStart)); + } + mTargetView.getLayoutParams().height = newHeight; + mTargetView.requestLayout(); + } + + @Override + public void initialize(int width, int height, int parentWidth, int parentHeight) { + super.initialize(width, height, parentWidth, parentHeight); + } + + @Override + public boolean willChangeBounds() { + return true; + } + } + + public interface OnExpandStateChangeListener { + /** + * Called when the expand/collapse animation has been finished + * + * @param textView - TextView being expanded/collapsed + * @param isExpanded - true if the TextView has been expanded + */ + void onExpandStateChanged(TextView textView, boolean isExpanded); + } + + public interface ExpandIndicatorController { + void changeState(boolean collapsed); + + void setView(View toggleView); + } + + static class ImageButtonExpandController implements ExpandIndicatorController { + + private final Drawable mExpandDrawable; + private final Drawable mCollapseDrawable; + + private ImageButton mImageButton; + + public ImageButtonExpandController(Drawable expandDrawable, Drawable collapseDrawable) { + mExpandDrawable = expandDrawable; + mCollapseDrawable = collapseDrawable; + } + + @Override + public void changeState(boolean collapsed) { + mImageButton.setImageDrawable(collapsed ? mExpandDrawable : mCollapseDrawable); + } + + @Override + public void setView(View toggleView) { + mImageButton = (ImageButton) toggleView; + } + } + + static class TextViewExpandController implements ExpandIndicatorController { + + private final String mExpandText; + private final String mCollapseText; + + private TextView mTextView; + + public TextViewExpandController(String expandText, String collapseText) { + mExpandText = expandText; + mCollapseText = collapseText; + } + + @Override + public void changeState(boolean collapsed) { + mTextView.setText(collapsed ? mExpandText : mCollapseText); + } + + @Override + public void setView(View toggleView) { + mTextView = (TextView) toggleView; + } + } +} \ No newline at end of file diff --git a/app/src/module_community/java/com/chwl/app/community/widget/GridImageWidget.java b/app/src/module_community/java/com/chwl/app/community/widget/GridImageWidget.java new file mode 100644 index 000000000..9a9cb20fe --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/widget/GridImageWidget.java @@ -0,0 +1,135 @@ +package com.chwl.app.community.widget; + +import android.app.Activity; +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.chwl.app.R; +import com.chwl.app.community.helper.CalcSize; +import com.chwl.app.community.helper.ImageUiHelper; +import com.chwl.app.photo.BigPhotoActivity; +import com.chwl.app.photo.DynamicImageAdapter; +import com.chwl.app.community.utils.ObjectTypeHelper; +import com.chwl.app.photo.PagerOption; +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil; +import com.chwl.app.ui.widget.recyclerview.decoration.GridVItemDecoration; +import com.chwl.core.community.bean.DynamicMedia; +import com.chwl.core.community.bean.WorldDynamicBean; +import com.chwl.library.utils.ListUtils; + +import java.util.List; + +import lombok.Setter; + +/** + * create by lvzebiao @2020/1/8 + */ +public class GridImageWidget extends FrameLayout { + + @Setter + private int maxWidth; + + @Setter + private int dividerDp; + + private RecyclerView rvImage; + + private Context context; + /** + * recycleView格子布局时的宽度 + * 用于计算item的高度 + */ + @Setter + private int rvWidth; + + public GridImageWidget(@NonNull Context context) { + this(context, null); + } + + public GridImageWidget(@NonNull Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public GridImageWidget(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + inflate(context, R.layout.widget_grid_image, this); + this.context = context; + maxWidth = UIUtil.getScreenWidth(context) * ImageUiHelper.BORDER_MIN / ImageUiHelper.BORDER_MAX; + dividerDp = 10; + rvImage = findViewById(R.id.rv_image); + } + + public void setData(WorldDynamicBean item, int topMargin) { + setVisibility(View.GONE); + List dynamicMediaList = item.getDynamicResList(); + if (item.getType() == WorldDynamicBean.TYPE_IMAGE + && dynamicMediaList != null && dynamicMediaList.size() > 0) { + setData(dynamicMediaList, topMargin); + } + } + + public void setData(List imageUrl, int topMargin) { + setVisibility(GONE); + if (ListUtils.isListEmpty(imageUrl)) { + return; + } + setVisibility(VISIBLE); + + CalcSize calcSize = new CalcSize(maxWidth); + ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) rvImage.getLayoutParams(); + if (imageUrl.size() > 1) { + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + params.height = ViewGroup.LayoutParams.WRAP_CONTENT; + } else { + //单图的情况,按比例显示 + DynamicMedia media = null; + if (imageUrl.size() > 0) { + media = imageUrl.get(0); + } + if (media == null) { + return; + } + calcSize = ImageUiHelper.calcImage(media, maxWidth); + params.width = calcSize.width; + params.height = calcSize.height; + } + params.topMargin = topMargin; + rvImage.setLayoutParams(params); + rvImage.setNestedScrollingEnabled(false); + int spanCount = imageUrl.size() > 2 ? 3 : imageUrl.size(); + if (rvImage.getTag() != null) { + if (rvImage.getTag() instanceof RecyclerView.ItemDecoration) { + rvImage.removeItemDecoration((RecyclerView.ItemDecoration) rvImage.getTag()); + } + rvImage.setTag(null); + } + GridVItemDecoration decoration = new GridVItemDecoration(context, dividerDp, spanCount); + rvImage.setTag(decoration); + rvImage.addItemDecoration(decoration); + + rvImage.setLayoutManager(new GridLayoutManager(context, spanCount)); + DynamicImageAdapter adapter = new DynamicImageAdapter(R.layout.item_grid_image_widget, imageUrl); + //当2列时的高度 + adapter.setMTwoImageHeight((rvWidth - UIUtil.dip2px(context, 10)) / 2); + //当3列时的高度 + adapter.setMThreeImageHeight((rvWidth - UIUtil.dip2px(context, 20)) / 3); + adapter.setSingleImageHeight(calcSize.height); + adapter.setOnItemClickListener((adapter1, view, position) -> { + PagerOption option = new PagerOption().setSave(true); + BigPhotoActivity.start((Activity) context, ObjectTypeHelper.mediaToCustomList(imageUrl), + position, option); + } + ); + rvImage.setAdapter(adapter); + + } + +} diff --git a/app/src/module_community/java/com/chwl/app/community/widget/TopicLabelWidget.kt b/app/src/module_community/java/com/chwl/app/community/widget/TopicLabelWidget.kt new file mode 100644 index 000000000..868fcc4eb --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/widget/TopicLabelWidget.kt @@ -0,0 +1,50 @@ +package com.chwl.app.community.widget + +import android.content.Context +import android.os.Build +import android.util.AttributeSet +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.annotation.Nullable +import com.chwl.app.ui.utils.ImageLoadUtilsV2 +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil + +class TopicLabelWidget(context: Context, @Nullable attrs: AttributeSet) : + LinearLayout(context, attrs) { + private val leftMargin = UIUtil.dip2px(context, 4.toDouble()) + + init { + orientation = HORIZONTAL + } + + fun setLabels(labels: List) { + if (childCount != 0) { + removeAllViews() + } + val width = UIUtil.dip2px(context, 28.0) + val height = UIUtil.dip2px(context, 14.0) + for ((index, item) in labels.withIndex()) { + val imageView = ImageView(context) + val layoutParams = MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) + if (index != 0) { + layoutParams.leftMargin = leftMargin + } + imageView.maxWidth = width + imageView.maxHeight = height + imageView.scaleType=ImageView.ScaleType.CENTER_INSIDE + imageView.layoutParams = layoutParams + addView(imageView) + ImageLoadUtilsV2.loadImage(imageView, item) + } + } + + override fun generateLayoutParams(lp: ViewGroup.LayoutParams?): LayoutParams { + if (lp is LayoutParams && Build.VERSION.SDK_INT >= 19) { + return LayoutParams(lp) + }else if (lp is ViewGroup.MarginLayoutParams) { + return LayoutParams(lp) + } + return super.generateLayoutParams(lp) + } +} \ No newline at end of file diff --git a/app/src/module_community/java/com/chwl/app/community/widget/TouchHideKeyboardView.java b/app/src/module_community/java/com/chwl/app/community/widget/TouchHideKeyboardView.java new file mode 100644 index 000000000..ce1a93411 --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/widget/TouchHideKeyboardView.java @@ -0,0 +1,36 @@ +package com.chwl.app.community.widget; + +import android.app.Activity; +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import androidx.constraintlayout.widget.ConstraintLayout; + +import com.chwl.library.utils.keyboard.KeyboardUtil; + +/** + * create by lvzebiao @2019/11/28 + */ +public class TouchHideKeyboardView extends ConstraintLayout { + + public TouchHideKeyboardView(Context context) { + super(context); + } + + public TouchHideKeyboardView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public TouchHideKeyboardView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (getContext() instanceof Activity) { + KeyboardUtil.hideKeyboard((Activity) getContext()); + } + return super.dispatchTouchEvent(ev); + } +} diff --git a/app/src/module_community/java/com/chwl/app/community/widget/ZoomImageView.java b/app/src/module_community/java/com/chwl/app/community/widget/ZoomImageView.java new file mode 100644 index 000000000..40cbf8bca --- /dev/null +++ b/app/src/module_community/java/com/chwl/app/community/widget/ZoomImageView.java @@ -0,0 +1,476 @@ +package com.chwl.app.community.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Matrix; +import android.graphics.RectF; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.ScaleGestureDetector; +import android.view.View; +import android.view.ViewTreeObserver; +import android.widget.ImageView; + +import com.netease.nim.uikit.common.util.log.LogUtil; + + +public class ZoomImageView extends ImageView implements ScaleGestureDetector.OnScaleGestureListener, View.OnTouchListener, ViewTreeObserver.OnGlobalLayoutListener { + + private static final String TAG = ZoomImageView.class.getSimpleName(); + public static final float SCALE_MAX = 3.0f; + private static final float SCALE_MID = 1.5f; + + /** + * 初始化时的缩放比例,如果图片宽或高大于屏幕,此值将小于0 + */ + private float initScale = 1.0f; + private boolean once = true; + + /** + * 用于存放矩阵的9个值 + */ + private final float[] matrixValues = new float[9]; + + /** + * 缩放的手势检测 + */ + private ScaleGestureDetector mScaleGestureDetector = null; + private final Matrix mScaleMatrix = new Matrix(); + + /** + * 用于双击检测 + */ + private GestureDetector mGestureDetector; + private boolean isAutoScale; + + private int mTouchSlop; + + private float mLastX; + private float mLastY; + + private boolean isCanDrag; + private int lastPointerCount; + + private boolean isCheckTopAndBottom = true; + private boolean isCheckLeftAndRight = true; + private OnClickListener onClickListener; + private OnLongClickListener onLongClickListener; + + public ZoomImageView(Context context) { + this(context, null); + } + + public ZoomImageView(Context context, AttributeSet attrs) { + super(context, attrs); + super.setScaleType(ScaleType.MATRIX); + mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + if (onClickListener != null) { + onClickListener.onClick(ZoomImageView.this); + return true; + } + return super.onSingleTapConfirmed(e); + } + + @Override + public void onLongPress(MotionEvent e) { + if (onLongClickListener != null) { + onLongClickListener.onLongClick(ZoomImageView.this); + } + } + + @Override + public boolean onDoubleTap(MotionEvent e) { + if (isAutoScale) + return true; + + float x = e.getX(); + float y = e.getY(); + LogUtil.print("DoubleTap, " + getScale() + " , " + initScale); + if (getScale() < SCALE_MID) { + //postDelayed(); 16 :多久实现一次的定时器操作 + ZoomImageView.this.postDelayed(new AutoScaleRunnable(SCALE_MID, x, y), 16); + isAutoScale = true; + } /*else if (getScale() >= SCALE_MID //连续双击放大 可放开 + && getScale() < SCALE_MAX) { + ZoomImageView.this.postDelayed(new AutoScaleRunnable(SCALE_MAX, x, y), 16); + isAutoScale = true; + }*/ else { + ZoomImageView.this.postDelayed(new AutoScaleRunnable(initScale, x, y), 16); + isAutoScale = true; + } + + return true; + } + }); + mScaleGestureDetector = new ScaleGestureDetector(context, this); + this.setOnTouchListener(this); + } + + /** + * 自动缩放的任务 + * + * @author zhy + */ + private class AutoScaleRunnable implements Runnable { + static final float BIGGER = 1.07f; + static final float SMALLER = 0.93f; + private float mTargetScale; + private float tmpScale; + + /** + * 缩放的中心 + */ + private float x; + private float y; + + /** + * 传入目标缩放值,根据目标值与当前值,判断应该放大还是缩小 + * + * @param targetScale + */ + public AutoScaleRunnable(float targetScale, float x, float y) { + this.mTargetScale = targetScale; + this.x = x; + this.y = y; + if (getScale() < mTargetScale) { + tmpScale = BIGGER; + } else { + tmpScale = SMALLER; + } + } + + @Override + public void run() { + // 进行缩放 + mScaleMatrix.postScale(tmpScale, tmpScale, x, y); + checkBorderAndCenterWhenScale(); + setImageMatrix(mScaleMatrix); + + final float currentScale = getScale(); + // 如果值在合法范围内,继续缩放 + if (((tmpScale > 1f) && (currentScale < mTargetScale)) || ((tmpScale < 1f) && (mTargetScale < currentScale))) { + + ZoomImageView.this.postDelayed(this, 16); + } else { + // 设置为目标的缩放比例 + final float deltaScale = mTargetScale / currentScale; + mScaleMatrix.postScale(deltaScale, deltaScale, x, y); + checkBorderAndCenterWhenScale(); + setImageMatrix(mScaleMatrix); + isAutoScale = false; + } + } + } + + /** + * 对图片进行缩放的控制,首先进行缩放范围的判断,然后设置mScaleMatrix的scale值 + * + * @param detector + * @return + */ + @SuppressLint("NewApi") + @Override + public boolean onScale(ScaleGestureDetector detector) { + float scale = getScale(); + float scaleFactor = detector.getScaleFactor(); + + if (getDrawable() == null) + return true; + + /** + * 缩放的范围控制 + */ + if ((scale < SCALE_MAX && scaleFactor > 1.0f) || (scale > initScale && scaleFactor < 1.0f)) { + /** + * 最大值最小值判断 + */ + if (scaleFactor * scale < initScale) { + scaleFactor = initScale / scale; + } + if (scaleFactor * scale > SCALE_MAX) { + scaleFactor = SCALE_MAX / scale; + } + /** + * 设置缩放比例 + */ + mScaleMatrix.postScale(scaleFactor, scaleFactor, detector.getFocusX(), detector.getFocusY()); + + checkBorderAndCenterWhenScale(); + setImageMatrix(mScaleMatrix); + } + return true; + } + + /** + * 在缩放时,进行图片显示范围的控制 + */ + private void checkBorderAndCenterWhenScale() { + + RectF rect = getMatrixRectF(); + float deltaX = 0; + float deltaY = 0; + + int width = getWidth(); + int height = getHeight(); + + // 如果宽或高大于屏幕,则控制范围 + if (rect.width() >= width) { + if (rect.left > 0) { + deltaX = -rect.left; + } + if (rect.right < width) { + deltaX = width - rect.right; + } + } + if (rect.height() >= height) { + if (rect.top > 0) { + deltaY = -rect.top; + } + if (rect.bottom < height) { + deltaY = height - rect.bottom; + } + } + // 如果宽或高小于屏幕,则让其居中 + if (rect.width() < width) { + deltaX = width * 0.5f - rect.right + 0.5f * rect.width(); + } + if (rect.height() < height) { + deltaY = height * 0.5f - rect.bottom + 0.5f * rect.height(); + } + + + mScaleMatrix.postTranslate(deltaX, deltaY); + + } + + /** + * 根据当前图片的Matrix获得图片的范围 + * + * @return + */ + private RectF getMatrixRectF() { + Matrix matrix = mScaleMatrix; + RectF rect = new RectF(); + Drawable d = getDrawable(); + if (null != d) { + rect.set(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); + matrix.mapRect(rect); + } + return rect; + } + + @Override + public boolean onScaleBegin(ScaleGestureDetector detector) { + return true; + } + + @Override + public void onScaleEnd(ScaleGestureDetector detector) { + } + + /** + * 我们让OnTouchListener的MotionEvent交给ScaleGestureDetector进行处理 + * public boolean onTouch(View v, MotionEvent event){ + * return mScaleGestureDetector.onTouchEvent(event); + * } + */ + @Override + public boolean onTouch(View v, MotionEvent event) { + + if (mGestureDetector.onTouchEvent(event)) + return true; + mScaleGestureDetector.onTouchEvent(event); + + float x = 0, y = 0; + // 拿到触摸点的个数 + final int pointerCount = event.getPointerCount(); + // 得到多个触摸点的x与y均值 + for (int i = 0; i < pointerCount; i++) { + x += event.getX(i); + y += event.getY(i); + } + x = x / pointerCount; + y = y / pointerCount; + + /** + * 每当触摸点发生变化时,重置mLasX , mLastY + */ + if (pointerCount != lastPointerCount) { + isCanDrag = false; + mLastX = x; + mLastY = y; + } + + lastPointerCount = pointerCount; + RectF rectF = getMatrixRectF(); + + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + if (rectF.width() > getWidth() || rectF.height() > getHeight()) { + getParent().requestDisallowInterceptTouchEvent(true); + } + break; + case MotionEvent.ACTION_MOVE: + if (rectF.width() > getWidth() || rectF.height() > getHeight()) { + getParent().requestDisallowInterceptTouchEvent(true); + } + + float dx = x - mLastX; + float dy = y - mLastY; + + if (!isCanDrag) { + isCanDrag = isCanDrag(dx, dy); + } + if (isCanDrag) { + + if (getDrawable() != null) { + // if (getMatrixRectF().left == 0 && dx > 0) + // { + // getParent().requestDisallowInterceptTouchEvent(false); + // } + // + // if (getMatrixRectF().right == getWidth() && dx < 0) + // { + // getParent().requestDisallowInterceptTouchEvent(false); + // } + isCheckLeftAndRight = isCheckTopAndBottom = true; + // 如果宽度小于屏幕宽度,则禁止左右移动 + if (rectF.width() < getWidth()) { + dx = 0; + isCheckLeftAndRight = false; + } + // 如果高度小雨屏幕高度,则禁止上下移动 + if (rectF.height() < getHeight()) { + dy = 0; + isCheckTopAndBottom = false; + } + + //设置偏移量 + mScaleMatrix.postTranslate(dx, dy); + //再次校验 + checkMatrixBounds(); + setImageMatrix(mScaleMatrix); + } + } + mLastX = x; + mLastY = y; + break; + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + + lastPointerCount = 0; + break; + } + return true; + } + + /** + * 获得当前的缩放比例 + * + * @return + */ + public final float getScale() { + mScaleMatrix.getValues(matrixValues); + return matrixValues[Matrix.MSCALE_X]; + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + getViewTreeObserver().addOnGlobalLayoutListener(this); + } + + @SuppressWarnings("deprecation") + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + + /** + * 根据图片的宽和高以及屏幕的宽和高,对图片进行缩放以及移动至屏幕的中心。 + * 如果图片很小,那就正常显示,不放大了~ + */ + @Override + public void onGlobalLayout() { + if (once) { + Drawable d = getDrawable(); + if (d == null) + return; + + int width = getWidth(); + int height = getHeight(); + // 拿到图片的宽和高 + int dw = d.getIntrinsicWidth(); + int dh = d.getIntrinsicHeight(); + float scale = 1.0f; + // 如果图片的宽或者高大于屏幕,则缩放至屏幕的宽或者高 + if (dw > width && dh <= height) { + scale = width * 1.0f / dw; + } + if (dh > height && dw <= width) { + scale = height * 1.0f / dh; + } + // 如果宽和高都大于屏幕,则让其按按比例适应屏幕大小 + if (dw > width && dh > height) { + scale = Math.min(width * 1.0f / dw, height * 1.0f / dh); + } + initScale = scale; + + mScaleMatrix.postTranslate((width - dw) / 2, (height - dh) / 2); + mScaleMatrix.postScale(scale, scale, getWidth() / 2, getHeight() / 2); + // 图片移动至屏幕中心 + setImageMatrix(mScaleMatrix); + once = false; + } + } + + /** + * 移动时,进行边界判断,主要判断宽或高大于屏幕的 + */ + private void checkMatrixBounds() { + RectF rect = getMatrixRectF(); + + float deltaX = 0, deltaY = 0; + final float viewWidth = getWidth(); + final float viewHeight = getHeight(); + // 判断移动或缩放后,图片显示是否超出屏幕边界 + if (rect.top > 0 && isCheckTopAndBottom) { + deltaY = -rect.top; + } + if (rect.bottom < viewHeight && isCheckTopAndBottom) { + deltaY = viewHeight - rect.bottom; + } + if (rect.left > 0 && isCheckLeftAndRight) { + deltaX = -rect.left; + } + if (rect.right < viewWidth && isCheckLeftAndRight) { + deltaX = viewWidth - rect.right; + } + mScaleMatrix.postTranslate(deltaX, deltaY); + } + + /** + * 是否是推动行为 + * + * @param dx + * @param dy + * @return + */ + private boolean isCanDrag(float dx, float dy) { + return Math.sqrt((dx * dx) + (dy * dy)) >= mTouchSlop; + } + + public void setOnClickListener(OnClickListener onClickListener) { + this.onClickListener = onClickListener; + } + + public void setOnLongClickListener(OnLongClickListener onLongClickListener) { + this.onLongClickListener = onLongClickListener; + } +} diff --git a/app/src/module_community/res/drawable-xhdpi/bg_dy_popup_comment.png b/app/src/module_community/res/drawable-xhdpi/bg_dy_popup_comment.png new file mode 100644 index 0000000000000000000000000000000000000000..96f394a084f4427f8cb3e250519ceacdfcd928b5 GIT binary patch literal 1344 zcmb7^{Xf$Q0LLeDX_AMvxS2a*a?8VcIz3R0Var2f-=QUKJrGWpRfbSocIaC25P6)3 zF&0I(H0zpF9=0Sh?aE`C<|!{+(Tbh>2k!N{&+GI0eBM8Ne*R?Q1AKHLa0mzl(#2sh zK_HOEPwQL;)?CjLz45N~vc&rVUOs32*73jf-Om2*^~L7%K>-9%GX!i1M{RfB7m<6* zwzClg0*i4NG?4ISuB7+O09L=lq6fOdh<9&^`=O0GLOv;eZ2V+o7x~Z_f1?PwYmT0+ z$wg#Xot0?(V!#c%+$Ie?I=r^G?3xMvHjQ{HQ^#q7Ek=c0;C!4{W=yEJ?EuGtqT)TE zYm`z3+2L@)h`A77yD2mJ-q-gz`0!8N6S&GJ0@oCc#kAZG>R}|+_~76xN6QRFxF9cR zrGn^2!I13h^7rEb4J-Sr+$>T9{Tmv`q$I1R1`C}hNA2F-1a`^|bT}Th>1+gJ<@0%@ z?2UoW(nfs97Tkjj*mIz+EZjObqh9T(J<*K>dmeBjc-CK3|~HTKRzyi1V5d;|aF)Tj*8sqlDc zf|tLRyKhZn4a4=uKKk{g^T_myQ9QFxCyA%$$b`Z2iQm%7rqKlu2})SWr7i_ia6D^a zHMgjxZdMsAZ!%-X@>ZC-fcic}8jMm_*vFQuHl*-ta-OXXK~Od{aiW&`K7AU^p3Y1G zDyo5YLtZQ8FAQ=I;6PwiL1rr#>#HQKfEK|4_W!&ZSqCP}aiix(n&Q<&%X)d?7om9P zb8jBjt(iW3BC=&XE-%zW_V!s)w5F`)5OJvAv**?C2j{Na-BH#J)%zo9IY#Q2gw<>T zEoZ`vU+$9pTotL2rlm+VPXYpSa*XneCmUWNRLEpc|4%M6?9NTO3^%5cJIcmpdTVQx zs2+&9+@9p`dx3RIRvE+;Siz*jO0cSwz+wc~$6(1HfGU)Y{*1fnfGHNX{GwXoBsUAj z<$JdHH9w&7L%EHiY=Z{G9D6xa@p|XdXJ_ zqE01vtSzo(Uhp%&ifocdn|+&=${BcSqR1AR_cB;JwpRnW?RdlMYIMmsls`~9I@aKq zdZIZSFAC5W#9%grMv>rJ2TEw1H$^Ewp1GBo+~rb9m1m%ByImXyry^Kky0V_?=2PD52%4is zVV|C*8K9-m6Aoc#Oq~jf!A#qkk0RTJg-a4ehe;#2h`7(S=K6t6&ZCPD;fUgayeOG5 z?8`;l(#@=_V2H21>m3c$Ynr2W?DTuR;ysC{yH8Cz!@Q_gwSvMUycZ|7b}pNcd-x>j zg55FYO=i!sfMijvEeM0RGU;X)-JkQX6dL|IAZW{z3hhEx&!CpliT4nRrtv?=ge|<^ z;d2!3n?E=;_iek(J*i3CJ6z|tYrD&YPT@>q8(!Z-;MqI&b%YZ6kR4|bHWt>IT^=#} zu0W*Su6iuj4x}jL-1e8o(X+a%3l%=F0FlKEb{jjyf%fuO{RpJbXqR&mJ8RKt h5-yE=<>Z#z6B`A6W^Q+H9`pV81aV#gm^&V1#y_(@X~zHn literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/bg_dy_popup_comment_three.png b/app/src/module_community/res/drawable-xhdpi/bg_dy_popup_comment_three.png new file mode 100644 index 0000000000000000000000000000000000000000..b517938d978c93b3c1626b80682a1c68fffe0c34 GIT binary patch literal 1340 zcmV-C1;hG@P)j6R3)zyh5^5F#~S^egn`0Xa@CBb8=CWwp`?ai)Bd$51=ef!77?cUsQkc`2EP+Y(>p%>!|1e(){+25oh z##2#^&qxG6^ROfo7V15Xrt14kYOzp%^gB8skya>9iNryvlT1hiKakRjl@{s*(*W{F z10_i!h(s7_s0HNHu}Fp}6vQI5Oyj0VQ^+Hw(BtbqAQW%kGh_nm9f<@)Ve}eMi_umy zHDm&jz;)3kAQ;HBXvl;j#i<}k6a?SGv?-GjDS4qu6pWsZWE!AI$z4D-ZiSY~@g0gp z)ppu?DAU+M0+H_N5(Pt)sX{{ErD9DODR@#cInD#$#pxYoBFrYodEmQLd?t-F5~}Dq zNa(u_X(TKV^V#^2N~$JTSlPaWxpa-OXZSRL-D6Y0*Rk)YtE;+{OxP=qT}@-)(;S4dd!zLG~8RV8nL z1NRsWR-e}lyNR`F0o3SOKdzw>TNEu@fe9K9`_|S9;?K;#Kz-R%QGIU#7JE6c*bMn zu}YjvY&=Hd8IM(BB%blucx*gYiDx`E9wYIL$0~8F<-WwmW8?9R$0~6yu}c4plz4~a z%PX_``y~$^p*CNc`Gthf8$Ec?T|IBqk5D~9a-Rz4PXxA zvwMZKrjArN%MtWM^hm!t)VFdZ5%v0T>mZr&fqF7+t4?c|_Q)5~M57{em-gtAmlOA0 z=B!rIC6BoCwvbB8d2LOZkd$lQP-e9?WmxirEH;!y%G_mgX60WbpXrKJXy46hiy4(n zIoVaTrId}uj5?VjSrWD0PKi`spJ|qyDw#@>^Z2h)Wm0{~saZv{*DTs}TAqM4YCru69Ha>T}ETrRovrhDd+! z14Crhp^Nm?Q3!LoqhiV~`ocgaTOf2v?Itn8L<@8+7^dGW>Hsn zNX{QvIh?_1d(|gIrrb>NJFQXJhch_tv7)pcR)XH!Xpx{vbO#hKS7(kDU3*e0Hca?G z@wSji6vw?dDRnsfHE#`tW5)*mUB=lY?akq@>&~+w6QhP+AlsI=dsL^)2SqHL6a#EwLXhd=N=b@ehaA=YdFOiho$1nI9?2GZ^~(ZmyxYTelrB8SNvA`9gc5C;c`fAI%R!=ra{QM~d100000RRA3MM6+kP&il$0000G0000C000&M06|PpNS6Qr009S~D3YXx z%Xg$7ujmB-wr~*I>)SJioYJ^7@4#HJsQc)#3k?__-{T%2|Sz5*(#lNLUH>QuE9J09H^qAYuRj0MG*f zodGHh02cs0kvNw}rK2JtFbDv!5(#Ml09t#q!(g3g4lIXw0RH?(c0t<_*qx0?vG{5^ uHBSK3@+0Irzyw(~03+BIUx@aAK?C9@+UJcS{>06BfsD;Imj;M{0000oCwz(k literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/ic_box_dynamic.png b/app/src/module_community/res/drawable-xhdpi/ic_box_dynamic.png new file mode 100644 index 0000000000000000000000000000000000000000..de1c33badbabf8650efc2b22375ac1d162b20e9b GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^3=*07`vZ_-Nq6*hWMJ6X&;2Kn7072S4sv&5 zSa(k5C6Hql;1lBNUf`pzudfFNKn4)V%gX~vpa786(b0jhH8nMX3?NWfS2r*)xG>>C zKF|cgk|4iehL+H>%fC54xIWZ9mMt=SEq}OmLpRVW9#0p?5R21OC*R)HqQKF5^+52< zpa1l&duCNG$bTOho>G5=No0|iyHCGC*2Whei~B@xs-;9v+;Dm4*@a6p_?H(HpjvJOZyO4U66uD$Y>fN4E2S6Yid3|HxKO5bLFVAO|Cgq56yNupdT+@w?TuMG%p94{y?12$ c7+=ef)hqt~(z++}fq};0>FVdQ&MBb@0GaEwcmMzZ literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/ic_close_publish.png b/app/src/module_community/res/drawable-xhdpi/ic_close_publish.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7da1944af829a512ce5b0dfd27ac807490a425 GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u#3?$#IayJ4}Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL#0(?ST-3xp^fWh0hZ-MlC7}&pm|C={&AW~blY&m}X_>LVru3WitQgXRJ zP%n2$kY6yv`-@t?i-Pl6cvj7Q_$&=5{LRzFF+}5ha>4>NgLsukD?)qJPDpN%<_S?( z=q?g@*T(dbO(k*h-GT)@0;!YTIIPtUv<8zv4vA6l~=L-v}y2V0vFp0UFJm@fy3G7jJeBfm#qtTfwZNs}wQT1#u uCohYT(Ylm=<;e_NS%G}U;vjb? zhIQv;UIIDB0X`wF?gc*k_FX!0;tUWSJ9ZY#fRG>&WOVZ6nd8SnBJz9cIDpy(N`m}? z8Q7nDi(b^vfB!pdWz&|Gn;&YuEdg3%;pyTSVsZLx=*^-d3Ovk72H|C&|Ht1pT+(}X zC;!~czeiNMCbR}l`8EHkL8N@scFwy}D=)^a(RsysCEoX^BC+Xlb7Hop;f38}0}%Ia`nu z^xJQ8hsoyuu1;Hi+&Ij`6BjV~QH-zQ9|xbUikENxiEz9dnxx!+J|wH?h@t56Sk0yXoh`Hz^&D@0n__Win4w-o<$OVSMxK?5!-*Z4$-HSl=y5uq!o9Idrk*m6Z5alznHEaQ)o|_opu8l Oz6_qOelF{r5}E++`|JY% literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/ic_dy_square_in_room.webp b/app/src/module_community/res/drawable-xhdpi/ic_dy_square_in_room.webp new file mode 100644 index 0000000000000000000000000000000000000000..80482d0c1b22836ec6b21f871d42c4f98098c951 GIT binary patch literal 1152 zcmV-`1b_QdNk&F^1ONb6MM6+kP&il$0000G0001S001KZ06|PpNLB#=00D==Ad)1f zN%{gg8$bXN5krWya?G07+g9n1Ts}nx4L4IaxRPXBX$}tY7xx5rIQw5-T;BbU=syFu zjTEhqnQvyFfR}>RA#6Horfb5(GQej{b?T|D{-n$g+G$2s`^DI^pc%^>FZLCgP4R}a zBO_%&Tb7E+t%FzmE8DdRt(lva7a!03oaGSO8tB-~ys7cnCR$ zC=-SaU5Mhb?r1?2i=D(GaU|pjqKp|HIEN?;9wdHwBz|4x{Xvd^Vl3`2DKQejjO_qI z3|h{Bn=MOe5uKo@HF*)WK1AjMW)4cGFOz`_+l_$iwOAu3HkteWBVWfcd!ck(a*D* zFQ58o!Ick9cKu(NFar>0gHaz})Tbm6(CGpDZecaw&x~FXT9iaAXwIYb<_nIHB5UHL z>nU{0h|75*Ii&~y0RH?-P-T|R(#x(Q8?Un;PZUW2Wy4eL=PU?On&f?BHN<|e8$=itG zxmwM@*j*mOZiP&*`!b3B3_iS~+M_MwzGyb71)vqERukC;bbWzphxs!qP2oBTT4sH* zhF2GGe(bhFdyu!^XqG`bS_Znmi_U4^HPV3$?Vj82NYwM*1 z2*J*s_5OmG(-ACnYL}GwMfzJNk`>|yawVY}Id@y(6Ci+m)$QMke-}rH^~{l@S7kVA z30%IefAtX+a!HErT~SG##z>KJL5a%-C!2X-#PJck=SpcVw%`4x1P9zEVc-?ix=iL< zVUZ3xzpC&=2krNjOd}~oA(ztnwvl~UQF`O!_!1I5zH~c}|L2_l&;FnHqq4Ok$yk(i zYly%BK4|mYByAXPh~Twoy5Tl$mFG}DSp;gmv&6!m>;Ij7Pd^0@Dl52qS0dNxjh6LG z4-{R`KK?>Y;?s;jU@WZ}Wu1k$^Si4YG=U|5{^S0K`9BvZZ9>Ekz1{sko}>GKh_{JE(->%D Sg=(4nf5BQvsW-LS0000cEIO(UWpK%2vI3;lLS67 za4Q~2DG*8rLIe+aS`!bmAb83Z60G6AJ+e z5R?ePNf43ze^GZ5Ru?THv9Rn#25&M%CS!ikT9i>a>SK5z~@C+Sc1hRSXzeV67g26~mX0cdBMMcjAf`-P% z#x~*j_ymf{Zy^?o=a!b1mzP&o=E-CobiCK_CWbagtiM#Q;v*YH)uFQDI2* zq`yk4xnlIk1Nt_neXD4B1qI_~G(w!pJLAmEnRew9SBu-m=2q924^N$POd!tP%{t%b z5x{9AIbD^V3y{#TiP4~;kE0w ztY!hfHs#~9VEe#BLY-6PV|p!0u9XHVmidfmht&Hw`I3@r7 zm5?f_DxWpjzI*?L`3I3iZaywM_q`;wpvDvfv6TqrGf+OlEPdaf?vM&_V)o#_z%yl75~^t}t6-x5P-zR12> ze#CF#@@9X4U$DUpfXGspbU;gbXTjK4=_MdLTTX@6b>k}s> zyKFG*u(arP^#AL^AlY$u@p(6olAJ37USd00?ksE%Qu+0BTC0%Cq1;Ea#Wo7EPcaJL zcb8-8G^P{LO6|#~HX93mjhj$&%ht(iqROvTUhywytTx zp4f49t^WrPi@dpMzE|fY<*!Unc3UA4p1So|%{KE`?{aPZ{qoL_95yx@@Lzf#_&Yt} lzvS;#57gQu&X%Q~loCIBI1%eDXj literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/ic_like_community_list.png b/app/src/module_community/res/drawable-xhdpi/ic_like_community_list.png new file mode 100644 index 0000000000000000000000000000000000000000..70e759ca0ffa7a93706924c56aff927a46808f60 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv7~+mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIDB0X`wF?gc*oy<*Xkcl>|PSP;UL@`~khuBZTN7bpqx3ugHCQh(C9J6tPd z_BaKmN0yWcbEyNZiScxC46!(UH`H@ls{+py!=6)r{cp1=acS)OJD0aVKxCuQ4jucP zIIFWeC;cm7T^xBUmNDwZs>_L5JbH5a0R}I#*x078e)1qF`&883omx?k`er_Gj^JK+ zE<(*#=bCq$bmRu5$(*}1ublMPn;pyAkaCAlKEaQdLB8mx+`N|6CX%^Qu@{?b1mkmB zrVw;|G^!tu4VsW4Hf4T~O*;mAsp4H&^UV9bC`lZe*@)MH&iLkvo{r&1! zqx)h8FSRc(c$LAfae+JdaLxJ^T-E)|oRTt27d%S{?N*(hF(>hH>DQ|trY=>ie6F9NYn3xkBZlYK6OS9W zrtt4Ser>19c}LaL2X>x4Q0T!cd5Wdj|7KLAB|pQwXY*_FlrEliw#%*NQr&w=sB-Rp nznUM394jp@AJhMT=pRG&Ch0flOUjo474$YHv*{f(NYCqSk7)N>#Ac7F(-=Cn^UKsqJ;`-+)Qeo2F5LkTgwAYI;a% zNpIRB2RR6c;4UmeFIrDMs=Lx!tvfq2JF{Li}W074Qg$NNY8gjwC;jL>rop} z8#^V+M!nc2(WWk$Hh0UEgUUs1y(rU5sF!MXU z?YgYcZqy!BzE`0F)Lx%L`+X`MKppH?sSx$%fJ%o@MW|xGN+tfNR;7bcI*ckq9k~*v z^3ghqsu+sWTSN38st5I6(J;+%!^N|-?cUsF&Ed*r=flC}=fm_2Dyub2D^LJL8X(ka z9g+q}q;(w}&y8$L5jpNNQO4sa6zOGu14t84TVmR*0;A+8hoGvK+4P7m?AL-XJMmIvJi0M z0ok-!0$Cp)mdWn;?yJd{wRhTNO|jc*L6Z=O0kTVxOIdG3f==Ct(5JsE^kYz^NOTO) zmwzcqm396!%UT1J(HN>+&?pcC&qQtbNImwP*ghP;kBxkd3TQ-{9%_1`>9AYdoN`em)Of!|gVmll4?(eb_NnX-S(NmP}kfM*S^A!CfN42ThPSz!W^S8{Mbq48)-!?unvJS>} z)AJfam3D1rOcA^8e+cllVM$``RskpFV2I3tkeQ$A@jYeqIjtR!B@B#tnPw&H>=cuA z`Jh@E+Xc4W1IIO!y&YcB@KJ9zF2U<~kM8CH7}e|V3Wl$~|XtjU^6EkDTspqfOo)&XTE*jZ;; zOx82Cv!05q%lvAM{bxN`+5=F1B3Vy%XT3Vvvc8mbS=SeVf%B(@_yqu}b<<{(-C3ui ztV;&e+Qe`SC%r)^1)xBpHHh1t^{UjBb>L9HQtFw^VYgdGQ|JT$jU+ooDIn_+)QJP; z+iFq=|GdCfvj9~EKs^8y03dlvvTjeFtn=akMXY2kBSitEsAs=dtvcva3f%sK!vF18 VBZ|rHQV9S6002ovPDHLkV1kB~{!;(| literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/ic_more_community_list.png b/app/src/module_community/res/drawable-xhdpi/ic_more_community_list.png new file mode 100644 index 0000000000000000000000000000000000000000..0fdfd00939e6d24e9e2de9c7c5844a862ad37fd3 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u#3?$#IayJ4}Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaND0(?ST-3xq9o;-Q{`0-PxPMtV$0!Vg?>^TmUWi1Kv3ud?)9u{Hj9AXU= z2=H`q4AD5BoFKv4ETzFF)u5pkm?)B$kzvpg#>;E!@W`mGjjbu;;)MW46}{|?42=%9 zAV!ZEnN^K#td3{Hfbte>O*?pW7CD``6KL>+f#KUG!P8fgihcvlX7F_Nb6Mw<&;$U^ CZbX*= literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/ic_name_community_notice_list.png b/app/src/module_community/res/drawable-xhdpi/ic_name_community_notice_list.png new file mode 100644 index 0000000000000000000000000000000000000000..83d70842c8745210b549b205a8352655cd4c8192 GIT binary patch literal 487 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 literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/ic_translate_dynamic.png b/app/src/module_community/res/drawable-xhdpi/ic_translate_dynamic.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba63302a4300f01d7737bfe7e39a5593f19d744 GIT binary patch literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^5~fTleJIRj+c?Gr%75H>{Rw2jOmK*w8^1o;Isu;ef*z4-K6B)l%|!b$B6COv+R zwa>pz?fMZZzC=e;&`Ew*^{>DG%4Z#S__FZUyS4@QK5Q(pMLWaO=S$4D*RGeRdCW{O6rGsn*s*jX z^X!Nm3;Tl(*Jmr8Vf1HuTp4vn<;KHr5q_)|50(ZzDY!5HvdU7LXVDJpBP|ET8eiub zoH R7Xvzu!PC{xWt~$(697)o<(B{e literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/ic_translate_selected_dynamic.webp b/app/src/module_community/res/drawable-xhdpi/ic_translate_selected_dynamic.webp new file mode 100644 index 0000000000000000000000000000000000000000..24b16831522804b6c7c984b854a06f70c94b313e GIT binary patch literal 344 zcmV-e0jK^_Nk&Fc0RRA3MM6+kP&il$0000G0000N000&M06|PpNTvV)00GazxNRHB z$(5YBXPz4o@qtCdWM+tK`FpWWW!9#3vif+At&5~o18^AGw$eOY<2b}!ak>4s#^hrK zMD%|G$coWnY>|+m(@fBiP=^V$G3mZ9b`t`2C)_8k?wzc$ztu(;XRItl9mx5cr0mPF zIf#f(*swjYb=@N_OtS{9g~GB!V49|RfXBf9N|lIci6_GxS89D>@gMV~2pKxf1hV2T zVv7J)P&goj0002+1OS}@Di{D406vj8mq(?eA|Wss3;?ha326WTE_KeQ5Qg8_77aH! zni2ixykdX={`t%exo;;(@onKvj22Xqt2%}TU4zZvv&Z)zCw?Zq{Zh7hp&KS+G_8&| ql&@0KHq+3ah4eX literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/ic_video_dynamic.png b/app/src/module_community/res/drawable-xhdpi/ic_video_dynamic.png new file mode 100644 index 0000000000000000000000000000000000000000..a5bc7306b240e52c98e3f8513c0ee1c81654dde1 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^N+8U^3=*07`vZ_-Nq6*hWMJ6X&;2Kn7072S4sv&5 zSa(k5C6Hql;1lBNUf`ptsj088ucM;_CxHw-Jv|_)tE(#~CkJEzfq{VmkOYbY88dYD zJ_MQ|SQ6wH%piKwbgTTFuW{|RY!#PYuk~(SW4#?H`QFpTF~s6@@08nOEeag2AG@Y+ z`S`!S?1IeYEYly)GH)}oFrHJLGgZ>i`!$Qr+6AY#lJCqo@G+4=P;hZ(r zCB_>=Px>G4S$}Gq(90ybOJ^)@z4`v5eA4de2i+GLR?G<2d%2OvA#T^qOaDWzFFN|g zQqXn&p^w7L{8qMyt(biR+e?2KJk2W zi27sI*P#03)iwozPahU}7_U@~6X;l(u%0QjzuBNi;-S%`v?+asjQ`gKexB8MF=)=Q ylr81*LR*=%?y|qEy<)+9TC)1wC#44E+%&GRP1CA@7?VJIzw6a748t&dz5(qbuvPTl2m}BC002ovPDHLkV1hOR#{2*P literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_detail_share.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_detail_share.png new file mode 100644 index 0000000000000000000000000000000000000000..5c15b6b55525b5ce93b774e4b85e98bd2531e77b GIT binary patch literal 451 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 literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_first_dynamic.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_first_dynamic.png new file mode 100644 index 0000000000000000000000000000000000000000..48c50bdb26e5369c64c90c619a80f90d203ea46b GIT binary patch literal 469 zcmV;`0V@89P)@}Jj|v&%c(%mpFhp0KFp^+&8XY+?1I|Bvgg-t)w%Nf_`d7io8Zfj-Nrkj z1U>)&019+cPE!C(|Nl={5RK}-y82aa0003*Nkl0xER=NK|7F)p z%?dbYoBYq5%8YLS5vS>`+3uUUp>4PGq_o;w#&3vSx&88$c|k0#y)_SH|Lk}3Nc+(L zH$E)2$-%e0}ezyx_}Zy z>i~k3O8}o{{0YcVYFtS5$K1y%fb#(<1AP8fK$dST=Kd12u5v(zMizspfxtW<1<2r=r0MtH{ z!9=7k;Aav^z*6~FJ=T3ma8S%s8nCHuphL*-!U3@huxdMN50dMLiOGr1DwOTa8;Z_B zvZvf7Vh6D3mKM;vOLZ?$xtdp+s>7h$>S$9PZ|ma+%lOgu{BZpRb152YkB|1Y00000 LNkvXXu0mjf1%B9@ literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_item_more.webp b/app/src/module_community/res/drawable-xhdpi/icon_dy_item_more.webp new file mode 100644 index 0000000000000000000000000000000000000000..cc950ad3f0282f73ab8abb9deff3366ee57e969c GIT binary patch literal 710 zcmWIYbaUIs#J~{l>J$(bU=hK^z`$St#F`8Y(hLlq&dvc6Kv@O`CJ7M90+h7*2N-ENQg5fwKy55=mQX!6ag(~U|>uE zvPIG%>vwRZL2rbQl;W?gG&e!?Ka@_*H%{(P7J pQ@7cjN#7 literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_comment.webp b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_comment.webp new file mode 100644 index 0000000000000000000000000000000000000000..0f74d2b7d617055ff9dc2265c77118a9ed67b5bc GIT binary patch literal 1388 zcmWIYbaP8#Wnc(*bqWXzu!!JdU|=u+Vr4M$baoDqU;=U(m?S_X3s5RIucRo*-AN%L zGD-m?1_O!7#RV`n7MhWP;oCI^Aj!aRSr>~uAtBC`)Z%2Iq7Oh^QUtV|fq^jv$QDV5 zuq#09BnZ0)#4ZX6at5kd0Ay>VBe9c^*ySY!B|tSNKIgA?khp~qQ(3^k zz~92aup2H^_~3|!GLha&VM;sS?X6@YqVfd0$} z!gPilhExUx22X}OhGYgkAj=4tNDLXwfGNgDm6?G-U-ZW7Nh10OpGXMN5C3@vg-P~1~ zyHaF6T;7-96SOw#ZS}SP`e#>Z#hS0WrFwXa?$7_fO?uY`-JW!RJy%vVlk+OC%Qsfl znx37|vi9AoUsu%rh)!V4^jtDi%k6g4qE$^yOi_~p7^EdU4l+8ZFtHmQxMcD%%P-0F zfJz9XM}(9@!lay1<_2KS;Rs-2WtpK8GNH-SDOZRqfQi>Ypi`tlWr|7=gTlpaxykuu zLAST%wr;&EQJQ@FS^J;=RnPv3-w(HOaQQE3G3i#D$@T+5Z`?g5sd(Z+myX?@KdbFg z!IqtC5{hqKo3{xV^AT&TCNA6htuo=|?APyNH!&PC&la9vyVfBfe1mh)y?ejoofbS! zI8u|d(T`*ID9-kx%?Z`vm|@3W6um|b3!QdZ`4+iLnFOP+Ur!uw=v zKU_+*5SXxcjvlwTQA>Mni_r?N*{i-=Dp{{CcA2&?#F_E)Y@P$MKW6RIvO8>>{6N^o zL;q+%8js1rhhK^WqZw*v2_^@x%s+7>f8$lx)tBs7JMX^C zbi7DqnS{4jSS81r8#3)}Dz2&@K2Kr15yr2|_CT=4fQ{?HY~7^}->&a|zV))hO2wai z<-Lu%+()W&&(CX}*ZbvGNnhHG+X;$Oowo|lF8-<=w)%5hYaqLP?t)~-o2&C!w%@Dz z^yXpY?1xq?d9UIRzL;n-%ir$+_j$R@_Ib`H&wtCyhY>q1X8zr6oiG)Iy# zYtpHAx*}EzeNANw|33csBDMdH&!>#PuTS`$IP(MwjABk6RmD^t(ZkJn literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_female.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_female.png new file mode 100644 index 0000000000000000000000000000000000000000..235275bb4080b337b40d7d0cfd59e24a0387b79f GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^{2mdKI;Vst06*G@;{X5v literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like.webp b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like.webp new file mode 100644 index 0000000000000000000000000000000000000000..3e9df0182ef7b8706865c458cde37e81196a2c5b GIT binary patch literal 2534 zcmc(fdsLFy7Qm16*0P+UtieZ+St3{zSyo!9n3^+cf+93t6*R}^p!jTLYOGAngaXnY zI+-~t;)GAG`RL&iL36B7(GkNmAKjv~^rivxS*z9jF?Zd6?ppVJ=j`+Q_St*wefGE4 z=j}=$D3<}?>wL(Q23f?03Kuh=KQ~@meJ_3!I05wXvHz0-~i~+AYK#ti4*5J=o4qn zGsDN*5wa?qZ#G}ye2Q37M z1>V2~9D?|NI=<91`UU{I-vO{7=Zh{V7l7K+02udu(QPUKU}YKrHJvemjKGh{EQBO1 zBm{uTVgOc<0a*Pz0Q!{AiGK0@@-6 z7t}FF3YGw1gKA#7Y6WxS4V|7HhgMc|&A(x~@pa3i#LILXnYMk$&uH@GfE4^&6(D`BO&7{mkkB-{cBMDq)2pd z2lHX;fQ2!~+zn?AdlZwvuOH1p_t%6`BJ*S6@9ilL|2R_<+5c(AAMdBI`w7zK$?N(T zz{lqOeEt8^u55hvI8C7~T0Gg!+xk3jXVN{R#`t$fZcy~2R{nVw{3dz?91;)WYm-K+BVHAS769A^&l z#Hwet*}%T;eHo)tv%fV12HE7C4X5qp2J-wnGS%2Qv5FheAWD^GAQRs;4&JK&mnm7X zkZzGw=ee1B|Fm3%(p7!8WKgWRlBy_e&ob*;y5;~jsqU#iose5LbFroRMPt)jzJkxv zFl>L0IeO>BQ0=)F3+ih}(ghKVEZj}8m(Jn5Hq-pVn7!vbQQxNt40Ejc!&`Ptq}ySc zROuaZk!&Sji_>IO1iZT4Wiz0o6ou{ok#u%(T z-@{8US^JXVKwmoX8^?N`)XAhU8$Z|*p?h#5;mXVWF^$oIkkojL7kE0{WkdWHaYa4s zRlYJ?c_9LSL$HbOjujJf8EqD1lE|tIM&?p+QtO^y7cd3yvCr#evrm7)tZZ<|+SXa3 z)B3CierD9_?EJKgF0ECj4L#|nL>z11wk?&zs#2VVI~Gmma)&uG3qEzrYNkMbu)HU) zJJ|n1jgOkn^#{$f%|n*iKMW;SjY#6NRvpHQX%eeSDo17I+a}^rL)sX8YrfPc_cF<& z?AE)>-GvwzwF`}2xEuUtZ{9Nza|GSJ1VuSWcEyrKRD8LLQ%1FL=W%JS46d7yQGzKv za%oRr={Sh=dNFZ~jX#9|%~hLI{adTDyIppXO&-LU2s!ZeqGU4>)j~!T(OfeSR?gYV zv+md@CzV}$lYMU@(O(@{1CAS*eS@$q!gNhZ78eShq(~TCcOio~oQ@DBuk{&S zxKP=iq`b9HHfy+W*f~35Y(NbTsFUI*$JS&b*ldr|`)+JU5)E=KqrEc~Y4dl*H@M`= zQ!bTA(z7BYyF|`4+hHi^4^EqUkZx?0%Pvn2V6<@~oebBryXF`sB3fJea zTAh>#MauF+@rZsHx#*v?*uf67J4prrI6Xr3|KVqncO1@Ml(AflJiA^vANI){gQ!+n zk=YwjI8nKgULan;lXt*{Iis?w>#x41&c1n6oF6dT(Zo#-ottgmU4|c$tYvR(gUZ8m zV+TLBZl(<}^C|OhEo4?VeI$X3M7u^ zj1~JZxSP00N768Zm@8eoinP(Dr!-i8d!kModSz{G(^R(*Gpv1iDrI1igSO{p0;#6u zuo{oV-FFj8q0}9D)_kgT7ayo zQb=vlK^lGa@!+j8qJmJv#t;^!$vHN3p&fQ=z(2w^Z9GXGULouyg|n_-5szvL9ioGjRzax0pW9f5}x7#Z-0 z60eZ<>G0dX9JP)bVG7wVRUbD000P?b4y-7D@iRVqe(rSXpQH$0Hl~ygah!@fpsftBxji!y`!#NwyoNQvU zJF{oj{e2*i|IF;1Klx|QnK@?`L_|bHL_|bHL_|bHL_|bHL_|bHL_|c2E()DMtCDhM zC2$L{9#{dK0KNxyM{(`vkh!%ZSV59tgg6!2xolWfzH&ouh(z*K_`57S ze)I!3IGaxa^(Kc;dGRJ-)ITUGS73N#8aNId2KG{~ew$6k?J0agtXqLqPW%mUpviFu zy?B%TX(nBe;gK<58};gBo4K~7TMBZI7mty?yK49x7zZ{k;G88)kyini0~>(V43E4r z$GJPA&|`@0uFe29JDU^WJ^$FGTp@~UzW^@)JAmI7+1z^IY2dEbvdu;}Tp`zze!x2d zd@;}QW56-sI$-rY$MpgIz!qS@Zd(I9lawnvqqz2G%Ne(!8wyhP;tw%>|15S&Kfz4B z&p-WMuJmCFFpilEYs`;r1g@~#JFc)@mh*Ier?;!w-PPjNtEZy4HUYc_eCF&av9K{H z7lkc|H2_@Z#3z_NU)8cCNr>XwNeVRO612;*SHU3W8DlNZA0jDNrhs#RWzI*w0)EP@ z{U~ZIcwO)9ns1ECRj`8CV%z~djF~21L;62+3h)Qk9hfm9OM}2VC;k;PiyTC-g4io# z6!W4&GfPPqD8UpYYg!s9z|cUkYmXGUi>O> z$cYDl2c0;<4CrB4k0m;CcOQn9CGlxs}HDGgUw?>@t;F-lawnZ%z*BCKSVCBo-GJ)A#kY^ z{{eg&D3=+%T#(JAyUo4St49OnGNYFZQmEVAhMp^ky@Oi;-0W;lD8TpuJy;OyO3YeF z!x0MdhGVZ5#P6FZ6T*lekA=I@Emq7%Pz&9-{do+?KEi5+fRBL<^awtL1-Zh@(%E<6F>AH$Cofg z%i4D8)qiq0Z%aaUS+4`T0=5ru6!S%&!U$H7D6SpEbU|-ox-WlHFYotu4*@R&`*Ut* zQG$OhdagBfOhNLP;RW*`co^6g#kFHOwIL!RA|fIpA|fIpA|fIpA|fIpA|fIp@;~)2 XQw;hZ7!Go2nNy^_ER98yvdCo? z;&qqHjD&C^mv~(wcOzLt-o5WXa6X^!^L?J5zTY37&+~ciUv<7BEpbW$002nCp!P^1 zs6k)Z4)p)jr*xaBOn%J+v7|q;O?c?{MMwTzN#a&a$shrw7L0*s` zIGlK&Ws4q52W?zf&H0ROw6uJB?upg(JU(J7av?9KKP-PS@!8@nSsOW#e;A{$c(<5> z0=Kf5y^lc8^p)2N#hdc^{ki|*9yF7ZZD)yjs{SPyI-#vF$3vjyKtJqRHtbp~r{~W%% z9O!|9KtaC<6!_XB+2iY7J|xJr57msGo-xy^!d6r?(aN5?R)<=Sm*g5}nkpANF0wiV zLqA)Y#spn2J6gSwzVrv6)+R1bA3Yunqqf^(dj{fRTJ5$C3w@uG^tKNa^J)Int*9VY z^on^BPK90PXANf{;yd(L$d7-2CQ>hI_9B*2JV>|K8HUm3RM_UezgTQvp#g{fxb0T5 zW^6?_RSwj88vpS75%OJmu(LE+?EQ6D(lY+uxpFD5P4#RAA5I{NasD!W>@P9qwR15C^KZexhU;O3eT%YS2O;OnqI>7C5+*CWu)1u z*!N$dFYkBT#GsWbx(r^{;*gVrq!Hn3g9Ncl#-C9!6o)#IXK!P8M9XMMS-Z(QmD1ck zq&G?NkiM)0>?NJ3%^E+$@J3#VFpKp*{>87!BNrljL)Gh@{v)+R!x?CqI~m+t6*-(2 zZ&QMyWx$EFv)-Ctp2)y|Cdy)IB02 zJZ2)1e;>Bz-9|G|YQkGS>h;ez;BGA@Pqx=Ib=tAlEowosgubpE$PMk3?VAksx1z)Z zK@)uiqg&st%-aqPHS#DuWmnNT>ZDNk-oJ;V|9;n}!x~*p@|98OI@WSfLn{1jU?!g5 zOgGl7AAniYU>8d~7&Mv=N9 z>qt&n)PR4|iLZj*YUg z%ByGh&DS3iyt7;#e9cctj{Tk-*?{Ya3vIqxgOb2z{X2awtgf}Rt*JmlGN-4bC47!M zIES7}iD=)tH5m}aL>ixzVwj$=iCe02pChbsDy)(3S|S9xLi<#QT10nKOJGeJolD0<4IxhfrzM!r~Lot(f%r6`FDtb5~-5!X1B3R+>-vS)vtOfsB}yY_h! zaWeC08|6{vpQqPmF(9h$EX|ThUIZ~y_g`%1kt^v_b$-ab>P$<$T7L~#ag4YL5lnU| zxoH@!tfKU4bV>k$j)dgh__!S7czZ9d1Y)9}<-rXcEQW8h_SvdtZUqNJ)Mdg6(;d?O z<&8$9RK0q!wD@_ahnEpA9Z7Nfgh37d5DuDw|P+0_v;gUlQY}Avju;etOot3K1gmm1axB`Lg(pL4#?_j%5F&gVJb?rk?|j-V%Hgmb z+$GA<-riB~&^8GKZrfl8PNi3TVZaWFa7`$g=Y-z&2~_V}V)0jC-uBe~Dp~2)s#5?e z8sa7-Ik+jcw;w&1pO8*Fa}AsFHpmDSFr9iZT^|{5Bqb~`GS`+Y|GO0>0Av7Ub!;jj z?+XfAWk?G;u9G##hA=SF~i1Oi@f5u!phIq4Kg+@ zWxb!^!Xw8H$q5zl@)=Fr*q`<0cy8uxb`!F>K%3=gc-G5eRMiU|GTT?Tq*aMYk$M`v zW1-hFoLyX`G10&xw9u5b7x&amf)lh*LYT$dT37aE(ddJX62#lY%U>f)Grgu>9cwf` znAYr(4h^^b{jQ=h=FNbq@KDv8_K%G{_R-Be0Gqpi_4wA+Yl&}~L1PpJg&@~QPowr( z-C})4`IIg$+ON6YDJmoo94 zsZx#dlg%9tZ4=fW9hzMpPZUbd9Mc)zGu1-0cIrJYT9or2Y%{dfoE|Q>lgZu6-p*) zp(F6wN(+L)dS7s`>m#u6!p14idr?Bjbzc|v#(BN4g_qVp;e#M+&iHd1=FE5Xs_ki+ zr;T?l%*R~P*wOQN@p+E%#0BL;iy z=uSRj0`Fat8=1QIvxRX(6#l5PbSPZfNN1RO>W+;kj5FNH-M+H8Lt*->?@b_S@^Nte zvoDJp^lWiwOlTaOP@oa+ITNv7t-IkbDDBejE& zG6X2%ra2?iW`#T6K85)=2)W7cmU!)mh>qxu?U*l|;^d=(bC(W%f|JhO(u&IF>HE>O z&RdV~(G1{x^wqO?_;~?UL0KHOU+b;akTBGiQg!whMVse4+{PmZoEBjsamqq{aj zIm0Vj=)1l@^12%cnDWO-U+)jT1e|+grt*q0Aoz(FW{cTfsUm}nR7l_SScQLl|ES5O14kHkeTG;kHrPyE z5rnu*beVI3vqE+yUvB?uXox&LCy_x%H>90Y0i_e zbaQiCW%^pg^YUqQQmzSR->1WuZyNzt!B#iQu9|LY@6gsWSo$#r(IEk)Yak^5ZtL~A zvjS+T7m3-@^8q>pStn;ib~SvfJGrX~J%HPgr)lEe=JHMAUwm(a?D379Yc935Vexi* zU__&eoWB}pm5Z`FfB$_@-7n*Qz2~(YmBaSTi+LuPFWtj`p|9NL;csr&*R3X+1Z0DS z@SMhCB9(4vZn)`<|EG+bbakrYgC|P8YQSgYtY-Cdq*S6@j|JKG8yg2@te*FuQ<4lX z=@DI(Sr?up1k{i!KZhdKuTv9_a{cv@$m$T#-p{_U59}LSRrJ9g*UsC|Q1K5d(^bfUQOTk3pjVJ?>qHy= zkFwN?w#=m6IFy$OhDr%!vq)+`Pfcb$I9x4h%=(x*Ap<0v8v(p1F(*wGYE-kV$l))FME1CCgQ)zGJO<^APO7#Z(HvV3_{udx-&#G1WR>b6Z`H zh;BE<47~nvg|I6dyRg^2z9fU>o&FocBB+b{_{02eGk}L` z)*QXmt7C=x{Kt2q!Rj-PQ&jzR*D zdky62j(9A9BBFvfPRPYjDA8|Fl;mmtst}#>aiLRC0 z%{RTQLRE3GeRxmgWD!H_LU33!XAln^(yA`Ax|Tulno;nta+}cQ@kMt;O0>vtc60}a ztTyX`$#K|7A}8g@)K<*`&!$efrpU8{VeNhcDUmV9M)Kzcs(dPdc^$&lp%7Pz>=G0c5WbN`^4`6beUET2?UE=tStS^lZ%xwb;5epbiYl0{H36_ z-2zmv_HlZwcP3LFI6vDEn1RsH4Gyh2Tc>A~T)-&bhevo!|IFt?YK<`H=rr@h0 z4&5c>d literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00003.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00003.png new file mode 100644 index 0000000000000000000000000000000000000000..95cc5092491803556e496bdda61571587b19f622 GIT binary patch literal 2591 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 M07*qoM6N<$f{}2f=Kufz literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00006.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00006.png new file mode 100644 index 0000000000000000000000000000000000000000..6e28f3062ce8d089a66255d9d9bceed28dfb7598 GIT binary patch literal 3335 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 literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00008.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00008.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd37d60c5b2d2165d60bd7f603a32de53cd4750 GIT binary patch literal 3171 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 U&Kxo~mH+?%07*qoM6N<$g4w$vsQ>@~ literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00010.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00010.png new file mode 100644 index 0000000000000000000000000000000000000000..00d4845214158f26557e36a4f7dff667abf08e3f GIT binary patch literal 2080 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 bio0@C&x=-EW)fZ;{TRf?%7IvG>67#~l|?ZD literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00012.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00012.png new file mode 100644 index 0000000000000000000000000000000000000000..b7686370f333a6d25aabfd3b539cad30efba271b GIT binary patch literal 1650 zcmai#`&SYM6vweGBa`_G-+`EVrYMG4SjTdxDa_YU)9m5$wM^1fFfmb!>C%D9*22W$ zvuQqn=@P}U%m*b)diWwLf-sL}N=i-hvDKvf<%O}R5`WvHuieOYXxJSYeUs=W)Z)hVhp z5Axot*<7!D8KZ^TSY7vBS6R?C(}qUVM6yAyqU|~V(5SLNgScDP!V`>ZwZ9iUi*aG9 z?p;|J2+sU71LmhH)O4hO-_@RJcK3YnvNLS#42jcGcdzhe8r-j%LL0S@_Z+qCP)anAk7dy5mhN}( zS-IW@HI`idw_S+?SZ_}0V9bCMcy2DmB%KaZLI3H?%>D7F+Vjo(TW_Fe@dxXvoQ?hN}oBgCa()(Z_Ao$_NX(D1f)C(ROBShNsq`vGj+=l?!Bb`4VQa5Ck z<6>gPVj)Jry`8>p6=fY6p6LmcyEN{uDB`7itKS70u2-yX`tN=Fij~pz#aykb)*QD! ztwSJAhNSyW)qblnyzBY-8LPpL8%6EkkL1W)%o(U(atMyy`p;^_O5Pvi+xfU#er^@h z39LB*^?AoTk=h4ZQknt*H>u!>+mKgdm1i_kx(>o*UFb6EbUd*JeXy)Jq58ON(&ORD zDJy=H03!+^EHeU5DxwIYf!X!$Tx#^j-XwlL*c#!<%W{s7_iHyG9Q)vcuf$xB*k$0D zO0`Pi?z5XDt~q^l2@=gkQ|x`cUCE-;iwjuaeT++nx3Fl=z>X!H*^bc(Eg{BdNee8r zG_i>#KM|#ffyg%S2pD;ul<2-_jETa}S51eLA>6kF(XB^qXN83OGk&*cyS`9>4iCK9 zX}^^NJ_(NpFx9XgrG=LIv=Zc7=~v0#u?Ni&)});aSM(&|&wa)8ii3`2O=a5Z!Q)c5 zpx%==EmCAZiurA?N;UfacEC!m?OFajx#O-8+fH8W9VVq-anRo5jgE)Sy7 zZIJ9jY+QcOg_}MHr+9|-uIOf>C;KQOavmJKEIG+HjT&Dzqbx|$If<9L1<#%(VxuT4 zM>GA#r8U=Vxp{xBSxrJXC`nobm6ny{?TmSE+$^swfJtbB$4T8wu;CE3Zv~Cdx|;em zeOKN_Pj2y&5mLt9_87b=R4Yl_9>b)IlnL>qE2sv3slp*DAb!8Q#bD9I9<9x0o76g=iT_E(2kL? zs+lz<-Z2O1`g!%@dfk!Uh_&XP)>`%Ye0$$3*%G|BUnI`TVVb`w#r!6ZWSmR4tgpg$ z)*r|SZ|DZC?fJ1ebn3GcmU5D}sEu?;h3|#VrUud*yH|`0i{F>dX?ip2#tyzz4WWHJ zcAp{-}$OJx3KXQj1D>`@k}2|GBA7Sc=}@tl;8Py9WB!y8r;N$HD_S{%0xw0s$T?UjP6A literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00013.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_00013.png new file mode 100644 index 0000000000000000000000000000000000000000..2c7a0559c4e618923777b51c8d3531a1e8f60191 GIT binary patch literal 1313 zcmV++1>X9JP)bVG7wVRUbD000P?b4y-7D@iRVqe(rSXpQH$0Hl~ygah!@fpsftBxji!y`!#NwyoNQvU zJF{oj{e2*i|IF;1Klx|QnK@?`L_|bHL_|bHL_|bHL_|bHL_|bHL_|c2E()DMtCDhM zC2$L{9#{dK0KNxyM{(`vkh!%ZSV59tgg6!2xolWfzH&ouh(z*K_`57S ze)I!3IGaxa^(Kc;dGRJ-)ITUGS73N#8aNId2KG{~ew$6k?J0agtXqLqPW%mUpviFu zy?B%TX(nBe;gK<58};gBo4K~7TMBZI7mty?yK49x7zZ{k;G88)kyini0~>(V43E4r z$GJPA&|`@0uFe29JDU^WJ^$FGTp@~UzW^@)JAmI7+1z^IY2dEbvdu;}Tp`zze!x2d zd@;}QW56-sI$-rY$MpgIz!qS@Zd(I9lawnvqqz2G%Ne(!8wyhP;tw%>|15S&Kfz4B z&p-WMuJmCFFpilEYs`;r1g@~#JFc)@mh*Ier?;!w-PPjNtEZy4HUYc_eCF&av9K{H z7lkc|H2_@Z#3z_NU)8cCNr>XwNeVRO612;*SHU3W8DlNZA0jDNrhs#RWzI*w0)EP@ z{U~ZIcwO)9ns1ECRj`8CV%z~djF~21L;62+3h)Qk9hfm9OM}2VC;k;PiyTC-g4io# z6!W4&GfPPqD8UpYYg!s9z|cUkYmXGUi>O> z$cYDl2c0;<4CrB4k0m;CcOQn9CGlxs}HDGgUw?>@t;F-lawnZ%z*BCKSVCBo-GJ)A#kY^ z{{eg&D3=+%T#(JAyUo4St49OnGNYFZQmEVAhMp^ky@Oi;-0W;lD8TpuJy;OyO3YeF z!x0MdhGVZ5#P6FZ6T*lekA=I@Emq7%Pz&9-{do+?KEi5+fRBL<^awtL1-Zh@(%E<6F>AH$Cofg z%i4D8)qiq0Z%aaUS+4`T0=5ru6!S%&!U$H7D6SpEbU|-ox-WlHFYotu4*@R&`*Ut* zQG$OhdagBfOhNLP;RW*`co^6g#kFHOwIL!RA|fIpA|fIpA|fIpA|fIpA|fIp@;~)2 XQw;f@h6t z=B2QglNDMp|7Kl5R;cd5Wv0od^@f$jV#`8xsw8h04j$_>j?fngJW3|P$x(p6y8Bsm2vW&11wQ=06oz?{u;b`F>^ z31>K9xzajdPLtBC6+*4k_h|DkK0T06v8@ zm`9}}BB3=^T~MG9iDv-P?39+{d4GSv@*MIHLSN7WUs><4u*w;Q21r2+pY7~D8hKB>a7SRiy@K~G`x5~gskgY4gAv5hc>XE0;^ffF@qn` z@|)q9Lb_#LiKbi|?tqABvbH@f$XW^{3m;c?&7TTqx%I453H2ZwgXt)$qnftP#nYpn z9m9kyW3WJa?Ko;E=6?D*wsrirg zpI4d>ka2zgf{loVa5L59Se3f}@n*;DKzD(q#BHU^?awTBpwhkn{U9d&49^GMjW+zt SXzhbDPxrz#cA&+x0000uTyoL? literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_true.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_like_true.png new file mode 100644 index 0000000000000000000000000000000000000000..5881cc041ead6e01e6817ba4b97b9b73e9788a3c GIT binary patch literal 846 zcmV-U1F`&xP)^Zi{X89zA(buah;0okRaZ4z8{2>&=%Wj>RK4sx4MT}iZmq`yllviA#97O znHSXG<#HEljn@R4d{Z0RxBE{d97>w=f5sOC9JRt`Z!iL-SS-Yue9`n1)XI#SKou9B z7w|?(n1*Er80m2KSY4p9TY3pFmm5yWQbjzLuQpAOx0+Tr1U%4F9PvDwz?I9CNUJ)nZMe!3+Y z8BDlj9?O5g*(#tZr$=(|v71(gjPz1McjwKf-J|@Y3Ml%cJQ&VF*qYw4NhR@fXVLD6 zU1gQQa4f@y*dz@=;-h@gz8w!#40=UgYC0*U0b%y!9VcReHK{Hse0uS49G&bkqmuIFK&rK3*-iUczQ z>Y?>N0NB__Ttdx#h34t5VNR{q)x9y6UDyZUbgO~r@m_w&o~-3t7bv=p6gE_!Dq zzSimZTaq?2(6V9aL~z(xjzV~_PRIg0j^~HW*|--t^D3+NMA7$}p+*HAsMhgH5b&Lz z_nG;!mubps0ZtESr_K3yA?zdYRS=pB-NU?*W_nuMp+*Cf>YDCQQb5-6b)ckds|M7x;mUF*>in&UH z{DK*TIli5^a5E?`ch|>b+(6N2PZ!4!j_b(@3{2}nSBn`eFlg{ma6Wu<3Fnc7o~W%^ zD;Xv%+_fgaMw{crjHxFMC~Om2ab|TxV`DAnghbT?2M%nJn8`SuNjr`)Wrd!0(0MK< jBL%jmHH^^*4=^zBxJmw0TXk3uXbpp>tDnm{r-UW|zfxQD literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_list_share.webp b/app/src/module_community/res/drawable-xhdpi/icon_dy_list_share.webp new file mode 100644 index 0000000000000000000000000000000000000000..6fbf2d0c341555d799518b21305aee8ea7e37541 GIT binary patch literal 978 zcmV;@110{{S5MM6+kP&il$0000G0000Z001KZ06|PpNWlRB00CFypp7I) zI(N@p_`o0VKZuCPgAgSfe<{;=gz>u{E5>%Z)h<^T&hMk$5QMB18jMl}5^UQxBMG{%H_YZiij%rT;C*5K%>^lV5i)c!KKb0run$=I#cdg_e zQk`NhT+9*qq^*J9DdvU?fY*(&46G>4Axw$6DcuoLCmT9;V>kH3cF$q(aA_$xW)L8N+#`7$-kZ>-b&l0x}&Yf*o{JJIB zaz^3y>uzDxDa%3kSM@-))RA2{$@`kT6W9^8IfSXNnS!uclQr-=zM|8IHHj>_hg3(r z&J^4gM~U|d{#2eVZ_0;HPps{qz)82I`vmxG6T5d0aJ$%BT~t)vyLbz5=Skd>wUC(M zTCsd#^KRCX-D#FDE*srGPXs~Ye0#J^{$v1FP&gps0RR9H3ILq}DkK0T06vL0mq(=| zq9HCg4q%`W31-;%i^u}zmJ^FF$tudE6qXl+mO}bg)?~6hdM7gTZtec7;Xz3T%C?$9IB2VtrM5ke zIiM$%n$d@o`1q%AtDW=0_?Qm+4n{|X5aP0e3!W0;_NU+4S=Ml#nt-P#2aUFn04py*KYstiQ+!A@m`kM-|N3_Z|8I-6Z1UkipR`QLW{bE#jw|R{#4Z2;0I>qr A{r~^~ literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_miniworld.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_miniworld.png new file mode 100644 index 0000000000000000000000000000000000000000..41316ad8e8d52d28fa0d6e57e661bec209d2419f GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s3?yAI>n{URW&u7SuKz1r{+BoZuW0>W-3($^ zwEwSYb1(4uU)c)c0?G2G{}n(5&Ht-_s0D;7TkcifWCNNYR1)MD{M@2f_B=;5!@WO8 zwLGHvH?RFDSCA~gz`&^I>EaloaXxkO&9Vjs9+$(jPH6rAzj-dhEwRswj&nz1_fv(ElTvsIn<1S0)+FL?b$eckI>{`LzmE>7~!J1DBnyuqwy;aQb!%PYF8 zwg{;@JfEoedH#uiYdfp%ecXSba*5uN9r`o-PjDG>rFE!3X3+3q6Ti*wwl|Yw?M?pE zPRR^+U7k)hc`4)Y;?~>?i>3s&DmYlYTUfu!QS{fLMV~*n%-^Dw#{b6T?ac|Bt~~qu zTgLUKh_LTb=N6@EPG0@Ch;<)NEw5e2s+gF>#k6qR2ga2eJ9Py^kHs;hPhDg7DtCR4 zmGRA;*QYp#tiSO=C;I&Awotj-S5t+z_8y$Ab!C;*JE@gA%@@;r{uMqptvh>jddBW& v*-vgd+?^cQ5jRPfaliBR`wQJadwpW&NDz4CSCrNb3|9tES3j3^P6ds|M7x;mUF*>in&UH z{DK+IN`8BhyDi_}D}L|P89>olo-U3d8t0P}7APf%#<8-tF>(Z|tqd*L5WuK+W(OB1 z$AQ+>6I!PqZe1FtdT>V8YOzDDYr_umrbKO((A$$G%4}w~w#715Y6IuyHAM&1&TP#( zxWYgzQKyho=$O!Fg@+nXN;Zk;^{9q6wrpJDIKhC~TIr~mfkKNRFVdQ&MBb@0MoZ}Hvj+t literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_popup_delete.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_popup_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..e74532c11b5d94e83f9792b3d9266952ff5adc79 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u#3?$#IayJ4}iUB?$uI>ds|M7x;mUF*>in&UH z{DK*td!LnL%iorl05~5DJKCWotQb zDCor@?vI?04O+bH1X-$_138)w%B=8jxHln+<6uvLec{@u0|z!_iLx|XEL3hyvo ibCM%)GXt9xGlR^*UBdH(tEzwwWAJqKb6Mw<&;$UD>uj$8 literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_popup_report.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_popup_report.png new file mode 100644 index 0000000000000000000000000000000000000000..4ad26c307de23c7ccc33e7144ab99b2f20e7bdf0 GIT binary patch literal 425 zcmeAS@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv7~+vjCqESN8&+|D=Pqpfk}x69h|w z{DK+Q{3!4e=Y0QM<9dhXj@c*T9+_-PVPIes^mK6yu{eEq%3Y}z0Rab1r_|HG_rLjd zmgmsZI&1O3`<{JiZ4>76y0$LJnk0IxZN_5#$IjHI?MPs z1wA(|=O(D8lrEmN;r81dZ_A3lM(%&`GA-xDiMxXJhwfN^S}2L#?)yyg({Jt6oB#|t22WQ%mvv4FO#o1e-HZSL literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_publish_examine.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_publish_examine.png new file mode 100644 index 0000000000000000000000000000000000000000..243d470a0c806e32b30140cbac67b11b83a34405 GIT binary patch literal 10709 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 Hu0mjf%*Ci| literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_publish_false.png b/app/src/module_community/res/drawable-xhdpi/icon_dy_publish_false.png new file mode 100644 index 0000000000000000000000000000000000000000..356fec1691f1be3ae777914c7819fece5b23cc88 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^c|dH&!VDy@tk?(=Pzmq}adj{7dG+emQzY;V44yoB z0$~7U4jboy4B{>c@(X5QdH-NR)S(=8>#kp~HajseFfw|&IEHu}pF7Q#|6qbh>wPZH z*)A?glN2V-h}hk6@Dl6(gV#=Kh;5A8HS?@luGby=S!n)vJC6rRw~@`q6G4Lf~-pY=e2)a+40#|zEEA+XU5{vOZx)kSG+Gd_af%9?V@V$_bhw8 zzwkZU?fu^7ulA4ri~BwQo19}cX}@r%xmfI6X_t)U=_mf&&%)+R-n#P-+p&V)7fNTQ RJp+ajgQu&X%Q~loCICokwut}$ literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_dy_publish_true.webp b/app/src/module_community/res/drawable-xhdpi/icon_dy_publish_true.webp new file mode 100644 index 0000000000000000000000000000000000000000..f5e1edd5cad3c994d63b39ce1ae428418750b1d8 GIT binary patch literal 608 zcmV-m0-ya-Nk&Fk0ssJ4MM6+kP&il$0000G0001O001=r06|PpNdEu;00Bo}paI!1 z1xyA18(c&L`n^yF97&Q?JM;OQ4Ceo0lcnd2*3>bcDLlaEKKJ7{6(KvK|BBo;QYNzu zr=d4k0juXf)g!(iSp^0^@*rxIw&h+v#7(BDOb0vp5gJAEB~LC2+ETu>^0JjLQLbIf znf$PkH`!q+f10U$$)8y&JNXl!wbJE>2)dcq09R&v5yUnSL*rTutxqv@*J4;OFQu!k z7^0mR!d?vVQU4;?0=t5JM44H@j2d$x%3=Fhc))@Y75cD13x;(piC`(q2t!*WjZ4Q^ z^5;qo_rfNaF+(da&c{~;jVlqcg4D3`*KFYPdDO59te)#$C@Jj$09H^qATj{}0MH5m zodGIt05$+VkwTeCC8Q!EESE@luo4Mr01Pa4;NJqL=$^7UJ=s?EDaPmOP^U#${YeZu z4AO=3k>l5^Wn{n)BURc`;6rn0o~A0wifEK{cqQ=0`8!#l6>%^C0RH?&m6qVGa*dgf zwTPVl0Bd6qMnG{KvCjOA?19mh^YthM6^~LQ4QGgl&>~a= z*dpfRbdhYrulp50SHRuA!OKkYsn%h}R<+d~pi&&>)G-|%hh{>d?PCJm3ApvQKZt$r z$AEda{QuX8HC=B!ULSm?m`d+Oqcm=|=px7SA$fq_20002(v=N{H literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_square_dynamic_comment.webp b/app/src/module_community/res/drawable-xhdpi/icon_square_dynamic_comment.webp new file mode 100644 index 0000000000000000000000000000000000000000..84cb5597d061ce15bff7696a437cddda50c774d0 GIT binary patch literal 826 zcmV-A1I7GONk&F80{{S5MM6+kP&iB_0{{RoBftm{f8-{TBuA<`Exdzq01n@yd=77G zIZeY&BuS1`by|1_;{Y7KNBJDy)^gf$BT0&sIm_PzC(g>VnQ6AmVcRy6oHU(zcK0rT z08Xc?eZM%L&yM3gm&;~d7q8d7(=;2$$@O}(ZHL@$cgwQ&@p$UGQ8K)3+ceD&tZCck z^ZA*kHTQe(G<^e0nx^@Ff5vgixrN+mhd}3Tj&dL#j&C*s6Us&5(qx?yCCKCj1qU0clC3 znJPxxf}*N|0s>l+PyibkNWlR>BmxIAz|u7FYEEJ`z$8=wNLUamV3KTg1Aqbm2{b?n z6cAvNP(cbN3AITmKnXO!KqLYvl2DRJ0f0o?wvD~nNp0J<71nlR)QxSMAM*d}nfqUS zU-1AD{b%4vY8%qr0!y(UAxV-XNs=T->gl1_O${*UBM1Xd3*1F34xA- z3D4;P$W-j|f$XZxz{qKTdjJM5C3$qQA4U%P{%D1+-N}*J*$HjyT#Dx~xI0bwcJ#qZ zhv7g#_Hw!`T*wd}wh_vpDs8IX=ZNgA&JkILQVj*nZ!!RP;A{G-_zd@qflu%ty%a;4 zG0+5u)5}3++HVsjiCk`$G|&r=3qTRoH*fJgAb7$|^mwv+w1JKVWUsmr+U?)u9!-HHgIn`_3peu zGwa}>I{NsSM)Jo$v8TC{8+DpsqcyeTl&YmiaQE}f3@O+szxawXBciCHiXnH3srKfz zHnXeQlm_4QtsbtK7Q%&d<-x0sgrV~NI(AnZtBYJA$hyLo2AH1YN@tQOV(9|RS4DZE z;TRIF7ZLH96Io#k!}-z&WHDEz}!@_C{^#x#Duf7>%YhoN%#gL2uXvYr=cR zegDaFQVO&ps1>ky@6828(^*#tD)}TRt{?-xd_fki0YHmG^GQ|yChjY*wcC!0ru_>l z1(o7?X&&;RBA;wg^4WOTfhMmcMOdB}Ag-%HEMGtZP^1nCN}+ugL)895KfAzo_^zH) zYueX%8!xi~iFEX(>F=I{T{%-Q>lg>L4iZ2({kw*VfYt?xE6K}#b-7da>b|NiZx(W< zCQBg^YNnuc+8NgF+|o|I3jAdmxn$S``%av+p? zDJq?9-w!y}idJ`b0i{L+)mbq+WLTG05c{+s%;BI(ujc5m(4uqW%Yk3-w*ZPs8!PfO z4RW0qQvDSS1|Ze|l;uB!)5TQPhg^#CdpK$PHZh3Vl^BFC960Zj_GNI~9KXF2skvLW zJ0yAn32fC<)Xop8AnK63y7gJtto!qzS`Y-u0{+rjF#z=@nM@&Wrtk6OVUj=e^5;B243<*`E&Ec?ZV6n(ixM$MI9e?>bv2Um_59&fAGDtzeP;W+`F3mbitQFTxo;&-g{B@2q_(YMTjM`ElLwB?DEO5RE_F z{D_qinT;<4F4eV?7YS^*0kW%%+r!_jx5`^P!L*!d0R h=f=*Z)6C~MSB;rg`=0_e=SB!7o3kFGXCK7x?Qd}&psfG^ literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable-xhdpi/icon_square_dynamic_like_normal.webp b/app/src/module_community/res/drawable-xhdpi/icon_square_dynamic_like_normal.webp new file mode 100644 index 0000000000000000000000000000000000000000..ddf8316d5f9e97d6fe0055df016c5b8064fd0860 GIT binary patch literal 1308 zcmWIYbaNA7Wnc(*bqWXzu!!JdU|=u+Vr4M$baoDqU;=U(m?S_X3s5RIucRo*-AN%L zGD-m?1_O!7#RV`n7MhWP;oCI^Aj!aRSr>~uAtBC`)Z%2Iq7Oh^QUtV|fq^jv$QDV5 zuq#09BnZ0)#4ZX6at5kd0Ay>VBe9c^*ySY!B|tSNKIgA?khp~qQ(3^k zz~92aup2H^_~3|!GLha&VM;sS?X6@YqVfd0$} z!gPilhExUx22X}OhGYgkAj=4tNDLXwfGNi38Zdq6D<9wxsDG?BDL3-v=Nr5VOkWrJ*~HNo*kp3Kz~h(nrLuZ+Wz7@*S49;KCjuYD6@Nk++Ph}LnWn) zXBuy8o2X(L9uj)Lo{@Rp`N_9)-+#0?_qz1k-+R06^M9_>kI@rfe)*Eg+HX~$Iq)?8(VzcsBz$J4)NEG}u&ohb;oq{SC3EtMr79c&YlVP_;l#Gw z+Y^>dow+>cHjuR~R`mCO`RbG-XFCjkF)RH#e<1g^gUhv_%XR^_=<1>~V zf4FMSo>wQs?H6A^`D)LcRS(%cAMd;Pz;pM{w6wIN&rcRcy-Ar^TR6U<;m5ZAC{=EXSy-vom0Ht z?&)TetTgK<>dDCZUA*i4a^)TMWzX_oD%qdW*fC+>Y^FnRe@#6%M>OE}%rCcJUZ_7m zzeFTprgNqGrTqTODz)>r%%7d~#yc*bYcsFMt#f6)Z)83HYRX!wWNKel?AP^lR?M;1 z$~0A8@H^B~dEuV9B~OE9ooDj)RBz*Hkn}9hOv@~uv@E!_Px$B1uF+R9Hvtl)Xv=Q4odCz+$hR&tPHYi`;>I1RKGWNoA2LmJw`xgoW7`v9j

-LkJuwm{;T{26f|j5q#`XXSlkk25 z+{0r#goH^rcMmsBb5d2++}*D~YenR#>$hn-;Ztt)2 zqY<`kyKwjEZk~wTr<7*>S~EKrkym#={f>#q+TAZy^{t91$vwlW-}) zsGfu)LZxvME+rV%lW;_+G)}^$1fzNqjtG^;Nw}0?RR00c+L$elKW%^j0000Xg=2c2x92lsmm7{7 zNm8WDUO1-bd3!!HcDapg+iA|h6WWYkXiash1!aox*J0Z>lAH_eyhP)9?4R zSakFKo}is7Hrd-Y01a>wq5yy( z0VDxNIY5$AB}4-RX<{_M0VDye3Q|x4pa7r>03=GbZQ9k0ZQFc|ZQHhUnOuzjubZ>a zKIh>BBKogDZ5yXhxP9(?gd|ClBuSDaNs=TNh_CV8+0h0Cws;MmfuIOns;~K$^lpY%$-aH8;-LtJ%J?EH_H= zRsy&yadWf=fP*d%i!%Fn9o{YXH~^nxY4%as;+tvmi^-9D1EF@06SFD5x!iJZk}Sce zhgO|Bcb`^-%oynugDe}&I9yuaedNK9jC#Z<3u4X(0gp-A$gnj=bzhk9K^*QVPOaBW*r3 z1lQRXjM_J&);w;EeZpIPx%Pf0{UR7gwhlRsz^aTLeD@2*W7Fmb5urP4(d!KIFJmP!!wOJgoU6h)jYj)Is) zK@savP=tVsTTv&`;*y+AdKyG3WN^`fin<6En_r}Y6^qc`J-O6`HeUV=0T+Mk`@Rp~ z_j}(*(h#p0*ozK40$x+e5L4(75H7F-#x@~Z0!u;+kPr76tdQcI)G`Ix%tTWlAJ_fz zSKt{K`_>`+Qls85WwR@dpbdcxDAEv*030EvyA>SqX#!=Q`-4YMOi$Zh(1yUWA#ORq zIRHrbl~jsr8S6>2c*vxPu+5Jd z^rK5v_V;JwcE>W$q?>D2kUDLN>e!;-hzN{+yR0$0V74gw`M>B4iIpq z+QW?Rw$gLY^HQWCKDfdb4o5c`eJ}G2c vfws0>ibv0b_&R`|2Ea7}r8RT*VtxHLHRb!Vm}zjQ00000NkvXXu0mjffovqD literal 0 HcmV?d00001 diff --git a/app/src/module_community/res/drawable/anim_list_dy_like.xml b/app/src/module_community/res/drawable/anim_list_dy_like.xml new file mode 100644 index 000000000..de7ec3e39 --- /dev/null +++ b/app/src/module_community/res/drawable/anim_list_dy_like.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/drawable/bg_round_1affbc51_9_4.xml b/app/src/module_community/res/drawable/bg_round_1affbc51_9_4.xml new file mode 100644 index 000000000..da38d7295 --- /dev/null +++ b/app/src/module_community/res/drawable/bg_round_1affbc51_9_4.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/drawable/btn_translate_dynamic_selector.xml b/app/src/module_community/res/drawable/btn_translate_dynamic_selector.xml new file mode 100644 index 000000000..d7ccf828a --- /dev/null +++ b/app/src/module_community/res/drawable/btn_translate_dynamic_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/drawable/divider_flexlayout.xml b/app/src/module_community/res/drawable/divider_flexlayout.xml new file mode 100644 index 000000000..ef1416188 --- /dev/null +++ b/app/src/module_community/res/drawable/divider_flexlayout.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/drawable/selector_dy_publish_btn_status.xml b/app/src/module_community/res/drawable/selector_dy_publish_btn_status.xml new file mode 100644 index 000000000..6dee3582d --- /dev/null +++ b/app/src/module_community/res/drawable/selector_dy_publish_btn_status.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/drawable/shape_bg_mini_world_added.xml b/app/src/module_community/res/drawable/shape_bg_mini_world_added.xml new file mode 100644 index 000000000..58591efa7 --- /dev/null +++ b/app/src/module_community/res/drawable/shape_bg_mini_world_added.xml @@ -0,0 +1,17 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/drawable/shape_bg_mini_world_name.xml b/app/src/module_community/res/drawable/shape_bg_mini_world_name.xml new file mode 100644 index 000000000..dc4afa03e --- /dev/null +++ b/app/src/module_community/res/drawable/shape_bg_mini_world_name.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/drawable/shape_bg_square_list.xml b/app/src/module_community/res/drawable/shape_bg_square_list.xml new file mode 100644 index 000000000..5671ff429 --- /dev/null +++ b/app/src/module_community/res/drawable/shape_bg_square_list.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/drawable/shape_round.xml b/app/src/module_community/res/drawable/shape_round.xml new file mode 100644 index 000000000..44a080885 --- /dev/null +++ b/app/src/module_community/res/drawable/shape_round.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/module_community/res/drawable/topic_up_drawable.xml b/app/src/module_community/res/drawable/topic_up_drawable.xml new file mode 100644 index 000000000..25905721e --- /dev/null +++ b/app/src/module_community/res/drawable/topic_up_drawable.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/activity_dynamic_detail.xml b/app/src/module_community/res/layout/activity_dynamic_detail.xml new file mode 100644 index 000000000..9d4281a91 --- /dev/null +++ b/app/src/module_community/res/layout/activity_dynamic_detail.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/activity_publish.xml b/app/src/module_community/res/layout/activity_publish.xml new file mode 100644 index 000000000..50b03ada0 --- /dev/null +++ b/app/src/module_community/res/layout/activity_publish.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/dialog_dy_publish_success.xml b/app/src/module_community/res/layout/dialog_dy_publish_success.xml new file mode 100644 index 000000000..6d1bbdd70 --- /dev/null +++ b/app/src/module_community/res/layout/dialog_dy_publish_success.xml @@ -0,0 +1,50 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/dy_empty_dynamic_comment.xml b/app/src/module_community/res/layout/dy_empty_dynamic_comment.xml new file mode 100644 index 000000000..0e15efa1d --- /dev/null +++ b/app/src/module_community/res/layout/dy_empty_dynamic_comment.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/dy_footer_loadmore.xml b/app/src/module_community/res/layout/dy_footer_loadmore.xml new file mode 100644 index 000000000..bc98eebb0 --- /dev/null +++ b/app/src/module_community/res/layout/dy_footer_loadmore.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/fragment_square.xml b/app/src/module_community/res/layout/fragment_square.xml new file mode 100644 index 000000000..4ecd096be --- /dev/null +++ b/app/src/module_community/res/layout/fragment_square.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/fragment_square_dynamic.xml b/app/src/module_community/res/layout/fragment_square_dynamic.xml new file mode 100644 index 000000000..ed55cf0a9 --- /dev/null +++ b/app/src/module_community/res/layout/fragment_square_dynamic.xml @@ -0,0 +1,27 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/frg_user_dynamic.xml b/app/src/module_community/res/layout/frg_user_dynamic.xml new file mode 100644 index 000000000..62c4e38ee --- /dev/null +++ b/app/src/module_community/res/layout/frg_user_dynamic.xml @@ -0,0 +1,23 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/frg_worlds_choose.xml b/app/src/module_community/res/layout/frg_worlds_choose.xml new file mode 100644 index 000000000..2b42dc392 --- /dev/null +++ b/app/src/module_community/res/layout/frg_worlds_choose.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/head_dynamic_detail.xml b/app/src/module_community/res/layout/head_dynamic_detail.xml new file mode 100644 index 000000000..cb3b94e71 --- /dev/null +++ b/app/src/module_community/res/layout/head_dynamic_detail.xml @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/item_dy_comment.xml b/app/src/module_community/res/layout/item_dy_comment.xml new file mode 100644 index 000000000..b72093265 --- /dev/null +++ b/app/src/module_community/res/layout/item_dy_comment.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/item_dy_reply.xml b/app/src/module_community/res/layout/item_dy_reply.xml new file mode 100644 index 000000000..7ea890f7e --- /dev/null +++ b/app/src/module_community/res/layout/item_dy_reply.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/item_dynamic_image.xml b/app/src/module_community/res/layout/item_dynamic_image.xml new file mode 100644 index 000000000..2fb7e88d8 --- /dev/null +++ b/app/src/module_community/res/layout/item_dynamic_image.xml @@ -0,0 +1,33 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/item_dynamic_sys.xml b/app/src/module_community/res/layout/item_dynamic_sys.xml new file mode 100644 index 000000000..b6b7d91ab --- /dev/null +++ b/app/src/module_community/res/layout/item_dynamic_sys.xml @@ -0,0 +1,39 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/item_grid_image_widget.xml b/app/src/module_community/res/layout/item_grid_image_widget.xml new file mode 100644 index 000000000..01ded47fb --- /dev/null +++ b/app/src/module_community/res/layout/item_grid_image_widget.xml @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/item_label_mini_world.xml b/app/src/module_community/res/layout/item_label_mini_world.xml new file mode 100644 index 000000000..170b8f33f --- /dev/null +++ b/app/src/module_community/res/layout/item_label_mini_world.xml @@ -0,0 +1,16 @@ + + + diff --git a/app/src/main/res/layout/item_publish_image.xml b/app/src/module_community/res/layout/item_publish_image.xml similarity index 100% rename from app/src/main/res/layout/item_publish_image.xml rename to app/src/module_community/res/layout/item_publish_image.xml diff --git a/app/src/module_community/res/layout/item_reply_footer_view.xml b/app/src/module_community/res/layout/item_reply_footer_view.xml new file mode 100644 index 000000000..c5586316a --- /dev/null +++ b/app/src/module_community/res/layout/item_reply_footer_view.xml @@ -0,0 +1,10 @@ + + diff --git a/app/src/module_community/res/layout/item_square_dynamic.xml b/app/src/module_community/res/layout/item_square_dynamic.xml new file mode 100644 index 000000000..8b520eeb0 --- /dev/null +++ b/app/src/module_community/res/layout/item_square_dynamic.xml @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/item_user_dynamic_image.xml b/app/src/module_community/res/layout/item_user_dynamic_image.xml new file mode 100644 index 000000000..00b96779b --- /dev/null +++ b/app/src/module_community/res/layout/item_user_dynamic_image.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/app/src/module_community/res/layout/item_user_dynamic_list.xml b/app/src/module_community/res/layout/item_user_dynamic_list.xml new file mode 100644 index 000000000..4f5b40292 --- /dev/null +++ b/app/src/module_community/res/layout/item_user_dynamic_list.xml @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/item_world_dynamic.xml b/app/src/module_community/res/layout/item_world_dynamic.xml new file mode 100644 index 000000000..a15145ce9 --- /dev/null +++ b/app/src/module_community/res/layout/item_world_dynamic.xml @@ -0,0 +1,282 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/item_worlds_choose.xml b/app/src/module_community/res/layout/item_worlds_choose.xml new file mode 100644 index 000000000..a3e73742b --- /dev/null +++ b/app/src/module_community/res/layout/item_worlds_choose.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/layout_dy_nick_detail.xml b/app/src/module_community/res/layout/layout_dy_nick_detail.xml new file mode 100644 index 000000000..2e711be81 --- /dev/null +++ b/app/src/module_community/res/layout/layout_dy_nick_detail.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/popup_dy_comment.xml b/app/src/module_community/res/layout/popup_dy_comment.xml new file mode 100644 index 000000000..633e06c99 --- /dev/null +++ b/app/src/module_community/res/layout/popup_dy_comment.xml @@ -0,0 +1,51 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/view_holder_world_dynamic_share.xml b/app/src/module_community/res/layout/view_holder_world_dynamic_share.xml new file mode 100644 index 000000000..767baafe6 --- /dev/null +++ b/app/src/module_community/res/layout/view_holder_world_dynamic_share.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/layout/widget_grid_image.xml b/app/src/module_community/res/layout/widget_grid_image.xml new file mode 100644 index 000000000..eb49035d7 --- /dev/null +++ b/app/src/module_community/res/layout/widget_grid_image.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/values-ar/strings.xml b/app/src/module_community/res/values-ar/strings.xml new file mode 100644 index 000000000..6b16ca61f --- /dev/null +++ b/app/src/module_community/res/values-ar/strings.xml @@ -0,0 +1,20 @@ + + + نشر الرسومات والنصوص + نشر + سجل حياتك في الوقت الحالي وشاركها مع الأشخاص المثيرين للاهتمام + نشر التعليقات + تكبير + غلق + يُمنع الإعلانات التجارية وأرقام الهواتف والألفاظ البذيئة والإباحية والمخيفة والعنيفة والمهينة، وسيتم حظر حساباتهم! + %s رد + تعال واحصل على مقعدك + قم بتكبير %sالردود + تعليق + ترشيح + متابعة + الأحدث + الساحة + اذهب والقى نظرة + + \ No newline at end of file diff --git a/app/src/module_community/res/values-zh-rTW/strings.xml b/app/src/module_community/res/values-zh-rTW/strings.xml new file mode 100644 index 000000000..e639d258c --- /dev/null +++ b/app/src/module_community/res/values-zh-rTW/strings.xml @@ -0,0 +1,19 @@ + + + 圖文發佈 + 發布 + 記錄你此刻生活,分享給有趣的人看... + 發表評論 + 展開 + 收起 + 禁止出現商業廣告、電話號碼, 以及低俗、色情、恐怖、暴力和具有侮辱性語言等內容,違規者封號處理 ! + 回復 %s + 快來搶占沙發吧~ + 展開%s條回復 + 評論 + 推薦 + 關註 + 最新 + 廣場 + 去看看 + \ No newline at end of file diff --git a/app/src/module_community/res/values/attrs.xml b/app/src/module_community/res/values/attrs.xml new file mode 100644 index 000000000..cc7f0fd93 --- /dev/null +++ b/app/src/module_community/res/values/attrs.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/module_community/res/values/dimens.xml b/app/src/module_community/res/values/dimens.xml new file mode 100644 index 000000000..56a345bd6 --- /dev/null +++ b/app/src/module_community/res/values/dimens.xml @@ -0,0 +1,9 @@ + + + + 51.5dp + 70dp + 2.5dp + 7dp + + \ No newline at end of file diff --git a/app/src/module_community/res/values/strings.xml b/app/src/module_community/res/values/strings.xml new file mode 100644 index 000000000..49393faf2 --- /dev/null +++ b/app/src/module_community/res/values/strings.xml @@ -0,0 +1,19 @@ + + + Post graphics and text + Post + Record your life at this moment and share it with interesting people... + Comment + Expand + Close + Commercial advertisements, phone numbers, and content that is vulgar, pornographic, terrifying, violent, and insulting are prohibited. Violators will be blocked! + Reply %s + Come and have your seat + Expand %s replies + Comment + Recommend + Follow + Newest + Square + Go to see + \ No newline at end of file diff --git a/core/src/main/java/com/chwl/core/XConstants.java b/core/src/main/java/com/chwl/core/XConstants.java index 27fbcc9d6..577f8ae3b 100644 --- a/core/src/main/java/com/chwl/core/XConstants.java +++ b/core/src/main/java/com/chwl/core/XConstants.java @@ -61,7 +61,10 @@ public class XConstants { public static final String REPORT_TYPE_ROOM = "room"; // 房間 public static final String REPORT_TYPE_VOICE = "voice"; // 聲音瓶子 public static final String REPORT_TYPE_USERCARD = "USERCARD"; // 資料卡片 - + public static final String REPORT_TYPE_WORLDDYNAMIC = "WORLDDYNAMIC"; // 世界動態 + public static final String REPORT_TYPE_DYNAMICCOMMENT = "DYNAMICCOMMENT"; // 世界動態 + public static final String REPORT_TYPE_PERSONAL_DYNAMIC = "PERSONAL_DYNAMIC"; // 個人頁動態 + public static final String REPORT_TYPE_DYNAMIC_SQUARE = "DYNAMIC_SQUARE";//廣場動態 /** * Referer (DEBUG) */ diff --git a/core/src/main/java/com/chwl/core/home/bean/MainTabType.java b/core/src/main/java/com/chwl/core/home/bean/MainTabType.java index bb13e4ff5..6bd2a4a01 100644 --- a/core/src/main/java/com/chwl/core/home/bean/MainTabType.java +++ b/core/src/main/java/com/chwl/core/home/bean/MainTabType.java @@ -1,10 +1,11 @@ package com.chwl.core.home.bean; public interface MainTabType { - //tabType(1-派对,2-广场,3-赛事,4-消息,5-我的) - int TAB_TYPE_STAR = 1; - int TAB_TYPE_HOME = 2; - int TAB_TYPE_MSG = 3; - int TAB_TYPE_ME = 4; - int TAB_TYPE_GAME = 5; + // int TAB_TYPE_STAR = 1; + int TAB_TYPE_HOME = 1; + int TAB_TYPE_GAME = 2; + int TAB_TYPE_SQUARE = 3; + int TAB_TYPE_MSG = 4; + int TAB_TYPE_ME = 5; + } diff --git a/core/src/main/java/com/chwl/core/initial/InitialModel.java b/core/src/main/java/com/chwl/core/initial/InitialModel.java index 9ab1cb4ab..223a87c15 100644 --- a/core/src/main/java/com/chwl/core/initial/InitialModel.java +++ b/core/src/main/java/com/chwl/core/initial/InitialModel.java @@ -395,8 +395,8 @@ public class InitialModel extends BaseModel implements IInitialModel { new MainTabInfo( "", "", - "Star", - MainTabType.TAB_TYPE_STAR, + ResUtil.getString(R.string.xchat_android_core_initial_initialmodel_03), + MainTabType.TAB_TYPE_HOME, null ), new MainTabInfo( @@ -409,8 +409,8 @@ public class InitialModel extends BaseModel implements IInitialModel { new MainTabInfo( "", "", - ResUtil.getString(R.string.xchat_android_core_initial_initialmodel_03), - MainTabType.TAB_TYPE_HOME, + "Square", + MainTabType.TAB_TYPE_SQUARE, null ), new MainTabInfo( diff --git a/core/src/main/java/com/chwl/core/user/bean/BaseUserInfo.java b/core/src/main/java/com/chwl/core/user/bean/BaseUserInfo.java index fc27c375f..84fba2176 100644 --- a/core/src/main/java/com/chwl/core/user/bean/BaseUserInfo.java +++ b/core/src/main/java/com/chwl/core/user/bean/BaseUserInfo.java @@ -47,6 +47,7 @@ public class BaseUserInfo implements Serializable { // 铭牌文字 private String nameplateWord; + private boolean isCustomWord; // 在哪个房间id private Long inRoomUid; diff --git a/core/src/model_community/java/com/chwl/core/community/attachment/DynamicSysAttachment.java b/core/src/model_community/java/com/chwl/core/community/attachment/DynamicSysAttachment.java index 1aa98c68b..81f39b5e0 100644 --- a/core/src/model_community/java/com/chwl/core/community/attachment/DynamicSysAttachment.java +++ b/core/src/model_community/java/com/chwl/core/community/attachment/DynamicSysAttachment.java @@ -1,10 +1,13 @@ package com.chwl.core.community.attachment; +import androidx.annotation.Keep; + import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.chwl.core.im.custom.bean.CustomAttachment; import com.chwl.core.msg.sys.bean.ErbanSysMsgInfo; +@Keep public class DynamicSysAttachment extends CustomAttachment { private ErbanSysMsgInfo erbanSysMsgInfo; diff --git a/core/src/model_community/java/com/chwl/core/community/attachment/UnReadCountAttachment.java b/core/src/model_community/java/com/chwl/core/community/attachment/UnReadCountAttachment.java index 3bc008efa..6feead31e 100644 --- a/core/src/model_community/java/com/chwl/core/community/attachment/UnReadCountAttachment.java +++ b/core/src/model_community/java/com/chwl/core/community/attachment/UnReadCountAttachment.java @@ -1,8 +1,11 @@ package com.chwl.core.community.attachment; +import androidx.annotation.Keep; + import com.alibaba.fastjson.JSONObject; import com.chwl.core.im.custom.bean.CustomAttachment; +@Keep public class UnReadCountAttachment extends CustomAttachment { private int total; diff --git a/core/src/model_community/java/com/chwl/core/community/im/DynamicImMsg.java b/core/src/model_community/java/com/chwl/core/community/im/DynamicImMsg.java index ffbc83872..6d211c0d6 100644 --- a/core/src/model_community/java/com/chwl/core/community/im/DynamicImMsg.java +++ b/core/src/model_community/java/com/chwl/core/community/im/DynamicImMsg.java @@ -1,5 +1,7 @@ package com.chwl.core.community.im; +import androidx.annotation.Keep; + import com.chwl.core.community.bean.WorldDynamicBean; import java.io.Serializable; @@ -10,6 +12,7 @@ import lombok.Data; * create by lvzebiao @2019/11/22 */ @Data +@Keep public class DynamicImMsg implements Serializable { private long dynamicId; diff --git a/core/src/model_community/java/com/chwl/core/community/im/WorldDynamicAttachment.java b/core/src/model_community/java/com/chwl/core/community/im/WorldDynamicAttachment.java index 46b885e58..adf6fe958 100644 --- a/core/src/model_community/java/com/chwl/core/community/im/WorldDynamicAttachment.java +++ b/core/src/model_community/java/com/chwl/core/community/im/WorldDynamicAttachment.java @@ -1,5 +1,7 @@ package com.chwl.core.community.im; +import androidx.annotation.Keep; + import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.netease.nimlib.sdk.msg.MessageBuilder; @@ -13,6 +15,7 @@ import lombok.Setter; /** * create by lvzebiao @2019/11/22 */ +@Keep public class WorldDynamicAttachment extends CustomAttachment { @Setter diff --git a/library/src/main/java/com/chwl/library/utils/TimeUtils.java b/library/src/main/java/com/chwl/library/utils/TimeUtils.java index a973e4c7b..cf81d12f3 100644 --- a/library/src/main/java/com/chwl/library/utils/TimeUtils.java +++ b/library/src/main/java/com/chwl/library/utils/TimeUtils.java @@ -196,6 +196,7 @@ public class TimeUtils { return null; } final Calendar cal = Calendar.getInstance(); + cal.setTimeZone(TimeZone.getTimeZone("GMT+8")); cal.setTimeInMillis(timeMillis); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; @@ -205,7 +206,7 @@ public class TimeUtils { int sec = cal.get(Calendar.SECOND); String timeString = null; try { - timeString = String.format(format, year, month, day, hour, min, sec); + timeString = String.format(Locale.ENGLISH, format, year, month, day, hour, min, sec); } catch (IllegalFormatException e) { MLog.error("TimeUtils", "getTimeStringFromMillis error! " + e.toString()); } diff --git a/app/src/main/java/com/chwl/app/common/photo/PhotoProvider.kt b/library/src/module_common/java/com/chwl/library/common/photo/PhotoProvider.kt similarity index 87% rename from app/src/main/java/com/chwl/app/common/photo/PhotoProvider.kt rename to library/src/module_common/java/com/chwl/library/common/photo/PhotoProvider.kt index ce52cea6d..ebb2afa6b 100644 --- a/app/src/main/java/com/chwl/app/common/photo/PhotoProvider.kt +++ b/library/src/module_common/java/com/chwl/library/common/photo/PhotoProvider.kt @@ -11,14 +11,20 @@ import com.chwl.library.common.application.BaseApp import com.chwl.library.common.delegate.SpDelegate import com.chwl.library.common.file.FileHelper import com.chwl.library.common.glide.GlideEngine -import com.chwl.library.common.util.LibLogger import com.chwl.library.easyphoto.EasyPhotos import com.chwl.library.easyphoto.models.album.entity.Photo import com.chwl.library.utils.TimeUtils import com.chwl.library.utils.TimeUtils.TIME_FORMAT +import com.example.lib_utils.log.LogUtil import kotlinx.coroutines.* import java.io.File +/** + * Created by wushaocheng on 2022/11/15 + * Desc:图片选择二次封装 + */ + + /** * Created by wushaocheng on 2022/11/15 * Desc:图片选择二次封装 @@ -58,11 +64,11 @@ object PhotoProvider { withContext(Dispatchers.IO) { clearCache() } } EasyPhotos.createAlbum(activity, false, false, GlideEngine()) - .setCount(maxSelect)//参数说明:最大可选数,默认1 - .setPuzzleMenu(false) - .onlyVideo() - .setCleanMenu(false) - .start(resultCode) + .setCount(maxSelect)//参数说明:最大可选数,默认1 + .setPuzzleMenu(false) + .onlyVideo() + .setCleanMenu(false) + .start(resultCode) } } @@ -85,13 +91,25 @@ object PhotoProvider { @JvmStatic @JvmOverloads - fun photoProvider(activity: FragmentActivity, maxSelect: Int = 1, canChooseGif: Boolean = false, resultCode: Int, isClearCache: Boolean = true) { + fun photoProvider( + activity: FragmentActivity, + maxSelect: Int = 1, + canChooseGif: Boolean = false, + resultCode: Int, + isClearCache: Boolean = true, + useWidth: Boolean = false + ) { cancelJop() mPhotoJob = MainScope().launch { if (isClearCache && isClearByTime()) { withContext(Dispatchers.IO) { clearCache() } } - EasyPhotos.createAlbum(activity, false, false, GlideEngine())//参数说明:上下文,是否显示相机按钮,是否使用宽高数据(false时宽高数据为0,扫描速度更快),[配置Glide为图片加载引擎](https://github.com/HuanTanSheng/EasyPhotos/wiki/12-%E9%85%8D%E7%BD%AEImageEngine%EF%BC%8C%E6%94%AF%E6%8C%81%E6%89%80%E6%9C%89%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E5%BA%93) + EasyPhotos.createAlbum( + activity, + false, + useWidth, + GlideEngine() + )//参数说明:上下文,是否显示相机按钮,是否使用宽高数据(false时宽高数据为0,扫描速度更快),[配置Glide为图片加载引擎](https://github.com/HuanTanSheng/EasyPhotos/wiki/12-%E9%85%8D%E7%BD%AEImageEngine%EF%BC%8C%E6%94%AF%E6%8C%81%E6%89%80%E6%9C%89%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E5%BA%93) .setCount(maxSelect)//参数说明:最大可选数,默认1 .setGif(canChooseGif) .setPuzzleMenu(false) @@ -158,7 +176,7 @@ object PhotoProvider { val path = "$foldPath${it.name}" if (FileHelper.copyFileFromUri(it.uri, path, true)) { it.path = path - LibLogger.debug(TAG, "path: ${it.path} , displayName: ${it.name} , newPath: $path ") + LogUtil.d(TAG, "path: ${it.path} , displayName: ${it.name} , newPath: $path ") } } } @@ -172,7 +190,7 @@ object PhotoProvider { * 清除复制缓存 */ fun clearCache() { - LibLogger.debug( + LogUtil.d( TAG, "clearCache => mLastSelectTime: ${TimeUtils.getDateTimeString( mLastSelectTime, TIME_FORMAT)}") FileHelper.removeAllFile(getInternalPath() + File.separator)