extends
initView();
initData();
initCompleted();
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ if (!Settings.canDrawOverlays(this)) {
+ Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
+ Uri.parse("package:" + getPackageName()));
+ startActivityForResult(intent, 100);
+ }
+ } else {
+ // 对于低于 Android 6.0 的设备,无需请求悬浮窗权限
+ // 可在此处添加针对旧版本的处理逻辑(如果需要)
+ }
+
}
@Override
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseMvpActivity.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseMvpActivity.java
index 62226f8b..3c7e71bf 100644
--- a/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseMvpActivity.java
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseMvpActivity.java
@@ -1,11 +1,32 @@
package com.qxcm.moduleutil.activity;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
+import android.graphics.PixelFormat;
+import android.os.Build;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.view.WindowManager;
+import android.widget.TextView;
import androidx.databinding.ViewDataBinding;
+import com.blankj.utilcode.util.LogUtils;
+import com.qxcm.moduleutil.R;
+import com.qxcm.moduleutil.base.CommonAppContext;
+import com.qxcm.moduleutil.bean.UserBean;
import com.qxcm.moduleutil.utils.LanguageUtil;
+import com.tencent.qcloud.tuicore.TUILogin;
+import com.tencent.qcloud.tuicore.interfaces.TUICallback;
+
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
public abstract class BaseMvpActivity extends BaseAppCompatActivity implements IView {
@@ -50,4 +71,106 @@ public abstract class BaseMvpActivity= Build.VERSION_CODES.O ?
+ WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY :
+ WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
+ WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
+ WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
+ WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
+ PixelFormat.TRANSLUCENT);
+
+ // 设置 Gravity 为左上角
+ layoutParams.gravity = Gravity.TOP | Gravity.START;
+
+ // Y 轴随机位置
+ layoutParams.y = (int) ((Math.random() * (screenHeight - 200)));
+
+ // 初始 X 设为负值,确保 View 在屏幕左侧外
+ layoutParams.x = -200;
+
+ View piaoPingView = LayoutInflater.from(this).inflate(R.layout.item_piaoping, null);
+ TextView textView = piaoPingView.findViewById(R.id.tv_content);
+ textView.setText(message);
+
+ windowManager.addView(piaoPingView, layoutParams);
+
+ piaoPingView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ piaoPingView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
+
+ int viewWidth = piaoPingView.getWidth();
+
+ // 设置锚点为左上角,避免偏移干扰
+ piaoPingView.setPivotX(0);
+ piaoPingView.setPivotY(0);
+
+ // 更新 x 坐标为 -screenWidth,确保 View 完全在屏幕左侧外
+ layoutParams.x = -screenWidth;
+ windowManager.updateViewLayout(piaoPingView, layoutParams);
+
+ // 启动动画:从左外滑入 -> 右外滑出
+ ObjectAnimator animator = ObjectAnimator.ofFloat(
+ piaoPingView,
+ "translationX",
+ 0f, // 初始偏移为 0(此时 View 在左侧外)
+ screenWidth + viewWidth // 向右移动整个屏幕宽度 + View 宽度
+ );
+ animator.setDuration(duration);
+ animator.addUpdateListener(animation -> {
+ float value = (float) animation.getAnimatedValue();
+ LogUtils.d("PiaoPing", "translationX = " + value);
+ });
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ windowManager.removeView(piaoPingView);
+ }
+ });
+
+ // 强制 GPU 渲染
+ piaoPingView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+
+ animator.start();
+ }
+ });
+ }
+
+
+
+
+
+
}
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/adapter/UserPhotoWallAdapter.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/adapter/UserPhotoWallAdapter.java
new file mode 100644
index 00000000..cc8db03f
--- /dev/null
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/adapter/UserPhotoWallAdapter.java
@@ -0,0 +1,55 @@
+package com.qxcm.moduleutil.adapter;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.qxcm.moduleutil.R;
+import com.qxcm.moduleutil.bean.UserImgList;
+import com.qxcm.moduleutil.utils.ImageUtils;
+
+public class UserPhotoWallAdapter extends BaseQuickAdapter {
+ private boolean b = false;
+ private int longClickPos = -1;
+
+ public UserPhotoWallAdapter() {
+ super(R.layout.me_item_user_photo_wall);
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, UserImgList item) {
+ if (helper.getAdapterPosition() == 5) {
+ helper.setVisible(R.id.riv_user_head, false);
+ helper.setVisible(R.id.iv_close, false);
+ } else {
+ helper.setVisible(R.id.riv_user_head, true);
+ if (!"0".equals(item.getId())) {
+ ImageUtils.loadCenterCrop(item.getUrl(), helper.getView(R.id.riv_user_head));
+ if (longClickPos == helper.getAdapterPosition()) {
+ helper.setVisible(R.id.iv_close, true);
+ } else {
+ helper.setVisible(R.id.iv_close, false);
+ }
+ } else {
+ helper.setImageResource(R.id.riv_user_head, com.qxcm.moduleutil.R.mipmap.add_img);
+ helper.setGone(R.id.iv_close, false);
+ }
+ }
+ helper.addOnClickListener(R.id.iv_close);
+ helper.addOnClickListener(R.id.riv_user_head);
+ helper.addOnLongClickListener(R.id.riv_user_head);
+ }
+
+
+ public void setDelete(boolean b) {
+ this.b = b;
+ notifyDataSetChanged();
+ }
+
+ public void setLongClickPos(int pos) {
+ this.longClickPos = pos;
+ notifyDataSetChanged();
+ }
+
+ public boolean getDelete() {
+ return b;
+ }
+}
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/BannerModel.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/BannerModel.java
new file mode 100644
index 00000000..3817842a
--- /dev/null
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/BannerModel.java
@@ -0,0 +1,88 @@
+package com.qxcm.moduleutil.bean;
+
+import com.stx.xhb.xbanner.entity.SimpleBannerInfo;
+
+import java.util.ArrayList;
+
+public class BannerModel extends SimpleBannerInfo {
+
+
+ /**
+ * ad_id : 11
+ * type : 2
+ * title : 鱼糖语音·开服送好礼
+ * item_id : 9
+ * link_url : null
+ * content : https://gudao-prod.oss-cn-hangzhou.aliyuncs.com/user-dir/YZrsGTJR5F.jpg
+ * detail_pictures : null
+ */
+
+ private String ad_id;
+ private String type;
+ private String title;
+ private String item_id;
+ private String link_url;
+ private String content;
+ private ArrayList detail_pictures;
+
+ public String getAd_id() {
+ return ad_id;
+ }
+
+ public void setAd_id(String ad_id) {
+ this.ad_id = ad_id;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getItem_id() {
+ return item_id;
+ }
+
+ public void setItem_id(String item_id) {
+ this.item_id = item_id;
+ }
+
+ public String getLink_url() {
+ return link_url;
+ }
+
+ public void setLink_url(String link_url) {
+ this.link_url = link_url;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public ArrayList getDetail_pictures() {
+ return detail_pictures;
+ }
+
+ public void setDetail_pictures(ArrayList detail_pictures) {
+ this.detail_pictures = detail_pictures;
+ }
+
+ @Override
+ public Object getXBannerUrl() {
+ return content;
+ }
+}
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/GiftBoxBean.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/GiftBoxBean.java
new file mode 100644
index 00000000..53b8b49c
--- /dev/null
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/GiftBoxBean.java
@@ -0,0 +1,23 @@
+package com.qxcm.moduleutil.bean;
+
+import java.util.List;
+
+import lombok.Data;
+/**
+ *@author qx
+ *@data 2025/5/27
+ *@description: 礼盒数据
+ */
+@Data
+public class GiftBoxBean {
+ private String newDataJinbi;
+ private List giftList;
+ @Data
+ public static class GiftBean {
+ private String giftName; //初级礼盒、高级礼盒
+ private String giftTitle; //最高可以获得的金币数
+ private String getGiftTypeName; //满多少个金币
+ private String giftTypeNumber; //当前的百分比
+ private String giftTypeStatus; //是否已经可以
+ }
+}
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RealNameBean.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RealNameBean.java
new file mode 100644
index 00000000..b14fbeaa
--- /dev/null
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RealNameBean.java
@@ -0,0 +1,19 @@
+package com.qxcm.moduleutil.bean;
+
+import lombok.Data;
+/**
+ *@author qx
+ *@data 2025/5/27
+ *@description: 实名认证点击获取返回的参数
+ */
+@Data
+public class RealNameBean {
+ private String userid;
+ private String nonce;
+ private String sign;
+ private String appid;
+ private String orderNo;
+ private String apiVersion;
+ private String licence;
+ private String faceId;
+}
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RevenueBean.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RevenueBean.java
new file mode 100644
index 00000000..8c33f685
--- /dev/null
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RevenueBean.java
@@ -0,0 +1,11 @@
+package com.qxcm.moduleutil.bean;
+
+import lombok.Data;
+
+@Data
+public class RevenueBean {
+ private String title;
+ private String time;
+ private String money;
+ private String type;
+}
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/TaskDataBean.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/TaskDataBean.java
new file mode 100644
index 00000000..2674c3d1
--- /dev/null
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/TaskDataBean.java
@@ -0,0 +1,12 @@
+package com.qxcm.moduleutil.bean;
+
+import lombok.Data;
+
+@Data
+public class TaskDataBean {
+ private String taskName;//任务名称
+ private String taskNumber;//对应的数量
+ private String taskType;//类型,展示不同的按钮:1.观看,2.完成,3.送礼,4.邀请,5.充值,6.任务
+ private String taskPictureUrl;//任务不同的图片地址
+ private String taskReward;//奖励
+}
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/http/ApiServer.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/http/ApiServer.java
index 55c2656a..ee24bc07 100644
--- a/moduleUtil/src/main/java/com/qxcm/moduleutil/http/ApiServer.java
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/http/ApiServer.java
@@ -1,6 +1,7 @@
package com.qxcm.moduleutil.http;
+import com.qxcm.moduleutil.bean.RealNameBean;
import com.qxcm.moduleutil.bean.UserBean;
import com.qxcm.moduleutil.widget.Constants;
@@ -53,6 +54,9 @@ public interface ApiServer {
@POST(Constants.CHANGE_PASSWORD)
Call> getPostData(@Field("new_password") String new_password,@Field("mobile") String mobile,@Field("sms_code") String code,@Field("user_id") String userId);
+ @FormUrlEncoded
+ @POST(Constants.REAL_NAME_RESULT)
+ Call> getRealNameResult(@Field("orderNo") String order_no);
@FormUrlEncoded
@POST(Constants.URL_LOGIN)
Observable>> oauthLogin(@Field("login_token") String login_token);
@@ -64,6 +68,10 @@ public interface ApiServer {
@POST(Constants.URL_WX_CODE)
Observable>> authCode1(@Field("code") String login_token);
+ @FormUrlEncoded
+ @POST(Constants.REAL_NAME)
+ Observable> realName(@Field("real_name") String real_name, @Field("card_number") String card_number);
+
// @FormUrlEncoded
// @POST(Constant.URL.ADDBANK)
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/http/RetrofitClient.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/http/RetrofitClient.java
index 4834fe15..2758adf8 100644
--- a/moduleUtil/src/main/java/com/qxcm/moduleutil/http/RetrofitClient.java
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/http/RetrofitClient.java
@@ -11,6 +11,7 @@ import com.franmontiel.persistentcookiejar.PersistentCookieJar;
import com.franmontiel.persistentcookiejar.cache.SetCookieCache;
import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor;
import com.qxcm.moduleutil.base.CommonAppContext;
+import com.qxcm.moduleutil.bean.RealNameBean;
import com.qxcm.moduleutil.bean.UserBean;
import com.qxcm.moduleutil.presenter.BasePresenter;
import com.qxcm.moduleutil.utils.SystemUtils;
@@ -195,4 +196,8 @@ public class RetrofitClient {
sApiServer.authCode(netease_token).compose(new DefaultTransformer<>()).subscribe(observer);
}
}
+
+ public void realName(String real_name, String card_number,BaseObserver observer){
+ sApiServer.realName(real_name,card_number).compose(new DefaultTransformer<>()).subscribe(observer);
+ }
}
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/utils/config/EnvironmentEnum.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/utils/config/EnvironmentEnum.java
index 6a9f155a..5c221582 100644
--- a/moduleUtil/src/main/java/com/qxcm/moduleutil/utils/config/EnvironmentEnum.java
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/utils/config/EnvironmentEnum.java
@@ -8,7 +8,8 @@ public enum EnvironmentEnum {
"DhpCS82gaigZljYqsWsUWUAZ20dREz",
"qx-yusheng",
"https://qx-yusheng.oss-cn-hangzhou.aliyuncs.com/",
- "wx9b6db036ca1073a2"),
+ "wx9b6db036ca1073a2",
+ 1600086675),
TEST(
"http://chat.qxmier.com/",
"6rdWuz058oq5OahdbFiGEybUcdahd12J83L34Uc7MrPIrxtFG+rXiwDvRcqNvjwbClbbmvMrmxKVkIysFByBsl0Qe9kqd2w8T/nhK5G6eXXlk2V9AjYCieIU+jRnjZBB+Cfechr6rCGJ2aeBARIsXcRPW7wm9WFK9euh5T+v6Pyte68yNaNdcYCll3+U4/uCEog7HygCnMIbAU+kqoPdmn2H+51YOHW+VsnsHd4w1+I3f8Tt0xLIXGM4GWnQueZ5GR46GTWiSYMy8dCIh9SPIMRyC91GosVcfGPMJSdcXqc=",
@@ -17,7 +18,8 @@ public enum EnvironmentEnum {
"DhpCS82gaigZljYqsWsUWUAZ20dREz",
"qx-yusheng",
"https://qx-yusheng.oss-cn-hangzhou.aliyuncs.com/",
- "wx9b6db036ca1073a2");
+ "wx9b6db036ca1073a2",
+ 1600086675);
private final String serverUrl;
private final String ALI_AUTH_KEY;//阿里云授权key
@@ -30,7 +32,11 @@ public enum EnvironmentEnum {
private final String wxAppId;
- EnvironmentEnum(String serverUrl, String ALI_AUTH_KEY, String ossEndPoint, String ossaAcessKeyId, String ossAccessKeySecret, String ossBucketName, String ossBaseUrl,String wxAppId) {
+ private final int sdkAppId;//腾讯云sdkAppId im
+
+ EnvironmentEnum(String serverUrl, String ALI_AUTH_KEY, String ossEndPoint, String ossaAcessKeyId,
+ String ossAccessKeySecret, String ossBucketName, String ossBaseUrl,String wxAppId,
+ int sdkAppId) {
this.serverUrl = serverUrl;
this.ALI_AUTH_KEY = ALI_AUTH_KEY;
this.ossEndPoint = ossEndPoint;
@@ -39,6 +45,11 @@ public enum EnvironmentEnum {
this.ossBucketName = ossBucketName;
this.ossBaseUrl = ossBaseUrl;
this.wxAppId=wxAppId;
+ this.sdkAppId=sdkAppId;
+ }
+
+ public int getSdkAppId() {
+ return sdkAppId;
}
public String getWxAppId() {
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/Constants.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/Constants.java
index bf4f1364..f3c8b10f 100644
--- a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/Constants.java
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/Constants.java
@@ -361,4 +361,7 @@ public class Constants {
public static final String AUTHORIZATION = "/api/Login/AlipayUserInfo";
+ public static final String REAL_NAME = "/api/UserData/real_name";//调用实名认证接口
+ public static final String REAL_NAME_RESULT = "/api/UserData/real_name_result";//调用实名认证接口
+
}
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/CustomBottomSheetDialog.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/CustomBottomSheetDialog.java
new file mode 100644
index 00000000..48c2d8f3
--- /dev/null
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/CustomBottomSheetDialog.java
@@ -0,0 +1,22 @@
+package com.qxcm.moduleutil.widget;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+import androidx.annotation.NonNull;
+
+import com.google.android.material.bottomsheet.BottomSheetDialog;
+
+public class CustomBottomSheetDialog extends BottomSheetDialog {
+ public CustomBottomSheetDialog(@NonNull Context context) {
+ super(context);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
+ }
+}
+
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/DoubleTimePickerBottomSheet.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/DoubleTimePickerBottomSheet.java
new file mode 100644
index 00000000..9e490154
--- /dev/null
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/DoubleTimePickerBottomSheet.java
@@ -0,0 +1,98 @@
+package com.qxcm.moduleutil.widget;
+
+import android.app.Dialog;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TabHost;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
+import com.qxcm.moduleutil.R;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+public class DoubleTimePickerBottomSheet extends BottomSheetDialogFragment {
+
+ private OnTimeRangeSelectedListener listener;
+
+ public interface OnTimeRangeSelectedListener {
+ void onTimeRangeSelected(Date startDate, Date endDate);
+ }
+
+ public void setOnTimeRangeSelectedListener(OnTimeRangeSelectedListener listener) {
+ this.listener = listener;
+ }
+
+ @NonNull
+ @Override
+ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
+ return new CustomBottomSheetDialog(requireContext());
+ }
+
+ @NonNull
+ @Override
+ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.dialog_double_time_picker, container, false);
+
+ // 初始化 TabHost
+ TabHost tabHost = view.findViewById(R.id.tabHost);
+ tabHost.setup();
+
+ tabHost.addTab(tabHost.newTabSpec("start").setIndicator("开始时间").setContent(R.id.start_time_tab));
+ tabHost.addTab(tabHost.newTabSpec("end").setIndicator("结束时间").setContent(R.id.end_time_tab));
+
+ // 初始化 Wheel Views
+ WheelDatePicker wheelStartDate = view.findViewById(R.id.wheel_start_date);
+ WheelTimePicker wheelStartTime = view.findViewById(R.id.wheel_start_time);
+ WheelDatePicker wheelEndDate = view.findViewById(R.id.wheel_end_date);
+ WheelTimePicker wheelEndTime = view.findViewById(R.id.wheel_end_time);
+
+ // 默认设置当前时间
+ Calendar startCal = Calendar.getInstance();
+ wheelStartDate.init(startCal.get(Calendar.YEAR), startCal.get(Calendar.MONTH), startCal.get(Calendar.DAY_OF_MONTH));
+ wheelStartTime.init(startCal.get(Calendar.HOUR_OF_DAY), startCal.get(Calendar.MINUTE),startCal.get(Calendar.SECOND));
+
+ // 设置默认结束时间略晚于开始时间
+ Calendar endCal = (Calendar) startCal.clone();
+ endCal.add(Calendar.HOUR, 1);
+ wheelEndDate.init(endCal.get(Calendar.YEAR), endCal.get(Calendar.MONTH), endCal.get(Calendar.DAY_OF_MONTH));
+ wheelEndTime.init(endCal.get(Calendar.HOUR_OF_DAY), endCal.get(Calendar.MINUTE),endCal.get(Calendar.SECOND));
+
+ // 取消按钮
+ view.findViewById(R.id.btn_cancel).setOnClickListener(v -> dismiss());
+
+ // 确定按钮
+ view.findViewById(R.id.btn_sure).setOnClickListener(v -> {
+ Calendar start = Calendar.getInstance();
+ start.set(wheelStartDate.getYear(), wheelStartDate.getMonth(), wheelStartDate.getDay(),
+ wheelStartTime.getHour(), wheelStartTime.getMinute(), wheelStartTime.getSecond());
+
+ Calendar end = Calendar.getInstance();
+ end.set(wheelEndDate.getYear(), wheelEndDate.getMonth(), wheelEndDate.getDay(),
+ wheelEndTime.getHour(), wheelEndTime.getMinute(), wheelEndTime.getSecond());
+
+ if (end.getTime().before(start.getTime())) {
+ Toast.makeText(requireContext(), "结束时间不能早于开始时间", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (listener != null) {
+ listener.onTimeRangeSelected(start.getTime(), end.getTime());
+ }
+ dismiss();
+ });
+
+ return view;
+ }
+}
+
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/ScrollViewPager.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/ScrollViewPager.java
index 85847194..cff123d4 100644
--- a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/ScrollViewPager.java
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/ScrollViewPager.java
@@ -56,4 +56,5 @@ public class ScrollViewPager extends ViewPager {
public void setCurrentItem(int item) {
super.setCurrentItem(item);
}
+
}
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelDatePicker.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelDatePicker.java
new file mode 100644
index 00000000..ba10b3ac
--- /dev/null
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelDatePicker.java
@@ -0,0 +1,97 @@
+package com.qxcm.moduleutil.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+import android.widget.NumberPicker;
+
+import java.util.Calendar;
+
+public class WheelDatePicker extends LinearLayout {
+
+ private NumberPicker yearPicker, monthPicker, dayPicker;
+ private int maxDay = 31;
+
+ public WheelDatePicker(Context context) {
+ this(context, null);
+ }
+
+ public WheelDatePicker(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context);
+ }
+
+ private void init(Context context) {
+ setOrientation(HORIZONTAL);
+
+ yearPicker = new NumberPicker(context);
+ monthPicker = new NumberPicker(context);
+ dayPicker = new NumberPicker(context);
+
+ LayoutParams params = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1);
+ yearPicker.setLayoutParams(params);
+ monthPicker.setLayoutParams(params);
+ dayPicker.setLayoutParams(params);
+
+ addView(yearPicker);
+ addView(monthPicker);
+ addView(dayPicker);
+
+ // 初始化年份范围
+ int currentYear = Calendar.getInstance().get(Calendar.YEAR);
+ yearPicker.setMinValue(currentYear - 50);
+ yearPicker.setMaxValue(currentYear + 50);
+
+ // 月份从 1 到 12
+ monthPicker.setMinValue(1);
+ monthPicker.setMaxValue(12);
+ monthPicker.setOnValueChangedListener((picker, oldVal, newVal) -> updateDays());
+
+ // 默认天数范围
+ dayPicker.setMinValue(1);
+ dayPicker.setMaxValue(maxDay);
+ }
+
+ private void updateDays() {
+ int year = yearPicker.getValue();
+ int month = monthPicker.getValue();
+
+ int daysInMonth;
+ if (month == 4 || month == 6 || month == 9 || month == 11) {
+ daysInMonth = 30;
+ } else if (month == 2) {
+ daysInMonth = isLeapYear(year) ? 29 : 28;
+ } else {
+ daysInMonth = 31;
+ }
+
+ int currentDay = dayPicker.getValue();
+ dayPicker.setMaxValue(daysInMonth);
+ if (currentDay > daysInMonth) {
+ dayPicker.setValue(daysInMonth);
+ }
+ }
+
+ private boolean isLeapYear(int year) {
+ return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
+ }
+
+ public void init(int year, int month, int day) {
+ yearPicker.setValue(year);
+ monthPicker.setValue(month + 1); // Calendar 是 0-based
+ dayPicker.setValue(day);
+ updateDays();
+ }
+
+ public int getYear() {
+ return yearPicker.getValue();
+ }
+
+ public int getMonth() {
+ return monthPicker.getValue() - 1; // 转回 Calendar 的 0-based
+ }
+
+ public int getDay() {
+ return dayPicker.getValue();
+ }
+}
\ No newline at end of file
diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelTimePicker.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelTimePicker.java
new file mode 100644
index 00000000..0cd5a283
--- /dev/null
+++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelTimePicker.java
@@ -0,0 +1,67 @@
+package com.qxcm.moduleutil.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+import android.widget.NumberPicker;
+
+public class WheelTimePicker extends LinearLayout {
+
+ private NumberPicker hourPicker, minutePicker, secondPicker;
+
+ public WheelTimePicker(Context context) {
+ this(context, null);
+ }
+
+ public WheelTimePicker(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context);
+ }
+
+ private void init(Context context) {
+ setOrientation(HORIZONTAL);
+
+ hourPicker = new NumberPicker(context);
+ minutePicker = new NumberPicker(context);
+ secondPicker= new NumberPicker(context);
+
+ LayoutParams params = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1);
+ hourPicker.setLayoutParams(params);
+ minutePicker.setLayoutParams(params);
+ secondPicker.setLayoutParams(params);
+
+ addView(hourPicker);
+ addView(minutePicker);
+ addView(secondPicker);
+
+ // 设置小时范围
+ hourPicker.setMinValue(0);
+ hourPicker.setMaxValue(23);
+
+ // 设置分钟范围
+ minutePicker.setMinValue(0);
+ minutePicker.setMaxValue(59);
+
+ // 秒范围
+ secondPicker.setMinValue(0);
+ secondPicker.setMaxValue(59);
+ }
+
+ public void init(int hour, int minute, int second) {
+ hourPicker.setValue(hour);
+ minutePicker.setValue(minute);
+ secondPicker.setValue(second);
+ }
+
+ public int getHour() {
+ return hourPicker.getValue();
+ }
+
+ public int getMinute() {
+ return minutePicker.getValue();
+ }
+
+ public int getSecond() {
+ return secondPicker.getValue();
+ }
+}
diff --git a/moduleUtil/src/main/res/drawable/bg_r16_f6f6f6.xml b/moduleUtil/src/main/res/drawable/bg_r16_f6f6f6.xml
new file mode 100644
index 00000000..da885844
--- /dev/null
+++ b/moduleUtil/src/main/res/drawable/bg_r16_f6f6f6.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/moduleUtil/src/main/res/drawable/rounded_background.xml b/moduleUtil/src/main/res/drawable/rounded_background.xml
new file mode 100644
index 00000000..6f364b25
--- /dev/null
+++ b/moduleUtil/src/main/res/drawable/rounded_background.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/moduleUtil/src/main/res/layout/date_picker_dialog.xml b/moduleUtil/src/main/res/layout/date_picker_dialog.xml
index 4416eb5d..bbfec287 100644
--- a/moduleUtil/src/main/res/layout/date_picker_dialog.xml
+++ b/moduleUtil/src/main/res/layout/date_picker_dialog.xml
@@ -26,6 +26,10 @@
android:calendarViewShown="false"
android:datePickerMode="spinner"
android:spinnersShown="true" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/moduleUtil/src/main/res/layout/item_piaoping.xml b/moduleUtil/src/main/res/layout/item_piaoping.xml
new file mode 100644
index 00000000..8d05b0eb
--- /dev/null
+++ b/moduleUtil/src/main/res/layout/item_piaoping.xml
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/moduleUtil/src/main/res/layout/me_item_user_photo_wall.xml b/moduleUtil/src/main/res/layout/me_item_user_photo_wall.xml
new file mode 100644
index 00000000..70e1d729
--- /dev/null
+++ b/moduleUtil/src/main/res/layout/me_item_user_photo_wall.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/gg.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/gg.png
new file mode 100644
index 00000000..eb81cf96
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/gg.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/go_cz.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/go_cz.png
new file mode 100644
index 00000000..ecdc8c28
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/go_cz.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/go_lock.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/go_lock.png
new file mode 100644
index 00000000..59f687a1
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/go_lock.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/go_sl.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/go_sl.png
new file mode 100644
index 00000000..b2a74531
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/go_sl.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/go_wc.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/go_wc.png
new file mode 100644
index 00000000..923dad2e
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/go_wc.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/go_yq.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/go_yq.png
new file mode 100644
index 00000000..38b57471
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/go_yq.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/nan.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/nan.png
new file mode 100644
index 00000000..4aec8809
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/nan.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/not_unlocked.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/not_unlocked.png
new file mode 100644
index 00000000..d54ca716
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/not_unlocked.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/nv.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/nv.png
new file mode 100644
index 00000000..082e8269
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/nv.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/release_n.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/release_n.png
new file mode 100644
index 00000000..6734ee98
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/release_n.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/task_cj.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/task_cj.png
new file mode 100644
index 00000000..94966d5a
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/task_cj.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/task_gj.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/task_gj.png
new file mode 100644
index 00000000..1f4f6e33
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/task_gj.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/task_gz.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/task_gz.png
new file mode 100644
index 00000000..ff81ed15
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/task_gz.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/task_lock.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/task_lock.png
new file mode 100644
index 00000000..572bcaa3
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/task_lock.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/task_t.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/task_t.png
new file mode 100644
index 00000000..b6f41f71
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/task_t.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/unlocked.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/unlocked.png
new file mode 100644
index 00000000..648943f6
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/unlocked.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/up_t.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/up_t.png
new file mode 100644
index 00000000..d12c8b9f
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/up_t.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/up_x.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/up_x.png
new file mode 100644
index 00000000..f24a3570
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/up_x.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/xt.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/xt.png
new file mode 100644
index 00000000..7a4a7016
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/xt.png differ
diff --git a/moduleUtil/src/main/res/mipmap-xxxhdpi/ylq.png b/moduleUtil/src/main/res/mipmap-xxxhdpi/ylq.png
new file mode 100644
index 00000000..b94c6ef3
Binary files /dev/null and b/moduleUtil/src/main/res/mipmap-xxxhdpi/ylq.png differ
diff --git a/moduleUtil/src/main/res/values-en-rUs/strings.xml b/moduleUtil/src/main/res/values-en-rUs/strings.xml
index 8e6dc3b9..15487694 100644
--- a/moduleUtil/src/main/res/values-en-rUs/strings.xml
+++ b/moduleUtil/src/main/res/values-en-rUs/strings.xml
@@ -6,6 +6,7 @@
Vespa
wallet
dan
+ news
Guild
dress up
shopping
diff --git a/moduleUtil/src/main/res/values/colors.xml b/moduleUtil/src/main/res/values/colors.xml
index 332a67bb..4a64d677 100644
--- a/moduleUtil/src/main/res/values/colors.xml
+++ b/moduleUtil/src/main/res/values/colors.xml
@@ -47,6 +47,7 @@
#FF757575
#FFA6A6A6
#FFE3E3E3
+ #F8E3C8
#FFBDBDBC
#FF6A6A6A
#FFC8C8C8
@@ -152,11 +153,14 @@
#424242
#A9A9A9
#EDF2F8
+ #E24171
+ #FFB8CD
#F0EDF2F8
#8699FC
#D7E3F6
#797979
#FF31505E
+ #F35F07
#5570FF
#DBE1FF
#DFFFFE
@@ -196,6 +200,7 @@
#212121
#2B2823
#34322D
+ #FCE4ED
#EBEDF6
#B7C3FC
#CCCCCC
@@ -209,6 +214,7 @@
#FFFFADAD
#FF845500
#FFFFDC96
+ #FDE8AE
#FFFFD698
#FF7F5FF5
#FFFF5858
diff --git a/moduleUtil/src/main/res/values/strings.xml b/moduleUtil/src/main/res/values/strings.xml
index 06c5296f..854b0c01 100644
--- a/moduleUtil/src/main/res/values/strings.xml
+++ b/moduleUtil/src/main/res/values/strings.xml
@@ -10,6 +10,7 @@
道具商城
我的背包
每日任务
+ 音信
消息通知
未成年人模式
@@ -95,6 +96,7 @@
钻石收支
其他功能
钻石换币
+ 金币收支
充值
支付方式
diff --git a/moduleUtil/src/main/res/values/styles.xml b/moduleUtil/src/main/res/values/styles.xml
index 19020a92..642bd72e 100644
--- a/moduleUtil/src/main/res/values/styles.xml
+++ b/moduleUtil/src/main/res/values/styles.xml
@@ -145,5 +145,14 @@
- true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulecircle/build.gradle b/modulecircle/build.gradle
index fdc978af..74574db4 100644
--- a/modulecircle/build.gradle
+++ b/modulecircle/build.gradle
@@ -24,8 +24,8 @@ android {
}
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_11
- targetCompatibility JavaVersion.VERSION_11
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
}
dataBinding {
enabled = true
@@ -39,6 +39,8 @@ dependencies {
implementation libs.appcompat
implementation libs.material
+ implementation libs.activity
+ implementation libs.constraintlayout
testImplementation libs.junit
androidTestImplementation libs.ext.junit
androidTestImplementation libs.espresso.core
diff --git a/modulecircle/src/main/AndroidManifest.xml b/modulecircle/src/main/AndroidManifest.xml
index 9bd4d8db..fe755e37 100644
--- a/modulecircle/src/main/AndroidManifest.xml
+++ b/modulecircle/src/main/AndroidManifest.xml
@@ -1,11 +1,15 @@
+
+ android:supportsRtl="true">
+
+
\ No newline at end of file
diff --git a/modulecircle/src/main/java/com/example/modulecircle/activity/ReleaseActivity.java b/modulecircle/src/main/java/com/example/modulecircle/activity/ReleaseActivity.java
new file mode 100644
index 00000000..d696138e
--- /dev/null
+++ b/modulecircle/src/main/java/com/example/modulecircle/activity/ReleaseActivity.java
@@ -0,0 +1,208 @@
+package com.example.modulecircle.activity;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextUtils;
+import android.text.TextWatcher;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import androidx.activity.EdgeToEdge;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.graphics.Insets;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.example.modulecircle.R;
+import com.example.modulecircle.contacts.ReleaseContract;
+import com.example.modulecircle.databinding.ActivityReleaseBinding;
+import com.example.modulecircle.dialog.MultiSelectAdapter;
+import com.example.modulecircle.presenter.ReleasePresenter;
+import com.google.android.material.bottomsheet.BottomSheetDialog;
+import com.luck.picture.lib.PictureSelector;
+import com.luck.picture.lib.config.PictureConfig;
+import com.luck.picture.lib.config.PictureMimeType;
+import com.luck.picture.lib.entity.LocalMedia;
+import com.qxcm.moduleutil.activity.BaseMvpActivity;
+import com.qxcm.moduleutil.adapter.UserPhotoWallAdapter;
+import com.qxcm.moduleutil.bean.UserImgList;
+import com.qxcm.moduleutil.utils.GlideEngine;
+import com.qxcm.moduleutil.utils.MyPictureParameterStyle;
+import com.qxcm.moduleutil.widget.Constants;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author qx
+ * @data 2025/5/28
+ * @description: 发布动态
+ */
+public class ReleaseActivity extends BaseMvpActivity implements ReleaseContract.View {
+ UserPhotoWallAdapter mUserPhotoWallAdapter;
+ List list;
+ final int maxNum = 1200;
+
+ @Override
+ protected void initData() {
+ mBinding.topBar.setTitle("动态发布");
+
+ mBinding.tvSz.setText("0/" + maxNum);
+ mBinding.etG.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) {
+ if (s.length() == maxNum) {
+ mBinding.tvSz.setText("您输入的字数已超过限制");
+ } else {
+ mBinding.tvSz.setText((maxNum - s.length()) + "/" + maxNum);
+ }
+ }
+ });
+
+ mBinding.rvPhotoWall.setLayoutManager(new GridLayoutManager(this, 3));
+ mBinding.rvPhotoWall.setAdapter(mUserPhotoWallAdapter = new UserPhotoWallAdapter());
+ mUserPhotoWallAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
+ @Override
+ public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
+ int id = view.getId();
+ UserImgList item = mUserPhotoWallAdapter.getItem(position);
+ if (id == com.qxcm.moduleutil.R.id.iv_close) {
+// MvpPre.deletePhoto(item.getId(), position);
+ } else {
+ if ("0".equals(item.getId())) {
+ startChoosePhoto(PictureMimeType.ofImage(), PictureConfig.REQUEST_CAMERA, true, 9);
+ }
+ }
+ }
+ });
+ mUserPhotoWallAdapter.setOnItemChildLongClickListener(new BaseQuickAdapter.OnItemChildLongClickListener() {
+ @Override
+ public boolean onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {
+ mUserPhotoWallAdapter.setLongClickPos(position);
+ return true;
+ }
+ });
+
+ list = new ArrayList<>();
+ UserImgList userImgList = new UserImgList("0", "");
+ list.add(userImgList);
+ mUserPhotoWallAdapter.setNewData(list);
+ mUserPhotoWallAdapter.setDelete(true);
+
+ mBinding.rl1.setOnClickListener(this::onClick);
+ }
+
+ private void onClick(View view) {
+ if (view.getId() == R.id.rl_1) {
+ dialog();
+ }
+ }
+
+ private void dialog() {
+
+ // 示例数据
+ List topics = Arrays.asList("话题1", "话题2", "话题3", "话题4");
+
+ BottomSheetDialog dialog = new BottomSheetDialog(this);
+ dialog.setContentView(R.layout.bottom_sheet_recyclerview);
+
+ RecyclerView recyclerView = dialog.findViewById(R.id.rv_options);
+ Button btnCancel = dialog.findViewById(R.id.btn_cancel);
+ Button btnConfirm = dialog.findViewById(R.id.btn_confirm);
+
+ assert recyclerView != null;
+ recyclerView.setLayoutManager(new LinearLayoutManager(this));
+ MultiSelectAdapter adapter = new MultiSelectAdapter(topics);
+ recyclerView.setAdapter(adapter);
+
+ btnCancel.setOnClickListener(v -> dialog.dismiss());
+
+ btnConfirm.setOnClickListener(v -> {
+ List selectedTopics = adapter.getSelectedItems();
+ // 返回结果给调用页面(可使用接口或 onActivityResult 等方式)
+ Log.d("Selected Topics", selectedTopics.toString());
+ // 示例:更新 UI
+ ((TextView)findViewById(R.id.tv_ht)).setText("已选:" + TextUtils.join(",", selectedTopics));
+ dialog.dismiss();
+ });
+
+ dialog.show();
+
+
+ }
+
+ private void startChoosePhoto(int mimeType, int requestCode, boolean isVideo, int type) {
+
+ PictureSelector.create(this)
+ .openGallery(mimeType)
+ .isGif(isVideo)
+ .imageEngine(GlideEngine.createGlideEngine())
+ .maxSelectNum(type)
+ .isPreviewImage(true)
+ .isCamera(true)
+ .setOutputCameraPath(Constants.FILE_PATH)
+ .isCompress(true)
+ .setPictureStyle(MyPictureParameterStyle.Companion.selectPicture())
+ .forResult(requestCode); //结果回调onActivityResult code
+
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (resultCode == RESULT_OK && data != null) {
+ switch (requestCode) {
+ case PictureConfig.CHOOSE_REQUEST:
+ List localMedia = PictureSelector.obtainMultipleResult(data);
+ if (localMedia != null && localMedia.size() != 0) {
+ LocalMedia imgMedia = localMedia.get(0);
+ String url;
+ if (imgMedia.isCompressed()) {
+ url = imgMedia.getCompressPath();
+ } else {
+ url = imgMedia.getRealPath();
+ }
+// MvpPre.uploadFile(new File(url), 0);
+ }
+ break;
+ case PictureConfig.REQUEST_CAMERA:
+ List localMedia1 = PictureSelector.obtainMultipleResult(data);
+ if (localMedia1 != null && localMedia1.size() != 0) {
+ LocalMedia imgMedia = localMedia1.get(0);
+// MvpPre.uploadFile(new File(imgMedia.getRealPath()), 3);
+ }
+ break;
+ }
+ }
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.activity_release;
+ }
+
+ @Override
+ protected ReleasePresenter bindPresenter() {
+ return new ReleasePresenter(this, this);
+ }
+}
\ No newline at end of file
diff --git a/modulecircle/src/main/java/com/example/modulecircle/adapter/ExpandColumnAdapter.java b/modulecircle/src/main/java/com/example/modulecircle/adapter/ExpandColumnAdapter.java
new file mode 100644
index 00000000..ec05fbaf
--- /dev/null
+++ b/modulecircle/src/main/java/com/example/modulecircle/adapter/ExpandColumnAdapter.java
@@ -0,0 +1,135 @@
+package com.example.modulecircle.adapter;
+
+import android.text.TextUtils;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.example.modulecircle.R;
+import com.qxcm.moduleutil.adapter.OneImageYuanJiaoAdapter;
+import com.qxcm.moduleutil.bean.CircleListBean;
+import com.qxcm.moduleutil.utils.ImageUtils;
+import com.qxcm.moduleutil.widget.MyGridView;
+import com.qxcm.moduleutil.widget.img.FullScreenUtil;
+
+public class ExpandColumnAdapter extends BaseQuickAdapter {
+ public ExpandColumnAdapter() {
+ super(R.layout.item_expand_column);
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, CircleListBean item) {
+ helper.addOnClickListener(com.qxcm.moduleutil.R.id.dianzan)
+ .addOnClickListener(com.qxcm.moduleutil.R.id.dy_lookmore_tv)
+ .addOnClickListener(com.qxcm.moduleutil.R.id.dy_head_image)
+ .addOnClickListener(com.qxcm.moduleutil.R.id.dy_more_image)
+ .addOnClickListener(com.qxcm.moduleutil.R.id.dy_oneimage_iv);
+
+ //先让单图,多图,音频的布局显示
+ helper.getView(com.qxcm.moduleutil.R.id.dy_oneimage_iv).setVisibility(View.VISIBLE);
+ helper.getView(com.qxcm.moduleutil.R.id.dy_image_recyc).setVisibility(View.VISIBLE);
+ helper.getView(com.qxcm.moduleutil.R.id.iv_jubao).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+// ARouter.getInstance().build(AroutUtil.COMMUNITY_JUBAO).withString("uid", item.getUid() + "").navigation();
+ }
+ });
+ //昵称
+ helper.setText(com.qxcm.moduleutil.R.id.dy_name_text, item.getUserNickName());
+
+ //头像
+ ImageUtils.loadHeadCC(item.getUserAvatar(), (ImageView) helper.getView(com.qxcm.moduleutil.R.id.dy_head_image));
+
+ //动态内容以富文本展示
+ String content = item.getContent();
+ if (content == null || content.length() == 0) {
+ helper.getView(com.qxcm.moduleutil.R.id.dy_lookmore_tv).setVisibility(View.GONE);
+ helper.getView(com.qxcm.moduleutil.R.id.dy_content_tv).setVisibility(View.GONE);
+ } else {
+ helper.getView(com.qxcm.moduleutil.R.id.dy_lookmore_tv).setVisibility(View.VISIBLE);
+ helper.getView(com.qxcm.moduleutil.R.id.dy_content_tv).setVisibility(View.VISIBLE);
+ }
+ helper.getView(com.qxcm.moduleutil.R.id.dy_lookmore_tv).getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ //这个回调会调用多次,获取完行数记得注销监听
+ TextView view = helper.getView(com.qxcm.moduleutil.R.id.dy_content_tv);
+ int lineCount = view.getLineCount();
+ if (lineCount >= 7) {
+ helper.getView(com.qxcm.moduleutil.R.id.dy_lookmore_tv).setVisibility(View.VISIBLE);
+ helper.getView(com.qxcm.moduleutil.R.id.dy_content_tv).getViewTreeObserver().removeOnPreDrawListener(this);//销毁
+ } else {
+ helper.getView(com.qxcm.moduleutil.R.id.dy_lookmore_tv).setVisibility(View.GONE);
+ helper.getView(com.qxcm.moduleutil.R.id.dy_content_tv).getViewTreeObserver().removeOnPreDrawListener(this);//销毁
+ }
+ return true;
+ }
+ });
+ helper.setText(com.qxcm.moduleutil.R.id.dy_content_tv, content);
+
+ if (TextUtils.isEmpty(content)) {
+ TextView view = helper.getView(com.qxcm.moduleutil.R.id.dy_content_tv);
+ view.setVisibility(View.GONE);
+ } else {
+ TextView view = helper.getView(com.qxcm.moduleutil.R.id.dy_content_tv);
+ view.setVisibility(View.VISIBLE);
+ }
+
+
+ //点赞
+ helper.setText(com.qxcm.moduleutil.R.id.dy_fabulous, item.getLike());
+// if (item.is_praise() == 1) {
+// TextView dy_fabulous = helper.getView(R.id.dy_fabulous);
+// dy_fabulous.setTextColor(mContext.getResources().getColor(R.color.dianzan2));
+// helper.setImageResource(R.id.dianzan_image, R.drawable.dongtai_hudong_yidianzan);
+// } else {
+// TextView dy_fabulous = helper.getView(R.id.dy_fabulous);
+// dy_fabulous.setTextColor(mContext.getResources().getColor(R.color.dianzan1));
+// helper.setImageResource(R.id.dianzan_image, R.drawable.dongtai_hudong_dianzan);
+// }
+
+ //分享数
+ helper.setText(com.qxcm.moduleutil.R.id.dy_zs, item.getIsShare());
+ //评论数
+ helper.setText(com.qxcm.moduleutil.R.id.dy_comment, item.getComment() + "");
+
+
+ //时间
+
+ if (!item.getTime().isEmpty()) {
+ try {
+ helper.setText(com.qxcm.moduleutil.R.id.dy_time_text, item.getTime());
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ if (item.getImages().size() != 0) {
+ String[] arrIv = item.getImages().toArray(new String[item.getImages().size()]);
+ int length = arrIv.length;
+
+
+ OneImageYuanJiaoAdapter oneImageYuanJiaoAdapter = new OneImageYuanJiaoAdapter(mContext);
+ MyGridView recyclerView = helper.getView(com.qxcm.moduleutil.R.id.dy_image_recyc);
+ recyclerView.setNumColumns(3);
+ recyclerView.setAdapter(oneImageYuanJiaoAdapter);
+ oneImageYuanJiaoAdapter.getList_adapter().clear();
+
+ for (int j = 0; j < arrIv.length; j++) {
+ oneImageYuanJiaoAdapter.getList_adapter().add(arrIv[j]);
+ }
+ helper.getView(com.qxcm.moduleutil.R.id.dy_oneimage_iv).setVisibility(View.GONE);
+
+ oneImageYuanJiaoAdapter.notifyDataSetChanged();
+
+ recyclerView.setOnItemClickListener((parent, view, position, id) -> {
+ FullScreenUtil.showFullScreenDialog(mContext, position, oneImageYuanJiaoAdapter.getList_adapter());
+ });
+ }
+
+ }
+}
diff --git a/modulecircle/src/main/java/com/example/modulecircle/contacts/ReleaseContract.java b/modulecircle/src/main/java/com/example/modulecircle/contacts/ReleaseContract.java
new file mode 100644
index 00000000..cb8e908f
--- /dev/null
+++ b/modulecircle/src/main/java/com/example/modulecircle/contacts/ReleaseContract.java
@@ -0,0 +1,15 @@
+package com.example.modulecircle.contacts;
+
+import android.app.Activity;
+
+import com.qxcm.moduleutil.activity.IPresenter;
+import com.qxcm.moduleutil.activity.IView;
+
+public class ReleaseContract {
+ public interface View extends IView {
+
+ }
+
+ public interface IIndexPre extends IPresenter {
+ }
+}
diff --git a/modulecircle/src/main/java/com/example/modulecircle/dialog/MultiSelectAdapter.java b/modulecircle/src/main/java/com/example/modulecircle/dialog/MultiSelectAdapter.java
new file mode 100644
index 00000000..8104877f
--- /dev/null
+++ b/modulecircle/src/main/java/com/example/modulecircle/dialog/MultiSelectAdapter.java
@@ -0,0 +1,76 @@
+package com.example.modulecircle.dialog;
+
+import android.util.SparseBooleanArray;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.modulecircle.R;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MultiSelectAdapter extends RecyclerView.Adapter {
+ private List options;
+ private SparseBooleanArray selectedPositions = new SparseBooleanArray();
+
+ public MultiSelectAdapter(List options) {
+ this.options = options;
+ }
+
+ @NonNull
+ @Override
+ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_multi_select, parent, false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+ String item = options.get(position);
+ holder.tvOption.setText(item);
+ holder.cbOption.setChecked(selectedPositions.get(position, false));
+
+ holder.itemView.setOnClickListener(v -> {
+ boolean isChecked = selectedPositions.get(position, false);
+ if (isChecked) {
+ selectedPositions.delete(position);
+ } else {
+ selectedPositions.put(position, true);
+ }
+ notifyItemChanged(position);
+ });
+ }
+
+ @Override
+ public int getItemCount() {
+ return options.size();
+ }
+
+ public List getSelectedItems() {
+ List selected = new ArrayList<>();
+ for (int i = 0; i < options.size(); i++) {
+ if (selectedPositions.get(i)) {
+ selected.add(options.get(i));
+ }
+ }
+ return selected;
+ }
+
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ CheckBox cbOption;
+ TextView tvOption;
+
+ public ViewHolder(@NonNull View itemView) {
+ super(itemView);
+ cbOption = itemView.findViewById(R.id.cb_option);
+ tvOption = itemView.findViewById(R.id.tv_option);
+ }
+ }
+}
+
diff --git a/modulecircle/src/main/java/com/example/modulecircle/fragment/CircleFragment.java b/modulecircle/src/main/java/com/example/modulecircle/fragment/CircleFragment.java
index 295b22a6..2a8bbb9d 100644
--- a/modulecircle/src/main/java/com/example/modulecircle/fragment/CircleFragment.java
+++ b/modulecircle/src/main/java/com/example/modulecircle/fragment/CircleFragment.java
@@ -1,9 +1,16 @@
package com.example.modulecircle.fragment;
+import android.content.Intent;
+import android.view.View;
+
+import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentStatePagerAdapter;
import com.example.modulecircle.R;
+import com.example.modulecircle.activity.ReleaseActivity;
import com.example.modulecircle.contacts.CircleContacts;
import com.example.modulecircle.databinding.FragmentCircleBinding;
import com.example.modulecircle.presenter.CirclePresenter;
@@ -11,6 +18,8 @@ import com.qxcm.moduleutil.adapter.MyFragmentPagerAdapter;
import com.qxcm.moduleutil.base.BaseMvpFragment;
import com.qxcm.moduleutil.bean.CircleListBean;
import com.qxcm.moduleutil.bean.HeatedBean;
+import com.qxcm.moduleutil.bean.MyBagBean;
+import com.qxcm.moduleutil.bean.RoomTypeModel;
import java.util.ArrayList;
import java.util.List;
@@ -20,22 +29,32 @@ import java.util.List;
*语圈
*/
public class CircleFragment extends BaseMvpFragment implements CircleContacts.View {
-
+ private List list;
public static CircleFragment newInstance () {
return new CircleFragment();
}
@Override
protected void initData () {
+ list=new ArrayList<>();
+ list.add(new MyBagBean("发现", "1"));
+ list.add(new MyBagBean("扩列", "2"));
+
+ mBinding.viewPager.setAdapter(new MyFragmentPagerAdapter(getChildFragmentManager(), list));
+ mBinding.tabLayout.setViewPager(mBinding.viewPager);
+ mBinding.tabLayout.setCurrentTab(0);
}
@Override
protected void initView () {
- List fragments = new ArrayList<>();
- fragments.add(CircleCategoryFragment.newInstance());
- mBinding.viewPager.setAdapter(new MyFragmentPagerAdapter(fragments, getChildFragmentManager()));
+ mBinding.ivRelease.setOnClickListener(this::onClick);
+ }
+ private void onClick(View view) {
+ if (view.getId()==R.id.iv_release){//发布
+ startActivity(new Intent(getContext(), ReleaseActivity.class));
+ }
}
@Override
@@ -63,4 +82,37 @@ public class CircleFragment extends BaseMvpFragment list) {
}
+
+ private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
+
+ private List list;
+
+
+ public MyFragmentPagerAdapter(FragmentManager fm, List list) {
+ super(fm);
+ this.list = list;
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ MyBagBean model = list.get(position);
+ if ("1".equals(model.getMyBagType())){
+ return CircleCategoryFragment.newInstance();
+ }else {
+ return ExpandColumnFragment.newInstance();
+ }
+ }
+
+ @Override
+ public int getCount() {
+ return list.size();
+ }
+
+ @Nullable
+ @Override
+ public CharSequence getPageTitle(int position) {
+ MyBagBean model = list.get(position);
+ return model.getMyBagTitle();
+ }
+ }
}
\ No newline at end of file
diff --git a/modulecircle/src/main/java/com/example/modulecircle/fragment/ExpandColumnFragment.java b/modulecircle/src/main/java/com/example/modulecircle/fragment/ExpandColumnFragment.java
new file mode 100644
index 00000000..6c72bac0
--- /dev/null
+++ b/modulecircle/src/main/java/com/example/modulecircle/fragment/ExpandColumnFragment.java
@@ -0,0 +1,82 @@
+package com.example.modulecircle.fragment;
+
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.blankj.utilcode.util.LogUtils;
+import com.example.modulecircle.R;
+import com.example.modulecircle.contacts.CircleContacts;
+import com.example.modulecircle.databinding.FragmentCircleBinding;
+import com.example.modulecircle.databinding.FragmentExpandColumnBinding;
+import com.example.modulecircle.presenter.CirclePresenter;
+import com.qxcm.moduleutil.base.BaseMvpFragment;
+import com.qxcm.moduleutil.bean.CircleListBean;
+import com.qxcm.moduleutil.bean.HeatedBean;
+
+import org.angmarch.views.NiceSpinner;
+import org.angmarch.views.OnSpinnerItemSelectedListener;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ *@author qx
+ *@data 2025/5/28
+ *@description: 动态中的扩列fragemnt
+ */
+public class ExpandColumnFragment extends BaseMvpFragment implements CircleContacts.View {
+
+
+ @Override
+ protected CirclePresenter bindPresenter() {
+ return new CirclePresenter(this,getActivity());
+ }
+
+ public static ExpandColumnFragment newInstance() {
+ return new ExpandColumnFragment();
+ }
+ @Override
+ protected void initData() {
+
+ List dataset = new LinkedList<>(Arrays.asList("只看女生", "只看男生", "查看全部"));
+ mBinding.niceSpinner.attachDataSource(dataset);
+ mBinding.niceSpinner.setOnSpinnerItemSelectedListener(new OnSpinnerItemSelectedListener() {
+ @Override
+ public void onItemSelected(NiceSpinner parent, View view, int position, long id) {
+ // 示例使用的是 String 类型,但你的数据类型可以是任意的
+ String item = (String) parent.getItemAtPosition(position);
+ LogUtils.e("@@@",item);
+ mBinding.niceSpinner.setText(item);
+// mBinding.niceSpinner.getItemAtPosition(position);
+ }
+ });
+ mBinding.niceSpinner.setText("只看女生");
+ mBinding.niceSpinner.setBackground(null);
+ }
+
+ @Override
+ protected void initView() {
+
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.fragment_expand_column;
+ }
+
+ @Override
+ public void setCategories(List list) {
+
+ }
+
+ @Override
+ public void setCircleList(List list) {
+
+ }
+}
\ No newline at end of file
diff --git a/modulecircle/src/main/java/com/example/modulecircle/presenter/ReleasePresenter.java b/modulecircle/src/main/java/com/example/modulecircle/presenter/ReleasePresenter.java
new file mode 100644
index 00000000..6030f49b
--- /dev/null
+++ b/modulecircle/src/main/java/com/example/modulecircle/presenter/ReleasePresenter.java
@@ -0,0 +1,12 @@
+package com.example.modulecircle.presenter;
+
+import android.content.Context;
+
+import com.example.modulecircle.contacts.ReleaseContract;
+import com.qxcm.moduleutil.presenter.BasePresenter;
+
+public class ReleasePresenter extends BasePresenter implements ReleaseContract.IIndexPre {
+ public ReleasePresenter(ReleaseContract.View view, Context context) {
+ super(view, context);
+ }
+}
diff --git a/modulecircle/src/main/res/layout/activity_release.xml b/modulecircle/src/main/res/layout/activity_release.xml
new file mode 100644
index 00000000..889c8170
--- /dev/null
+++ b/modulecircle/src/main/res/layout/activity_release.xml
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulecircle/src/main/res/layout/bottom_sheet_recyclerview.xml b/modulecircle/src/main/res/layout/bottom_sheet_recyclerview.xml
new file mode 100644
index 00000000..203aecb1
--- /dev/null
+++ b/modulecircle/src/main/res/layout/bottom_sheet_recyclerview.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modulecircle/src/main/res/layout/fragment_circle.xml b/modulecircle/src/main/res/layout/fragment_circle.xml
index ca5eed16..8debd0ba 100644
--- a/modulecircle/src/main/res/layout/fragment_circle.xml
+++ b/modulecircle/src/main/res/layout/fragment_circle.xml
@@ -19,22 +19,31 @@
android:orientation="horizontal"
android:gravity="center_vertical">
-
+ android:layout_marginTop="@dimen/dp_12"
+ app:tl_indicator_corner_radius="@dimen/dp_3"
+ app:tl_indicator_drawable="@drawable/index_bg_indicator"
+ app:tl_indicator_height="@dimen/dp_6"
+ app:tl_indicator_margin_bottom="@dimen/dp_3"
+ app:tl_indicator_width="@dimen/dp_28"
+ app:tl_showCateIndicator="false"
+ app:tl_tab_width="@dimen/dp_50"
+ app:tl_textBold="SELECT"
+ app:tl_textSelectColor="@color/color_2B2823"
+ app:tl_textSelectedSize="@dimen/sp_16"
+ app:tl_textUnselectColor="@color/color_FF999999"
+ app:tl_textsize="@dimen/sp_14" />
diff --git a/modulecircle/src/main/res/layout/fragment_expand_column.xml b/modulecircle/src/main/res/layout/fragment_expand_column.xml
new file mode 100644
index 00000000..5f1c82bb
--- /dev/null
+++ b/modulecircle/src/main/res/layout/fragment_expand_column.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulecircle/src/main/res/layout/item_expand_column.xml b/modulecircle/src/main/res/layout/item_expand_column.xml
new file mode 100644
index 00000000..37351757
--- /dev/null
+++ b/modulecircle/src/main/res/layout/item_expand_column.xml
@@ -0,0 +1,143 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulecircle/src/main/res/layout/item_multi_select.xml b/modulecircle/src/main/res/layout/item_multi_select.xml
new file mode 100644
index 00000000..ebd4acca
--- /dev/null
+++ b/modulecircle/src/main/res/layout/item_multi_select.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/modulecircle/src/main/res/values/strings.xml b/modulecircle/src/main/res/values/strings.xml
index e5f8fdc2..6048840e 100644
--- a/modulecircle/src/main/res/values/strings.xml
+++ b/modulecircle/src/main/res/values/strings.xml
@@ -1,2 +1,4 @@
+
+ Hello blank fragment
\ No newline at end of file
diff --git a/modulemain/build.gradle b/modulemain/build.gradle
index 9fc8cec3..f775bc8d 100644
--- a/modulemain/build.gradle
+++ b/modulemain/build.gradle
@@ -24,14 +24,14 @@ android {
}
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_11
- targetCompatibility JavaVersion.VERSION_11
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
}
dataBinding {
enabled = true
}
kotlinOptions {
- jvmTarget = '11'
+ jvmTarget = '17'
}
}
@@ -44,6 +44,7 @@ dependencies {
implementation project(':modulevoice')
implementation project(':modulecircle')
implementation project(':modulevocal')
+ implementation project(':modulenews')
testImplementation libs.junit
androidTestImplementation libs.ext.junit
diff --git a/modulemain/src/main/AndroidManifest.xml b/modulemain/src/main/AndroidManifest.xml
index 1b81ad25..acdcdc08 100644
--- a/modulemain/src/main/AndroidManifest.xml
+++ b/modulemain/src/main/AndroidManifest.xml
@@ -6,7 +6,7 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
- android:theme="@style/Theme.QxLive">
+ >
- 声播
- 语圈
- 音信
- 音域
+ 首页
+ 广场
+ 消息
+ 我的
\ No newline at end of file
diff --git a/modulemain/src/main/res/values/strings.xml b/modulemain/src/main/res/values/strings.xml
index 5c69e2f6..b935636f 100644
--- a/modulemain/src/main/res/values/strings.xml
+++ b/modulemain/src/main/res/values/strings.xml
@@ -1,6 +1,6 @@
- 声播
- 语圈
- 音信
- 音域
+ 首页
+ 广场
+ 消息
+ 我的
\ No newline at end of file
diff --git a/modulenews/.gitignore b/modulenews/.gitignore
new file mode 100644
index 00000000..42afabfd
--- /dev/null
+++ b/modulenews/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/modulenews/build.gradle b/modulenews/build.gradle
new file mode 100644
index 00000000..8a863e34
--- /dev/null
+++ b/modulenews/build.gradle
@@ -0,0 +1,45 @@
+plugins {
+ alias(libs.plugins.android.library)
+}
+
+android {
+ namespace 'com.example.modulenews'
+ compileSdk 35
+
+ defaultConfig {
+ minSdk 24
+ targetSdk 35
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
+ }
+
+ dataBinding {
+ enabled = true
+ }
+}
+
+dependencies {
+
+ implementation libs.appcompat
+ implementation libs.material
+ testImplementation libs.junit
+ androidTestImplementation libs.ext.junit
+ androidTestImplementation libs.espresso.core
+
+ implementation project(':moduleUtil')
+ api project(':tuiconversation')
+ api project(':tuichat')
+}
\ No newline at end of file
diff --git a/modulenews/proguard-rules.pro b/modulenews/proguard-rules.pro
new file mode 100644
index 00000000..481bb434
--- /dev/null
+++ b/modulenews/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/modulenews/src/androidTest/java/com/example/modulenews/ExampleInstrumentedTest.java b/modulenews/src/androidTest/java/com/example/modulenews/ExampleInstrumentedTest.java
new file mode 100644
index 00000000..7112cf95
--- /dev/null
+++ b/modulenews/src/androidTest/java/com/example/modulenews/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.modulenews;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.example.modulenews", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/modulenews/src/main/AndroidManifest.xml b/modulenews/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..a58c5767
--- /dev/null
+++ b/modulenews/src/main/AndroidManifest.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulenews/src/main/java/com/example/modulenews/adapter/FragmentAdapter.java b/modulenews/src/main/java/com/example/modulenews/adapter/FragmentAdapter.java
new file mode 100644
index 00000000..bcaa6968
--- /dev/null
+++ b/modulenews/src/main/java/com/example/modulenews/adapter/FragmentAdapter.java
@@ -0,0 +1,39 @@
+package com.example.modulenews.adapter;
+
+import androidx.annotation.NonNull;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentActivity;
+import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.Lifecycle;
+import androidx.viewpager2.adapter.FragmentStateAdapter;
+
+import java.util.List;
+
+public class FragmentAdapter extends FragmentStateAdapter {
+ private static final String TAG = FragmentAdapter.class.getSimpleName();
+ private List fragmentList;
+ public FragmentAdapter(@NonNull FragmentActivity fragmentActivity) {
+ super(fragmentActivity);
+ }
+ public FragmentAdapter(@NonNull Fragment fragment) {
+ super(fragment);
+ }
+ public FragmentAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) {
+ super(fragmentManager, lifecycle);
+ }
+ public void setFragmentList(List fragmentList) {
+ this.fragmentList = fragmentList;
+ }
+ @NonNull
+ @Override
+ public Fragment createFragment(int position) {
+ if (fragmentList == null || fragmentList.size() <= position) {
+ return new Fragment();
+ }
+ return fragmentList.get(position);
+ }
+ @Override
+ public int getItemCount() {
+ return fragmentList == null ? 0 : fragmentList.size();
+ }
+}
\ No newline at end of file
diff --git a/modulenews/src/main/java/com/example/modulenews/contacts/NewsContacts.java b/modulenews/src/main/java/com/example/modulenews/contacts/NewsContacts.java
new file mode 100644
index 00000000..c0b744d5
--- /dev/null
+++ b/modulenews/src/main/java/com/example/modulenews/contacts/NewsContacts.java
@@ -0,0 +1,16 @@
+package com.example.modulenews.contacts;
+
+import android.app.Activity;
+
+import com.qxcm.moduleutil.activity.IPresenter;
+import com.qxcm.moduleutil.activity.IView;
+
+public class NewsContacts {
+ public interface View extends IView {
+
+ }
+ public interface IHomePre extends IPresenter {
+
+ }
+
+}
diff --git a/modulenews/src/main/java/com/example/modulenews/fragment/NewsFragment.java b/modulenews/src/main/java/com/example/modulenews/fragment/NewsFragment.java
new file mode 100644
index 00000000..a33b95c0
--- /dev/null
+++ b/modulenews/src/main/java/com/example/modulenews/fragment/NewsFragment.java
@@ -0,0 +1,92 @@
+package com.example.modulenews.fragment;
+
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.fragment.app.Fragment;
+
+import com.example.modulenews.R;
+import com.example.modulenews.adapter.FragmentAdapter;
+import com.example.modulenews.contacts.NewsContacts;
+import com.example.modulenews.databinding.FragmentNewsBinding;
+import com.example.modulenews.presenter.NewsPresenter;
+import com.qxcm.moduleutil.adapter.MyFragmentPagerAdapter;
+import com.qxcm.moduleutil.base.BaseMvpFragment;
+import com.tencent.imsdk.v2.V2TIMConversation;
+import com.tencent.qcloud.tuicore.TUIConstants;
+import com.tencent.qcloud.tuicore.TUICore;
+import com.tencent.qcloud.tuikit.tuichat.bean.C2CChatInfo;
+import com.tencent.qcloud.tuikit.tuichat.bean.GroupChatInfo;
+import com.tencent.qcloud.tuikit.tuichat.classicui.page.TUIC2CChatActivity;
+import com.tencent.qcloud.tuikit.tuichat.classicui.page.TUIC2CChatFragment;
+import com.tencent.qcloud.tuikit.tuichat.classicui.page.TUIGroupChatFragment;
+import com.tencent.qcloud.tuikit.tuiconversation.classicui.page.TUIConversationFragment;
+import com.tencent.qcloud.tuikit.tuiconversation.classicui.page.TUIConversationFragmentContainer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ *@author qx
+ *@data 2025/5/26
+ *@description: 音域
+ */
+public class NewsFragment extends BaseMvpFragment implements NewsContacts.View {
+
+ public static NewsFragment newInstance () {
+ return new NewsFragment();
+ }
+
+ @Override
+ protected void initData () {
+ }
+
+ @Override
+ protected void initView () {
+
+ List fragments = new ArrayList<>();
+// 添加 tuiconversation 组件提供的经典版会话界面
+ fragments.add(new TUIConversationFragment());
+
+// 添加 tuicontact 组件提供的经典版联系人界面
+// fragments.add(new TUIContactFragment());
+
+// FragmentAdapter fragmentAdapter = new FragmentAdapter(this);
+// fragmentAdapter.setFragmentList(fragments);
+// mBinding.viewPager.setOffscreenPageLimit(2);
+ mBinding.viewPager.setAdapter(new MyFragmentPagerAdapter(fragments, getChildFragmentManager()));
+ mBinding.viewPager.setCurrentItem(0, false);
+
+ mBinding.ivRoom2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent=new Intent(getActivity(), TUIC2CChatActivity.class);
+ intent.putExtra(TUIConstants.TUIChat.CHAT_ID, "10010");
+ intent.putExtra(TUIConstants.TUIChat.CHAT_TYPE, V2TIMConversation.V2TIM_C2C);
+ startActivity(intent);
+ }
+ });
+
+
+ }
+
+ @Override
+ protected void initListener () {
+ super.initListener();
+ }
+
+ @Override
+ protected int getLayoutId () {
+ return R.layout.fragment_news;
+ }
+
+ @Override
+ protected NewsPresenter bindPresenter () {
+ return new NewsPresenter(this, getContext());
+ }
+
+
+}
\ No newline at end of file
diff --git a/modulenews/src/main/java/com/example/modulenews/presenter/NewsPresenter.java b/modulenews/src/main/java/com/example/modulenews/presenter/NewsPresenter.java
new file mode 100644
index 00000000..e5fa5db1
--- /dev/null
+++ b/modulenews/src/main/java/com/example/modulenews/presenter/NewsPresenter.java
@@ -0,0 +1,12 @@
+package com.example.modulenews.presenter;
+
+import android.content.Context;
+
+import com.example.modulenews.contacts.NewsContacts;
+import com.qxcm.moduleutil.presenter.BasePresenter;
+
+public class NewsPresenter extends BasePresenter implements NewsContacts.IHomePre {
+ public NewsPresenter(NewsContacts.View view, Context context) {
+ super(view, context);
+ }
+}
diff --git a/modulenews/src/main/res/drawable/ic_launcher_background.xml b/modulenews/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 00000000..07d5da9c
--- /dev/null
+++ b/modulenews/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modulenews/src/main/res/drawable/ic_launcher_foreground.xml b/modulenews/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 00000000..2b068d11
--- /dev/null
+++ b/modulenews/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulenews/src/main/res/layout/fragment_news.xml b/modulenews/src/main/res/layout/fragment_news.xml
new file mode 100644
index 00000000..1194b661
--- /dev/null
+++ b/modulenews/src/main/res/layout/fragment_news.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulenews/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/modulenews/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000..6f3b755b
--- /dev/null
+++ b/modulenews/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulenews/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/modulenews/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 00000000..6f3b755b
--- /dev/null
+++ b/modulenews/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulenews/src/main/res/mipmap-hdpi/ic_launcher.webp b/modulenews/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 00000000..c209e78e
Binary files /dev/null and b/modulenews/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/modulenews/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/modulenews/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 00000000..b2dfe3d1
Binary files /dev/null and b/modulenews/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/modulenews/src/main/res/mipmap-mdpi/ic_launcher.webp b/modulenews/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 00000000..4f0f1d64
Binary files /dev/null and b/modulenews/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/modulenews/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/modulenews/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 00000000..62b611da
Binary files /dev/null and b/modulenews/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/modulenews/src/main/res/mipmap-xhdpi/ic_launcher.webp b/modulenews/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 00000000..948a3070
Binary files /dev/null and b/modulenews/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/modulenews/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/modulenews/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 00000000..1b9a6956
Binary files /dev/null and b/modulenews/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/modulenews/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/modulenews/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 00000000..28d4b77f
Binary files /dev/null and b/modulenews/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/modulenews/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/modulenews/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 00000000..9287f508
Binary files /dev/null and b/modulenews/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/modulenews/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/modulenews/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 00000000..aa7d6427
Binary files /dev/null and b/modulenews/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/modulenews/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/modulenews/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 00000000..9126ae37
Binary files /dev/null and b/modulenews/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/modulenews/src/main/res/values-night/themes.xml b/modulenews/src/main/res/values-night/themes.xml
new file mode 100644
index 00000000..1c850379
--- /dev/null
+++ b/modulenews/src/main/res/values-night/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/modulenews/src/main/res/values/colors.xml b/modulenews/src/main/res/values/colors.xml
new file mode 100644
index 00000000..f8c6127d
--- /dev/null
+++ b/modulenews/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/modulenews/src/main/res/values/strings.xml b/modulenews/src/main/res/values/strings.xml
new file mode 100644
index 00000000..e5f8fdc2
--- /dev/null
+++ b/modulenews/src/main/res/values/strings.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/modulenews/src/main/res/values/themes.xml b/modulenews/src/main/res/values/themes.xml
new file mode 100644
index 00000000..46ca6c9a
--- /dev/null
+++ b/modulenews/src/main/res/values/themes.xml
@@ -0,0 +1,16 @@
+
+
+
+
\ No newline at end of file
diff --git a/modulenews/src/test/java/com/example/modulenews/ExampleUnitTest.java b/modulenews/src/test/java/com/example/modulenews/ExampleUnitTest.java
new file mode 100644
index 00000000..9a8404f3
--- /dev/null
+++ b/modulenews/src/test/java/com/example/modulenews/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.example.modulenews;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+ @Test
+ public void addition_isCorrect() {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/moduletablayout/build.gradle b/moduletablayout/build.gradle
index 64d92c56..c23d2b91 100644
--- a/moduletablayout/build.gradle
+++ b/moduletablayout/build.gradle
@@ -22,8 +22,8 @@ android {
}
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_11
- targetCompatibility JavaVersion.VERSION_11
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
}
}
diff --git a/modulevocal/build.gradle b/modulevocal/build.gradle
index 35cf5727..3f9eaf74 100644
--- a/modulevocal/build.gradle
+++ b/modulevocal/build.gradle
@@ -23,8 +23,8 @@ android {
}
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_11
- targetCompatibility JavaVersion.VERSION_11
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
}
dataBinding {
enable = true
diff --git a/modulevocal/src/main/AndroidManifest.xml b/modulevocal/src/main/AndroidManifest.xml
index e314a39f..7977fbca 100644
--- a/modulevocal/src/main/AndroidManifest.xml
+++ b/modulevocal/src/main/AndroidManifest.xml
@@ -7,6 +7,15 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/BaseAppTheme">
+
+
+
diff --git a/modulevocal/src/main/java/com/example/modulevocal/activity/DailyTasksActivity.java b/modulevocal/src/main/java/com/example/modulevocal/activity/DailyTasksActivity.java
new file mode 100644
index 00000000..e2edbee3
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/activity/DailyTasksActivity.java
@@ -0,0 +1,74 @@
+package com.example.modulevocal.activity;
+
+
+import android.graphics.Color;
+
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import com.example.modulevocal.R;
+import com.example.modulevocal.adapter.TaskBoxAdapter;
+import com.example.modulevocal.adapter.TaskDataAdapter;
+import com.example.modulevocal.conacts.DailyTasksConacts;
+import com.example.modulevocal.databinding.ActivityDailyTasksBinding;
+import com.example.modulevocal.presenter.DailyTasksPresenter;
+import com.qxcm.moduleutil.activity.BaseMvpActivity;
+import com.qxcm.moduleutil.bean.GiftBoxBean;
+import com.qxcm.moduleutil.bean.TaskDataBean;
+
+import java.util.List;
+
+/**
+ *@author qx
+ *@data 2025/5/27
+ *@description: 每日任务
+ */
+public class DailyTasksActivity extends BaseMvpActivity implements DailyTasksConacts.View {
+
+ private TaskBoxAdapter mTaskBoxAdapter;
+ private TaskDataAdapter mTaskDataAdapter;
+
+ @Override
+ protected DailyTasksPresenter bindPresenter() {
+ return new DailyTasksPresenter(this, this);
+ }
+
+ @Override
+ protected void initData() {
+ MvpPre.tasksLihen();
+ MvpPre.tasksData();
+ }
+
+ @Override
+ protected void initView() {
+ super.initView();
+ mBinding.topBar.setTitle("每日任务");
+ mBinding.topBar.setRightTxtVisible(true);
+ mBinding.topBar.setRightText("礼盒记录");
+ mBinding.topBar.setRightColor(Color.parseColor("#FF8ACC"));
+
+ mTaskBoxAdapter = new TaskBoxAdapter();
+ mBinding.rvTask.setLayoutManager(new GridLayoutManager(this,2,GridLayoutManager.VERTICAL,false));
+ mBinding.rvTask.setAdapter(mTaskBoxAdapter);
+
+ mTaskDataAdapter=new TaskDataAdapter();
+ mBinding.rvTaskToday.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
+ mBinding.rvTaskToday.setAdapter(mTaskDataAdapter);
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.activity_daily_tasks;
+ }
+
+ @Override
+ public void setGiftBox(GiftBoxBean giftBoxBean) {
+ mBinding.tvTitle.setText("今日累计获得金币:"+giftBoxBean.getNewDataJinbi());
+ mTaskBoxAdapter.setNewData(giftBoxBean.getGiftList());
+ }
+
+ @Override
+ public void tasksDataList(List taskDataBeans) {
+ mTaskDataAdapter.setNewData(taskDataBeans);
+ }
+}
\ No newline at end of file
diff --git a/modulevocal/src/main/java/com/example/modulevocal/activity/MyMoneyActivity.java b/modulevocal/src/main/java/com/example/modulevocal/activity/MyMoneyActivity.java
index 4d379fb6..9a25818b 100644
--- a/modulevocal/src/main/java/com/example/modulevocal/activity/MyMoneyActivity.java
+++ b/modulevocal/src/main/java/com/example/modulevocal/activity/MyMoneyActivity.java
@@ -29,6 +29,9 @@ public class MyMoneyActivity extends BaseMvpActivity implements RealNameConacts.View{
+
+
+ @Override
+ protected void initData() {
+ mBinding.topBar.setTitle("实名认证");
+ String fullText = "您知悉并同意应用提供者\n· 收集、使用您本人的身份信息和人脸图像\n· 向合法数据持有者核实您的身份信息\n· 本操作数据仅用于身份核实,安全可靠";
+ SpannableString spannable = new SpannableString(fullText);
+
+ int firstLineEnd = fullText.indexOf('\n');
+ if (firstLineEnd > 0) {
+ // 设置第一行字体大小和颜色
+ spannable.setSpan(
+ new AbsoluteSizeSpan(16, true), // 18sp,基于 TextView 的 sp 值调整
+ 0,
+ firstLineEnd,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ );
+
+ spannable.setSpan(
+ new ForegroundColorSpan(Color.BLACK),
+ 0,
+ firstLineEnd,
+ Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
+ );
+ }
+
+ mBinding.tvAgreeTerms.setText(spannable);
+ mBinding.btnSubmit.setOnClickListener(this::onClick);
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.activity_real_name;
+ }
+
+ @Override
+ protected RealNamePresenter bindPresenter() {
+ return new RealNamePresenter(this, this);
+ }
+
+ @Override
+ public void realNameSuccess(RealNameBean msg) {
+ Bundle data = new Bundle();
+ WbCloudFaceVerifySdk.InputData inputData = new WbCloudFaceVerifySdk.InputData(
+ msg.getFaceId(),
+ msg.getOrderNo(),
+ msg.getAppid(),
+ msg.getApiVersion(),
+ msg.getNonce(),
+ msg.getUserid(),
+ msg.getSign(),
+ FaceVerifyStatus.Mode.GRADE,
+ msg.getLicence());
+ data.putSerializable(WbCloudFaceContant.INPUT_DATA, inputData);
+ //设置是否打开语音提示,默认关闭,此处设置为关闭
+ data.putBoolean(WbCloudFaceContant. PLAY_VOICE, true);
+
+ //避免用户快速点击导致二次登录,二次拉起刷脸等操作引起问题
+ WbCloudFaceVerifySdk.getInstance().
+ initAdvSdk(RealName1Activity.this, data, new WbCloudFaceVerifyLoginListener() {
+ @Override
+ public void onLoginSuccess () {
+ //登录成功,拉起 sdk 页面,由 FaceVerifyResultListener 返回刷脸结果
+ WbCloudFaceVerifySdk.getInstance().startWbFaceVerifySdk(RealName1Activity.this, new WbCloudFaceVerifyResultListener() {
+ @Override
+ public void onFinish(WbFaceVerifyResult result) {
+ if (result != null) {
+ if (result.isSuccess()) {
+ Log.d("@@@", "刷脸成功!");
+ SpUtil.setRealName(true);
+ MvpPre.realNameResult(result.getOrderNo());
+
+ } else {
+ Log.d("@@@", "刷脸失败!");
+ }
+ }
+ //刷脸结束后,及时释放资源
+ WbCloudFaceVerifySdk.getInstance().release();
+
+ }
+ });
+ }
+ @Override
+ public void onLoginFailed (WbFaceError error){
+ Log.d("@@@", "刷脸失败!");
+ //刷脸结束后,及时释放资源
+ WbCloudFaceVerifySdk.getInstance().release();
+ }
+ });
+ }
+
+ @Override
+ public void sendCodeSuccess() {
+ finish();
+ }
+
+ private void onClick(View view) {
+ if (view.getId()== R.id.btnSubmit){
+ if (mBinding.edName.getText().toString().isEmpty()){
+ com.blankj.utilcode.util.ToastUtils.showShort("请输入姓名");
+ return;
+ }
+ if (mBinding.edPassword.getText().toString().isEmpty()){
+ com.blankj.utilcode.util.ToastUtils.showShort("请输入身份证号");
+ return;
+ }
+ if (RegexUtils.isIDCard18Exact(mBinding.edPassword.getText().toString())) {
+ if (mBinding.btnSubmit.getText().toString().equals("下一步")) {
+ mBinding.stepNum1.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.num_11));
+ mBinding.stepNum2.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.num_2));
+// mBinding.l1.setVisibility(View.GONE);
+// mBinding.l2.setVisibility(View.VISIBLE);
+// mBinding.btnSubmit.setText("立即认证");
+ MvpPre.realName(mBinding.edName.getText().toString(),mBinding.edPassword.getText().toString());
+ } else {
+ SpUtil.setRealName(true);
+ finish();
+ }
+ }else {
+ com.blankj.utilcode.util.ToastUtils.showShort("请输入正确的身份证号");
+ return;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/modulevocal/src/main/java/com/example/modulevocal/activity/RealNameActivity.java b/modulevocal/src/main/java/com/example/modulevocal/activity/RealNameActivity.java
deleted file mode 100644
index 02fe2775..00000000
--- a/modulevocal/src/main/java/com/example/modulevocal/activity/RealNameActivity.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.example.modulevocal.activity;
-
-import android.graphics.Color;
-import android.os.Bundle;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.Spanned;
-import android.text.style.AbsoluteSizeSpan;
-import android.text.style.ForegroundColorSpan;
-import android.view.View;
-
-import androidx.activity.EdgeToEdge;
-import androidx.appcompat.app.AppCompatActivity;
-import androidx.core.graphics.Insets;
-import androidx.core.view.ViewCompat;
-import androidx.core.view.WindowInsetsCompat;
-
-import com.example.modulevocal.R;
-import com.example.modulevocal.databinding.ActivityRealNameBinding;
-import com.qxcm.moduleutil.activity.BaseAppCompatActivity;
-import com.qxcm.moduleutil.utils.SpUtil;
-
-public class RealNameActivity extends BaseAppCompatActivity {
-
-
- @Override
- protected void initData() {
-
- }
-
- @Override
- protected void initView() {
- mBinding.topBar.setTitle("实名认证");
- String fullText = "您知悉并同意应用提供者\n· 收集、使用您本人的身份信息和人脸图像\n· 向合法数据持有者核实您的身份信息\n· 本操作数据仅用于身份核实,安全可靠";
- SpannableString spannable = new SpannableString(fullText);
-
- int firstLineEnd = fullText.indexOf('\n');
- if (firstLineEnd > 0) {
- // 设置第一行字体大小和颜色
- spannable.setSpan(
- new AbsoluteSizeSpan(16, true), // 18sp,基于 TextView 的 sp 值调整
- 0,
- firstLineEnd,
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
- );
-
- spannable.setSpan(
- new ForegroundColorSpan(Color.BLACK),
- 0,
- firstLineEnd,
- Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
- );
- }
-
- mBinding.tvAgreeTerms.setText(spannable);
- mBinding.btnSubmit.setOnClickListener(this::onClick);
- }
-
- private void onClick(View view) {
- if (view.getId()==R.id.btnSubmit){
- if (mBinding.btnSubmit.getText().toString().equals("下一步")){
- mBinding.stepNum1.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.num_11));
- mBinding.stepNum2.setBackground(getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.num_2));
- mBinding.l1.setVisibility(View.GONE);
- mBinding.l2.setVisibility(View.VISIBLE);
- mBinding.btnSubmit.setText("立即认证");
- }else {
- SpUtil.setRealName(true);
- finish();
- }
- }
- }
-
- @Override
- protected int getLayoutId() {
- return R.layout.activity_real_name;
- }
-}
\ No newline at end of file
diff --git a/modulevocal/src/main/java/com/example/modulevocal/activity/RevenueActivity.java b/modulevocal/src/main/java/com/example/modulevocal/activity/RevenueActivity.java
new file mode 100644
index 00000000..2bac8b1b
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/activity/RevenueActivity.java
@@ -0,0 +1,106 @@
+package com.example.modulevocal.activity;
+
+import android.os.Bundle;
+
+import androidx.activity.EdgeToEdge;
+import androidx.annotation.Nullable;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.graphics.Insets;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentStatePagerAdapter;
+
+import com.example.modulevocal.R;
+import com.example.modulevocal.conacts.RevenueConacts;
+import com.example.modulevocal.databinding.ActivityRevenueBinding;
+import com.example.modulevocal.fragment.RevenueFragment;
+import com.example.modulevocal.fragment.mybag.MyBagFragment;
+import com.example.modulevocal.fragment.mybag.MyBagListFragment;
+import com.example.modulevocal.presenter.RevenuePresenter;
+import com.qxcm.moduleutil.activity.BaseMvpActivity;
+import com.qxcm.moduleutil.activity.IPresenter;
+import com.qxcm.moduleutil.bean.MyBagBean;
+import com.qxcm.moduleutil.bean.RevenueBean;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ *@author qx
+ *@data 2025/5/27
+ *@description: 金币收支、钻石收支,根据传递的type不同,显示不同的数据,type=1:金币收支,type=2:钻石收支
+ */
+public class RevenueActivity extends BaseMvpActivity implements RevenueConacts.View{
+ private List list;
+ private int type;
+
+ @Override
+ protected void initData() {
+ type= Integer.parseInt(Objects.requireNonNull(getIntent().getStringExtra("type")));
+ list=new ArrayList<>();
+ if (type==1) {
+ mBinding.topBar.setTitle("金币收支");
+ list.add(new MyBagBean("金币收入", "1"));
+ list.add(new MyBagBean("金币支出", "2"));
+ }else {
+ mBinding.topBar.setTitle("钻石收支");
+ list.add(new MyBagBean("钻石收入", "1"));
+ list.add(new MyBagBean("钻石支出", "2"));
+ }
+
+ mBinding.viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), list));
+ mBinding.slidingTabLayout.setViewPager(mBinding.viewPager);
+ mBinding.slidingTabLayout.setCurrentTab(0);
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.activity_revenue;
+ }
+
+ @Override
+ protected RevenuePresenter bindPresenter() {
+ return new RevenuePresenter(this, this);
+ }
+
+ @Override
+ public void saveRevenueData(List bean) {
+
+ }
+
+ private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter {
+
+ private List list;
+
+
+ public MyFragmentPagerAdapter(FragmentManager fm, List list) {
+ super(fm);
+ this.list = list;
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ MyBagBean model = list.get(position);
+ if ("1".equals(model.getMyBagType())){
+ return RevenueFragment.newInstance(model.getMyBagType(), "1");
+ }else {
+ return RevenueFragment.newInstance(model.getMyBagType(), "2");
+ }
+ }
+
+ @Override
+ public int getCount() {
+ return list.size();
+ }
+
+ @Nullable
+ @Override
+ public CharSequence getPageTitle(int position) {
+ MyBagBean model = list.get(position);
+ return model.getMyBagTitle();
+ }
+ }
+}
\ No newline at end of file
diff --git a/modulevocal/src/main/java/com/example/modulevocal/activity/SettingActivity.java b/modulevocal/src/main/java/com/example/modulevocal/activity/SettingActivity.java
index 37db9483..1e277607 100644
--- a/modulevocal/src/main/java/com/example/modulevocal/activity/SettingActivity.java
+++ b/modulevocal/src/main/java/com/example/modulevocal/activity/SettingActivity.java
@@ -74,7 +74,7 @@ public class SettingActivity extends BaseAppCompatActivity {
dialog.dismiss();
- startActivity(new Intent(SettingActivity.this, RealNameActivity.class));
+ startActivity(new Intent(SettingActivity.this, RealName1Activity.class));
});
}
}else if (view.getId()==R.id.ll_qhch){
diff --git a/modulevocal/src/main/java/com/example/modulevocal/adapter/RevenueAdapter.java b/modulevocal/src/main/java/com/example/modulevocal/adapter/RevenueAdapter.java
new file mode 100644
index 00000000..68bacb84
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/adapter/RevenueAdapter.java
@@ -0,0 +1,20 @@
+package com.example.modulevocal.adapter;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.example.modulevocal.R;
+import com.qxcm.moduleutil.bean.RevenueBean;
+
+public class RevenueAdapter extends BaseQuickAdapter {
+ public RevenueAdapter() {
+ super(R.layout.item_revenue);
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, RevenueBean item) {
+ helper.setText(R.id.tv_name, item.getTitle());
+ helper.setText(R.id.tv_time, item.getTime());
+ helper.setText(R.id.tv_jb, item.getMoney());
+
+ }
+}
diff --git a/modulevocal/src/main/java/com/example/modulevocal/adapter/TaskBoxAdapter.java b/modulevocal/src/main/java/com/example/modulevocal/adapter/TaskBoxAdapter.java
new file mode 100644
index 00000000..9006c03a
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/adapter/TaskBoxAdapter.java
@@ -0,0 +1,95 @@
+package com.example.modulevocal.adapter;
+
+import android.annotation.SuppressLint;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.style.ForegroundColorSpan;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.core.content.ContextCompat;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.example.modulevocal.R;
+import com.google.android.material.progressindicator.LinearProgressIndicator;
+import com.qxcm.moduleutil.bean.GiftBoxBean;
+import com.qxcm.moduleutil.utils.ImageUtils;
+
+public class TaskBoxAdapter extends BaseQuickAdapter {
+ public TaskBoxAdapter() {
+ super(R.layout.item_task_box);
+ }
+
+ @SuppressLint("UseCompatLoadingForDrawables")
+ @Override
+ protected void convert(BaseViewHolder helper, GiftBoxBean.GiftBean item) {
+ int position = helper.getLayoutPosition(); // 获取当前位置
+
+ View itemView = helper.itemView; // 获取整个 item 的根布局
+ TextView giftName = helper.getView(R.id.tv_type_name);
+ TextView giftTitle = helper.getView(R.id.tv_title);
+ giftName.setText(item.getGiftName());
+ giftTitle.setText(item.getGiftTitle());
+ if (position == 0) {
+ itemView.setBackgroundColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_FCE4ED)); // 红色
+ giftName.setTextColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_E24171));
+ setSpannableText(giftTitle, "最高可获得%d金币", Integer.parseInt(item.getGiftTitle()),com.qxcm.moduleutil.R.color.color_E24171);
+ helper.setImageDrawable(R.id.task_box, mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.task_cj));
+
+ } else if (position == 1) {
+ itemView.setBackgroundColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_FDE8AE)); // 黄色
+ giftName.setTextColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_F35F07));
+ setSpannableText(giftTitle, "最高可获得%d金币", Integer.parseInt(item.getGiftTitle()),com.qxcm.moduleutil.R.color.color_F35F07);
+ helper.setImageDrawable(R.id.task_box, mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.task_gj));
+
+ } else {
+ // 其他 item 恢复默认背景(可选)
+ itemView.setBackground(null);
+ }
+
+ helper.setText(R.id.tv_jb, "满"+item.getGetGiftTypeName()+"金币");
+ LinearProgressIndicator progressIndicator= helper.getView(R.id.progress_indicator);
+ progressIndicator.setProgress(Integer.parseInt(item.getGiftTypeNumber()));
+ helper.setText(R.id.tv_jb_num, item.getGiftTypeNumber()+"%");
+ if (position==0){
+ progressIndicator.setIndicatorColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_E24171));
+ }else {
+ progressIndicator.setIndicatorColor(mContext.getResources().getColor(com.qxcm.moduleutil.R.color.color_F35F07));
+
+ }
+
+ if (Integer.parseInt(item.getGiftTypeNumber())<100){
+ helper.setImageDrawable(R.id.iv_unlock, mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.not_unlocked));
+ helper.getView(R.id.iv_unlock).setSelected(false);
+ }else {
+ helper.setImageDrawable(R.id.iv_unlock, mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.unlocked));
+ helper.getView(R.id.iv_unlock).setSelected(true);
+ }
+
+
+ }
+
+ // 设置带部分颜色的文本
+ private void setSpannableText(TextView textView, String format, int number,int color) {
+ String fullText = String.format(format, number);
+ SpannableString spannableString = new SpannableString(fullText);
+
+ // 找到数字的位置
+ String numberStr = String.valueOf(number);
+ int startIndex = fullText.indexOf(numberStr);
+ int endIndex = startIndex + numberStr.length();
+
+ if (startIndex >= 0) {
+ // 设置数字为红色
+ spannableString.setSpan(
+ new ForegroundColorSpan(ContextCompat.getColor(mContext,color)), // 使用你定义的颜色
+ startIndex,
+ endIndex,
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
+ );
+ }
+
+ textView.setText(spannableString);
+ }
+}
diff --git a/modulevocal/src/main/java/com/example/modulevocal/adapter/TaskDataAdapter.java b/modulevocal/src/main/java/com/example/modulevocal/adapter/TaskDataAdapter.java
new file mode 100644
index 00000000..836daeb8
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/adapter/TaskDataAdapter.java
@@ -0,0 +1,36 @@
+package com.example.modulevocal.adapter;
+
+import android.widget.TextView;
+
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.example.modulevocal.R;
+import com.qxcm.moduleutil.bean.GiftBoxBean;
+import com.qxcm.moduleutil.bean.TaskDataBean;
+
+public class TaskDataAdapter extends BaseQuickAdapter {
+ public TaskDataAdapter() {
+ super(R.layout.item_task_data);
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, TaskDataBean item) {
+ TextView textView=helper.getView(R.id.task_type);
+ if (item.getTaskType().equals("1")){
+ textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.go_lock));
+ }else if (item.getTaskType().equals("2")){
+ textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.go_wc));
+ } else if (item.getTaskType().equals("3")) {
+ textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.go_sl));
+ }else if (item.getTaskType().equals("4")) {
+ textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.go_yq));
+ }else if (item.getTaskType().equals("5")) {
+ textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.go_cz));
+ }else if (item.getTaskType().equals("6")) {
+ textView.setBackground(mContext.getResources().getDrawable(com.qxcm.moduleutil.R.mipmap.ylq));
+ }
+
+ helper.setText(R.id.task_name, item.getTaskName())
+ .setText(R.id.task_jb_number, item.getTaskReward());
+ }
+}
diff --git a/modulevocal/src/main/java/com/example/modulevocal/conacts/DailyTasksConacts.java b/modulevocal/src/main/java/com/example/modulevocal/conacts/DailyTasksConacts.java
new file mode 100644
index 00000000..fb85e23e
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/conacts/DailyTasksConacts.java
@@ -0,0 +1,28 @@
+package com.example.modulevocal.conacts;
+
+import android.app.Activity;
+
+import com.qxcm.moduleutil.activity.IPresenter;
+import com.qxcm.moduleutil.activity.IView;
+import com.qxcm.moduleutil.bean.GiftBoxBean;
+import com.qxcm.moduleutil.bean.TaskDataBean;
+
+import java.io.File;
+import java.util.List;
+
+public class DailyTasksConacts {
+
+ public interface View extends IView {
+ void setGiftBox(GiftBoxBean giftBoxBean);
+
+ void tasksDataList(List taskDataBeans);
+
+ }
+
+ public interface IMePre extends IPresenter {
+
+ void tasksLihen();
+
+ void tasksData();
+ }
+}
diff --git a/modulevocal/src/main/java/com/example/modulevocal/conacts/RealNameConacts.java b/modulevocal/src/main/java/com/example/modulevocal/conacts/RealNameConacts.java
new file mode 100644
index 00000000..f6652f65
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/conacts/RealNameConacts.java
@@ -0,0 +1,23 @@
+package com.example.modulevocal.conacts;
+
+import android.app.Activity;
+
+import com.qxcm.moduleutil.activity.IPresenter;
+import com.qxcm.moduleutil.activity.IView;
+import com.qxcm.moduleutil.bean.RealNameBean;
+
+import java.io.File;
+
+public class RealNameConacts {
+ public interface View extends IView {
+ void realNameSuccess(RealNameBean msg);
+
+ void sendCodeSuccess();
+ }
+
+ public interface IMePre extends IPresenter {
+ void realName(String real_name, String card_number);
+
+ void realNameResult(String orderNo);
+ }
+}
diff --git a/modulevocal/src/main/java/com/example/modulevocal/conacts/RevenueConacts.java b/modulevocal/src/main/java/com/example/modulevocal/conacts/RevenueConacts.java
new file mode 100644
index 00000000..98015461
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/conacts/RevenueConacts.java
@@ -0,0 +1,20 @@
+package com.example.modulevocal.conacts;
+
+import android.app.Activity;
+
+import com.qxcm.moduleutil.activity.IPresenter;
+import com.qxcm.moduleutil.activity.IView;
+import com.qxcm.moduleutil.bean.RevenueBean;
+
+import java.util.List;
+
+public class RevenueConacts {
+ public interface View extends IView {
+ void saveRevenueData(List bean);
+ }
+ public interface IMePre extends IPresenter {
+
+ void getRevenueData();
+
+ }
+}
diff --git a/modulevocal/src/main/java/com/example/modulevocal/fragment/RevenueFragment.java b/modulevocal/src/main/java/com/example/modulevocal/fragment/RevenueFragment.java
new file mode 100644
index 00000000..a480d054
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/fragment/RevenueFragment.java
@@ -0,0 +1,101 @@
+package com.example.modulevocal.fragment;
+
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.DatePicker;
+import android.widget.Toast;
+
+import com.example.modulevocal.R;
+import com.example.modulevocal.adapter.RevenueAdapter;
+import com.example.modulevocal.conacts.RevenueConacts;
+import com.example.modulevocal.databinding.FragmentRevenueBinding;
+import com.example.modulevocal.fragment.mybag.MyBagFragment;
+import com.example.modulevocal.presenter.RevenuePresenter;
+import com.qxcm.moduleutil.base.BaseMvpFragment;
+import com.qxcm.moduleutil.bean.RevenueBean;
+import com.qxcm.moduleutil.dialog.DoubleDatePickerDialog;
+import com.qxcm.moduleutil.widget.DoubleTimePickerBottomSheet;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+/**
+ *@author qx
+ *@data 2025/5/27
+ *@description: 收支展示的页面,根据type展示收入和支出,根据revenueType展示钻石还是金币
+ */
+public class RevenueFragment extends BaseMvpFragment implements RevenueConacts.View{
+
+ private String type;
+ private String revenueType;
+
+ private RevenueAdapter adapter;
+ @Override
+ protected RevenuePresenter bindPresenter() {
+ return new RevenuePresenter(this,getActivity());
+ }
+
+ public static RevenueFragment newInstance(String type, String revenueType) {
+ Bundle args = new Bundle();
+ args.putString("type", type);
+ args.putString("revenueType", revenueType);
+ RevenueFragment fragment = new RevenueFragment();
+
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void initArgs(Bundle arguments) {
+ super.initArgs(arguments);
+ type = arguments.getString("type");
+ revenueType = arguments.getString("revenueType");
+ }
+
+ @Override
+ protected void initData() {
+ mBinding.rl3.setOnClickListener(v -> {
+ DoubleTimePickerBottomSheet dialog = new DoubleTimePickerBottomSheet();
+ dialog.setOnTimeRangeSelectedListener((startDate, endDate) -> {
+ // 处理选择的时间范围
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:mm", Locale.getDefault());
+ Log.d("SelectedTime", "开始时间:" + sdf.format(startDate));
+ mBinding.tv2.setText(sdf.format(startDate));
+ Log.d("SelectedTime", "结束时间:" + sdf.format(endDate));
+ mBinding.tv22.setText(sdf.format(endDate));
+ MvpPre.getRevenueData();
+ });
+ dialog.show(getParentFragmentManager(), "DoubleTimePicker");
+ });
+ }
+
+ @Override
+ protected void initView() {
+ mBinding.revenueView.setLayoutManager(new LinearLayoutManager(getActivity()));
+ adapter = new RevenueAdapter();
+ mBinding.revenueView.setAdapter(adapter);
+
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.fragment_revenue;
+ }
+
+ @Override
+ public void saveRevenueData(List bean) {
+ adapter.setNewData(bean);
+ }
+}
\ No newline at end of file
diff --git a/modulevocal/src/main/java/com/example/modulevocal/fragment/VocalRangeFragment.java b/modulevocal/src/main/java/com/example/modulevocal/fragment/VocalRangeFragment.java
index 8232ea37..c273bed3 100644
--- a/modulevocal/src/main/java/com/example/modulevocal/fragment/VocalRangeFragment.java
+++ b/modulevocal/src/main/java/com/example/modulevocal/fragment/VocalRangeFragment.java
@@ -14,6 +14,7 @@ import android.view.View;
import com.example.modulevocal.R;
import com.example.modulevocal.activity.BlacklistActivity;
+import com.example.modulevocal.activity.DailyTasksActivity;
import com.example.modulevocal.activity.EditUserInfoActivity;
import com.example.modulevocal.activity.MyBagActivity;
import com.example.modulevocal.activity.MyMoneyActivity;
@@ -144,7 +145,7 @@ public class VocalRangeFragment extends BaseMvpFragment implements DailyTasksConacts.IMePre{
+ public DailyTasksPresenter(DailyTasksConacts.View view, Context context) {
+ super(view, context);
+ }
+ //获取礼盒列表
+ @Override
+ public void tasksLihen() {
+ GiftBoxBean giftBoxBean = new GiftBoxBean();
+ giftBoxBean.setNewDataJinbi("100");
+ List giftList = new ArrayList<>();
+ GiftBoxBean.GiftBean giftBean = new GiftBoxBean.GiftBean();
+ giftBean.setGiftName("初级礼盒");
+ giftBean.setGiftTitle("1000");
+ giftBean.setGetGiftTypeName("200");
+ giftBean.setGiftTypeNumber("50");
+ giftList.add(giftBean);
+
+ GiftBoxBean.GiftBean giftBean2 = new GiftBoxBean.GiftBean();
+ giftBean2.setGiftName("高级礼盒");
+ giftBean2.setGiftTitle("61112");
+ giftBean2.setGetGiftTypeName("500");
+ giftBean2.setGiftTypeNumber("40");
+ giftList.add(giftBean2);
+
+ giftBoxBean.setGiftList(giftList);
+
+ MvpRef.get().setGiftBox(giftBoxBean);
+
+ }
+
+ @Override
+ public void tasksData() {
+
+ List taskDataBeans = new ArrayList<>();
+ for (int i = 0; i < 6; i++){
+ TaskDataBean taskDataBean = new TaskDataBean();
+ taskDataBean.setTaskName("任务"+i);
+ taskDataBean.setTaskNumber("1"+i);
+ taskDataBean.setTaskReward("10"+10);
+ taskDataBean.setTaskType(""+i+1);
+ taskDataBean.setTaskPictureUrl("");
+ taskDataBeans.add(taskDataBean);
+ }
+ MvpRef.get().tasksDataList(taskDataBeans);
+
+ }
+}
diff --git a/modulevocal/src/main/java/com/example/modulevocal/presenter/RealNamePresenter.java b/modulevocal/src/main/java/com/example/modulevocal/presenter/RealNamePresenter.java
new file mode 100644
index 00000000..21dd80e7
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/presenter/RealNamePresenter.java
@@ -0,0 +1,74 @@
+package com.example.modulevocal.presenter;
+
+import android.content.Context;
+
+import com.blankj.utilcode.util.ToastUtils;
+import com.example.modulevocal.conacts.RealNameConacts;
+import com.qxcm.moduleutil.base.CommonAppContext;
+import com.qxcm.moduleutil.bean.RealNameBean;
+import com.qxcm.moduleutil.http.ApiServer;
+import com.qxcm.moduleutil.http.BaseModel;
+import com.qxcm.moduleutil.http.BaseObserver;
+import com.qxcm.moduleutil.presenter.BasePresenter;
+
+import io.reactivex.disposables.Disposable;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+import retrofit2.Retrofit;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+public class RealNamePresenter extends BasePresenter implements RealNameConacts.IMePre{
+
+ public RealNamePresenter(RealNameConacts.View view, Context context) {
+ super(view, context);
+ }
+
+ @Override
+ public void realName(String real_name, String card_number) {
+ api.realName(real_name, card_number, new BaseObserver() {
+
+ @Override
+ public void onSubscribe(Disposable d) {
+ addDisposable(d);
+ }
+
+ @Override
+ public void onNext(RealNameBean realNameBean) {
+ MvpRef.get().realNameSuccess(realNameBean);
+ }
+ });
+ }
+
+ @Override
+ public void realNameResult(String orderNo) {
+ Retrofit retrofit = new Retrofit.Builder().baseUrl(CommonAppContext.getInstance().getCurrentEnvironment().getServerUrl())
+ .addConverterFactory(GsonConverterFactory.create())
+ .build();
+
+ Call> call=retrofit.create(ApiServer.class).getRealNameResult(orderNo);
+ call.enqueue(new Callback>() {
+ @Override
+ public void onResponse(Call> call, Response> response) {
+ if (response.code()==200){
+ BaseModel string=response.body();
+ if (string!=null){
+ int code=string.getCode();
+ if (code==1){
+ MvpRef.get().sendCodeSuccess();
+ }else {
+ ToastUtils.showShort(string.getMsg());
+ }
+ }
+
+ }
+ }
+
+ @Override
+ public void onFailure(Call> call, Throwable t) {
+ ToastUtils.showShort("上传失败");
+ }
+
+ });
+ }
+}
diff --git a/modulevocal/src/main/java/com/example/modulevocal/presenter/RevenuePresenter.java b/modulevocal/src/main/java/com/example/modulevocal/presenter/RevenuePresenter.java
new file mode 100644
index 00000000..ac910f40
--- /dev/null
+++ b/modulevocal/src/main/java/com/example/modulevocal/presenter/RevenuePresenter.java
@@ -0,0 +1,29 @@
+package com.example.modulevocal.presenter;
+
+import android.content.Context;
+
+import com.example.modulevocal.conacts.RevenueConacts;
+import com.qxcm.moduleutil.bean.RevenueBean;
+import com.qxcm.moduleutil.presenter.BasePresenter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RevenuePresenter extends BasePresenter implements RevenueConacts.IMePre {
+ public RevenuePresenter(RevenueConacts.View view, Context context) {
+ super(view, context);
+ }
+
+ @Override
+ public void getRevenueData() {
+ List list = new ArrayList<>();
+ for (int i = 0; i < 3; i++){
+ RevenueBean revenueBean = new RevenueBean();
+ revenueBean.setTitle("每日签到");
+ revenueBean.setTime("2025-5-27 18:29:25");
+ revenueBean.setMoney("+10"+i);
+ list.add(revenueBean);
+ }
+ MvpRef.get().saveRevenueData(list);
+ }
+}
diff --git a/modulevocal/src/main/res/layout/activity_daily_tasks.xml b/modulevocal/src/main/res/layout/activity_daily_tasks.xml
new file mode 100644
index 00000000..052dcba9
--- /dev/null
+++ b/modulevocal/src/main/res/layout/activity_daily_tasks.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulevocal/src/main/res/layout/activity_my_money.xml b/modulevocal/src/main/res/layout/activity_my_money.xml
index 8c126870..3265318d 100644
--- a/modulevocal/src/main/res/layout/activity_my_money.xml
+++ b/modulevocal/src/main/res/layout/activity_my_money.xml
@@ -140,13 +140,12 @@
+ android:textSize="@dimen/sp_14" />
+ android:text="身份证" />
@@ -114,7 +114,8 @@
android:id="@+id/ll_1"
style="@style/My_Info_Item_LL_Style"
android:layout_marginTop="@dimen/dp_9"
- android:background="@drawable/bg_r15_white">
+ android:background="@drawable/bg_r15_white"
+ android:visibility="gone">
+ android:background="@drawable/bg_r15_white"
+ android:visibility="gone">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulevocal/src/main/res/layout/fragment_revenue.xml b/modulevocal/src/main/res/layout/fragment_revenue.xml
new file mode 100644
index 00000000..d6c6b514
--- /dev/null
+++ b/modulevocal/src/main/res/layout/fragment_revenue.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulevocal/src/main/res/layout/fragment_user_hompage.xml b/modulevocal/src/main/res/layout/fragment_user_hompage.xml
index ec9af0d5..e6aca09e 100644
--- a/modulevocal/src/main/res/layout/fragment_user_hompage.xml
+++ b/modulevocal/src/main/res/layout/fragment_user_hompage.xml
@@ -10,6 +10,7 @@
diff --git a/modulevocal/src/main/res/layout/item_revenue.xml b/modulevocal/src/main/res/layout/item_revenue.xml
new file mode 100644
index 00000000..9e7643cf
--- /dev/null
+++ b/modulevocal/src/main/res/layout/item_revenue.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulevocal/src/main/res/layout/item_task_box.xml b/modulevocal/src/main/res/layout/item_task_box.xml
new file mode 100644
index 00000000..5f12e928
--- /dev/null
+++ b/modulevocal/src/main/res/layout/item_task_box.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulevocal/src/main/res/layout/item_task_data.xml b/modulevocal/src/main/res/layout/item_task_data.xml
new file mode 100644
index 00000000..e5c58cad
--- /dev/null
+++ b/modulevocal/src/main/res/layout/item_task_data.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulevocal/src/main/res/layout/me_item_user_gift_wall.xml b/modulevocal/src/main/res/layout/me_item_user_gift_wall.xml
index 976eb087..f6360f9c 100644
--- a/modulevocal/src/main/res/layout/me_item_user_gift_wall.xml
+++ b/modulevocal/src/main/res/layout/me_item_user_gift_wall.xml
@@ -42,8 +42,8 @@
\ No newline at end of file
+
+
+ Hello blank fragment
+
\ No newline at end of file
diff --git a/modulevocal/src/main/res/values/styles.xml b/modulevocal/src/main/res/values/styles.xml
new file mode 100644
index 00000000..226e1882
--- /dev/null
+++ b/modulevocal/src/main/res/values/styles.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modulevoice/build.gradle b/modulevoice/build.gradle
index 58879085..3c719886 100644
--- a/modulevoice/build.gradle
+++ b/modulevoice/build.gradle
@@ -24,14 +24,14 @@ android {
}
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_11
- targetCompatibility JavaVersion.VERSION_11
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
}
dataBinding {
enabled = true
}
kotlinOptions {
- jvmTarget = '11'
+ jvmTarget = '17'
}
buildFeatures {
viewBinding true
diff --git a/modulevoice/src/main/java/com/example/modulevoice/contacts/VoiceCategoryContacts.java b/modulevoice/src/main/java/com/example/modulevoice/contacts/VoiceCategoryContacts.java
index cdb530bd..c89148aa 100644
--- a/modulevoice/src/main/java/com/example/modulevoice/contacts/VoiceCategoryContacts.java
+++ b/modulevoice/src/main/java/com/example/modulevoice/contacts/VoiceCategoryContacts.java
@@ -5,6 +5,7 @@ import android.app.Activity;
import com.qxcm.moduleutil.activity.IPresenter;
import com.qxcm.moduleutil.activity.IView;
+import com.qxcm.moduleutil.bean.BannerModel;
import com.qxcm.moduleutil.bean.RoomTypeModel;
import com.qxcm.moduleutil.bean.TopRoom;
@@ -17,7 +18,7 @@ public final class VoiceCategoryContacts {
void setCategories(List list);
-// void setBanners(List bannerModels);
+ void setBanners(List bannerModels);
void setRoomId(String roomId);
diff --git a/modulevoice/src/main/java/com/example/modulevoice/fragment/VoiceCategoryFragment.java b/modulevoice/src/main/java/com/example/modulevoice/fragment/VoiceCategoryFragment.java
index 7e061af7..784939dd 100644
--- a/modulevoice/src/main/java/com/example/modulevoice/fragment/VoiceCategoryFragment.java
+++ b/modulevoice/src/main/java/com/example/modulevoice/fragment/VoiceCategoryFragment.java
@@ -10,6 +10,7 @@ import androidx.fragment.app.FragmentStatePagerAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
@@ -20,8 +21,11 @@ import com.example.modulevoice.databinding.FragmentVoiceCategoryBinding;
import com.example.modulevoice.presenter.VoiceCategoryPresenter;
import com.hjq.toast.ToastUtils;
import com.qxcm.moduleutil.base.BaseMvpFragment;
+import com.qxcm.moduleutil.bean.BannerModel;
import com.qxcm.moduleutil.bean.RoomTypeModel;
import com.qxcm.moduleutil.bean.TopRoom;
+import com.qxcm.moduleutil.utils.ImageUtils;
+import com.stx.xhb.xbanner.XBanner;
import com.sunfusheng.marqueeview.MarqueeView;
import com.zhpan.bannerview.constants.PageStyle;
@@ -75,7 +79,7 @@ public class VoiceCategoryFragment extends BaseMvpFragment list) {
-// mBinding.banner.setBannerData(R.layout.index_image_banner, list);
-// }
+ @Override
+ public void setBanners(List bannerModels) {
+ mBinding.banner.setBannerData(R.layout.index_image_banner, bannerModels);
+ }
+
@Override
public void setRoomId(String roomId) {
diff --git a/modulevoice/src/main/java/com/example/modulevoice/presenter/VoiceCategoryPresenter.java b/modulevoice/src/main/java/com/example/modulevoice/presenter/VoiceCategoryPresenter.java
index 0ec9f640..b0e7df5d 100644
--- a/modulevoice/src/main/java/com/example/modulevoice/presenter/VoiceCategoryPresenter.java
+++ b/modulevoice/src/main/java/com/example/modulevoice/presenter/VoiceCategoryPresenter.java
@@ -4,6 +4,7 @@ import android.content.Context;
import android.speech.tts.Voice;
import com.example.modulevoice.contacts.VoiceCategoryContacts;
+import com.qxcm.moduleutil.bean.BannerModel;
import com.qxcm.moduleutil.bean.RoomTypeModel;
import com.qxcm.moduleutil.bean.TopRoom;
import com.qxcm.moduleutil.presenter.BasePresenter;
@@ -94,6 +95,20 @@ public class VoiceCategoryPresenter extends BasePresenter bannerModels = new ArrayList();
+ for (int i = 0; i < 5; i++) {
+ BannerModel bannerModel = new BannerModel();
+ bannerModel.setAd_id("123");
+ bannerModel.setType("123");
+ bannerModel.setTitle("123");
+ bannerModel.setItem_id("123");
+ bannerModel.setLink_url("123");
+ bannerModel.setContent("https://pic.rmb.bdstatic.com/bjh/240727/0794225838d72cc4c12c39c9bc7a986d2625.jpeg@h_1280");
+ bannerModel.setDetail_pictures(null);
+ bannerModels.add(bannerModel);
+ }
+
+ MvpRef.get().setBanners(bannerModels);
}
@Override
public void getCarousels() {
diff --git a/modulevoice/src/main/res/layout/fragment_voice_category.xml b/modulevoice/src/main/res/layout/fragment_voice_category.xml
index bb00b875..53b26efe 100644
--- a/modulevoice/src/main/res/layout/fragment_voice_category.xml
+++ b/modulevoice/src/main/res/layout/fragment_voice_category.xml
@@ -23,46 +23,45 @@
android:paddingRight="16dp"
app:layout_scrollFlags="scroll|enterAlways">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+ app:bvp_indicator_visibility="gone"
+ app:layout_constraintTop_toTopOf="parent" />
+ app:layout_constraintTop_toBottomOf="@+id/banner_view_pager">
+ android:src="@mipmap/pp" />
+ app:mvTextSize="@dimen/sp_14" />
+ android:src="@mipmap/wg" />
+
+
+
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index b45d41cd..77432359 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -14,6 +14,7 @@ pluginManagement {
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
maven { url "https://jitpack.io" }
maven { url "https://mvn.mob.com/android" }
+ maven { url "https://mirrors.tencent.com/nexus/repository/maven-public/" }
}
}
dependencyResolutionManagement {
@@ -26,6 +27,7 @@ dependencyResolutionManagement {
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
maven { url "https://jitpack.io" }
maven { url "https://mvn.mob.com/android" }
+ maven { url "https://mirrors.tencent.com/nexus/repository/maven-public/" }
flatDir { dirs 'libs' } // 如果需要 flatDir,放在这里
}
}
@@ -39,3 +41,24 @@ include ':modulevoice' //声播模块
include ':moduletablayout'
include ':modulecircle' //语圈模块
include ':modulevocal' //个人模块
+include ':modulenews' //音域
+
+// 引入内部组件通信模块 (必要模块)
+//include ':tuicore'
+//project(':tuicore').projectDir = new File(settingsDir, '../TUIKit/TUICore/tuicore')
+//
+//// 引入 IM 组件公共模块(必要模块)
+////include ':timcommon'
+////project(':timcommon').projectDir = new File(settingsDir, '../TUIKit/TIMCommon/timcommon')
+//
+//// 引入聊天功能模块 (基础功能模块)
+//include ':tuichat'
+//project(':tuichat').projectDir = new File(settingsDir, '../TUIKit/TUIChat/tuichat')
+//
+//// 引入会话功能模块 (基础功能模块)
+//include ':tuiconversation'
+//project(':tuiconversation').projectDir = new File(settingsDir, '../TUIKit/TUIConversation/tuiconversation')
+include ':timcommon'
+include ':tuichat'
+include ':tuiconversation'
+include ':tuicore'
diff --git a/timcommon/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable-xxhdpi-v4_core_selected_icon_light.png.flat b/timcommon/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable-xxhdpi-v4_core_selected_icon_light.png.flat
new file mode 100644
index 00000000..7d96ab4e
Binary files /dev/null and b/timcommon/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable-xxhdpi-v4_core_selected_icon_light.png.flat differ
diff --git a/timcommon/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/timcommon/classicui/widget/message/MessageContentHolder$2.class b/timcommon/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/timcommon/classicui/widget/message/MessageContentHolder$2.class
new file mode 100644
index 00000000..01a538e2
Binary files /dev/null and b/timcommon/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/timcommon/classicui/widget/message/MessageContentHolder$2.class differ
diff --git a/timcommon/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/timcommon/component/action/PopMenuAdapter.class b/timcommon/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/timcommon/component/action/PopMenuAdapter.class
new file mode 100644
index 00000000..145f8249
Binary files /dev/null and b/timcommon/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/timcommon/component/action/PopMenuAdapter.class differ
diff --git a/timcommon/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/timcommon/interfaces/OnChatPopActionClickListener.class b/timcommon/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/timcommon/interfaces/OnChatPopActionClickListener.class
new file mode 100644
index 00000000..6fa6b13c
Binary files /dev/null and b/timcommon/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/timcommon/interfaces/OnChatPopActionClickListener.class differ
diff --git a/timcommon/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/timcommon/minimalistui/widget/message/MessageContentHolder$4.class b/timcommon/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/timcommon/minimalistui/widget/message/MessageContentHolder$4.class
new file mode 100644
index 00000000..71958bdc
Binary files /dev/null and b/timcommon/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/timcommon/minimalistui/widget/message/MessageContentHolder$4.class differ
diff --git a/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/classicui/ClassicUIService$1.dex b/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/classicui/ClassicUIService$1.dex
new file mode 100644
index 00000000..6384520c
Binary files /dev/null and b/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/classicui/ClassicUIService$1.dex differ
diff --git a/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/component/inputedittext/TIMMentionEditText.dex b/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/component/inputedittext/TIMMentionEditText.dex
new file mode 100644
index 00000000..b7279412
Binary files /dev/null and b/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/component/inputedittext/TIMMentionEditText.dex differ
diff --git a/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/ChatView$23$2.dex b/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/ChatView$23$2.dex
new file mode 100644
index 00000000..d2b4cf07
Binary files /dev/null and b/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/ChatView$23$2.dex differ
diff --git a/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/presenter/ChatPresenter$35.dex b/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/presenter/ChatPresenter$35.dex
new file mode 100644
index 00000000..8dabeaad
Binary files /dev/null and b/tuichat/build/.transforms/7a306fc474fc2367c382f12a89ccc0b2/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/presenter/ChatPresenter$35.dex differ
diff --git a/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/component/face/EmojiViewHolder$3.dex b/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/component/face/EmojiViewHolder$3.dex
new file mode 100644
index 00000000..b926f546
Binary files /dev/null and b/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/component/face/EmojiViewHolder$3.dex differ
diff --git a/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/input/InputView$8.dex b/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/input/InputView$8.dex
new file mode 100644
index 00000000..fdcb8eb1
Binary files /dev/null and b/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/input/InputView$8.dex differ
diff --git a/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/MessageRecyclerView$1.dex b/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/MessageRecyclerView$1.dex
new file mode 100644
index 00000000..142d9236
Binary files /dev/null and b/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/MessageRecyclerView$1.dex differ
diff --git a/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/presenter/ChatPresenter$34.dex b/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/presenter/ChatPresenter$34.dex
new file mode 100644
index 00000000..14f10658
Binary files /dev/null and b/tuichat/build/.transforms/a7a2c0f6dc4a363398dfce28ecc9af15/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuichat/presenter/ChatPresenter$34.dex differ
diff --git a/tuichat/build/generated/res/pngs/debug/drawable-anydpi-v24/ic_other_video_call.xml b/tuichat/build/generated/res/pngs/debug/drawable-anydpi-v24/ic_other_video_call.xml
new file mode 100644
index 00000000..370ac52d
--- /dev/null
+++ b/tuichat/build/generated/res/pngs/debug/drawable-anydpi-v24/ic_other_video_call.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/tuichat/build/generated/res/pngs/debug/drawable-hdpi/chat_ic_back.png b/tuichat/build/generated/res/pngs/debug/drawable-hdpi/chat_ic_back.png
new file mode 100644
index 00000000..3c9d9917
Binary files /dev/null and b/tuichat/build/generated/res/pngs/debug/drawable-hdpi/chat_ic_back.png differ
diff --git a/tuichat/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable-xxhdpi-v4_chat_back.png.flat b/tuichat/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable-xxhdpi-v4_chat_back.png.flat
new file mode 100644
index 00000000..22c0f454
Binary files /dev/null and b/tuichat/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/drawable-xxhdpi-v4_chat_back.png.flat differ
diff --git a/tuichat/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_chat_forward_msg_content_line_layout.xml.flat b/tuichat/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_chat_forward_msg_content_line_layout.xml.flat
new file mode 100644
index 00000000..2d69da3f
Binary files /dev/null and b/tuichat/build/intermediates/compiled_local_resources/debug/compileDebugLibraryResources/out/layout_chat_forward_msg_content_line_layout.xml.flat differ
diff --git a/tuichat/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/InputView$9.class b/tuichat/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/InputView$9.class
new file mode 100644
index 00000000..4dc9e882
Binary files /dev/null and b/tuichat/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuichat/classicui/widget/input/InputView$9.class differ
diff --git a/tuichat/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/GroupNoticeMinimalistActivity.class b/tuichat/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/GroupNoticeMinimalistActivity.class
new file mode 100644
index 00000000..0d4af392
Binary files /dev/null and b/tuichat/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuichat/minimalistui/page/GroupNoticeMinimalistActivity.class differ
diff --git a/tuichat/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/SoundMessageHolder.class b/tuichat/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/SoundMessageHolder.class
new file mode 100644
index 00000000..41110e1b
Binary files /dev/null and b/tuichat/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuichat/minimalistui/widget/message/viewholder/SoundMessageHolder.class differ
diff --git a/tuichat/build/intermediates/packaged_res/debug/packageDebugResources/anim/chat_pop_menu_out_anim.xml b/tuichat/build/intermediates/packaged_res/debug/packageDebugResources/anim/chat_pop_menu_out_anim.xml
new file mode 100644
index 00000000..07fa89bc
--- /dev/null
+++ b/tuichat/build/intermediates/packaged_res/debug/packageDebugResources/anim/chat_pop_menu_out_anim.xml
@@ -0,0 +1,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/tuichat/build/intermediates/packaged_res/debug/packageDebugResources/drawable-xxhdpi-v4/pop_menu_speaker.png b/tuichat/build/intermediates/packaged_res/debug/packageDebugResources/drawable-xxhdpi-v4/pop_menu_speaker.png
new file mode 100644
index 00000000..d4a21a30
Binary files /dev/null and b/tuichat/build/intermediates/packaged_res/debug/packageDebugResources/drawable-xxhdpi-v4/pop_menu_speaker.png differ
diff --git a/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/classicui/widget/ChatView$2$1.class b/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/classicui/widget/ChatView$2$1.class
new file mode 100644
index 00000000..71d6a86c
Binary files /dev/null and b/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/classicui/widget/ChatView$2$1.class differ
diff --git a/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/FileMessageHolder$1.class b/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/FileMessageHolder$1.class
new file mode 100644
index 00000000..e4b36dea
Binary files /dev/null and b/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/classicui/widget/message/viewholder/FileMessageHolder$1.class differ
diff --git a/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/model/ChatFileDownloadProvider$DownloadCallback.class b/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/model/ChatFileDownloadProvider$DownloadCallback.class
new file mode 100644
index 00000000..d63fd7c7
Binary files /dev/null and b/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/model/ChatFileDownloadProvider$DownloadCallback.class differ
diff --git a/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/model/ChatProvider$24.class b/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/model/ChatProvider$24.class
new file mode 100644
index 00000000..de82fc47
Binary files /dev/null and b/tuichat/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuichat/model/ChatProvider$24.class differ
diff --git a/tuiconversation/build/.transforms/b3c8bea6378b2a283018c31dfa649d94/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuiconversation/bean/ConversationGroupBean.dex b/tuiconversation/build/.transforms/b3c8bea6378b2a283018c31dfa649d94/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuiconversation/bean/ConversationGroupBean.dex
new file mode 100644
index 00000000..d2bb24c3
Binary files /dev/null and b/tuiconversation/build/.transforms/b3c8bea6378b2a283018c31dfa649d94/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/tencent/qcloud/tuikit/tuiconversation/bean/ConversationGroupBean.dex differ
diff --git a/tuiconversation/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuiconversation/classicui/page/TUIConversationFragment$7.class b/tuiconversation/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuiconversation/classicui/page/TUIConversationFragment$7.class
new file mode 100644
index 00000000..d0d19e81
Binary files /dev/null and b/tuiconversation/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuiconversation/classicui/page/TUIConversationFragment$7.class differ
diff --git a/tuiconversation/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ConversationIconView$1.class b/tuiconversation/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ConversationIconView$1.class
new file mode 100644
index 00000000..6d208014
Binary files /dev/null and b/tuiconversation/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuiconversation/minimalistui/widget/ConversationIconView$1.class differ
diff --git a/tuiconversation/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuiconversation/presenter/ConversationPresenter$4.class b/tuiconversation/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuiconversation/presenter/ConversationPresenter$4.class
new file mode 100644
index 00000000..cbf55b4f
Binary files /dev/null and b/tuiconversation/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/tencent/qcloud/tuikit/tuiconversation/presenter/ConversationPresenter$4.class differ
diff --git a/tuiconversation/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuiconversation/bean/DraftInfo.class b/tuiconversation/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuiconversation/bean/DraftInfo.class
new file mode 100644
index 00000000..6e0e0e7f
Binary files /dev/null and b/tuiconversation/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuiconversation/bean/DraftInfo.class differ
diff --git a/tuiconversation/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationListAdapter$ForwardSelectHolder.class b/tuiconversation/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationListAdapter$ForwardSelectHolder.class
new file mode 100644
index 00000000..dc9901cb
Binary files /dev/null and b/tuiconversation/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuiconversation/classicui/widget/ConversationListAdapter$ForwardSelectHolder.class differ
diff --git a/tuiconversation/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuiconversation/presenter/ConversationFoldPresenter.class b/tuiconversation/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuiconversation/presenter/ConversationFoldPresenter.class
new file mode 100644
index 00000000..2224c3c9
Binary files /dev/null and b/tuiconversation/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/tencent/qcloud/tuikit/tuiconversation/presenter/ConversationFoldPresenter.class differ
diff --git a/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/bean/ConversationInfo.java b/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/bean/ConversationInfo.java
new file mode 100644
index 00000000..8365a1da
--- /dev/null
+++ b/tuiconversation/src/main/java/com/tencent/qcloud/tuikit/tuiconversation/bean/ConversationInfo.java
@@ -0,0 +1,382 @@
+package com.tencent.qcloud.tuikit.tuiconversation.bean;
+
+import androidx.annotation.NonNull;
+import com.tencent.imsdk.v2.V2TIMConversation;
+import com.tencent.imsdk.v2.V2TIMGroupAtInfo;
+import com.tencent.imsdk.v2.V2TIMMessage;
+import com.tencent.imsdk.v2.V2TIMUserStatus;
+import com.tencent.qcloud.tuikit.timcommon.bean.TUIMessageBean;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ConversationInfo implements Serializable, Comparable {
+ public static final int TYPE_COMMON = 1;
+ public static final int TYPE_CUSTOM = 2;
+
+ public static final int TYPE_FORWAR_SELECT = 3;
+ public static final int TYPE_RECENT_LABEL = 4;
+
+ public static final int AT_TYPE_AT_ME = V2TIMGroupAtInfo.TIM_AT_ME;
+ public static final int AT_TYPE_AT_ALL = V2TIMGroupAtInfo.TIM_AT_ALL;
+ public static final int AT_TYPE_AT_ALL_AND_ME = V2TIMGroupAtInfo.TIM_AT_ALL_AT_ME;
+ public static final int AT_TYPE_UNKNOWN = V2TIMGroupAtInfo.TIM_AT_UNKNOWN;
+
+ public static final int USER_STATUS_UNKNOWN = V2TIMUserStatus.V2TIM_USER_STATUS_UNKNOWN;
+ public static final int USER_STATUS_ONLINE = V2TIMUserStatus.V2TIM_USER_STATUS_ONLINE;
+
+ public static final int LAST_MSG_STATUS_UNKNOWN = 0;
+ public static final int LAST_MSG_STATUS_SENDING = V2TIMMessage.V2TIM_MSG_STATUS_SENDING;
+ public static final int LAST_MSG_STATUS_SEND_FAIL = V2TIMMessage.V2TIM_MSG_STATUS_SEND_FAIL;
+ public static final int LAST_MSG_STATUS_HAS_DELETED = V2TIMMessage.V2TIM_MSG_STATUS_HAS_DELETED;
+ public static final int LAST_MSG_STATUS_LOCAL_IMPORTED = V2TIMMessage.V2TIM_MSG_STATUS_LOCAL_IMPORTED;
+ public static final int LAST_MSG_STATUS_LOCAL_REVOKED = V2TIMMessage.V2TIM_MSG_STATUS_LOCAL_REVOKED;
+
+ /**
+ * conversation type
+ */
+ private int type;
+
+ private int atType = AT_TYPE_UNKNOWN;
+
+ /**
+ * unread message number
+ */
+ private int unRead;
+ /**
+ * conversation ID
+ */
+ private String conversationId;
+ /**
+ * ID, C2C is UserID, Group is group ID
+ */
+ private String id;
+
+ private int statusType = USER_STATUS_UNKNOWN;
+
+ private V2TIMConversation conversation;
+
+ private List