私聊改造:用户卡片UI调整

This commit is contained in:
huangjian
2023-02-07 16:17:16 +08:00
parent 3b8796c378
commit f3a4af4582
9 changed files with 130 additions and 21 deletions

View File

@@ -92,6 +92,12 @@ public class MessageListPanelEx {
@Override
public int compare(IMMessage o1, IMMessage o2) {
if (o1.getAttachment() instanceof UserCardAttachment) {
return -1;
}
if (o2.getAttachment() instanceof UserCardAttachment) {
return 1;
}
long time = o1.getTime() - o2.getTime();
return time == 0 ? 0 : (time < 0 ? -1 : 1);
}

View File

@@ -18,6 +18,7 @@ import com.mango.core.decoration.headwear.bean.HeadWearInfo;
import com.mango.core.noble.NobleUtil;
import com.mango.core.user.UserModel;
import com.mango.core.user.bean.UserPhoto;
import com.mango.core.utils.CurrentTimeUtils;
import com.mango.core.utils.StarUtils;
import com.mango.core.utils.StringExtensionKt;
import com.mango.core.utils.net.RxHelper;
@@ -28,11 +29,15 @@ import com.mango.moshen.skill.repository.SkillModel;
import com.mango.moshen.ui.user.ShowPhotoActivity;
import com.mango.moshen.ui.user.UserInfoActivity;
import com.mango.moshen.ui.utils.ImageLoadUtils;
import com.mango.moshen.utils.TimeUiUtils;
import com.mango.moshen.vip.VipHelper;
import com.mango.xchat_android_library.utils.JavaUtil;
import com.mango.xchat_android_library.utils.ListUtils;
import com.mango.xchat_android_library.utils.TimeUtils;
import com.netease.nim.uikit.business.session.viewholder.MsgViewHolderBase;
import com.netease.nim.uikit.common.ui.recyclerview.adapter.BaseMultiItemFetchLoadAdapter;
import com.netease.nim.uikit.common.util.sys.ScreenUtil;
import com.netease.nim.uikit.common.util.sys.TimeUtil;
import java.util.ArrayList;
import java.util.Date;
@@ -53,11 +58,12 @@ public class MsgViewHolderUserCard extends MsgViewHolderBase {
private View flSkill2;
private CircleImageView ivAvatar;
private TextView tvNick;
private ImageView ivGender;
private TextView tvGenderAndAge;
private TextView tvConstellation;
private TextView tvDesc;
private RecyclerView rvPhotos;
private ImageView ivHeadWear;
private ImageView ivVipIcon;
public MsgViewHolderUserCard(BaseMultiItemFetchLoadAdapter adapter) {
super(adapter);
@@ -78,11 +84,12 @@ public class MsgViewHolderUserCard extends MsgViewHolderBase {
flSkill2 = findViewById(R.id.fl_skill_2);
ivAvatar = findViewById(R.id.iv_avatar);
tvNick = findViewById(R.id.tv_nick);
ivGender = findViewById(R.id.iv_gender);
tvGenderAndAge = findViewById(R.id.tv_gender_and_age);
tvConstellation = findViewById(R.id.tv_constellation);
tvDesc = findViewById(R.id.tv_desc);
rvPhotos = findViewById(R.id.rv_photos);
ivHeadWear = findViewById(R.id.iv_head_wear);
ivVipIcon = findViewById(R.id.iv_vip_icon);
}
@Override
@@ -132,7 +139,9 @@ public class MsgViewHolderUserCard extends MsgViewHolderBase {
.subscribe(userInfo -> {
ImageLoadUtils.loadAvatar(userInfo.getAvatar(), ivAvatar);
tvNick.setText(StringExtensionKt.subAndReplaceDot(userInfo.getNick(), 7));
ivGender.setImageResource(userInfo.getGender() == 1 ? R.drawable.ic_gender_male : R.drawable.ic_gender_female);
tvGenderAndAge.setCompoundDrawablesRelativeWithIntrinsicBounds(userInfo.getGender() == 1 ? R.drawable.ic_gender_male_empty_bg : R.drawable.ic_gender_female_empty_bg, 0, 0, 0);
tvGenderAndAge.setBackgroundResource(userInfo.getGender() == 1 ? R.drawable.shape_45bbff_to_8ad4ff : R.drawable.shape_ff90ae_to_ff497d);
tvGenderAndAge.setText(String.valueOf(CurrentTimeUtils.getAgeFromTimestamp(userInfo.getBirth())));
tvDesc.setText(userInfo.getUserDesc() != null ? userInfo.getUserDesc() : context.getResources().getString(R.string.msg_no_user_desc));
//设置星座
String star = StarUtils.getConstellation(new Date(userInfo.getBirth()));
@@ -142,8 +151,8 @@ public class MsgViewHolderUserCard extends MsgViewHolderBase {
tvConstellation.setText(star);
tvConstellation.setVisibility(View.VISIBLE);
}
VipHelper.loadVipIcon(ivVipIcon, userInfo.getUserVipInfoVO());
photoAdapter.setNewData(userInfo.getPrivatePhoto());
HeadWearInfo headWearInfo = userInfo.getUserHeadwear();
if (headWearInfo != null && !TextUtils.isEmpty(headWearInfo.getPic())) {
NobleUtil.loadHeadWear(

View File

@@ -23,9 +23,14 @@ import com.alibaba.fastjson.JSONObject;
import com.alibaba.security.realidentity.RPEventListener;
import com.alibaba.security.realidentity.RPResult;
import com.alibaba.security.realidentity.RPVerify;
import com.mango.core.utils.LogUtils;
import com.mango.moshen.BuildConfig;
import com.mango.xchat_android_library.utils.file.JXFileUtils;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.orhanobut.logger.Logger;
import com.tencent.mm.opensdk.modelbiz.WXLaunchMiniProgram;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.umeng.commonsdk.statistics.common.DeviceConfig;
import com.mango.moshen.UIHelper;
import com.mango.moshen.avroom.activity.AVRoomActivity;
@@ -532,6 +537,28 @@ public class JSInterface {
if (mActivity instanceof TarotPayWebViewActivity) mActivity.finish();
}
@JavascriptInterface
public void openTarotPay(String json) {
JSONObject jsonObject = JSONObject.parseObject(json);
//微信小程序支付的微信appid和微信登录&支付的appid是不同的...
IWXAPI api = WXAPIFactory.createWXAPI(mActivity, jsonObject.getString("wxminiAppid"));
WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();
req.userName = jsonObject.getString("wxminiId"); // 填小程序原始id
//拉起小程序页面的可带参路径,不填默认拉起小程序首页,对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。
req.path = "pages/index/index?pub_ticket=" + AuthModel.get().getTicket() +
"&tarotChargeProdId=" + jsonObject.getString("tarotChargeProdId") +
"&cardList=" + jsonObject.getString("cardList") +
"&payType=" + jsonObject.getString("payType") +
"&pub_uid=" + AuthModel.get().getCurrentUid() +
"&uid=" + AuthModel.get().getCurrentUid() +
"&ticket=" + AuthModel.get().getTicket() +
"&roomUid=" + AvRoomDataManager.get().getRoomUid() +
"&appVersion=" + BuildConfig.VERSION_NAME +
"&app=" + XChatConstants.APP_MARK;
req.miniprogramType = BuildConfig.DEBUG ? WXLaunchMiniProgram.Req.MINIPROGRAM_TYPE_TEST : WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE;// 可选打开 开发版,体验版和正式版
api.sendReq(req);
}
/**
* 打开弹窗式 WebViewActivity
*/
@@ -550,9 +577,9 @@ public class JSInterface {
public void saveBase64Image(String imageBase64) {
mActivity.runOnUiThread(() ->
mActivity.checkPermission(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
)
.subscribe(aBoolean -> {
if (aBoolean) {
try {

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#45BBFF"
android:endColor="#8AD4FF" />
<corners android:radius="30dp" />
</shape>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#FF497D"
android:endColor="#FF90AE" />
<corners android:radius="30dp" />
</shape>

View File

@@ -139,29 +139,48 @@
app:layout_constraintStart_toStartOf="@id/iv_avatar"
app:layout_constraintTop_toTopOf="@id/iv_avatar" />
<ImageView
android:id="@+id/iv_vip_icon"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_marginStart="10dp"
app:layout_constraintBottom_toTopOf="@id/tv_desc"
app:layout_constraintStart_toEndOf="@id/iv_head_wear"
app:layout_constraintTop_toTopOf="@id/iv_avatar"
app:layout_constraintVertical_chainStyle="packed"
tools:src="@drawable/ic_gender_female" />
<TextView
android:id="@+id/tv_nick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginStart="4dp"
android:textColor="@color/color_333333"
android:textSize="16dp"
app:layout_constraintBottom_toTopOf="@id/tv_desc"
app:layout_constraintStart_toEndOf="@id/iv_head_wear"
app:layout_constraintTop_toTopOf="@id/iv_avatar"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintBottom_toBottomOf="@id/iv_vip_icon"
app:layout_constraintStart_toEndOf="@id/iv_vip_icon"
app:layout_constraintTop_toTopOf="@id/iv_vip_icon"
app:layout_goneMarginStart="10dp"
tools:text="这就是大哥呀呀" />
<ImageView
android:id="@+id/iv_gender"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
<TextView
android:id="@+id/tv_gender_and_age"
android:layout_width="32dp"
android:layout_height="14dp"
android:layout_marginStart="5dp"
android:background="@drawable/shape_ff90ae_to_ff497d"
android:drawableStart="@drawable/ic_gender_female_empty_bg"
android:gravity="center_vertical"
android:drawablePadding="2dp"
android:includeFontPadding="false"
android:paddingStart="4dp"
android:textColor="@color/white"
android:textSize="10sp"
app:layout_constraintBottom_toBottomOf="@id/tv_nick"
app:layout_constraintStart_toEndOf="@id/tv_nick"
app:layout_constraintTop_toTopOf="@id/tv_nick"
tools:src="@drawable/ic_gender_female" />
tools:src="@drawable/ic_gender_female"
tools:text="22" />
<TextView
android:id="@+id/tv_constellation"
@@ -177,7 +196,7 @@
android:textColor="@color/white"
android:textSize="10sp"
app:layout_constraintBottom_toBottomOf="@id/tv_nick"
app:layout_constraintStart_toEndOf="@id/iv_gender"
app:layout_constraintStart_toEndOf="@id/tv_gender_and_age"
app:layout_constraintTop_toTopOf="@id/tv_nick"
tools:text="处女座" />
@@ -189,8 +208,8 @@
android:textColor="#BABBCD"
android:textSize="14dp"
app:layout_constraintBottom_toBottomOf="@id/iv_avatar"
app:layout_constraintStart_toStartOf="@id/tv_nick"
app:layout_constraintTop_toBottomOf="@id/tv_nick"
app:layout_constraintStart_toStartOf="@id/iv_vip_icon"
app:layout_constraintTop_toBottomOf="@id/iv_vip_icon"
tools:text="正在“可惜不是你…”热聊中" />
<androidx.recyclerview.widget.RecyclerView

View File

@@ -1,5 +1,8 @@
package com.mango.core.utils;
import java.util.Calendar;
import java.util.Date;
public class CurrentTimeUtils {
private static long offsetTime;
@@ -12,4 +15,33 @@ public class CurrentTimeUtils {
public static long getCurrentTime() {
return System.currentTimeMillis() - offsetTime;
}
public static int getAgeFromTimestamp(long timestamp) {
Date birthDay = new Date(timestamp);
Calendar cal = Calendar.getInstance();
cal.setTime(new Date(getCurrentTime()));
int yearNow = cal.get(Calendar.YEAR);
int monthNow = cal.get(Calendar.MONTH);
int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
cal.setTime(birthDay);
int yearBirth = cal.get(Calendar.YEAR);
int monthBirth = cal.get(Calendar.MONTH);
int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
int age = yearNow - yearBirth;
if (monthNow <= monthBirth) {
if (monthNow == monthBirth) {
if (dayOfMonthNow < dayOfMonthBirth)
age--;
} else {
age--;
}
}
return age;
}
}