diff --git a/app/build.gradle b/app/build.gradle
index 2065208bb..57addf3fe 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -221,7 +221,6 @@ dependencies {
api "com.jzxiang.pickerview:TimePickerDialog:1.0.1"
api "com.github.zyyoona7:EasyPopup:1.0.2"
api "com.github.donkingliang:LabelsView:1.6.5"
- api "com.github.yyued:SVGAPlayer-Android:2.6.1"
api "com.ms-square:expandableTextView:0.1.4"
annotationProcessor 'androidx.annotation:annotation:1.6.0'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9a8a42db1..bc638fcc3 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -947,6 +947,8 @@
android:windowSoftInputMode="adjustPan"
android:name=".ui.feedback.FeedbackActivity"
android:screenOrientation="portrait" />
+
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/avroom/activity/AVRoomActivity.java b/app/src/main/java/com/chwl/app/avroom/activity/AVRoomActivity.java
index d8f6d8cf8..7b3ee6db2 100644
--- a/app/src/main/java/com/chwl/app/avroom/activity/AVRoomActivity.java
+++ b/app/src/main/java/com/chwl/app/avroom/activity/AVRoomActivity.java
@@ -42,6 +42,7 @@ import com.alibaba.fastjson.JSONObject;
import com.chwl.app.notify.RoomNotifyManager;
import com.chwl.app.ui.webview.baishun.BaiShunGameWebFragment;
import com.chwl.app.ui.webview.baishun.IBaiShunGameListener;
+import com.chwl.library.widget.SVGAView;
import com.chwl.core.monsterhunting.bean.MonsterDataBean;
import com.chwl.core.room.game.bean.BaiShunGameConfig;
import com.chwl.core.support.room.AudioRoomContext;
@@ -177,6 +178,15 @@ public class AVRoomActivity extends BaseMvpActivity {
- private int selectPosition;
-
- public int getSelectPosition() {
- return selectPosition;
- }
-
- public void setSelectPosition(int selectPosition) {
- notifyItemChanged(this.selectPosition);
- this.selectPosition = selectPosition;
- notifyItemChanged(this.selectPosition);
- }
-
- public HeadWearShopAdapter(int layoutResId, int brid) {
- super(layoutResId, brid);
- }
-
- @Override
- protected void convert(BindingViewHolder helper, HeadWearInfo item) {
- super.convert(helper, item);
- ItemHeadWearBinding binding = (ItemHeadWearBinding) helper.getBinding();
- binding.llRoot.setSelected(selectPosition == helper.getAdapterPosition());
- NobleUtil.loadHeadWears(item.getPic(), binding.ivHeadWear);
- binding.setSelectPosition(selectPosition == helper.getAdapterPosition());
-
- if (item.getLabelType() == HeadWearInfo.LABEL_TYPE_NORMAL) {
- binding.ivTag.setVisibility(View.GONE);
-
- } else if (HeadWearInfo.LABEL_TYPE_NEW == item.getLabelType()) {
- binding.ivTag.setVisibility(View.VISIBLE);
- binding.ivTag.setImageResource(R.drawable.ic_mark_new);
-
- } else if (HeadWearInfo.LABEL_TYPE_DISCOUNT == item.getLabelType()) {
- binding.ivTag.setVisibility(View.VISIBLE);
- binding.ivTag.setImageResource(R.drawable.ic_mark_discount);
-
- } else if (HeadWearInfo.LABEL_TYPE_LIMIT == item.getLabelType()) {
- binding.ivTag.setVisibility(View.VISIBLE);
- binding.ivTag.setImageResource(R.drawable.ic_mark_limit);
-
- } else if (HeadWearInfo.LABEL_TYPE_EXCLUSIVE == item.getLabelType()) {
- binding.ivTag.setVisibility(View.VISIBLE);
- binding.ivTag.setImageResource(R.drawable.ic_mark_exclusive);
- }
-
- binding.tvHeadName.setText(item.getName() + "");
- }
-
- public void setCarInfoHasBeenBought(HeadWearInfo carInfo) {
- if (carInfo.getHeadwearId() <= 0 || ListUtils.isListEmpty(mData)) return;
- int index = mData.indexOf(carInfo);
- if (index == -1) return;
- mData.get(index).setStatus(HeadWearInfo.STATUS_IN_USED);
- notifyItemChanged(index);
- }
-}
diff --git a/app/src/main/java/com/chwl/app/decoration/adapter/MyHeadWearAdapter.java b/app/src/main/java/com/chwl/app/decoration/adapter/MyHeadWearAdapter.java
index 8ecee750e..5df707115 100644
--- a/app/src/main/java/com/chwl/app/decoration/adapter/MyHeadWearAdapter.java
+++ b/app/src/main/java/com/chwl/app/decoration/adapter/MyHeadWearAdapter.java
@@ -6,9 +6,11 @@ import com.chwl.app.R;
import com.chwl.app.bindadapter.BaseAdapter;
import com.chwl.app.bindadapter.BindingViewHolder;
import com.chwl.app.databinding.ItemMyHeadWearBinding;
+import com.chwl.app.utils.AvatarHelper;
import com.chwl.core.decoration.headwear.bean.HeadWearInfo;
import com.chwl.core.noble.NobleUtil;
import com.chwl.library.utils.ResUtil;
+import com.chwl.library.widget.SVGAView;
/**
* Created by huangmeng1 on 2018/5/11.
@@ -20,11 +22,14 @@ public class MyHeadWearAdapter extends BaseAdapter {
super(layoutResId, brid);
}
+ private SVGAView.SVGACache svgaCache = SVGAView.newCache(10);
+
@Override
protected void convert(BindingViewHolder helper, HeadWearInfo item) {
super.convert(helper, item);
ItemMyHeadWearBinding binding = (ItemMyHeadWearBinding) helper.getBinding();
- NobleUtil.loadHeadWears(item.getPic(), binding.ivCarCover);
+ binding.ivCarCover.bindCache(svgaCache);
+ AvatarHelper.loadAvatarFrame(binding.ivCarCover, item.getFirstUrl(), item.getType());
helper.addOnClickListener(R.id.tv_used);
if (item.getLabelType() == HeadWearInfo.LABEL_TYPE_NORMAL) {
diff --git a/app/src/main/java/com/chwl/app/support/PreloadResourceViewModel.kt b/app/src/main/java/com/chwl/app/support/PreloadResourceViewModel.kt
index fa0788039..7e437cd5c 100644
--- a/app/src/main/java/com/chwl/app/support/PreloadResourceViewModel.kt
+++ b/app/src/main/java/com/chwl/app/support/PreloadResourceViewModel.kt
@@ -3,7 +3,7 @@ package com.chwl.app.support
import androidx.lifecycle.viewModelScope
import com.chwl.app.BuildConfig
import com.chwl.app.base.BaseViewModel
-import com.chwl.core.helper.PathHelper
+import com.chwl.library.utils.PathHelper
import com.chwl.core.home.model.HomeModel
import com.chwl.library.common.util.SPUtils
import com.chwl.library.download.DownloadException
diff --git a/app/src/main/java/com/chwl/app/ui/debug/DebugActivity.kt b/app/src/main/java/com/chwl/app/ui/debug/DebugActivity.kt
new file mode 100644
index 000000000..2f9a3f957
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/ui/debug/DebugActivity.kt
@@ -0,0 +1,50 @@
+package com.chwl.app.ui.debug
+
+import com.chwl.app.base.BaseViewBindingActivity
+import com.chwl.app.databinding.DebugActivityBinding
+import com.netease.nim.uikit.StatusBarUtil
+
+class DebugActivity : BaseViewBindingActivity() {
+ override fun init() {
+ initWhiteTitleBar("调试")
+ initSVGAList()
+ }
+
+ private fun initSVGAList() {
+ val adapter = DebugAdapter()
+ binding.recyclerView.adapter = adapter
+// binding.recyclerView.setItemViewCacheSize(-1)
+ val svgaList = listOf(
+ "https://image.pekolive.com/花和玫瑰.svga",
+ "https://image.pekolive.com/firecrown.svga",
+ "https://image.pekolive.com/ningtangchengbaoqietu.svga",
+ "https://image.pekolive.com/xunmengfengche.svga",
+ "https://image.pekolive.com/tonghuaqiyuan1334.svga",
+ "https://image.pekolive.com/mengquyinhe.svga",
+ "https://image.pekolive.com/duqinghuashu.svga",
+ "https://image.pekolive.com/juzhijingling.svga",
+ "https://image.pekolive.com/3121_aixintouwei.svga",
+ "https://image.pekolive.com/4051_langmanyewan.svga"
+ )
+ val list = ArrayList()
+ list.addAll(svgaList)
+ list.addAll(svgaList)
+ adapter.setNewData(list)
+ binding.btnRefreshAll.setOnClickListener {
+ adapter.notifyDataSetChanged()
+ }
+ binding.btnRefresh.setOnClickListener {
+ adapter.notifyItemChanged(5, true)
+ }
+ }
+
+ override fun needSteepStateBar(): Boolean {
+ return true
+ }
+
+ override fun setStatusBar() {
+ super.setStatusBar()
+ StatusBarUtil.transparencyBar(this)
+ StatusBarUtil.StatusBarLightMode(this)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/ui/debug/DebugAdapter.kt b/app/src/main/java/com/chwl/app/ui/debug/DebugAdapter.kt
new file mode 100644
index 000000000..2754e8ea8
--- /dev/null
+++ b/app/src/main/java/com/chwl/app/ui/debug/DebugAdapter.kt
@@ -0,0 +1,47 @@
+package com.chwl.app.ui.debug
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.chwl.app.R
+import com.chwl.library.widget.SVGAView
+import com.example.lib_utils.log.ILog
+
+class DebugAdapter : BaseQuickAdapter(R.layout.debug_item_svga), ILog {
+
+ private val svgaCache = SVGAView.newCache(10)
+ override fun convertPayloads(
+ helper: BaseViewHolder,
+ item: String?,
+ payloads: MutableList
+ ) {
+ super.convertPayloads(helper, item, payloads)
+ logD("convertPayloads holder:${helper.absoluteAdapterPosition} #${helper.hashCode()} SVGAView")
+ val svgaView = helper.getView(R.id.svga_view)
+ svgaView.loadUrl(item)
+ }
+
+ override fun convert(helper: BaseViewHolder, item: String?) {
+ logD("convert holder:${helper.absoluteAdapterPosition} #${helper.hashCode()} SVGAView")
+ helper.setText(R.id.tv_name, helper.absoluteAdapterPosition.toString())
+ val item = getItem(helper.bindingAdapterPosition)
+ val svgaView = helper.getView(R.id.svga_view)
+ svgaView.bindCache(svgaCache)
+ svgaView.setLogTag(helper.absoluteAdapterPosition.toString())
+ svgaView.loadUrl(item)
+ }
+
+ override fun onViewAttachedToWindow(holder: BaseViewHolder) {
+ super.onViewAttachedToWindow(holder)
+ logD("onViewAttachedToWindow holder:${holder.absoluteAdapterPosition} #${holder.hashCode()} SVGAView")
+// val item = getItem(holder.bindingAdapterPosition)
+// val svgaView = holder.getView(R.id.svga_view)
+// svgaView.bindCache(SVGAView.newCache(10))
+// svgaView.setLogTag(holder.absoluteAdapterPosition.toString())
+// svgaView.loadUrl(item)
+ }
+
+ override fun onViewDetachedFromWindow(holder: BaseViewHolder) {
+ super.onViewDetachedFromWindow(holder)
+ logD("onViewDetachedFromWindow holder:${holder.absoluteAdapterPosition} #${holder.hashCode()} SVGAView")
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/chwl/app/ui/setting/SettingActivity.kt b/app/src/main/java/com/chwl/app/ui/setting/SettingActivity.kt
index 4c7b48832..181ba5e63 100644
--- a/app/src/main/java/com/chwl/app/ui/setting/SettingActivity.kt
+++ b/app/src/main/java/com/chwl/app/ui/setting/SettingActivity.kt
@@ -13,6 +13,7 @@ import com.chwl.app.base.BaseViewBindingActivity
import com.chwl.app.common.widget.dialog.DialogManager.OkCancelDialogListener
import com.chwl.app.databinding.ActivitySettingBinding
import com.chwl.app.notify.RoomNotifyManager
+import com.chwl.app.ui.debug.DebugActivity
import com.chwl.app.ui.im.avtivity.BlackListManageActivity
import com.chwl.app.ui.language.LanguageActivity
import com.chwl.app.ui.login.BindPhoneActivity
@@ -221,6 +222,7 @@ class SettingActivity : BaseViewBindingActivity(), View.
}
private fun debug() {
+ startActivity(Intent(this, DebugActivity::class.java))
// CommonWebViewActivity.start(this,"https://api.molistar.xyz/molistar/activity/2024-invitationFission/index.html")
// PublicChatRoomMessageActivity.start(this)
// MyDecorationActivity.start(this,0)
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 d447e25c2..cc57b5ecd 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
@@ -25,8 +25,9 @@ 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.app.utils.AvatarHelper;
+import com.chwl.library.widget.SVGAView;
import com.chwl.core.decoration.headwear.bean.HeadWearInfo;
-import com.chwl.core.noble.NobleUtil;
import com.example.lib_utils.UiUtils;
import com.google.android.material.appbar.AppBarLayout;
import com.netease.nim.uikit.StatusBarUtil;
@@ -254,6 +255,7 @@ public class UserInfoActivity extends BaseBindingActivity
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/debug_item_svga.xml b/app/src/main/res/layout/debug_item_svga.xml
new file mode 100644
index 000000000..5c02c7788
--- /dev/null
+++ b/app/src/main/res/layout/debug_item_svga.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_user_info.xml b/app/src/main/res/layout/dialog_user_info.xml
index 04d54a216..ecb8cf843 100644
--- a/app/src/main/res/layout/dialog_user_info.xml
+++ b/app/src/main/res/layout/dialog_user_info.xml
@@ -66,7 +66,7 @@
android:layout_height="55dp"
android:layout_gravity="center" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_micro_dating.xml b/app/src/main/res/layout/item_micro_dating.xml
index 98e87817a..3a002cc78 100644
--- a/app/src/main/res/layout/item_micro_dating.xml
+++ b/app/src/main/res/layout/item_micro_dating.xml
@@ -97,7 +97,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
-
-
-
-
-
-
-
+
+
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
deleted file mode 100644
index a7f63bec7..000000000
--- a/app/src/module_community/java/com/chwl/app/community/dynamic/adapter/WorldDynamicAdapter.java
+++ /dev/null
@@ -1,307 +0,0 @@
-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
index ac3d32d7d..cacb7aaba 100644
--- 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
@@ -23,6 +23,8 @@ import androidx.recyclerview.widget.RecyclerView;
import com.chwl.app.photo.BigPhotoActivity;
import com.chwl.app.photo.PagerOption;
+import com.chwl.app.utils.AvatarHelper;
+import com.chwl.library.widget.SVGAView;
import com.chwl.core.XConstants;
import com.chwl.core.utils.CoreTextUtils;
import com.coorchice.library.utils.LogUtils;
@@ -97,7 +99,7 @@ public class DynamicDetailActivity extends BaseViewBindingActivity
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/module_public_chat/java/com/chwl/app/public_chat/core/ChatRoomMessageAdapter.java b/app/src/module_public_chat/java/com/chwl/app/public_chat/core/ChatRoomMessageAdapter.java
index 1576e5f2b..b32e2fc30 100644
--- a/app/src/module_public_chat/java/com/chwl/app/public_chat/core/ChatRoomMessageAdapter.java
+++ b/app/src/module_public_chat/java/com/chwl/app/public_chat/core/ChatRoomMessageAdapter.java
@@ -1,19 +1,20 @@
package com.chwl.app.public_chat.core;
import android.view.View;
+import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView;
import com.chwl.app.public_chat.core.viewholder.ChatRoomMessageViewHolderBase;
import com.chwl.app.public_chat.core.viewholder.ChatRoomMessageViewHolderFactory;
import com.chwl.library.utils.LogUtil;
+import com.chwl.library.widget.SVGAView;
import com.netease.nim.uikit.R;
import com.netease.nim.uikit.business.session.module.Container;
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter;
-import com.netease.nim.uikit.common.ui.recyclerview.holder.NIMBaseViewHolder;
+import com.netease.nim.uikit.common.ui.recyclerview.holder.PublicChatRoomNimBaseViewHolder;
import com.netease.nim.uikit.impl.NimUIKitImpl;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
-import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.msg.model.IMMessage;
import java.util.HashMap;
@@ -25,7 +26,7 @@ import java.util.Set;
/**
* Created by huangjun on 2016/12/21.
*/
-public class ChatRoomMessageAdapter extends BaseMultiItemFetchLoadAdapter {
+public class ChatRoomMessageAdapter extends BaseMultiItemFetchLoadAdapter {
private Map, Integer> holder2ViewType;
@@ -34,6 +35,8 @@ public class ChatRoomMessageAdapter extends BaseMultiItemFetchLoadAdapter data, Container container) {
super(recyclerView, data);
@@ -53,6 +56,11 @@ public class ChatRoomMessageAdapter extends BaseMultiItemFetchLoadAdapter {
+public abstract class ChatRoomMessageViewHolderBase extends RecyclerViewHolder {
public ImageView nameIconView;
// basic
@@ -67,8 +71,8 @@ public abstract class ChatRoomMessageViewHolderBase extends RecyclerViewHolder toMap(Map map) {
if (map == null) {
@@ -70,6 +72,7 @@ public class HeadWearInfo extends BaseDecoration implements Serializable {
}
map.put(PIC, pic);
map.put(EFFECT, effect);
+ map.put(TYPE, type);
if (effect != null && effect.length() > 0) {
map.put(HEAD_WEAR, effect);
} else {
diff --git a/core/src/main/java/com/chwl/core/noble/NobleUtil.java b/core/src/main/java/com/chwl/core/noble/NobleUtil.java
index 9bad2d1a9..184687fb5 100644
--- a/core/src/main/java/com/chwl/core/noble/NobleUtil.java
+++ b/core/src/main/java/com/chwl/core/noble/NobleUtil.java
@@ -136,6 +136,9 @@ public class NobleUtil {
.listener(new RequestListener() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
+ if (url.equals(imageView.getTag())) {
+ imageView.setImageDrawable(null);
+ }
return false;
}
@@ -159,6 +162,7 @@ public class NobleUtil {
}).submit();
}
+ @Deprecated()
public static void loadHeadWear(String url, ImageView imageView) {
GlideApp.with(BasicConfig.INSTANCE.getAppContext())
.asBitmap()
@@ -194,7 +198,7 @@ public class NobleUtil {
* 用于坑位加载头饰
* 引入keyId和keyValue是为了解决异步加载,造成坑位头饰加载错误的问题
*/
- public static void loadMicHeadWear(String url, ImageView imageView, int keyId, String keyValue) {
+ public static void loadHeadWear(String url, ImageView imageView, int keyId, String keyValue) {
GlideApp.with(BasicConfig.INSTANCE.getAppContext())
.asBitmap()
.dontAnimate()
@@ -203,6 +207,14 @@ public class NobleUtil {
.listener(new RequestListener() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
+ if (imageView.getTag(keyId) == null) {
+ return false;
+ }
+ if (!imageView.getTag(keyId).equals(keyValue)) {
+ //坑位已经变动,不需要设置图片
+ return false;
+ }
+ imageView.setImageDrawable(null);
return false;
}
diff --git a/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java b/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java
index 99ff238f9..2e4335418 100644
--- a/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java
+++ b/core/src/main/java/com/chwl/core/room/model/RoomBaseModel.java
@@ -623,6 +623,7 @@ public class RoomBaseModel extends BaseModel implements IRoomBaseModel {
if (!TextUtils.isEmpty(headWearUrl)) {
contentJsonObj.put("headWearUrl", headWearUrl);
}
+ contentJsonObj.put("headWearType", headWearInfo.getType());
}
if (AvRoomDataManager.get().isDatingVip(userInfo.getUid())) {
contentJsonObj.put("vipMic", true);
diff --git a/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java b/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java
index 95ae5ba58..71bf88875 100644
--- a/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java
+++ b/core/src/main/java/com/chwl/core/room/queue/bean/MicMemberInfo.java
@@ -22,6 +22,7 @@ public class MicMemberInfo {
private String micNickColor;
private String micCircle;
private String headWearUrl;
+ private int headWearType;
private boolean preventKick;
/**
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 84fba2176..b025c5740 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
@@ -27,6 +27,8 @@ public class BaseUserInfo implements Serializable {
private String headwearEffect;
+ private int headwearType;
+
private long uid;
private int nobleId;
diff --git a/library/build.gradle b/library/build.gradle
index 32aada015..70be71d36 100644
--- a/library/build.gradle
+++ b/library/build.gradle
@@ -120,6 +120,8 @@ dependencies {
api 'com.qcloud.cos:cos-android:5.9.25'
api 'com.liulishuo.filedownloader:library:1.7.7'
+
+ api "com.github.yyued:SVGAPlayer-Android:2.6.1"
}
repositories {
mavenCentral()
diff --git a/core/src/main/java/com/chwl/core/helper/PathHelper.kt b/library/src/main/java/com/chwl/library/utils/PathHelper.kt
similarity index 99%
rename from core/src/main/java/com/chwl/core/helper/PathHelper.kt
rename to library/src/main/java/com/chwl/library/utils/PathHelper.kt
index 897f738b0..c458dea28 100644
--- a/core/src/main/java/com/chwl/core/helper/PathHelper.kt
+++ b/library/src/main/java/com/chwl/library/utils/PathHelper.kt
@@ -1,4 +1,4 @@
-package com.chwl.core.helper
+package com.chwl.library.utils
import com.chwl.library.utils.codec.MD5Utils
diff --git a/library/src/main/java/com/chwl/library/widget/SVGAView.kt b/library/src/main/java/com/chwl/library/widget/SVGAView.kt
new file mode 100644
index 000000000..24a4c1990
--- /dev/null
+++ b/library/src/main/java/com/chwl/library/widget/SVGAView.kt
@@ -0,0 +1,237 @@
+package com.chwl.library.widget
+
+import android.content.Context
+import android.util.AttributeSet
+import android.util.LruCache
+import com.chwl.library.download.DownloadException
+import com.chwl.library.download.DownloadManager
+import com.chwl.library.download.DownloadManager.download
+import com.chwl.library.download.DownloadRequest.Companion.build
+import com.chwl.library.download.DownloadTask
+import com.chwl.library.download.FileDownloadListener
+import com.chwl.library.utils.PathHelper
+import com.example.lib_utils.AppUtils
+import com.example.lib_utils.log.ILog
+import com.opensource.svgaplayer.SVGADrawable
+import com.opensource.svgaplayer.SVGAImageView
+import com.opensource.svgaplayer.SVGAParser
+import com.opensource.svgaplayer.SVGAParser.Companion.shareParser
+import com.opensource.svgaplayer.SVGAVideoEntity
+import java.io.BufferedInputStream
+import java.io.FileInputStream
+
+class SVGAView : SVGAImageView, ILog {
+ companion object {
+ val shareParser: SVGAParser by lazy {
+ SVGAParser(AppUtils.getApp())
+ }
+
+ @JvmStatic
+ fun newCache(maxSize: Int): SVGACache {
+ if (maxSize > 1) {
+ return SVGALruCache(maxSize)
+ } else {
+ return SVGASingleCache()
+ }
+ }
+ }
+
+ var resumePlayAfterAttached = true
+
+ private var resourceUrl: String? = null
+
+ private var svgaCache: SVGACache? = null
+
+ private val downloadTag: String get() = "SVGAVIEW_${hashCode()}"
+
+ private var logTag: String? = null
+
+ private var isDownloading = false
+
+ constructor(context: Context) : super(context)
+ constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
+ constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
+ context,
+ attrs,
+ defStyleAttr
+ )
+
+ fun loadUrl(url: String?) {
+ logD("loadUrl() url:$url")
+ if (url.isNullOrEmpty()) {
+ this.resourceUrl = null
+ this.setImageDrawable(null)
+ onViewStateChanged(0)
+ if (isDownloading) {
+ DownloadManager.stopTag(downloadTag)
+ isDownloading = false
+ }
+ return
+ }
+ if (url == resourceUrl && drawable is SVGADrawable) {
+ logD("loadUrl() 已加载 isAnimating:$isAnimating")
+ if (!isAnimating) {
+ startAnimation()
+ }
+ return
+ }
+ this.setImageDrawable(null)
+ this.resourceUrl = url
+ val cacheItem = svgaCache?.get(url)
+ if (cacheItem != null) {
+ logD("loadUrl() 有缓存")
+ this@SVGAView.setImageDrawable(SVGADrawable(cacheItem))
+ this@SVGAView.startAnimation()
+ return
+ }
+ loadSVGAUrl(url)
+ }
+
+ private fun loadSVGAUrl(url: String) {
+ logD("loadSVGAUrl url:$url")
+ DownloadManager.stopTag(downloadTag)
+ val filePath = PathHelper.generateResourcesFilePath(url)
+ val request = build(url, filePath, downloadTag, null, 60000L)
+ this.isDownloading = true
+ download(request, object : FileDownloadListener() {
+ override fun onDownloadCompleted(task: DownloadTask) {
+ this@SVGAView.isDownloading = false
+ val path = task.getRequest().getPath()
+ logD("loadSVGAUrl onDownloadCompleted url:$url path:$path")
+ if (resourceUrl == url) {
+ loadSVGAFile(url, path)
+ }
+ }
+
+ override fun onDownloadError(exception: DownloadException) {
+ this@SVGAView.isDownloading = false
+ logD("loadSVGAUrl onDownloadError url:$url")
+ if (resourceUrl == url) {
+ onViewStateChanged(-1)
+ }
+ }
+ })
+ }
+
+ private fun loadSVGAFile(url: String, path: String) {
+ try {
+ logD("loadSVGAFile path:$path url:$url")
+ val inputStream = BufferedInputStream(FileInputStream(path))
+ shareParser().decodeFromInputStream(
+ inputStream,
+ path,
+ object : SVGAParser.ParseCompletion {
+ override fun onComplete(videoItem: SVGAVideoEntity) {
+ logD("SVGAView parseCompletion onComplete url:$url")
+ if (resourceUrl != url) {
+ return
+ }
+ svgaCache?.put(resourceUrl ?: "", videoItem)
+ this@SVGAView.setImageDrawable(SVGADrawable(videoItem))
+ this@SVGAView.startAnimation()
+ onViewStateChanged(1)
+ }
+
+ override fun onError() {
+ logD("SVGAView parseCompletion onError url:$url")
+ if (resourceUrl != url) {
+ return
+ }
+ onViewStateChanged(-1)
+ }
+ },
+ true,
+ null,
+ null
+ )
+ } catch (e: Exception) {
+ e.printStackTrace()
+ logD("loadSVGAFile url:$url e:${e.message}")
+ onViewStateChanged(-1)
+ }
+ }
+
+ /**
+ * @param state -1 异常、0 空、1 成功
+ */
+ private fun onViewStateChanged(state: Int) {
+ logD("onViewStateChanged state:$state")
+ }
+
+ fun bindCache(cache: SVGACache?) {
+ logD("bindCache() cache:$cache")
+ this.svgaCache = cache
+ }
+
+ fun setLogTag(tag: String) {
+ logD("setLogTag() newTag:$tag oldTag:$logTag")
+ this.logTag = tag
+ }
+
+ override fun logD(message: String, tag: String, filePrinter: Boolean) {
+ if (logTag != null) {
+ super.logD("#$logTag# $message", tag, filePrinter)
+ } else {
+ super.logD(message, tag, filePrinter)
+ }
+ }
+
+ override fun onDetachedFromWindow() {
+ logD("onDetachedFromWindow()")
+ super.onDetachedFromWindow()
+ }
+
+ override fun onAttachedToWindow() {
+ logD("onAttachedToWindow()")
+ super.onAttachedToWindow()
+ if (resumePlayAfterAttached) {
+ if (drawable is SVGADrawable) {
+ if (!isAnimating) {
+ logD("onAttachedToWindow() startAnimation")
+ startAnimation()
+ }
+ }
+ }
+ }
+
+ interface SVGACache {
+ fun get(key: String): SVGAVideoEntity?
+
+ fun put(key: String, entity: SVGAVideoEntity)
+
+ fun clear()
+ }
+
+ class SVGALruCache(maxSize: Int) : SVGACache {
+ val lruCache = LruCache(maxSize)
+ override fun get(key: String): SVGAVideoEntity? {
+ return lruCache.get(key)
+ }
+
+ override fun put(key: String, entity: SVGAVideoEntity) {
+ lruCache.put(key, entity)
+ }
+
+ override fun clear() {
+ lruCache.evictAll()
+ }
+ }
+
+ class SVGASingleCache : SVGACache {
+ var cache: Pair? = null
+ override fun get(key: String): SVGAVideoEntity? {
+ if (cache?.first == key) {
+ return cache?.second
+ }
+ return null
+ }
+
+ override fun put(key: String, entity: SVGAVideoEntity) {
+ cache = Pair(key, entity)
+ }
+
+ override fun clear() {
+ cache = null
+ }
+ }
+}
\ No newline at end of file
diff --git a/libs/lib_utils/src/main/java/com/example/lib_utils/StringUtils2.kt b/libs/lib_utils/src/main/java/com/example/lib_utils/StringUtils2.kt
index b102e0ad0..05626453e 100644
--- a/libs/lib_utils/src/main/java/com/example/lib_utils/StringUtils2.kt
+++ b/libs/lib_utils/src/main/java/com/example/lib_utils/StringUtils2.kt
@@ -8,6 +8,10 @@ import java.util.regex.Pattern
*/
object StringUtils2 {
+ fun toInt(str: String?): Int {
+ return str?.toIntOrNull() ?: 0
+ }
+
/**
* 拆分字符串(根据匹配规则,按顺序拆分出来)
* @param pattern 匹配节点的规则模式
diff --git a/nim_uikit/res/layout/nim_chat_room_message_item.xml b/nim_uikit/res/layout/nim_chat_room_message_item.xml
index 93476b142..0db453cff 100644
--- a/nim_uikit/res/layout/nim_chat_room_message_item.xml
+++ b/nim_uikit/res/layout/nim_chat_room_message_item.xml
@@ -40,7 +40,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent" />
-
-