adapterReference;
+
+ BarrageAdapterHandler(Looper looper, BarrageAdapter adapter) {
+ super(looper);
+ adapterReference = new WeakReference<>(adapter);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+
+ switch (msg.what) {
+ case MSG_CREATE_VIEW: {
+ T data = (T) adapterReference.get().mDataList.remove();
+ if (data == null)
+ break;
+ if (adapterReference.get().barrageView == null)
+ throw new RuntimeException("please set barrageView,barrageView can't be null");
+ // get from cache
+ View cacheView = adapterReference.get().barrageView.getCacheView(data.getType());
+ adapterReference.get().createItemView(data, cacheView);
+ if (adapterReference.get().repeat != 1)
+ adapterReference.get().mDataList.addLast(data);
+ }
+ }
+
+ }
+
+ }
+}
diff --git a/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/listener/SimpleAnimationListener.java b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/listener/SimpleAnimationListener.java
new file mode 100644
index 0000000..4f7c181
--- /dev/null
+++ b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/listener/SimpleAnimationListener.java
@@ -0,0 +1,32 @@
+package com.orient.tea.barragephoto.listener;
+
+import android.animation.Animator;
+
+/**
+ * 简单的监听器
+ *
+ * Created by wangjie on 2019/3/16.
+ */
+
+public abstract class SimpleAnimationListener implements Animator.AnimatorListener {
+
+ @Override
+ public void onAnimationStart(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+
+ }
+}
diff --git a/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/model/DataSource.java b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/model/DataSource.java
new file mode 100644
index 0000000..04963a6
--- /dev/null
+++ b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/model/DataSource.java
@@ -0,0 +1,12 @@
+package com.orient.tea.barragephoto.model;
+
+/**
+ * 数据源接口
+ *
+ * Created by wangjie on 2019/3/7.
+ */
+
+public interface DataSource {
+ // 返回当前的类型
+ int getType();
+}
diff --git a/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/ui/BarrageView.java b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/ui/BarrageView.java
new file mode 100644
index 0000000..6ac495d
--- /dev/null
+++ b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/ui/BarrageView.java
@@ -0,0 +1,580 @@
+package com.orient.tea.barragephoto.ui;
+
+import android.animation.Animator;
+import android.animation.ValueAnimator;
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.os.Handler;
+import android.os.Message;
+import android.util.AttributeSet;
+import android.util.SparseArray;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.LinearInterpolator;
+
+import com.orient.tea.barragephoto.R;
+import com.orient.tea.barragephoto.adapter.BarrageAdapter;
+import com.orient.tea.barragephoto.listener.SimpleAnimationListener;
+import com.orient.tea.barragephoto.model.DataSource;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.concurrent.CountDownLatch;
+
+/**
+ * 弹幕视图
+ * 使用属性动画实现监听事件
+ *
+ * Created by wangjie on 2019/3/7.
+ */
+
+@SuppressWarnings({"unchecked", "FieldCanBeLocal", "unused", "MismatchedReadAndWriteOfArray"})
+public class BarrageView extends ViewGroup implements IBarrageView {
+ // TODO
+ // 1. 多类型下的碰撞检测
+ // 2. 测试
+ // 3. 具体行数的设置
+ // 4. 具体的高度设置和位置设置
+ public static final String TAG = "BarrageView";
+
+ // 1 碰撞检测模式 2 随机生成模式
+ public final static int MODEL_COLLISION_DETECTION = 1;
+ public final static int MODEL_RANDOM = 2;
+ // 弹幕的相对位置
+ public final static int GRAVITY_TOP = 1;
+ public final static int GRAVITY_MIDDLE = 2;
+ public final static int GRAVITY_BOTTOM = 4;
+ public final static int GRAVITY_FULL = 7;
+ // 设置最大的缓存View的数量 当达到200的时候回收View
+ public final static int MAX_COUNT = 500;
+ // 速度和波动速度的默认值
+ public final static int DEFAULT_SPEED = 200;
+ public final static int DEFAULT_WAVE_SPEED = 20;
+
+ private BarrageHandler mHandler;
+ // 记录放入缓存的View
+ public int count = 0;
+ // 发送间隔
+ public long interval;
+ // 模式
+ private int model = MODEL_RANDOM;
+
+ // 新增速度 px/100ms
+ private int speed = 200;
+ private int speedWaveValue = 20;
+ // 每一行的速度的储存
+ private int[] speedArray;
+
+ // 是否设置当前动画
+ private boolean cancel = false;
+
+ // 当前的gravity
+ private int gravity = GRAVITY_TOP;
+ // 行数
+ private int barrageLines;
+ // 重复次数
+ private int repeat;
+ // 宽度和高度
+ private int width, height;
+ private List barrageList;
+ private BarrageAdapter mAdapter;
+ // 单行的高度
+ private int singleLineHeight = -1;
+ // 是否阻止事件的下发
+ private boolean isInterceptTouchEvent = false;
+ // 上下弹幕之间的距离
+ private int barrageDistance;
+ // View的缓存
+ private SparseArray> mArray;
+ private Random random = new Random();
+ private CountDownLatch countDownLatch = new CountDownLatch(1);
+
+
+ public BarrageView(Context context) {
+ this(context, null);
+ }
+
+ public BarrageView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ @SuppressLint("HandlerLeak")
+ public BarrageView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+
+ this.barrageList = new ArrayList<>();
+ this.mArray = new SparseArray<>();
+ mHandler = new BarrageHandler(this);
+
+ }
+
+ /**
+ * 设置适配器
+ *
+ * @param adapter 适配器
+ */
+ public void setAdapter(BarrageAdapter adapter) {
+ this.mAdapter = adapter;
+ // 相互绑定
+ mAdapter.setBarrageView(this);
+ }
+
+ public void setOptions(Options options){
+ if(options != null){
+ if(options.config.gravity != -1){
+ this.gravity = options.config.gravity;
+ }
+
+ if(options.config.interval > 0){
+ this.interval = options.config.interval;
+ }
+
+ if(options.config.speed != 0 && options.config.waveSpeed != 0){
+ this.speed = options.config.speed;
+ this.speedWaveValue = options.config.waveSpeed;
+ }
+
+ if(options.config.model != 0){
+ this.model = options.config.model;
+ }
+
+ if(options.config.repeat != 0){
+ this.repeat = options.config.repeat;
+ }
+
+ this.isInterceptTouchEvent = options.config.isInterceptTouchEvent;
+ }
+ }
+
+ /**
+ * 添加进缓存
+ *
+ * @param root 缓存的View
+ */
+ public synchronized void addViewToCaches(int type, View root) {
+ if (mArray.get(type) == null) {
+ LinkedList linkedList = new LinkedList<>();
+ linkedList.add(root);
+ mArray.put(type, linkedList);
+ } else {
+ mArray.get(type).add(root);
+ }
+ }
+
+ /**
+ * 删除视图
+ *
+ * @return 类型
+ */
+ public synchronized View removeViewFromCaches(int type) {
+ if (mArray.indexOfKey(type) >= 0) {
+ return mArray.get(type).poll();
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * 获取内存View的数量
+ *
+ * @return 内存的大小
+ */
+ public int getCacheSize() {
+ int sum = 0;
+ Set mTypeList = mAdapter.getTypeList();
+ for (Integer type : mTypeList) {
+ if (mArray.indexOfKey(type) >= 0) {
+ sum += mArray.get(type).size();
+ }
+ }
+ return sum;
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+
+ }
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ if (isInterceptTouchEvent)
+ return true;
+ return super.onInterceptTouchEvent(ev);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ measureChildren(widthMeasureSpec, heightMeasureSpec);
+
+ int width = MeasureSpec.getSize(widthMeasureSpec);
+ int height = MeasureSpec.getSize(heightMeasureSpec);
+ this.width = width;
+ this.height = height;
+ //countDownLatch.countDown();
+ }
+
+ /**
+ * 初始化一个空的弹幕列表和速度列表
+ */
+ private void initBarrageListAndSpeedArray() {
+ barrageDistance = DeviceUtils.dp2px(getContext(), 12);
+ /*try {
+ countDownLatch.await();
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }*/
+ barrageLines = height / (singleLineHeight + barrageDistance);
+ for (int i = 0; i < barrageLines; i++) {
+ barrageList.add(i, null);
+ }
+ speedArray = new int[barrageLines];
+ for (int i = 0; i < barrageLines; i++) {
+ speedArray[i] = 0;
+ }
+ }
+
+ /**
+ * 设置单行的高度
+ */
+ public void setSingleLineHeight(int singleLineHeight) {
+ this.singleLineHeight = singleLineHeight;
+ }
+
+ @Override
+ public void addBarrageItem(final View view) {
+ // 获取高度和宽度
+ int w = View.MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ int h = View.MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+ view.measure(w, h);
+ final int itemWidth = view.getMeasuredWidth();
+ final int itemHeight = view.getMeasuredHeight();
+
+ if (singleLineHeight == -1) {
+ // 如果没有设置高度 启用添加的第一个Item作为行数
+ // 建议使用最小的Item的高度
+ singleLineHeight = itemHeight;
+ initBarrageListAndSpeedArray();
+ }
+ // 生成动画
+ final ValueAnimator valueAnimator = ValueAnimator.ofInt(width, -itemWidth);
+
+ // 获取最佳的行数
+ final int line = getBestLine(itemHeight);
+ int curSpeed = getSpeed(line, itemWidth);
+ long duration = (int)((float)(width+itemWidth)/(float)curSpeed+1) * 1000;
+ //Log.i(TAG,"duration:"+duration);
+ valueAnimator.setDuration(duration);
+ valueAnimator.setInterpolator(new LinearInterpolator());
+ valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ float value = animation.getAnimatedFraction();
+ //animation.getAnimatedValue()
+ //Log.e(TAG, "value:" + value);
+ if(cancel){
+ valueAnimator.cancel();
+ BarrageView.this.removeView(view);
+ }
+ //view.layout(value, line * (singleLineHeight + barrageDistance) + barrageDistance / 2, value + itemWidth, line * (singleLineHeight + barrageDistance) + barrageDistance / 2 + itemHeight);
+ view.layout((int) (width - (width + itemWidth) * value)
+ , line * (singleLineHeight + barrageDistance) + barrageDistance / 2
+ , (int) (width - (width + itemWidth) * value) + itemWidth
+ , line * (singleLineHeight + barrageDistance) + barrageDistance / 2 + itemHeight);
+ }
+ });
+ valueAnimator.addListener(new SimpleAnimationListener() {
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ super.onAnimationEnd(animation);
+
+ BarrageView.this.removeView(view);
+ BarrageAdapter.BarrageViewHolder holder = (BarrageAdapter.BarrageViewHolder) view.getTag(R.id.barrage_view_holder);
+ DataSource d = (DataSource) holder.mData;
+ int type = d.getType();
+ addViewToCaches(type, view);
+ // 通知内存添加缓存
+ mHandler.sendEmptyMessage(0);
+ }
+ });
+ addView(view);
+ speedArray[line] = curSpeed;
+ // 因为使用缓存View,必须重置位置
+ view.layout(width, line * (singleLineHeight + barrageDistance) + barrageDistance / 2, width + itemWidth, line * (singleLineHeight + barrageDistance) + barrageDistance / 2 + itemHeight);
+ barrageList.set(line, view);
+ valueAnimator.start();
+ }
+
+ /**
+ * 获取速度
+ *
+ * @param line 最佳弹道
+ * @param itemWidth 子View的宽度
+ * @return 速度
+ */
+ private int getSpeed(int line, int itemWidth) {
+ if (model == MODEL_RANDOM) {
+ return speed - speedWaveValue + random.nextInt(2 * speedWaveValue);
+ } else {
+ int lastSpeed = speedArray[line];
+ View view = barrageList.get(line);
+ int curSpeed;
+ if (view == null) {
+ curSpeed = speed - speedWaveValue + random.nextInt(2 * speedWaveValue);
+ //Log.e(TAG, "View:null" + ",line:" + line + ",speed:" + curSpeed);
+ // 如果当前为空 随机生成一个滑动时间
+ return curSpeed;
+ }
+ int slideLength = (int) (width - view.getX());
+ if (view.getWidth() > slideLength) {
+ // 数据密集的时候跟上面的时间间隔相同
+ //Log.e(TAG, "View:------" + ",line:" + line + ",speed:" + lastSpeed);
+ return lastSpeed;
+ }
+ // 得到上个View剩下的滑动时间
+ int lastLeavedSlidingTime = (int) ((view.getX() + view.getWidth() ) / (float) lastSpeed)+1;
+ //Log.e(TAG,"lastLeavedSlidingTime:"+lastLeavedSlidingTime+",lastLeavedSlidingTime:"+);
+ int fastestSpeed = (width) / lastLeavedSlidingTime;
+ fastestSpeed = Math.min(fastestSpeed, speed + speedWaveValue);
+ if (fastestSpeed <= speed - speedWaveValue) {
+ curSpeed = speed - speedWaveValue;
+ } else
+ curSpeed = speed - speedWaveValue + random.nextInt(fastestSpeed - (speed - speedWaveValue));
+ //Log.e(TAG, "view:" + view.getX() + ",lastLeavedSlidingTime:" + lastLeavedSlidingTime + ",line:" + line + ",speed:" + curSpeed);
+ return curSpeed;
+ }
+ }
+
+ /**
+ * 获取最佳的行数
+ *
+ * @param currentItemHeight 当前的高度
+ * @return 最佳行数
+ */
+ private int getBestLine(int currentItemHeight) {
+ if (currentItemHeight <= singleLineHeight) {
+ return realGetBestLine(1);
+ } else {
+ int v = currentItemHeight / singleLineHeight;
+ if (v * singleLineHeight < currentItemHeight)
+ v++;
+ return realGetBestLine(v);
+ }
+ }
+
+ /**
+ * 真实获取最佳的行数
+ *
+ * @param v 当前View的高度/单行的标准高度
+ * @return 最佳行数
+ */
+ private int realGetBestLine(int v) {
+ //转换成2进制
+ int gewei = gravity % 2; //个位是
+ int temp = gravity / 2;
+ int shiwei = temp % 2;
+ temp = temp / 2;
+ int baiwei = temp % 2;
+
+ //将所有的行分为三份,前两份行数相同,将第一份的行数四舍五入
+ int firstPart = (int) (barrageLines / 3.0f + 0.5f);
+
+ //构造允许输入行的列表
+ List legalLines = new ArrayList<>();
+ if (gewei == 1) {
+ for (int i = 0; i < firstPart; i++)
+ if (i % v == 0)
+ legalLines.add(i);
+ }
+ if (shiwei == 1) {
+ for (int i = firstPart; i < 2 * firstPart; i++)
+ if (i % v == 0)
+ legalLines.add(i);
+ }
+ if (baiwei == 1) {
+ for (int i = 2 * firstPart; i < barrageLines; i++)
+ if (i % v == 0 && i <= barrageLines - v)
+ legalLines.add(i);
+ }
+
+
+ int bestLine = 0;
+ //如果有空行直接结束
+ for (int i = 0; i < barrageLines; i++) {
+ if (barrageList.get(i) == null && i % v == 0) {
+ bestLine = i;
+ if (legalLines.contains(bestLine))
+ return bestLine;
+ }
+ }
+ float minSpace = Integer.MAX_VALUE;
+ //没有空行,就找最大空间的
+ for (int i = barrageLines - 1; i >= 0; i--) {
+ if (i % v == 0 && i <= barrageLines - v)
+ if (legalLines.contains(i)) {
+ if (barrageList.get(i).getX() + barrageList.get(i).getWidth() <= minSpace) {
+ minSpace = barrageList.get(i).getX() + barrageList.get(i).getWidth();
+ bestLine = i;
+ }
+ }
+ }
+ return bestLine;
+ }
+
+ public void destroy() {
+ // 停止动画
+ cancel = true;
+ // 清除消息队列,防止内存泄漏
+ mHandler.removeCallbacksAndMessages(null);
+ mAdapter.destroy();
+ }
+
+ /**
+ * 缩小缓存长度,减少内存的使用
+ */
+ public synchronized void shrinkCacheSize() {
+ Set mTypeList = mAdapter.getTypeList();
+ for (Integer type : mTypeList) {
+ if (mArray.indexOfKey(type) >= 0) {
+ LinkedList list = mArray.get(type);
+ int len = list.size();
+ while (list.size() > (len / 2.0 + 0.5)) {
+ list.pop();
+ }
+ mArray.put(type, list);
+ }
+ }
+ }
+
+ @Override
+ public View getCacheView(int type) {
+ return removeViewFromCaches(type);
+ }
+
+ @Override
+ public long getInterval() {
+ return interval;
+ }
+
+ @Override
+ public int getRepeat() {
+ return repeat;
+ }
+
+ private static class BarrageHandler extends Handler {
+ private WeakReference barrageViewReference;
+
+ BarrageHandler(BarrageView barrageView) {
+ this.barrageViewReference = new WeakReference(barrageView);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+ switch (msg.what) {
+ case 0:
+ if (barrageViewReference.get().count < MAX_COUNT) {
+ // 思考一下200是否合适
+ barrageViewReference.get().count++;
+ } else {
+ // 发动gc
+ barrageViewReference.get().shrinkCacheSize();
+ // 计算一下
+ barrageViewReference.get().count = barrageViewReference.get().getCacheSize();
+ }
+ }
+ }
+ }
+
+ static class Config {
+ int gravity = -1;
+ long interval;
+ int speed;
+ int waveSpeed;
+ int model;
+ boolean isInterceptTouchEvent = true;
+ int repeat = 1;
+ }
+
+ public static class Options{
+
+ Config config;
+
+ public Options() {
+ config = new Config();
+ }
+
+ /**
+ * 布局位置
+ *
+ * @param gravity 布局位置
+ */
+ public Options setGravity(int gravity){
+ this.config.gravity = gravity;
+ return this;
+ }
+
+ /**
+ * 视图发送的间隔
+ *
+ * @param interval 间隔 单位毫秒
+ */
+ public Options setInterval(long interval) {
+ this.config.interval = interval;
+ return this;
+ }
+
+ /**
+ * 设置间隔
+ *
+ * @param speed 弹幕滑动的基础速度
+ * @param waveValue 滑动素的波动值
+ */
+ public Options setSpeed(int speed, int waveValue) {
+ if (speed < waveValue
+ || speed <= 0
+ || waveValue < 0)
+ throw new RuntimeException("duration or wavValue is not correct!");
+ this.config.speed = speed;
+ this.config.waveSpeed = waveValue;
+ return this;
+ }
+
+ /**
+ * 弹幕模式 默认随机速度模式
+ *
+ * @param model 模式类型
+ */
+ public Options setModel(int model) {
+ this.config.model = model;
+ return this;
+ }
+
+ /**
+ * 循环次数 默认为1次 可以无限循环
+ *
+ * @param repeat 模式类型
+ */
+ public Options setRepeat(int repeat) {
+ this.config.repeat = repeat;
+ return this;
+ }
+
+ /**
+ * 设置是否阻止事件的下发
+ */
+ public Options setClick(boolean isInterceptTouchEvent) {
+ this.config.isInterceptTouchEvent = !isInterceptTouchEvent;
+ return this;
+ }
+
+ }
+
+}
diff --git a/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/ui/DeviceUtils.java b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/ui/DeviceUtils.java
new file mode 100644
index 0000000..5c8b6ce
--- /dev/null
+++ b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/ui/DeviceUtils.java
@@ -0,0 +1,21 @@
+package com.orient.tea.barragephoto.ui;
+
+import android.content.Context;
+
+/**
+ * Device Utils
+ *
+ * Created by wangjie on 2019/3/16.
+ */
+ class DeviceUtils {
+ static int dp2px(Context context, float dpValue) {
+ float scale = context.getResources().getDisplayMetrics().density;
+ return (int) (dpValue * scale + 0.5f);
+ }
+
+ @SuppressWarnings("unused")
+ static int sp2px(Context context, float spValue) {
+ float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
+ return (int) (spValue * fontScale + 0.5f);
+ }
+}
diff --git a/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/ui/IBarrageView.java b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/ui/IBarrageView.java
new file mode 100644
index 0000000..6e54345
--- /dev/null
+++ b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/ui/IBarrageView.java
@@ -0,0 +1,25 @@
+package com.orient.tea.barragephoto.ui;
+
+import android.view.View;
+
+import java.util.List;
+
+/**
+ * 弹幕视图的接口
+ *
+ * Created by wangjie on 2019/3/15.
+ */
+
+public interface IBarrageView {
+ // 添加视图
+ void addBarrageItem(View view);
+
+ // 获取是否存在缓存
+ View getCacheView(int type);
+
+ // 发送View间隔 默认为0
+ long getInterval();
+
+ // 循环的次数
+ int getRepeat();
+}
diff --git a/Muti-Barrage/src/main/res/values/ids.xml b/Muti-Barrage/src/main/res/values/ids.xml
new file mode 100644
index 0000000..05247f5
--- /dev/null
+++ b/Muti-Barrage/src/main/res/values/ids.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/Muti-Barrage/src/main/res/values/strings.xml b/Muti-Barrage/src/main/res/values/strings.xml
new file mode 100644
index 0000000..2063989
--- /dev/null
+++ b/Muti-Barrage/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ BarragePhoto
+
diff --git a/Muti-Barrage/src/test/java/com/orient/tea/barragephoto/ExampleUnitTest.java b/Muti-Barrage/src/test/java/com/orient/tea/barragephoto/ExampleUnitTest.java
new file mode 100644
index 0000000..6180d0f
--- /dev/null
+++ b/Muti-Barrage/src/test/java/com/orient/tea/barragephoto/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.orient.tea.barragephoto;
+
+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() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
+}
\ No newline at end of file
diff --git a/SudMGPWrapper/.gitignore b/SudMGPWrapper/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/SudMGPWrapper/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/SudMGPWrapper/build.gradle b/SudMGPWrapper/build.gradle
new file mode 100644
index 0000000..ff33cef
--- /dev/null
+++ b/SudMGPWrapper/build.gradle
@@ -0,0 +1,39 @@
+plugins {
+ id 'com.android.library'
+}
+
+android {
+ compileSdkVersion 32
+
+ defaultConfig {
+ minSdkVersion 21
+ targetSdkVersion 32
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ consumerProguardFiles 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
+ }
+}
+
+dependencies {
+
+ // 引入 SudMGPSDK
+// api project(':SudMGPSDK')
+ api 'tech.sud.mgp:SudMGP:1.3.6.1181'
+ // gson
+ api 'com.google.code.gson:gson:2.8.6'
+ // 依赖okhttp
+ api 'com.squareup.okhttp3:okhttp:4.9.2'
+
+
+
+}
\ No newline at end of file
diff --git a/SudMGPWrapper/consumer-rules.pro b/SudMGPWrapper/consumer-rules.pro
new file mode 100644
index 0000000..b8ab644
--- /dev/null
+++ b/SudMGPWrapper/consumer-rules.pro
@@ -0,0 +1,2 @@
+# SudMGPWrapper keep
+-keep class tech.sud.mgp.SudMGPWrapper.** {*;}
\ No newline at end of file
diff --git a/SudMGPWrapper/proguard-rules.pro b/SudMGPWrapper/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/SudMGPWrapper/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/SudMGPWrapper/src/main/AndroidManifest.xml b/SudMGPWrapper/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..943f4c5
--- /dev/null
+++ b/SudMGPWrapper/src/main/AndroidManifest.xml
@@ -0,0 +1,5 @@
+
+
+
+
\ No newline at end of file
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSMMGCache.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSMMGCache.java
new file mode 100644
index 0000000..f3c0c27
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSMMGCache.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.decorator;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Objects;
+
+import tech.sud.mgp.SudMGPWrapper.state.SudMGPMGState;
+
+/**
+ * 游戏回调数据缓存
+ */
+public class SudFSMMGCache {
+
+ private String captainUserId; // 记录当前队长的用户id
+ private SudMGPMGState.MGCommonGameState mgCommonGameStateModel; // 全局游戏状态
+ private boolean isHitBomb = false; // 是否数字炸弹
+ private final HashSet playerInSet = new HashSet<>(); // 记录已经加入了游戏的玩家
+ private final HashSet playerReadySet = new HashSet<>(); // 记录已经准备好的游戏玩家
+ private final HashMap playerPlayingMap = new HashMap<>(); // 记录玩家的游戏状态
+
+ // 队长状态 处理
+ public void onPlayerMGCommonPlayerCaptain(String userId, SudMGPMGState.MGCommonPlayerCaptain model) {
+ if (model != null) {
+ if (model.isCaptain) {
+ captainUserId = userId;
+ } else {
+ if (Objects.equals(captainUserId, userId)) {
+ captainUserId = null;
+ }
+ }
+ }
+ }
+
+ // 游戏状态 处理
+ public void onGameMGCommonGameState(SudMGPMGState.MGCommonGameState model) {
+ mgCommonGameStateModel = model;
+ }
+
+ // 玩家加入状态处理
+ public void onPlayerMGCommonPlayerIn(String userId, SudMGPMGState.MGCommonPlayerIn model) {
+ if (model != null) {
+ if (model.isIn) {
+ playerInSet.add(userId);
+ } else {
+ playerInSet.remove(userId);
+ playerReadySet.remove(userId);
+ }
+ }
+ }
+
+ // 玩家准备状态
+ public void onPlayerMGCommonPlayerReady(String userId, SudMGPMGState.MGCommonPlayerReady model) {
+ if (model != null) {
+ if (model.isReady) {
+ playerReadySet.add(userId);
+ } else {
+ playerReadySet.remove(userId);
+ }
+ }
+ }
+
+ // 玩家游戏状态
+ public void onPlayerMGCommonPlayerPlaying(String userId, SudMGPMGState.MGCommonPlayerPlaying model) {
+ if (model != null) {
+ playerPlayingMap.put(userId, model);
+ }
+ }
+
+ // 关键词状态
+ public void onGameMGCommonKeyWordToHit(SudMGPMGState.MGCommonKeyWordToHit model) {
+ if (model != null) {
+ isHitBomb = model.wordType.equals("number");
+ }
+ }
+
+ // 返回该玩家是否正在游戏中
+ public boolean playerIsPlaying(String userId) {
+ SudMGPMGState.MGCommonPlayerPlaying mgCommonPlayerPlaying = playerPlayingMap.get(userId);
+ if (mgCommonPlayerPlaying != null) {
+ return mgCommonPlayerPlaying.isPlaying;
+ }
+ return false;
+ }
+
+ // 返回该玩家是否已准备
+ public boolean playerIsReady(String userId) {
+ return playerReadySet.contains(userId);
+ }
+
+ // 返回该玩家是否已加入了游戏
+ public boolean playerIsIn(String userId) {
+ return playerInSet.contains(userId);
+ }
+
+ // 获取当前游戏中的人数
+ public int getPlayerInNumber() {
+ return playerInSet.size();
+ }
+
+ // 是否数字炸弹
+ public boolean isHitBomb() {
+ return isHitBomb;
+ }
+
+ // 销毁游戏
+ public void destroyMG() {
+ captainUserId = null;
+ mgCommonGameStateModel = null;
+ isHitBomb = false;
+ playerInSet.clear();
+ playerReadySet.clear();
+ playerPlayingMap.clear();
+ }
+
+ /** 获取队长userId */
+ public String getCaptainUserId() {
+ return captainUserId;
+ }
+
+ /** 获取当前已加入游戏的玩家集合 */
+ public HashSet getPlayerInSet() {
+ return new HashSet<>(playerInSet);
+ }
+
+ /** 获取当前已准备的玩家集合 */
+ public HashSet getPlayerReadySet() {
+ return new HashSet<>(playerReadySet);
+ }
+
+ /** 获取玩家游戏状态集合 */
+ public HashMap getPlayerPlayingMap() {
+ return new HashMap<>(playerPlayingMap);
+ }
+
+ /**
+ * 返回当前游戏的状态,数值参数{@link SudMGPMGState.MGCommonGameState}
+ */
+ public int getGameState() {
+ if (mgCommonGameStateModel != null) {
+ return mgCommonGameStateModel.gameState;
+ }
+ return SudMGPMGState.MGCommonGameState.UNKNOW;
+ }
+
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSMMGDecorator.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSMMGDecorator.java
new file mode 100644
index 0000000..5d09fd5
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSMMGDecorator.java
@@ -0,0 +1,843 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.decorator;
+
+import tech.sud.mgp.SudMGPWrapper.state.SudMGPMGState;
+import tech.sud.mgp.SudMGPWrapper.utils.ISudFSMStateHandleUtils;
+import tech.sud.mgp.SudMGPWrapper.utils.SudJsonUtils;
+import tech.sud.mgp.core.ISudFSMMG;
+import tech.sud.mgp.core.ISudFSMStateHandle;
+
+/**
+ * ISudFSMMG 游戏调APP回调装饰类
+ * 参考文档:https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG.html
+ */
+public class SudFSMMGDecorator implements ISudFSMMG {
+
+ // 回调
+ private SudFSMMGListener sudFSMMGListener;
+
+ // 数据状态封装
+ private final SudFSMMGCache sudFSMMGCache = new SudFSMMGCache();
+
+ /**
+ * 设置回调
+ *
+ * @param listener 监听器
+ */
+ public void setSudFSMMGListener(SudFSMMGListener listener) {
+ sudFSMMGListener = listener;
+ }
+
+ /**
+ * 游戏日志
+ * 最低版本:v1.1.30.xx
+ */
+ @Override
+ public void onGameLog(String dataJson) {
+ SudFSMMGListener listener = sudFSMMGListener;
+ if (listener != null) {
+ listener.onGameLog(dataJson);
+ }
+ }
+
+ /**
+ * 游戏加载进度
+ *
+ * @param stage 阶段:start=1,loading=2,end=3
+ * @param retCode 错误码:0成功
+ * @param progress 进度:[0, 100]
+ */
+ @Override
+ public void onGameLoadingProgress(int stage, int retCode, int progress) {
+ SudFSMMGListener listener = sudFSMMGListener;
+ if (listener != null) {
+ listener.onGameLoadingProgress(stage, retCode, progress);
+ }
+ }
+
+ /**
+ * 游戏开始
+ * 最低版本:v1.1.30.xx
+ */
+ @Override
+ public void onGameStarted() {
+ SudFSMMGListener listener = sudFSMMGListener;
+ if (listener != null) {
+ listener.onGameStarted();
+ }
+ }
+
+ /**
+ * 游戏销毁
+ * 最低版本:v1.1.30.xx
+ */
+ @Override
+ public void onGameDestroyed() {
+ SudFSMMGListener listener = sudFSMMGListener;
+ if (listener != null) {
+ listener.onGameDestroyed();
+ }
+ }
+
+ /**
+ * Code过期,需要实现
+ * APP接入方需要调用handle.success或handle.fail
+ *
+ * @param dataJson {"code":"value"}
+ */
+ @Override
+ public void onExpireCode(ISudFSMStateHandle handle, String dataJson) {
+ SudFSMMGListener listener = sudFSMMGListener;
+ if (listener != null) {
+ listener.onExpireCode(handle, dataJson);
+ }
+ }
+
+ /**
+ * 获取游戏View信息,需要实现
+ * APP接入方需要调用handle.success或handle.fail
+ *
+ * @param handle 操作
+ * @param dataJson {}
+ */
+ @Override
+ public void onGetGameViewInfo(ISudFSMStateHandle handle, String dataJson) {
+ SudFSMMGListener listener = sudFSMMGListener;
+ if (listener != null) {
+ listener.onGetGameViewInfo(handle, dataJson);
+ }
+ }
+
+ /**
+ * 获取游戏Config,需要实现
+ * APP接入方需要调用handle.success或handle.fail
+ *
+ * @param handle 操作
+ * @param dataJson {}
+ * 最低版本:v1.1.30.xx
+ */
+ @Override
+ public void onGetGameCfg(ISudFSMStateHandle handle, String dataJson) {
+ SudFSMMGListener listener = sudFSMMGListener;
+ if (listener != null) {
+ listener.onGetGameCfg(handle, dataJson);
+ }
+ }
+
+ /**
+ * 游戏状态变化
+ * APP接入方需要调用handle.success或handle.fail
+ *
+ * @param handle 操作
+ * @param state 状态命令
+ * @param dataJson 状态值
+ */
+ @Override
+ public void onGameStateChange(ISudFSMStateHandle handle, String state, String dataJson) {
+ SudFSMMGListener listener = sudFSMMGListener;
+ if (listener != null && listener.onGameStateChange(handle, state, dataJson)) {
+ return;
+ }
+ switch (state) {
+ case SudMGPMGState.MG_COMMON_PUBLIC_MESSAGE: // 1. 公屏消息
+ SudMGPMGState.MGCommonPublicMessage mgCommonPublicMessage = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPublicMessage.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonPublicMessage(handle, mgCommonPublicMessage);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_KEY_WORD_TO_HIT: // 2. 关键词状态
+ SudMGPMGState.MGCommonKeyWordToHit mgCommonKeyWordToHit = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonKeyWordToHit.class);
+ sudFSMMGCache.onGameMGCommonKeyWordToHit(mgCommonKeyWordToHit);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonKeyWordToHit(handle, mgCommonKeyWordToHit);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_SETTLE: // 3. 游戏结算状态
+ SudMGPMGState.MGCommonGameSettle mgCommonGameSettle = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSettle.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameSettle(handle, mgCommonGameSettle);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_CLICK_JOIN_BTN: // 4. 加入游戏按钮点击状态
+ SudMGPMGState.MGCommonSelfClickJoinBtn mgCommonSelfClickJoinBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickJoinBtn.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonSelfClickJoinBtn(handle, mgCommonSelfClickJoinBtn);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_CLICK_CANCEL_JOIN_BTN: // 5. 取消加入(退出)游戏按钮点击状态
+ SudMGPMGState.MGCommonSelfClickCancelJoinBtn selfClickCancelJoinBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickCancelJoinBtn.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonSelfClickCancelJoinBtn(handle, selfClickCancelJoinBtn);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_CLICK_READY_BTN: // 6. 准备按钮点击状态
+ SudMGPMGState.MGCommonSelfClickReadyBtn mgCommonSelfClickReadyBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickReadyBtn.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonSelfClickReadyBtn(handle, mgCommonSelfClickReadyBtn);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_CLICK_CANCEL_READY_BTN: // 7. 取消准备按钮点击状态
+ SudMGPMGState.MGCommonSelfClickCancelReadyBtn mgCommonSelfClickCancelReadyBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickCancelReadyBtn.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonSelfClickCancelReadyBtn(handle, mgCommonSelfClickCancelReadyBtn);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_CLICK_START_BTN: // 8. 开始游戏按钮点击状态
+ SudMGPMGState.MGCommonSelfClickStartBtn mgCommonSelfClickStartBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickStartBtn.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonSelfClickStartBtn(handle, mgCommonSelfClickStartBtn);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_CLICK_SHARE_BTN: // 9. 分享按钮点击状态
+ SudMGPMGState.MGCommonSelfClickShareBtn mgCommonSelfClickShareBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickShareBtn.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonSelfClickShareBtn(handle, mgCommonSelfClickShareBtn);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_STATE: // 10. 游戏状态
+ SudMGPMGState.MGCommonGameState mgCommonGameState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameState.class);
+ sudFSMMGCache.onGameMGCommonGameState(mgCommonGameState);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameState(handle, mgCommonGameState);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_CLICK_GAME_SETTLE_CLOSE_BTN: // 11. 结算界面关闭按钮点击状态(2021-12-27新增)
+ SudMGPMGState.MGCommonSelfClickGameSettleCloseBtn mgCommonSelfClickGameSettleCloseBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickGameSettleCloseBtn.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonSelfClickGameSettleCloseBtn(handle, mgCommonSelfClickGameSettleCloseBtn);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_CLICK_GAME_SETTLE_AGAIN_BTN: // 12. 结算界面再来一局按钮点击状态(2021-12-27新增)
+ SudMGPMGState.MGCommonSelfClickGameSettleAgainBtn mgCommonSelfClickGameSettleAgainBtn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickGameSettleAgainBtn.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonSelfClickGameSettleAgainBtn(handle, mgCommonSelfClickGameSettleAgainBtn);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_SOUND_LIST: // 13. 游戏上报游戏中的声音列表(2021-12-30新增,现在只支持碰碰我最强)
+ SudMGPMGState.MGCommonGameSoundList mgCommonGameSoundList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSoundList.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameSoundList(handle, mgCommonGameSoundList);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_SOUND: // 14. 游通知app层播放声音(2021-12-30新增,现在只支持碰碰我最强)
+ SudMGPMGState.MGCommonGameSound mgCommonGameSound = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSound.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameSound(handle, mgCommonGameSound);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_BG_MUSIC_STATE: // 15. 游戏通知app层播放背景音乐状态(2022-01-07新增,现在只支持碰碰我最强)
+ SudMGPMGState.MGCommonGameBgMusicState mgCommonGameBgMusicState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameBgMusicState.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameBgMusicState(handle, mgCommonGameBgMusicState);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_SOUND_STATE: // 16. 游戏通知app层播放音效的状态(2022-01-07新增,现在只支持碰碰我最强)
+ SudMGPMGState.MGCommonGameSoundState mgCommonGameSoundState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSoundState.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameSoundState(handle, mgCommonGameSoundState);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_ASR: // 17. ASR状态(开启和关闭语音识别状态,v1.1.45.xx 版本新增)
+ SudMGPMGState.MGCommonGameASR mgCommonGameASR = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameASR.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameASR(handle, mgCommonGameASR);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_MICROPHONE: // 18. 麦克风状态(2022-02-08新增)
+ SudMGPMGState.MGCommonSelfMicrophone mgCommonSelfMicrophone = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfMicrophone.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonSelfMicrophone(handle, mgCommonSelfMicrophone);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_HEADPHONE: // 19. 耳机(听筒,扬声器)状态(2022-02-08新增)
+ SudMGPMGState.MGCommonSelfHeadphone mgCommonSelfHeadphone = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfHeadphone.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonSelfHeadphone(handle, mgCommonSelfHeadphone);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_APP_COMMON_SELF_X_RESP: // 20. App通用状态操作结果错误码(2022-05-10新增)
+ SudMGPMGState.MGCommonAPPCommonSelfXResp mgCommonAPPCommonSelfXResp = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonAPPCommonSelfXResp.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonAPPCommonSelfXResp(handle, mgCommonAPPCommonSelfXResp);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_ADD_AI_PLAYERS: // 21. 游戏通知app层添加陪玩机器人是否成功(2022-05-17新增)
+ SudMGPMGState.MGCommonGameAddAIPlayers mgCommonGameAddAIPlayers = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameAddAIPlayers.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameAddAIPlayers(handle, mgCommonGameAddAIPlayers);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_NETWORK_STATE: // 22. 游戏通知app层添当前网络连接状态(2022-06-21新增)
+ SudMGPMGState.MGCommonGameNetworkState mgCommonGameNetworkState = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameNetworkState.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameNetworkState(handle, mgCommonGameNetworkState);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_GET_SCORE: // 23. 游戏通知app获取积分
+ SudMGPMGState.MGCommonGameGetScore mgCommonGameScore = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameGetScore.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameGetScore(handle, mgCommonGameScore);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_SET_SCORE: // 24. 游戏通知app带入积分
+ SudMGPMGState.MGCommonGameSetScore mgCommonGameSetScore = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameSetScore.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameSetScore(handle, mgCommonGameSetScore);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_CREATE_ORDER: // 25. 创建订单
+ SudMGPMGState.MGCommonGameCreateOrder mgCommonGameCreateOrder = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameCreateOrder.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameCreateOrder(handle, mgCommonGameCreateOrder);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_PLAYER_ROLE_ID: // 26. 游戏通知app玩家角色(仅对狼人杀有效)
+ SudMGPMGState.MGCommonPlayerRoleId mgCommonPlayerRoleId = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerRoleId.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonPlayerRoleId(handle, mgCommonPlayerRoleId);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_DISCO_ACTION: // 1. 元宇宙砂砂舞指令回调
+ SudMGPMGState.MGCommonGameDiscoAction mgCommonGameDiscoAction = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameDiscoAction.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameDiscoAction(handle, mgCommonGameDiscoAction);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_DISCO_ACTION_END: // 2. 元宇宙砂砂舞指令动作结束通知
+ SudMGPMGState.MGCommonGameDiscoActionEnd mgCommonGameDiscoActionEnd = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameDiscoActionEnd.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCommonGameDiscoActionEnd(handle, mgCommonGameDiscoActionEnd);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_CONFIG: // 1. 礼物配置文件(火箭)
+ SudMGPMGState.MGCustomRocketConfig mgCustomRocketConfig = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketConfig.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketConfig(handle, mgCustomRocketConfig);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_MODEL_LIST: // 2. 拥有模型列表(火箭)
+ SudMGPMGState.MGCustomRocketModelList mgCustomRocketModelList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketModelList.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketModelList(handle, mgCustomRocketModelList);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_COMPONENT_LIST: // 3. 拥有组件列表(火箭)
+ SudMGPMGState.MGCustomRocketComponentList mgCustomRocketComponentList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketComponentList.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketComponentList(handle, mgCustomRocketComponentList);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_USER_INFO: // 4. 获取用户信息(火箭)
+ SudMGPMGState.MGCustomRocketUserInfo mgCustomRocketUserInfo = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketUserInfo.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketUserInfo(handle, mgCustomRocketUserInfo);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_ORDER_RECORD_LIST: // 5. 订单记录列表(火箭)
+ SudMGPMGState.MGCustomRocketOrderRecordList mgCustomRocketOrderRecordList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketOrderRecordList.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketOrderRecordList(handle, mgCustomRocketOrderRecordList);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_ROOM_RECORD_LIST: // 6. 展馆内列表(火箭)
+ SudMGPMGState.MGCustomRocketRoomRecordList mgCustomRocketRoomRecordList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketRoomRecordList.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketRoomRecordList(handle, mgCustomRocketRoomRecordList);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_USER_RECORD_LIST: // 7. 展馆内玩家送出记录(火箭)
+ SudMGPMGState.MGCustomRocketUserRecordList mgCustomRocketUserRecordList = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketUserRecordList.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketUserRecordList(handle, mgCustomRocketUserRecordList);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_SET_DEFAULT_MODEL: // 8. 设置默认模型(火箭)
+ SudMGPMGState.MGCustomRocketSetDefaultModel mgCustomRocketSetDefaultSeat = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketSetDefaultModel.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketSetDefaultModel(handle, mgCustomRocketSetDefaultSeat);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_DYNAMIC_FIRE_PRICE: // 9. 动态计算一键发送价格(火箭)
+ SudMGPMGState.MGCustomRocketDynamicFirePrice mgCustomRocketDynamicFirePrice = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketDynamicFirePrice.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketDynamicFirePrice(handle, mgCustomRocketDynamicFirePrice);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_FIRE_MODEL: // 10. 一键发送(火箭)
+ SudMGPMGState.MGCustomRocketFireModel mGCustomRocketFireModel = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketFireModel.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketFireModel(handle, mGCustomRocketFireModel);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_CREATE_MODEL: // 11. 新组装模型(火箭)
+ SudMGPMGState.MGCustomRocketCreateModel mgCustomRocketCreateModel = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketCreateModel.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketCreateModel(handle, mgCustomRocketCreateModel);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_REPLACE_COMPONENT: // 12. 模型更换组件(火箭)
+ SudMGPMGState.MGCustomRocketReplaceComponent mgCustomRocketReplaceComponent = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketReplaceComponent.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketReplaceComponent(handle, mgCustomRocketReplaceComponent);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_BUY_COMPONENT: // 13. 购买组件(火箭)
+ SudMGPMGState.MGCustomRocketBuyComponent mgCustomRocketBuyComponent = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketBuyComponent.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketBuyComponent(handle, mgCustomRocketBuyComponent);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_PLAY_EFFECT_START: // 14. 播放效果开始(火箭)
+ SudMGPMGState.MGCustomRocketPlayEffectStart mgCustomRocketPlayEffectStart = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketPlayEffectStart.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketPlayEffectStart(handle, mgCustomRocketPlayEffectStart);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_PLAY_EFFECT_FINISH: // 15. 播放效果完成(火箭)
+ SudMGPMGState.MGCustomRocketPlayEffectFinish mgCustomRocketPlayEffectFinish = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketPlayEffectFinish.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketPlayEffectFinish(handle, mgCustomRocketPlayEffectFinish);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_VERIFY_SIGN: // 16. 验证签名合规(火箭)
+ SudMGPMGState.MGCustomRocketVerifySign mgCustomRocketVerifySign = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketVerifySign.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketVerifySign(handle, mgCustomRocketVerifySign);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_UPLOAD_MODEL_ICON: // 17. 上传icon(火箭)
+ SudMGPMGState.MGCustomRocketUploadModelIcon mgCustomRocketUploadModelIcon = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketUploadModelIcon.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketUploadModelIcon(handle, mgCustomRocketUploadModelIcon);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_PREPARE_FINISH: // 18. 前期准备完成(火箭)
+ SudMGPMGState.MGCustomRocketPrepareFinish mgCustomRocketPrepareFinish = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketPrepareFinish.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketPrepareFinish(handle, mgCustomRocketPrepareFinish);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_SHOW_GAME_SCENE: // 19. 火箭主界面已显示(火箭)
+ SudMGPMGState.MGCustomRocketShowGameScene mgCustomRocketShowGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketShowGameScene.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketShowGameScene(handle, mgCustomRocketShowGameScene);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_HIDE_GAME_SCENE: // 20. 火箭主界面已隐藏(火箭)
+ SudMGPMGState.MGCustomRocketHideGameScene mgCustomRocketHideGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketHideGameScene.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketHideGameScene(handle, mgCustomRocketHideGameScene);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_CLICK_LOCK_COMPONENT: // 21. 点击锁住组件(火箭)
+ SudMGPMGState.MGCustomRocketClickLockComponent mgCustomRocketClickLockComponent = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketClickLockComponent.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketClickLockComponent(handle, mgCustomRocketClickLockComponent);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_FLY_CLICK: // 22. 火箭效果飞行点击(火箭)
+ SudMGPMGState.MGCustomRocketFlyClick mgCustomRocketFlyClick = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketFlyClick.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketFlyClick(handle, mgCustomRocketFlyClick);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_FLY_END: // 23. 火箭效果飞行结束(火箭)
+ SudMGPMGState.MGCustomRocketFlyEnd mgCustomRocketFlyEnd = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketFlyEnd.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketFlyEnd(handle, mgCustomRocketFlyEnd);
+ }
+ break;
+ case SudMGPMGState.MG_CUSTOM_ROCKET_SET_CLICK_RECT: // 24. 设置点击区域(火箭)
+ SudMGPMGState.MGCustomRocketSetClickRect mgCustomRocketSetClickRect = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCustomRocketSetClickRect.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGCustomRocketSetClickRect(handle, mgCustomRocketSetClickRect);
+ }
+ break;
+ case SudMGPMGState.MG_BASEBALL_RANKING: // 1. 查询排行榜数据(棒球)
+ SudMGPMGState.MGBaseballRanking mgBaseballRanking = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballRanking.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGBaseballRanking(handle, mgBaseballRanking);
+ }
+ break;
+ case SudMGPMGState.MG_BASEBALL_MY_RANKING: // 2. 查询我的排名(棒球)
+ SudMGPMGState.MGBaseballMyRanking mgBaseballMyRanking = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballMyRanking.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGBaseballMyRanking(handle, mgBaseballMyRanking);
+ }
+ break;
+ case SudMGPMGState.MG_BASEBALL_RANGE_INFO: // 3. 查询当前距离我的前后玩家数据(棒球)
+ SudMGPMGState.MGBaseballRangeInfo mgBaseballRangeInfo = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballRangeInfo.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGBaseballRangeInfo(handle, mgBaseballRangeInfo);
+ }
+ break;
+ case SudMGPMGState.MG_BASEBALL_SET_CLICK_RECT: // 4. 设置app提供给游戏可点击区域(棒球)
+ SudMGPMGState.MGBaseballSetClickRect mgBaseballSetClickRect = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballSetClickRect.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGBaseballSetClickRect(handle, mgBaseballSetClickRect);
+ }
+ break;
+ case SudMGPMGState.MG_BASEBALL_PREPARE_FINISH: // 5. 前期准备完成(棒球)
+ SudMGPMGState.MGBaseballPrepareFinish mgBaseballPrepareFinish = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballPrepareFinish.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGBaseballPrepareFinish(handle, mgBaseballPrepareFinish);
+ }
+ break;
+ case SudMGPMGState.MG_BASEBALL_SHOW_GAME_SCENE: // 6. 主界面已显示(棒球)
+ SudMGPMGState.MGBaseballShowGameScene mgBaseballShowGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballShowGameScene.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGBaseballShowGameScene(handle, mgBaseballShowGameScene);
+ }
+ break;
+ case SudMGPMGState.MG_BASEBALL_HIDE_GAME_SCENE: // 7. 主界面已隐藏(棒球)
+ SudMGPMGState.MGBaseballHideGameScene mgBaseballHideGameScene = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballHideGameScene.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGBaseballHideGameScene(handle, mgBaseballHideGameScene);
+ }
+ break;
+ case SudMGPMGState.MG_BASEBALL_TEXT_CONFIG: // 8. 获取文本配置数据(棒球)
+ SudMGPMGState.MGBaseballTextConfig mgBaseballTextConfig = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGBaseballTextConfig.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onGameMGBaseballTextConfig(handle, mgBaseballTextConfig);
+ }
+ break;
+ default:
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ break;
+ }
+ }
+
+ /**
+ * 游戏玩家状态变化
+ * APP接入方需要调用handle.success或handle.fail
+ *
+ * @param handle 操作
+ * @param userId 用户id
+ * @param state 状态命令
+ * @param dataJson 状态值
+ */
+ @Override
+ public void onPlayerStateChange(ISudFSMStateHandle handle, String userId, String state, String dataJson) {
+ SudFSMMGListener listener = sudFSMMGListener;
+ if (listener != null && listener.onPlayerStateChange(handle, userId, state, dataJson)) {
+ return;
+ }
+ switch (state) {
+ case SudMGPMGState.MG_COMMON_PLAYER_IN: // 1.加入状态(已修改)
+ SudMGPMGState.MGCommonPlayerIn mgCommonPlayerIn = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerIn.class);
+ sudFSMMGCache.onPlayerMGCommonPlayerIn(userId, mgCommonPlayerIn);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonPlayerIn(handle, userId, mgCommonPlayerIn);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_PLAYER_READY: // 2.准备状态(已修改)
+ SudMGPMGState.MGCommonPlayerReady mgCommonPlayerReady = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerReady.class);
+ sudFSMMGCache.onPlayerMGCommonPlayerReady(userId, mgCommonPlayerReady);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonPlayerReady(handle, userId, mgCommonPlayerReady);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_PLAYER_CAPTAIN: // 3.队长状态(已修改)
+ SudMGPMGState.MGCommonPlayerCaptain mgCommonPlayerCaptain = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerCaptain.class);
+ sudFSMMGCache.onPlayerMGCommonPlayerCaptain(userId, mgCommonPlayerCaptain);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonPlayerCaptain(handle, userId, mgCommonPlayerCaptain);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_PLAYER_PLAYING: // 4.游戏状态(已修改)
+ SudMGPMGState.MGCommonPlayerPlaying mgCommonPlayerPlaying = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerPlaying.class);
+ sudFSMMGCache.onPlayerMGCommonPlayerPlaying(userId, mgCommonPlayerPlaying);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonPlayerPlaying(handle, userId, mgCommonPlayerPlaying);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_PLAYER_ONLINE: // 5.玩家在线状态
+ SudMGPMGState.MGCommonPlayerOnline mgCommonPlayerOnline = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerOnline.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonPlayerOnline(handle, userId, mgCommonPlayerOnline);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_PLAYER_CHANGE_SEAT: // 6.玩家换游戏位状态
+ SudMGPMGState.MGCommonPlayerChangeSeat mgCommonPlayerChangeSeat = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonPlayerChangeSeat.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonPlayerChangeSeat(handle, userId, mgCommonPlayerChangeSeat);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_CLICK_GAME_PLAYER_ICON: // 7. 游戏通知app点击玩家头像
+ SudMGPMGState.MGCommonSelfClickGamePlayerIcon mgCommonSelfClickGamePlayerIcon = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfClickGamePlayerIcon.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonSelfClickGamePlayerIcon(handle, userId, mgCommonSelfClickGamePlayerIcon);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_DIE_STATUS: // 8. 游戏通知app玩家死亡状态(2022-04-24新增)
+ SudMGPMGState.MGCommonSelfDieStatus mgCommonSelfDieStatus = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfDieStatus.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonSelfDieStatus(handle, userId, mgCommonSelfDieStatus);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_TURN_STATUS: // 9. 游戏通知app轮到玩家出手状态(2022-04-24新增)
+ SudMGPMGState.MGCommonSelfTurnStatus mgCommonSelfTurnStatus = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfTurnStatus.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonSelfTurnStatus(handle, userId, mgCommonSelfTurnStatus);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_SELECT_STATUS: // 10. 游戏通知app玩家选择状态(2022-04-24新增)
+ SudMGPMGState.MGCommonSelfSelectStatus mgCommonSelfSelectStatus = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfSelectStatus.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonSelfSelectStatus(handle, userId, mgCommonSelfSelectStatus);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_GAME_COUNTDOWN_TIME: // 11. 游戏通知app层当前游戏剩余时间(2022-05-23新增,目前UMO生效)
+ SudMGPMGState.MGCommonGameCountdownTime mgCommonGameCountdownTime = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonGameCountdownTime.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonGameCountdownTime(handle, userId, mgCommonGameCountdownTime);
+ }
+ break;
+ case SudMGPMGState.MG_COMMON_SELF_OB_STATUS: // 12. 游戏通知app层当前玩家死亡后变成ob视角(2022-08-23新增,目前狼人杀生效)
+ SudMGPMGState.MGCommonSelfObStatus mgCommonSelfObStatus = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGCommonSelfObStatus.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGCommonSelfObStatus(handle, userId, mgCommonSelfObStatus);
+ }
+ break;
+ case SudMGPMGState.MG_DG_SELECTING: // 1. 选词中状态(已修改)
+ SudMGPMGState.MGDGSelecting mgdgSelecting = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGDGSelecting.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGDGSelecting(handle, userId, mgdgSelecting);
+ }
+ break;
+ case SudMGPMGState.MG_DG_PAINTING: // 2. 作画中状态(已修改)
+ SudMGPMGState.MGDGPainting mgdgPainting = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGDGPainting.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGDGPainting(handle, userId, mgdgPainting);
+ }
+ break;
+ case SudMGPMGState.MG_DG_ERRORANSWER: // 3. 显示错误答案状态(已修改)
+ SudMGPMGState.MGDGErroranswer mgdgErroranswer = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGDGErroranswer.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGDGErroranswer(handle, userId, mgdgErroranswer);
+ }
+ break;
+ case SudMGPMGState.MG_DG_TOTALSCORE: // 4. 显示总积分状态(已修改)
+ SudMGPMGState.MGDGTotalscore mgdgTotalscore = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGDGTotalscore.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGDGTotalscore(handle, userId, mgdgTotalscore);
+ }
+ break;
+ case SudMGPMGState.MG_DG_SCORE: // 5. 本次获得积分状态(已修改)
+ SudMGPMGState.MGDGScore mgdgScore = SudJsonUtils.fromJson(dataJson, SudMGPMGState.MGDGScore.class);
+ if (listener == null) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ } else {
+ listener.onPlayerMGDGScore(handle, userId, mgdgScore);
+ }
+ break;
+ default:
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ break;
+ }
+ }
+
+ /** 获取队长userId */
+ public String getCaptainUserId() {
+ return sudFSMMGCache.getCaptainUserId();
+ }
+
+ // 返回该玩家是否正在游戏中
+ public boolean playerIsPlaying(String userId) {
+ return sudFSMMGCache.playerIsPlaying(userId);
+ }
+
+ // 返回该玩家是否已准备
+ public boolean playerIsReady(String userId) {
+ return sudFSMMGCache.playerIsReady(userId);
+ }
+
+ // 返回该玩家是否已加入了游戏
+ public boolean playerIsIn(String userId) {
+ return sudFSMMGCache.playerIsIn(userId);
+ }
+
+ // 获取当前游戏中的人数
+ public int getPlayerInNumber() {
+ return sudFSMMGCache.getPlayerInNumber();
+ }
+
+ // 是否数字炸弹
+ public boolean isHitBomb() {
+ return sudFSMMGCache.isHitBomb();
+ }
+
+ // 销毁游戏
+ public void destroyMG() {
+ sudFSMMGCache.destroyMG();
+ }
+
+ /**
+ * 返回当前游戏的状态,数值参数{@link SudMGPMGState.MGCommonGameState}
+ */
+ public int getGameState() {
+ return sudFSMMGCache.getGameState();
+ }
+
+ /** 获取缓存的状态 */
+ public SudFSMMGCache getSudFSMMGCache() {
+ return sudFSMMGCache;
+ }
+
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSMMGListener.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSMMGListener.java
new file mode 100644
index 0000000..d3bc69e
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSMMGListener.java
@@ -0,0 +1,740 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.decorator;
+
+import tech.sud.mgp.SudMGPWrapper.state.SudMGPMGState;
+import tech.sud.mgp.SudMGPWrapper.utils.ISudFSMStateHandleUtils;
+import tech.sud.mgp.core.ISudFSMStateHandle;
+
+/**
+ * {@link SudFSMMGDecorator} 回调定义
+ */
+public interface SudFSMMGListener {
+
+ /**
+ * 游戏日志
+ * 最低版本:v1.1.30.xx
+ */
+ default void onGameLog(String str) {
+ }
+
+ /**
+ * 游戏加载进度
+ *
+ * @param stage 阶段:start=1,loading=2,end=3
+ * @param retCode 错误码:0成功
+ * @param progress 进度:[0, 100]
+ */
+ default void onGameLoadingProgress(int stage, int retCode, int progress) {
+ }
+
+ /**
+ * 游戏开始,需要实现
+ * 最低版本:v1.1.30.xx
+ */
+ void onGameStarted();
+
+ /**
+ * 游戏销毁,需要实现
+ * 最低版本:v1.1.30.xx
+ */
+ void onGameDestroyed();
+
+ /**
+ * Code过期,需要实现
+ * APP接入方需要调用handle.success或handle.fail
+ *
+ * @param dataJson {"code":"value"}
+ */
+ void onExpireCode(ISudFSMStateHandle handle, String dataJson);
+
+ /**
+ * 获取游戏View信息,需要实现
+ * APP接入方需要调用handle.success或handle.fail
+ *
+ * @param handle
+ * @param dataJson {}
+ */
+ void onGetGameViewInfo(ISudFSMStateHandle handle, String dataJson);
+
+ /**
+ * 获取游戏Config,需要实现
+ * APP接入方需要调用handle.success或handle.fail
+ *
+ * @param handle
+ * @param dataJson {}
+ * 最低版本:v1.1.30.xx
+ */
+ void onGetGameCfg(ISudFSMStateHandle handle, String dataJson);
+
+ // region 游戏回调APP 通用状态
+ // 参考文档:https://github.com/SudTechnology/sud-mgp-doc/blob/main/Client/MG%20FSM/%E9%80%9A%E7%94%A8%E7%8A%B6%E6%80%81-%E7%8E%A9%E5%AE%B6.md
+
+ /**
+ * 1.游戏公屏消息
+ * mg_common_public_message
+ */
+ default void onGameMGCommonPublicMessage(ISudFSMStateHandle handle, SudMGPMGState.MGCommonPublicMessage model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 2. 关键词状态
+ * mg_common_key_word_to_hit
+ */
+ default void onGameMGCommonKeyWordToHit(ISudFSMStateHandle handle, SudMGPMGState.MGCommonKeyWordToHit model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 3. 游戏结算状态
+ * mg_common_game_settle
+ */
+ default void onGameMGCommonGameSettle(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSettle model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 4. 加入游戏按钮点击状态
+ * mg_common_self_click_join_btn
+ */
+ default void onGameMGCommonSelfClickJoinBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickJoinBtn model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 5. 取消加入(退出)游戏按钮点击状态
+ * mg_common_self_click_cancel_join_btn
+ */
+ default void onGameMGCommonSelfClickCancelJoinBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickCancelJoinBtn model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 6. 准备按钮点击状态
+ * mg_common_self_click_ready_btn
+ */
+ default void onGameMGCommonSelfClickReadyBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickReadyBtn model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 7. 取消准备按钮点击状态
+ * mg_common_self_click_cancel_ready_btn
+ */
+ default void onGameMGCommonSelfClickCancelReadyBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickCancelReadyBtn model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 8. 开始游戏按钮点击状态
+ * mg_common_self_click_start_btn
+ */
+ default void onGameMGCommonSelfClickStartBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickStartBtn model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 9. 分享按钮点击状态
+ * mg_common_self_click_share_btn
+ */
+ default void onGameMGCommonSelfClickShareBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickShareBtn model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 10. 游戏状态
+ * mg_common_game_state
+ */
+ default void onGameMGCommonGameState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameState model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 11. 结算界面关闭按钮点击状态(2021-12-27新增)
+ * mg_common_self_click_game_settle_close_btn
+ */
+ default void onGameMGCommonSelfClickGameSettleCloseBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickGameSettleCloseBtn model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 12. 结算界面再来一局按钮点击状态(2021-12-27新增)
+ * mg_common_self_click_game_settle_again_btn
+ */
+ default void onGameMGCommonSelfClickGameSettleAgainBtn(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfClickGameSettleAgainBtn model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 13. 游戏上报游戏中的声音列表(2021-12-30新增,现在只支持碰碰我最强)
+ * mg_common_game_sound_list
+ */
+ default void onGameMGCommonGameSoundList(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSoundList model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 14. 游通知app层播放声音(2021-12-30新增,现在只支持碰碰我最强)
+ * mg_common_game_sound
+ */
+ default void onGameMGCommonGameSound(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSound model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 15. 游戏通知app层播放背景音乐状态(2022-01-07新增,现在只支持碰碰我最强)
+ * mg_common_game_bg_music_state
+ */
+ default void onGameMGCommonGameBgMusicState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameBgMusicState model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 16. 游戏通知app层播放音效的状态(2022-01-07新增,现在只支持碰碰我最强)
+ * mg_common_game_sound_state
+ */
+ default void onGameMGCommonGameSoundState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSoundState model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 17. ASR状态(开启和关闭语音识别状态,v1.1.45.xx 版本新增)
+ * mg_common_game_asr
+ */
+ default void onGameMGCommonGameASR(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameASR model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 18. 麦克风状态(2022-02-08新增)
+ * mg_common_self_microphone
+ */
+ default void onGameMGCommonSelfMicrophone(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfMicrophone model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 19. 耳机(听筒,扬声器)状态(2022-02-08新增)
+ * mg_common_self_headphone
+ */
+ default void onGameMGCommonSelfHeadphone(ISudFSMStateHandle handle, SudMGPMGState.MGCommonSelfHeadphone model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 20. App通用状态操作结果错误码(2022-05-10新增)
+ * mg_common_app_common_self_x_resp
+ */
+ default void onGameMGCommonAPPCommonSelfXResp(ISudFSMStateHandle handle, SudMGPMGState.MGCommonAPPCommonSelfXResp model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 21. 游戏通知app层添加陪玩机器人是否成功(2022-05-17新增)
+ * mg_common_game_add_ai_players
+ */
+ default void onGameMGCommonGameAddAIPlayers(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameAddAIPlayers model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 22. 游戏通知app层添当前网络连接状态(2022-06-21新增)
+ * mg_common_game_network_state
+ */
+ default void onGameMGCommonGameNetworkState(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameNetworkState model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 23. 游戏通知app获取积分
+ * mg_common_game_score
+ */
+ default void onGameMGCommonGameGetScore(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameGetScore model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 24. 游戏通知app带入积分
+ * mg_common_game_set_score
+ */
+ default void onGameMGCommonGameSetScore(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameSetScore model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 25. 创建订单
+ * mg_common_game_create_order
+ */
+ default void onGameMGCommonGameCreateOrder(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameCreateOrder model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 26. 游戏通知app玩家角色(仅对狼人杀有效)
+ * mg_common_player_role_id
+ */
+ default void onGameMGCommonPlayerRoleId(ISudFSMStateHandle handle, SudMGPMGState.MGCommonPlayerRoleId model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+ // endregion 游戏回调APP 通用状态
+
+ // region 游戏回调APP 玩家状态
+
+ /**
+ * 1.加入状态(已修改)
+ * mg_common_player_in
+ */
+ default void onPlayerMGCommonPlayerIn(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerIn model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 2.准备状态(已修改)
+ * mg_common_player_ready
+ */
+ default void onPlayerMGCommonPlayerReady(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerReady model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 3.队长状态(已修改)
+ * mg_common_player_captain
+ */
+ default void onPlayerMGCommonPlayerCaptain(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerCaptain model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 4.游戏状态(已修改)
+ * mg_common_player_playing
+ */
+ default void onPlayerMGCommonPlayerPlaying(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerPlaying model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 5.玩家在线状态
+ * mg_common_player_online
+ */
+ default void onPlayerMGCommonPlayerOnline(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerOnline model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 6.玩家换游戏位状态
+ * mg_common_player_change_seat
+ */
+ default void onPlayerMGCommonPlayerChangeSeat(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonPlayerChangeSeat model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 7. 游戏通知app点击玩家头像
+ * mg_common_self_click_game_player_icon
+ */
+ default void onPlayerMGCommonSelfClickGamePlayerIcon(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfClickGamePlayerIcon model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 8. 游戏通知app玩家死亡状态(2022-04-24新增)
+ * mg_common_self_die_status
+ */
+ default void onPlayerMGCommonSelfDieStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfDieStatus model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 9. 游戏通知app轮到玩家出手状态(2022-04-24新增)
+ * mg_common_self_turn_status
+ */
+ default void onPlayerMGCommonSelfTurnStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfTurnStatus model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 10. 游戏通知app玩家选择状态(2022-04-24新增)
+ * mg_common_self_select_status
+ */
+ default void onPlayerMGCommonSelfSelectStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfSelectStatus model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 11. 游戏通知app层当前游戏剩余时间(2022-05-23新增,目前UMO生效)
+ * mg_common_game_countdown_time
+ */
+ default void onPlayerMGCommonGameCountdownTime(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonGameCountdownTime model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 12. 游戏通知app层当前玩家死亡后变成ob视角(2022-08-23新增,目前狼人杀生效)
+ * mg_common_self_ob_status
+ */
+ default void onPlayerMGCommonSelfObStatus(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGCommonSelfObStatus model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ // endregion 游戏回调APP 玩家状态
+
+ // region 游戏回调APP 玩家状态 你画我猜
+ // 参考文档:https://github.com/SudTechnology/sud-mgp-doc/blob/main/Client/MG%20FSM/%E4%BD%A0%E7%94%BB%E6%88%91%E7%8C%9C.md
+
+ /**
+ * 1. 选词中状态(已修改)
+ * mg_dg_selecting
+ */
+ default void onPlayerMGDGSelecting(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGSelecting model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 2. 作画中状态(已修改)
+ * mg_dg_painting
+ */
+ default void onPlayerMGDGPainting(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGPainting model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 3. 显示错误答案状态(已修改)
+ * mg_dg_erroranswer
+ */
+ default void onPlayerMGDGErroranswer(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGErroranswer model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 4. 显示总积分状态(已修改)
+ * mg_dg_totalscore
+ */
+ default void onPlayerMGDGTotalscore(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGTotalscore model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 5. 本次获得积分状态(已修改)
+ * mg_dg_score
+ */
+ default void onPlayerMGDGScore(ISudFSMStateHandle handle, String userId, SudMGPMGState.MGDGScore model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ // endregion 游戏回调APP 玩家状态 你画我猜
+
+ // region 游戏回调APP 通用状态 元宇宙砂砂舞
+
+ /**
+ * 1. 元宇宙砂砂舞指令回调
+ * mg_common_game_disco_action
+ */
+ default void onGameMGCommonGameDiscoAction(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameDiscoAction model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 2. 元宇宙砂砂舞指令动作结束通知
+ * mg_common_game_disco_action_end
+ */
+ default void onGameMGCommonGameDiscoActionEnd(ISudFSMStateHandle handle, SudMGPMGState.MGCommonGameDiscoActionEnd model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+ // endregion 游戏回调APP 通用状态 元宇宙砂砂舞
+
+ // region 游戏回调APP 通用状态 定制火箭
+
+ /**
+ * 1. 礼物配置文件(火箭)
+ * mg_custom_rocket_config
+ */
+ default void onGameMGCustomRocketConfig(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketConfig model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 2. 拥有模型列表(火箭)
+ * mg_custom_rocket_model_list
+ */
+ default void onGameMGCustomRocketModelList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketModelList model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 3. 拥有组件列表(火箭)
+ * mg_custom_rocket_component_list
+ */
+ default void onGameMGCustomRocketComponentList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketComponentList model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 4. 获取用户信息(火箭)
+ * mg_custom_rocket_user_info
+ */
+ default void onGameMGCustomRocketUserInfo(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketUserInfo model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 5. 订单记录列表(火箭)
+ * mg_custom_rocket_order_record_list
+ */
+ default void onGameMGCustomRocketOrderRecordList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketOrderRecordList model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 6. 展馆内列表(火箭)
+ * mg_custom_rocket_room_record_list
+ */
+ default void onGameMGCustomRocketRoomRecordList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketRoomRecordList model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 7. 展馆内玩家送出记录(火箭)
+ * mg_custom_rocket_user_record_list
+ */
+ default void onGameMGCustomRocketUserRecordList(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketUserRecordList model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 8. 设置默认模型(火箭)
+ * mg_custom_rocket_set_default_model
+ */
+ default void onGameMGCustomRocketSetDefaultModel(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketSetDefaultModel model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 9. 动态计算一键发送价格(火箭)
+ * mg_custom_rocket_dynamic_fire_price
+ */
+ default void onGameMGCustomRocketDynamicFirePrice(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketDynamicFirePrice model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 10. 一键发送(火箭)
+ * mg_custom_rocket_fire_model
+ */
+ default void onGameMGCustomRocketFireModel(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketFireModel model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 11. 新组装模型(火箭)
+ * mg_custom_rocket_create_model
+ */
+ default void onGameMGCustomRocketCreateModel(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketCreateModel model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 12. 模型更换组件(火箭)
+ * mg_custom_rocket_replace_component
+ */
+ default void onGameMGCustomRocketReplaceComponent(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketReplaceComponent model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 13. 购买组件(火箭)
+ * mg_custom_rocket_buy_component
+ */
+ default void onGameMGCustomRocketBuyComponent(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketBuyComponent model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 14. 播放效果开始(火箭)
+ * mg_custom_rocket_play_effect_start
+ */
+ default void onGameMGCustomRocketPlayEffectStart(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketPlayEffectStart model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 15. 播放效果完成(火箭)
+ * mg_custom_rocket_play_effect_finish
+ */
+ default void onGameMGCustomRocketPlayEffectFinish(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketPlayEffectFinish model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 16. 验证签名合规(火箭)
+ * mg_custom_rocket_verify_sign
+ */
+ default void onGameMGCustomRocketVerifySign(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketVerifySign model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 17. 上传icon(火箭)
+ * mg_custom_rocket_upload_model_icon
+ */
+ default void onGameMGCustomRocketUploadModelIcon(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketUploadModelIcon model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 18. 前期准备完成(火箭)
+ * mg_custom_rocket_prepare_finish
+ */
+ default void onGameMGCustomRocketPrepareFinish(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketPrepareFinish model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 19. 火箭主界面已显示(火箭)
+ * mg_custom_rocket_show_game_scene
+ */
+ default void onGameMGCustomRocketShowGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketShowGameScene model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 20. 火箭主界面已隐藏(火箭)
+ * mg_custom_rocket_hide_game_scene
+ */
+ default void onGameMGCustomRocketHideGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketHideGameScene model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 21. 点击锁住组件(火箭)
+ * mg_custom_rocket_click_lock_component
+ */
+ default void onGameMGCustomRocketClickLockComponent(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketClickLockComponent model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 22. 火箭效果飞行点击(火箭)
+ * mg_custom_rocket_fly_click
+ */
+ default void onGameMGCustomRocketFlyClick(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketFlyClick model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 23. 火箭效果飞行结束(火箭)
+ * mg_custom_rocket_fly_end
+ */
+ default void onGameMGCustomRocketFlyEnd(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketFlyEnd model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 24. 设置点击区域(火箭)
+ * mg_custom_rocket_set_click_rect
+ */
+ default void onGameMGCustomRocketSetClickRect(ISudFSMStateHandle handle, SudMGPMGState.MGCustomRocketSetClickRect model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+ // endregion 游戏回调APP 通用状态 定制火箭
+
+ // region 游戏回调APP 通用状态 棒球
+
+ /**
+ * 1. 查询排行榜数据(棒球)
+ * mg_baseball_ranking
+ */
+ default void onGameMGBaseballRanking(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballRanking model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 2. 查询我的排名(棒球)
+ * mg_baseball_my_ranking
+ */
+ default void onGameMGBaseballMyRanking(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballMyRanking model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 3. 查询当前距离我的前后玩家数据(棒球)
+ * mg_baseball_range_info
+ */
+ default void onGameMGBaseballRangeInfo(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballRangeInfo model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 4. 设置app提供给游戏可点击区域(棒球)
+ * mg_baseball_set_click_rect
+ */
+ default void onGameMGBaseballSetClickRect(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballSetClickRect model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 5. 前期准备完成(棒球)
+ * mg_baseball_prepare_finish
+ */
+ default void onGameMGBaseballPrepareFinish(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballPrepareFinish model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 6. 主界面已显示(棒球)
+ * mg_baseball_show_game_scene
+ */
+ default void onGameMGBaseballShowGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballShowGameScene model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 7. 主界面已隐藏(棒球)
+ * mg_baseball_hide_game_scene
+ */
+ default void onGameMGBaseballHideGameScene(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballHideGameScene model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+
+ /**
+ * 8. 获取文本配置数据(棒球)
+ * mg_baseball_text_config
+ */
+ default void onGameMGBaseballTextConfig(ISudFSMStateHandle handle, SudMGPMGState.MGBaseballTextConfig model) {
+ ISudFSMStateHandleUtils.handleSuccess(handle);
+ }
+ // endregion 游戏回调APP 通用状态 棒球
+
+ /**
+ * 游戏状态变化
+ * 透传游戏向App发送的游戏通用状态消息
+ * **********使用此方法可先看下此方法的使用逻辑*************
+ *
+ * @param handle 回调操作
+ * @param state 状态命令
+ * @param dataJson 状态值
+ * @return 返回true,表示由此方法接管该状态处理,此时需注意调用:ISudFSMStateHandleUtils.handleSuccess(handle);
+ */
+ default boolean onGameStateChange(ISudFSMStateHandle handle, String state, String dataJson) {
+ return false;
+ }
+
+ /**
+ * 游戏玩家状态变化
+ * 透传游戏向App发送的玩家状态变化
+ * **********使用此方法可先看下此方法的使用逻辑*************
+ *
+ * @param handle 回调操作
+ * @param userId 用户Id
+ * @param state 状态命令
+ * @param dataJson 状态值
+ * @return 返回true,表示由此方法接管该状态处理,此时需注意调用:ISudFSMStateHandleUtils.handleSuccess(handle);
+ */
+ default boolean onPlayerStateChange(ISudFSMStateHandle handle, String userId, String state, String dataJson) {
+ return false;
+ }
+
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSTAPPDecorator.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSTAPPDecorator.java
new file mode 100644
index 0000000..7d3c399
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/decorator/SudFSTAPPDecorator.java
@@ -0,0 +1,446 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.decorator;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+
+import tech.sud.mgp.SudMGPWrapper.state.SudMGPAPPState;
+import tech.sud.mgp.SudMGPWrapper.utils.SudJsonUtils;
+import tech.sud.mgp.core.ISudFSTAPP;
+import tech.sud.mgp.core.ISudListenerNotifyStateChange;
+
+/**
+ * ISudFSTAPP的装饰类,接近于业务
+ * 参考文档:https://docs.sud.tech/zh-CN/app/Client/API/ISudFSTAPP.html
+ * 注意:
+ * 1,向游戏侧发送状态之后,不能立即调用destroyMG()方法,也不能立即finish Activity。例如:{@link SudFSTAPPDecorator#notifyAPPCommonSelfEnd()}
+ */
+public class SudFSTAPPDecorator {
+
+ /**
+ * APP调用游戏的接口
+ */
+ private ISudFSTAPP iSudFSTAPP;
+
+ /**
+ * 设置app调用sdk的对象
+ *
+ * @param iSudFSTAPP
+ */
+ public void setISudFSTAPP(ISudFSTAPP iSudFSTAPP) {
+ this.iSudFSTAPP = iSudFSTAPP;
+ }
+
+ // region 状态通知,ISudFSTAPP.notifyStateChange
+
+ /**
+ * 发送
+ * 1. 加入状态
+ *
+ * @param isIn true 加入游戏,false 退出游戏
+ * @param seatIndex 加入的游戏位(座位号) 默认传seatIndex = -1 随机加入,seatIndex 从0开始,不可大于座位数
+ * @param isSeatRandom 默认为ture, 带有游戏位(座位号)的时候,如果游戏位(座位号)已经被占用,是否随机分配一个空位坐下 isSeatRandom=true 随机分配空位坐下,isSeatRandom=false 不随机分配
+ * @param teamId 不支持分队的游戏:数值填1;支持分队的游戏:数值填1或2(两支队伍);
+ */
+ public void notifyAPPCommonSelfIn(boolean isIn, int seatIndex, boolean isSeatRandom, int teamId) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonSelfIn state = new SudMGPAPPState.APPCommonSelfIn();
+ state.isIn = isIn;
+ state.seatIndex = seatIndex;
+ state.isSeatRandom = isSeatRandom;
+ state.teamId = teamId;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_IN, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 2. 准备状态
+ * 用户(本人)准备/取消准备
+ *
+ * @param isReady true 准备,false 取消准备
+ */
+ public void notifyAPPCommonSelfReady(boolean isReady) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonSelfReady state = new SudMGPAPPState.APPCommonSelfReady();
+ state.isReady = isReady;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_READY, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 3. 游戏状态 模型
+ * 用户游戏状态,如果用户在游戏中,建议:
+ * a.空出屏幕中心区:
+ * 关闭全屏礼物特效;
+ * b.部分强操作类小游戏(spaceMax为true),尽量收缩原生UI,给游戏留出尽量大的操作空间:
+ * 收缩公屏;
+ * 收缩麦位;
+ * 如果不在游戏中,则恢复。
+ *
+ * @param isPlaying true 开始游戏,false 结束游戏
+ * @param reportGameInfoExtras string类型,Https服务回调report_game_info参数,最大长度1024字节,超过则截断(2022-01-21)
+ */
+ public void notifyAPPCommonSelfPlaying(boolean isPlaying, String reportGameInfoExtras, String reportGameInfoKey) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonSelfPlaying state = new SudMGPAPPState.APPCommonSelfPlaying();
+ state.isPlaying = isPlaying;
+ state.reportGameInfoExtras = reportGameInfoExtras;
+ state.reportGameInfoKey = reportGameInfoKey;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_PLAYING, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 4. 队长状态
+ * 用户是否为队长,队长在游戏中会有开始游戏的权利。
+ * 发送此状态后,会把队长身份转移到另一名用户身上。
+ * 注意:必须是队长发送才有效果。可通过{@link SudFSMMGDecorator#getCaptainUserId()}拿到当前队长id
+ *
+ * @param curCaptainUID 必填,指定队长uid
+ */
+ public void notifyAPPCommonSelfCaptain(String curCaptainUID) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonSelfCaptain state = new SudMGPAPPState.APPCommonSelfCaptain();
+ state.curCaptainUID = curCaptainUID;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_CAPTAIN, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 5. 踢人
+ * 用户(本人,队长)踢其他玩家;
+ * 队长才能踢人;
+ *
+ * @param kickedUID 被踢用户uid
+ */
+ public void notifyAPPCommonSelfKick(String kickedUID) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonSelfKick state = new SudMGPAPPState.APPCommonSelfKick();
+ state.kickedUID = kickedUID;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_KICK, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 6. 结束游戏
+ * 用户(本人,队长)结束(本局)游戏
+ * 注意:必须是队长发送才有效果。可通过{@link SudFSMMGDecorator#getCaptainUserId()}拿到当前队长id
+ */
+ public void notifyAPPCommonSelfEnd() {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonSelfEnd state = new SudMGPAPPState.APPCommonSelfEnd();
+ // 使用iSudFSTAPP.notifyStateChange方法向游戏侧发送状态时,因为大部分状态都需要通过网络向后端发送状态指令
+ // 所以如果发送状态后,马上就销毁游戏或者Activity,那么状态指令大概率会不生效
+ // *** 如果要确保指令能到达后端,那么发送指令后不要立即destroyMG()或finish Activity,可在发送后delay一定时间(如300 or 500 ms)再销毁
+ // *** 如果不在乎指令是否能成功到达,可忽略delay
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_END, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 9. 麦克风状态
+ * 用户(本人)麦克风状态,建议:
+ * 进入房间后初始通知一次;
+ * 每次变更(开麦/闭麦/禁麦/解麦)通知一次;
+ *
+ * @param isOn true 开麦,false 闭麦
+ * @param isDisabled true 被禁麦,false 未被禁麦
+ */
+ public void notifyAPPCommonSelfMicrophone(boolean isOn, boolean isDisabled) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonSelfMicrophone state = new SudMGPAPPState.APPCommonSelfMicrophone();
+ state.isOn = isOn;
+ state.isDisabled = isDisabled;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_MICROPHONE, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 10. 文字命中状态
+ * 用户(本人)聊天信息命中关键词状态,建议:
+ * 精确匹配;
+ * 首次聊天内容命中关键词之后,后续聊天内容不翻转成未命中;
+ * 直至小游戏侧关键词更新,再将状态翻转为未命中;
+ *
+ * @param isHit true 命中,false 未命中
+ * @param keyWord 单个关键词, 兼容老版本
+ * @param text 返回转写文本
+ * @param wordType text:文本包含匹配; number:数字等于匹配
+ * @param keyWordList 命中关键词,可以包含多个关键词
+ * @param numberList 在number模式下才有,返回转写的多个数字
+ */
+ public void notifyAPPCommonSelfTextHitState(boolean isHit, String keyWord, String text,
+ String wordType, List keyWordList, List numberList) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonSelfTextHitState state = new SudMGPAPPState.APPCommonSelfTextHitState();
+ state.isHit = isHit;
+ state.keyWord = keyWord;
+ state.text = text;
+ state.wordType = wordType;
+ state.keyWordList = keyWordList;
+ state.numberList = numberList;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_SELF_TEXT_HIT, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 11. 打开或关闭背景音乐(2021-12-27新增)
+ *
+ * @param isOpen true 打开背景音乐,false 关闭背景音乐
+ */
+ public void notifyAPPCommonOpenBgMusic(boolean isOpen) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonOpenBgMusic state = new SudMGPAPPState.APPCommonOpenBgMusic();
+ state.isOpen = isOpen;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_OPEN_BG_MUSIC, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 12. 打开或关闭音效(2021-12-27新增)
+ *
+ * @param isOpen true 打开音效,false 关闭音效
+ */
+ public void notifyAPPCommonOpenSound(boolean isOpen) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonOpenSound state = new SudMGPAPPState.APPCommonOpenSound();
+ state.isOpen = isOpen;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_OPEN_SOUND, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 13. 打开或关闭游戏中的振动效果(2021-12-27新增)
+ *
+ * @param isOpen 打开振动效果,false 关闭振动效果
+ */
+ public void notifyAPPCommonOpenVibrate(boolean isOpen) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonOpenVibrate state = new SudMGPAPPState.APPCommonOpenVibrate();
+ state.isOpen = isOpen;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_OPEN_VIBRATE, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 14. 设置游戏的音量大小(2021-12-31新增)
+ *
+ * @param volume 音量大小 0 到 100
+ */
+ public void notifyAPPCommonGameSoundVolume(int volume) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonGameSoundVolume state = new SudMGPAPPState.APPCommonGameSoundVolume();
+ state.volume = volume;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_SOUND_VOLUME, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 15. 设置游戏玩法选项(2022-05-10新增)
+ *
+ * @param ludo ludo游戏
+ */
+ public void notifyAPPCommonGameSettingSelectInfo(SudMGPAPPState.Ludo ludo) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonGameSettingSelectInfo state = new SudMGPAPPState.APPCommonGameSettingSelectInfo();
+ state.ludo = ludo;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_SETTING_SELECT_INFO, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 16. 设置游戏中的AI玩家(2022-05-11新增)
+ * 队长设置才有效
+ *
+ * @param aiPlayers AI玩家
+ * @param isReady 机器人加入后是否自动准备 1:自动准备,0:不自动准备 默认为1
+ */
+ public void notifyAPPCommonGameAddAIPlayers(List aiPlayers, int isReady) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonGameAddAIPlayers state = new SudMGPAPPState.APPCommonGameAddAIPlayers();
+ state.aiPlayers = aiPlayers;
+ state.isReady = isReady;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_ADD_AI_PLAYERS, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 17. app在收到游戏断开连接通知后,通知游戏重试连接(2022-06-21新增,暂时支持ludo)
+ */
+ public void notifyAPPCommonGameReconnect() {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonGameReconnect state = new SudMGPAPPState.APPCommonGameReconnect();
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_RECONNECT, SudJsonUtils.toJson(state), null);
+ }
+ }
+
+ /**
+ * 发送
+ * 18. app返回玩家当前积分
+ */
+ public void notifyAPPCommonGameScore(long score) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.APPCommonGameScore state = new SudMGPAPPState.APPCommonGameScore();
+ state.score = score;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_SCORE, SudJsonUtils.toJson(state), null);
+ }
+ }
+ // endregion 状态通知,ISudFSTAPP.notifyStateChange
+
+ // region 生命周期
+ public void startMG() {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ iSudFSTAPP.startMG();
+ }
+ }
+
+ public void pauseMG() {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ iSudFSTAPP.pauseMG();
+ }
+ }
+
+ public void playMG() {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ iSudFSTAPP.playMG();
+ }
+ }
+
+ public void stopMG() {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ iSudFSTAPP.stopMG();
+ }
+ }
+
+ public void destroyMG() {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ iSudFSTAPP.destroyMG();
+ }
+ }
+
+ // endregion 生命周期
+
+ /**
+ * 更新code
+ *
+ * @param code
+ * @param listener
+ */
+ public void updateCode(String code, ISudListenerNotifyStateChange listener) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ iSudFSTAPP.updateCode(code, listener);
+ }
+ }
+
+ /**
+ * 音频流数据
+ */
+ public void pushAudio(ByteBuffer buffer, int bufferLength) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ iSudFSTAPP.pushAudio(buffer, bufferLength);
+ }
+ }
+
+ // region 元宇宙砂砂舞
+
+ /**
+ * 发送
+ * 1. 元宇宙砂砂舞相关设置
+ * 参考文档:https://docs.sud.tech/zh-CN/app/Client/APPFST/CommonStateForDisco.html
+ *
+ * @param actionId 必传的参数,用于指定类型的序号,不同序号用于区分游戏内的不同功能,不传则会判断为无效指令,具体序号代表的功能见下表
+ * @param cooldown 持续时间,单位秒,部分功能有持续时间就需要传对应的数值,不传或传错则会按各自功能的默认值处理(见下表)
+ * @param isTop 是否置顶,针对部分功能可排队置顶(false:不置顶;true:置顶;默认为false)
+ * @param field1 额外参数1,针对部分功能有具体的意义
+ * @param field2 额外参数2,针对部分功能有具体的意义
+ */
+ public void notifyAppCommonGameDiscoAction(int actionId, Integer cooldown, Boolean isTop, String field1, String field2) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ SudMGPAPPState.AppCommonGameDiscoAction state = new SudMGPAPPState.AppCommonGameDiscoAction();
+ state.actionId = actionId;
+ state.cooldown = cooldown;
+ state.isTop = isTop;
+ state.field1 = field1;
+ state.field2 = field2;
+ iSudFSTAPP.notifyStateChange(SudMGPAPPState.APP_COMMON_GAME_DISCO_ACTION, SudJsonUtils.toJson(state), null);
+ }
+ }
+ // endregion 元宇宙砂砂舞
+
+ /**
+ * APP状态通知给小游戏
+ *
+ * @param state 状态标识
+ * @param dataJson 数据
+ * @param listener 回调监听
+ */
+ public void notifyStateChange(String state, String dataJson, ISudListenerNotifyStateChange listener) {
+ ISudFSTAPP iSudFSTAPP = this.iSudFSTAPP;
+ if (iSudFSTAPP != null) {
+ iSudFSTAPP.notifyStateChange(state, dataJson, listener);
+ }
+ }
+
+ /**
+ * APP状态通知给小游戏
+ *
+ * @param state 状态标识
+ * @param dataJson 数据
+ */
+ public void notifyStateChange(String state, String dataJson) {
+ notifyStateChange(state, dataJson, null);
+ }
+
+ /**
+ * APP状态通知给小游戏
+ *
+ * @param state 状态标识
+ * @param obj 数据
+ */
+ public void notifyStateChange(String state, Object obj) {
+ notifyStateChange(state, SudJsonUtils.toJson(obj), null);
+ }
+
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/model/GameConfigModel.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/model/GameConfigModel.java
new file mode 100644
index 0000000..4873804
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/model/GameConfigModel.java
@@ -0,0 +1,256 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.model;
+
+import java.io.Serializable;
+
+/**
+ * 游戏配置模型
+ * 参考文档:https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG/onGetGameCfg.html
+ */
+public class GameConfigModel implements Serializable {
+
+ public int gameMode = 1; // 游戏模式(每个游戏默认模式是1,不填是1)
+ public int gameCPU = 0; // 游戏CPU(值为0和1;0:CPU正常功耗,1:CPU低功耗;默认是0,CPU正常功耗)
+ public int gameSoundControl = 0; // 游戏中声音的播放是否被app层接管(值为0和1;0:游戏播放声音,1:app层播放声音,游戏中不播放任何声音;默认是0)
+ public int gameSoundVolume = 100; // 游戏中音量的大小(值为0到100;默认是100)
+ public GameUi ui = new GameUi(); // 对游戏ui界面的配置,可定制ui界面的显示与不显示
+
+ // 游戏配置中,ui部分
+ public static class GameUi implements Serializable {
+ public GameSettle gameSettle = new GameSettle(); // 结算界面
+ public GamePing ping = new GamePing(); // 界面中的ping值
+ public GameVersion version = new GameVersion(); // 界面中的版本信息值
+ public GameLevel level = new GameLevel(); // 大厅中的段位信息
+ public GameLobbySettingBtn lobby_setting_btn = new GameLobbySettingBtn(); // 大厅的设置按钮
+ public GameLobbyHelpBtn lobby_help_btn = new GameLobbyHelpBtn(); // 大厅的帮助按钮
+ public GameLobbyPlayers lobby_players = new GameLobbyPlayers(); // 大厅玩家展示位
+ public GameLobbyPlayerCaptainIcon lobby_player_captain_icon = new GameLobbyPlayerCaptainIcon(); // 大厅玩家展示位上队长标识
+ public GameLobbyPlayerKickoutIcon lobby_player_kickout_icon = new GameLobbyPlayerKickoutIcon(); // 大厅玩家展示位上踢人标识
+ public GameLobbyRule lobby_rule = new GameLobbyRule(); // 大厅的玩法规则描述文字
+ public GameLobbyGameSetting lobby_game_setting = new GameLobbyGameSetting(); // 玩法设置
+ public GameJoinBtn join_btn = new GameJoinBtn(); // 加入按钮
+ public GameCancelJoinBtn cancel_join_btn = new GameCancelJoinBtn(); // 取消加入按钮
+ public GameReadyBtn ready_btn = new GameReadyBtn(); // 准备按钮
+ public GameCancelReadyBtn cancel_ready_btn = new GameCancelReadyBtn(); // 取消准备按钮
+ public GameStartBtn start_btn = new GameStartBtn(); // 开始按钮
+ public GameShareBtn share_btn = new GameShareBtn(); // 分享
+ public GameSttingBtn game_setting_btn = new GameSttingBtn(); // 游戏场景中的设置按钮
+ public GameHelpBtn game_help_btn = new GameHelpBtn(); // 游戏场景中的帮助按钮
+ public GameSettleCloseBtn game_settle_close_btn = new GameSettleCloseBtn(); // 游戏结算界面中的关闭按钮
+ public GameSettleAgainBtn game_settle_again_btn = new GameSettleAgainBtn(); // 游戏结算界面中的再来一局按钮
+ public GameBg game_bg = new GameBg();// 是否隐藏背景图,包括大厅和战斗
+ public BlockChangeSeat block_change_seat = new BlockChangeSeat(); // 自定义阻止换座位
+ public GameSettingSelectPnl game_setting_select_pnl = new GameSettingSelectPnl(); // 大厅中的玩法选择设置面板
+ public GameManagedImage game_managed_image = new GameManagedImage(); // 游戏中的托管图标
+ public GameTableImage game_table_image = new GameTableImage(); // 游戏中牌桌背景图 (注:只对某些带牌桌类游戏有作用)
+ public GameCountdownTime game_countdown_time = new GameCountdownTime(); // 游戏中游戏倒计时显示 (注:现在只针对umo生效)
+ public GameSelectedTips game_selected_tips = new GameSelectedTips(); // 游戏中所选择的玩法提示文字 (注:现在只针对ludo生效)
+ public NFTAvatar nft_avatar = new NFTAvatar(); // 控制NFT头像的开关
+ public GameOpening game_opening = new GameOpening(); // 控制开场动画的开关
+ public GameMvp game_mvp = new GameMvp(); // 游戏结算前的mvp动画
+ public UmoIcon umo_icon = new UmoIcon(); // 游戏中动画和头像右上角的UMO图标
+ public Logo logo = new Logo(); // 大厅中的logo
+ public GamePlayers game_players = new GamePlayers(); // 游戏中的游戏位
+ }
+
+ // 结算界面
+ public static class GameSettle implements Serializable {
+ public boolean hide = false; // 是否隐藏结算界面(false: 显示; true: 隐藏,默认为 false)
+ }
+
+ // 界面中的ping值
+ public static class GamePing implements Serializable {
+ public boolean hide = false; // 是否隐藏ping值(false: 显示;true: 隐藏,默认为false)
+ }
+
+ // 界面中的版本信息值
+ public static class GameVersion implements Serializable {
+ public boolean hide = false; // 是否隐藏版本信息(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 大厅中的段位信息
+ public static class GameLevel implements Serializable {
+ public boolean hide = false; // 是否隐藏段位信息(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 大厅的设置按钮
+ public static class GameLobbySettingBtn implements Serializable {
+ public boolean hide = false; // 是否隐藏大厅的设置按钮(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 大厅的帮助按钮
+ public static class GameLobbyHelpBtn implements Serializable {
+ public boolean hide = false; // 是否隐藏大厅的帮助按钮(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 大厅玩家展示位
+ public static class GameLobbyPlayers implements Serializable {
+ public boolean custom = false; // 大厅玩家展示位头像点击加入(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false)
+ public boolean hide = false; // 是否隐藏大厅玩家展示位(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 大厅玩家展示位上队长标识
+ public static class GameLobbyPlayerCaptainIcon implements Serializable {
+ public boolean hide = false; // 是否隐藏大厅玩家展示位上队长标识(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 大厅玩家展示位上踢人标识
+ public static class GameLobbyPlayerKickoutIcon implements Serializable {
+ public boolean hide = false; // 是否隐藏大厅玩家展示位上踢人标识(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 大厅的玩法规则描述文字
+ public static class GameLobbyRule implements Serializable {
+ public boolean hide = false; // 是否隐藏大厅的玩法规则描述文字(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 玩法设置
+ public static class GameLobbyGameSetting implements Serializable {
+ public boolean hide = false; // 是否隐藏玩法设置(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 加入按钮
+ public static class GameJoinBtn implements Serializable {
+ public boolean custom = false; // 加入按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false)
+ public boolean hide = false; // 是否隐藏加入按钮(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 取消加入按钮
+ public static class GameCancelJoinBtn implements Serializable {
+ public boolean custom = false; // 取消加入按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false)
+ public boolean hide = false; // 是否隐藏取消加入按钮(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 准备按钮
+ public static class GameReadyBtn implements Serializable {
+ public boolean custom = false; // 准备按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false)
+ public boolean hide = false; // 是否隐藏准备按钮(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 取消准备按钮
+ public static class GameCancelReadyBtn implements Serializable {
+ public boolean custom = false; // 取消准备按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false)
+ public boolean hide = false; // 是否隐藏取消准备按钮(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 开始游戏按钮
+ public static class GameStartBtn implements Serializable {
+ public boolean custom = false; // 开始游戏按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false)
+ public boolean hide = false; // 是否隐藏开始游戏按钮(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 分享按钮
+ public static class GameShareBtn implements Serializable {
+ public boolean custom = false; // 分享按钮(false: 游戏处理逻辑; true: 游戏只通知按钮点击事件,不处理;默认为false)
+ public boolean hide = true; // 是否隐藏分享按钮(false: 显示; true: 隐藏,默认为true)
+ }
+
+ // 游戏场景中的设置按钮
+ public static class GameSttingBtn implements Serializable {
+ public boolean hide = false; // 是否隐藏游戏场景中的设置按钮(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 游戏场景中的帮助按钮
+ public static class GameHelpBtn implements Serializable {
+ public boolean hide = false; // 是否隐藏游戏场景中的帮助按钮(false: 显示; true: 隐藏,默认为false)
+ }
+
+ // 游戏结算界面中的关闭按钮
+ public static class GameSettleCloseBtn implements Serializable {
+ public boolean custom = false; // 游戏结算界面中的关闭按钮(false: 关闭结算界面返回大厅; true: 游戏通知按钮点击事件,并关闭结算界面返回大厅;默认为false)
+ }
+
+ // 游戏结算界面中的再来一局按钮
+ public static class GameSettleAgainBtn implements Serializable {
+ // 游戏结算界面中的再来一局按钮
+ // (false: 关闭结算界面返回大厅并将玩家设置为准备状态; true: 游戏通知按钮点击事件,并关闭结算界面返回大厅(不将玩家设置为准备状态);默认为false)
+ public boolean custom = false;
+
+ // 是否隐藏结算界面中的『再来一局』按钮(false: 显示; true: 隐藏,默认为false)
+ public boolean hide = false;
+ }
+
+ // 是否隐藏背景图,包括大厅和战斗
+ // !!!这里只隐藏加载完成后的背景图,加载中背景图如需隐藏则调用:{SudMGP.getCfg().setShowLoadingGameBg(false); }
+ public static class GameBg implements Serializable {
+ //(false: 显示; true: 隐藏,默认为false)
+ public boolean hide = false;
+ }
+
+ // 自定义阻止换座位
+ public static class BlockChangeSeat implements Serializable {
+ //(false: 可以换座位; true: 不可以换座位;默认为false)
+ public boolean custom = false;
+ }
+
+ // 大厅中的玩法选择设置面板
+ public static class GameSettingSelectPnl implements Serializable {
+ // 是否隐藏大厅中的玩法选择设置面板(false: 显示; true: 隐藏,默认为false)
+ public boolean hide = false;
+ }
+
+ // 游戏中的托管图标
+ public static class GameManagedImage implements Serializable {
+ // 是否隐藏游戏中的托管图标(false: 显示; true: 隐藏,默认为false)
+ public boolean hide = false;
+ }
+
+ // 游戏中牌桌背景图 (注:只对某些带牌桌类游戏有作用)
+ public static class GameTableImage implements Serializable {
+ // 是否隐藏游戏牌桌背景图(false: 显示; true: 隐藏,默认为false)
+ public boolean hide = false;
+ }
+
+ // 游戏中游戏倒计时显示 (注:现在只针对umo生效)
+ public static class GameCountdownTime implements Serializable {
+ // 是否隐藏游戏中游戏倒计时显示(false: 显示; true: 隐藏,默认为false)
+ public boolean hide = false;
+ }
+
+ // 游戏中所选择的玩法提示文字 (注:现在只针对ludo生效)
+ public static class GameSelectedTips implements Serializable {
+ // 是否隐藏游戏中所选择的玩法提示文字显示(false: 显示; true: 隐藏,默认为false)
+ public boolean hide = false;
+ }
+
+ // 控制NFT头像的开关
+ public static class NFTAvatar implements Serializable {
+ // true隐藏 false显示
+ public boolean hide = true;
+ }
+
+ // 控制开场动画的开关
+ public static class GameOpening implements Serializable {
+ // true隐藏 false显示
+ public boolean hide = true;
+ }
+
+ // 游戏结算前的mvp动画
+ public static class GameMvp implements Serializable {
+ // true隐藏 false显示
+ public boolean hide = true;
+ }
+
+ // 游戏中动画和头像右上角的UMO图标
+ public static class UmoIcon implements Serializable {
+ // 是否隐藏游戏中动画和头像右上角的UMO图标并改为UNO(false: 不隐藏,依然显示UMO; true: 隐藏,改为显示UNO,默认为false)
+ public boolean hide = false;
+ }
+
+ // 大厅中的logo
+ public static class Logo implements Serializable {
+ // 是否隐藏大厅中的logo(false: 不隐藏; true: 隐藏,默认为false)
+ public boolean hide = false;
+ }
+
+ // 游戏中的游戏位
+ public static class GamePlayers implements Serializable {
+ // 是否隐藏游戏中的游戏位(false: 不隐藏; true: 隐藏,默认为false,暂时只支持你画我猜)
+ public boolean hide = false;
+ }
+
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/model/GameViewInfoModel.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/model/GameViewInfoModel.java
new file mode 100644
index 0000000..f3c3fb4
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/model/GameViewInfoModel.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.model;
+
+/**
+ * 游戏视图
+ * 参考文档:https://docs.sud.tech/zh-CN/app/Client/API/ISudFSMMG/onGetGameViewInfo.html
+ */
+public class GameViewInfoModel {
+ // 返回码
+ public int ret_code;
+
+ // 返回消息
+ public String ret_msg;
+
+ // 游戏View的大小
+ public GameViewSizeModel view_size = new GameViewSizeModel();
+
+ // 游戏安全操作区域
+ public GameViewRectModel view_game_rect = new GameViewRectModel();
+
+ public static class GameViewSizeModel {
+ // 游戏View的宽 (单位像素)
+ public int width;
+
+ // 游戏View的高 (单位像素)
+ public int height;
+ }
+
+ public static class GameViewRectModel {
+ // 相对于view_size左边框偏移(单位像素)
+ public int left;
+ // 相对于view_size上边框偏移(单位像素)
+ public int top;
+ // 相对于view_size右边框偏移(单位像素)
+ public int right;
+ // 相对于view_size下边框偏移(单位像素)
+ public int bottom;
+ }
+
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/state/MGStateResponse.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/state/MGStateResponse.java
new file mode 100644
index 0000000..916fb9a
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/state/MGStateResponse.java
@@ -0,0 +1,18 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.state;
+
+/**
+ * mg2app,状态响应
+ */
+public class MGStateResponse {
+
+ // 返回码,成功
+ public static final int SUCCESS = 0;
+
+ public int ret_code; // 返回码
+ public String ret_msg; // 返回消息
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/state/SudMGPAPPState.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/state/SudMGPAPPState.java
new file mode 100644
index 0000000..98117f0
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/state/SudMGPAPPState.java
@@ -0,0 +1,845 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.state;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * APP to MG 的通用状态定义
+ * 参考文档:https://docs.sud.tech/zh-CN/app/Client/APPFST/
+ */
+public class SudMGPAPPState implements Serializable {
+
+ // region 通用状态
+ /**
+ * 1. 加入状态
+ * 最低版本: v1.1.30.xx
+ */
+ public static final String APP_COMMON_SELF_IN = "app_common_self_in";
+
+ /**
+ * 1. 加入状态 模型
+ * 用户(本人)加入游戏/退出游戏
+ * 正确流程:
+ * 1.isIn=true: 加入游戏=>准备游戏=>开始游戏;
+ * 2.isIn=false: 结束=>取消准备=>退出游戏;
+ */
+ public static class APPCommonSelfIn implements Serializable {
+ // rue 加入游戏,false 退出游戏
+ public boolean isIn;
+
+ // 加入的游戏位(座位号) 默认传seatIndex = -1 随机加入,seatIndex 从0开始,不可大于座位数
+ public int seatIndex;
+
+ // 默认为ture, 带有游戏位(座位号)的时候,如果游戏位(座位号)已经被占用,是否随机分配一个空位坐下 isSeatRandom=true 随机分配空位坐下,isSeatRandom=false 不随机分配
+ public boolean isSeatRandom;
+
+ // 不支持分队的游戏:数值填1;支持分队的游戏:数值填1或2(两支队伍);
+ public int teamId;
+ }
+
+ /**
+ * 2. 准备状态
+ * 最低版本: v1.1.30.xx
+ */
+ public static final String APP_COMMON_SELF_READY = "app_common_self_ready";
+
+ /**
+ * 2. 准备状态 模型
+ * 用户(本人)准备/取消准备
+ */
+ public static class APPCommonSelfReady implements Serializable {
+ // true 准备,false 取消准备
+ public boolean isReady;
+ }
+
+ /**
+ * 3. 游戏状态
+ * 最低版本: v1.1.30.xx
+ */
+ public static final String APP_COMMON_SELF_PLAYING = "app_common_self_playing";
+
+ /**
+ * 3. 游戏状态 模型
+ * 用户游戏状态,如果用户在游戏中,建议:
+ * a.空出屏幕中心区:
+ * 关闭全屏礼物特效;
+ * b.部分强操作类小游戏(spaceMax为true),尽量收缩原生UI,给游戏留出尽量大的操作空间:
+ * 收缩公屏;
+ * 收缩麦位;
+ * 如果不在游戏中,则恢复。
+ */
+ public static class APPCommonSelfPlaying implements Serializable {
+ // true 开始游戏,false 结束游戏
+ public boolean isPlaying;
+
+ // string类型,Https服务回调report_game_info参数,最大长度1024字节,超过则截断(2022-01-21)
+ public String reportGameInfoExtras;
+
+ // string类型,最大长度64字节,接入方服务端,可以根据这个字段来查询一局游戏的数据
+ public String reportGameInfoKey;
+ }
+
+ /**
+ * 4. 队长状态
+ * 最低版本: v1.1.30.xx
+ */
+ public static final String APP_COMMON_SELF_CAPTAIN = "app_common_self_captain";
+
+ /**
+ * 4. 队长状态 模型
+ * 用户是否为队长,队长在游戏中会有开始游戏的权利。
+ */
+ public static class APPCommonSelfCaptain implements Serializable {
+ // 必填,指定队长uid
+ public String curCaptainUID;
+ }
+
+ /**
+ * 5. 踢人
+ * v1.1.30.xx
+ */
+ public static final String APP_COMMON_SELF_KICK = "app_common_self_kick";
+
+ /**
+ * 5. 踢人 模型
+ * 用户(本人,队长)踢其他玩家;
+ * 队长才能踢人;
+ */
+ public static class APPCommonSelfKick implements Serializable {
+ // 被踢用户uid
+ public String kickedUID;
+ }
+
+ /**
+ * 6. 结束游戏
+ * v1.1.30.xx
+ */
+ public static final String APP_COMMON_SELF_END = "app_common_self_end";
+
+ /**
+ * 6. 结束游戏 模型
+ * 用户(本人,队长)结束(本局)游戏
+ */
+ public static class APPCommonSelfEnd implements Serializable {
+ // 当前不需要传参
+ }
+
+ /**
+ * 7. 房间状态(depreated 已废弃v1.1.30.xx)
+ */
+ public static final String APP_COMMON_SELF_ROOM = "app_common_self_room";
+
+ /**
+ * 8. 麦位状态(depreated 已废弃v1.1.30.xx)
+ */
+ public static final String APP_COMMON_SELF_SEAT = "app_common_self_seat";
+
+ /**
+ * 9. 麦克风状态
+ */
+ public static final String APP_COMMON_SELF_MICROPHONE = "app_common_self_microphone";
+
+ /**
+ * 9. 麦克风状态 模型
+ * 用户(本人)麦克风状态,建议:
+ * 进入房间后初始通知一次;
+ * 每次变更(开麦/闭麦/禁麦/解麦)通知一次;
+ */
+ public static class APPCommonSelfMicrophone implements Serializable {
+ // true 开麦,false 闭麦
+ public boolean isOn;
+
+ // true 被禁麦,false 未被禁麦
+ public boolean isDisabled;
+ }
+
+ /**
+ * 10. 文字命中状态
+ */
+ public static final String APP_COMMON_SELF_TEXT_HIT = "app_common_self_text_hit";
+
+ /**
+ * 10. 文字命中状态 模型
+ * 用户(本人)聊天信息命中关键词状态,建议:
+ * 精确匹配;
+ * 首次聊天内容命中关键词之后,后续聊天内容不翻转成未命中;
+ * 直至小游戏侧关键词更新,再将状态翻转为未命中;
+ */
+ public static class APPCommonSelfTextHitState implements Serializable {
+ // true 命中,false 未命中
+ public boolean isHit;
+
+ // 单个关键词, 兼容老版本
+ public String keyWord;
+
+ // 返回转写文本
+ public String text;
+
+ // text:文本包含匹配; number:数字等于匹配
+ public String wordType;
+
+ // 命中关键词,可以包含多个关键词
+ public List keyWordList;
+
+ // 在number模式下才有,返回转写的多个数字
+ public List numberList;
+ }
+
+ /**
+ * 11. 打开或关闭背景音乐(2021-12-27新增)
+ */
+ public static final String APP_COMMON_OPEN_BG_MUSIC = "app_common_open_bg_music";
+
+ /**
+ * 11. 打开或关闭背景音乐(2021-12-27新增) 模型
+ */
+ public static class APPCommonOpenBgMusic implements Serializable {
+ // true 打开背景音乐,false 关闭背景音乐
+ public boolean isOpen;
+ }
+
+ /**
+ * 12. 打开或关闭音效(2021-12-27新增)
+ */
+ public static final String APP_COMMON_OPEN_SOUND = "app_common_open_sound";
+
+ /**
+ * 12. 打开或关闭音效(2021-12-27新增) 模型
+ */
+ public static class APPCommonOpenSound implements Serializable {
+ // true 打开音效,false 关闭音效
+ public boolean isOpen;
+ }
+
+ /**
+ * 13. 打开或关闭游戏中的振动效果(2021-12-27新增)
+ */
+ public static final String APP_COMMON_OPEN_VIBRATE = "app_common_open_vibrate";
+
+ /**
+ * 13. 打开或关闭游戏中的振动效果(2021-12-27新增)模型
+ */
+ public static class APPCommonOpenVibrate implements Serializable {
+ // true 打开振动效果,false 关闭振动效果
+ public boolean isOpen;
+ }
+
+ /**
+ * 14. 设置游戏的音量大小(2021-12-31新增)
+ */
+ public static final String APP_COMMON_GAME_SOUND_VOLUME = "app_common_game_sound_volume";
+
+ /**
+ * 14. 设置游戏的音量大小(2021-12-31新增)模型
+ */
+ public static class APPCommonGameSoundVolume implements Serializable {
+ // 音量大小 0 到 100
+ public int volume;
+ }
+
+ /**
+ * 15. 设置游戏玩法选项(2022-05-10新增)
+ */
+ public static final String APP_COMMON_GAME_SETTING_SELECT_INFO = "app_common_game_setting_select_info";
+
+ /**
+ * 15. 设置游戏玩法选项(2022-05-10新增) 模型
+ */
+ public static class APPCommonGameSettingSelectInfo implements Serializable {
+ public Ludo ludo; // 游戏名称
+ }
+
+ public static class Ludo implements Serializable {
+ public int mode; // mode: 默认赛制,0: 快速, 1: 经典;
+ public int chessNum; // chessNum: 默认棋子数量, 2: 对应2颗棋子; 4: 对应4颗棋子;
+ public int item; // item: 默认道具, 1: 有道具, 0: 没有道具
+ }
+
+ /**
+ * 16. 设置游戏中的AI玩家(2022-05-11新增)
+ */
+ public static final String APP_COMMON_GAME_ADD_AI_PLAYERS = "app_common_game_add_ai_players";
+
+ /**
+ * 16. 设置游戏中的AI玩家(2022-05-11新增) 模型
+ */
+ public static class APPCommonGameAddAIPlayers implements Serializable {
+ public List aiPlayers; // AI玩家
+ public int isReady = 1; // 机器人加入后是否自动准备 1:自动准备,0:不自动准备 默认为1
+ }
+
+ public static class AIPlayers implements Serializable {
+ public String userId; // 玩家id
+ public String avatar; // 头像url
+ public String name; // 名字
+ public String gender; // 性别 male:男,female:女
+ }
+
+ /**
+ * 17. app在收到游戏断开连接通知后,通知游戏重试连接(2022-06-21新增,暂时支持ludo)
+ */
+ public static final String APP_COMMON_GAME_RECONNECT = "app_common_game_reconnect";
+
+ /**
+ * 17. app在收到游戏断开连接通知后,通知游戏重试连接(2022-06-21新增,暂时支持ludo) 模型
+ */
+ public static class APPCommonGameReconnect implements Serializable {
+ }
+
+ /**
+ * 18. app返回玩家当前积分
+ */
+ public static final String APP_COMMON_GAME_SCORE = "app_common_game_score";
+
+ /**
+ * 18. app返回玩家当前积分
+ */
+ public static class APPCommonGameScore implements Serializable {
+ public long score; // 玩家当前积分
+ }
+ // endregion 通用状态
+
+ // region 元宇宙砂砂舞
+ /**
+ * 1. 元宇宙砂砂舞相关设置
+ * 参考文档:https://docs.sud.tech/zh-CN/app/Client/APPFST/CommonStateForDisco.html
+ */
+ public static final String APP_COMMON_GAME_DISCO_ACTION = "app_common_game_disco_action";
+
+ /**
+ * 1. 元宇宙砂砂舞相关设置 模型
+ */
+ public static class AppCommonGameDiscoAction implements Serializable {
+ public int actionId; // 必传的参数,用于指定类型的序号,不同序号用于区分游戏内的不同功能,不传则会判断为无效指令,具体序号代表的功能见下表
+ public Integer cooldown; // 持续时间,单位秒,部分功能有持续时间就需要传对应的数值,不传或传错则会按各自功能的默认值处理(见下表)
+ public Boolean isTop; // 是否置顶,针对部分功能可排队置顶(false:不置顶;true:置顶;默认为false)
+ public String field1; // 额外参数1,针对部分功能有具体的意义
+ public String field2; // 额外参数2,针对部分功能有具体的意义
+ }
+ // endregion 元宇宙砂砂舞
+
+ // region 定制火箭
+ /**
+ * 1. 礼物配置文件回调
+ */
+ public static final String APP_CUSTOM_ROCKET_CONFIG = "app_custom_rocket_config";
+
+ /**
+ * 1. 礼物配置文件回调 模型
+ */
+ public static class AppCustomRocketConfig implements Serializable {
+ public int maxSeat; // 最大机位
+ public double firePrice; // 发射的静态价格
+ public int isDynamicPrice; // 发射价格是否动态开关 0:静态 1动态
+ public String gameIntroduce; // 玩法介绍
+ public String monetaryUnit; // 货币的单位
+ public long serverTime; // 服务器时间戳,单位秒
+ public List filterModel; // 过滤不显示的模块(默认是为空)
+ public List filterLayer; // 过滤不显示的页面(默认是为空)
+ public List componentList; // 组件列表 1套装,2主仓,3尾翼,4头像,5签名,6颜色
+ public List headList; // 组件列表
+ public List extraList; // 专属配置
+
+ public static class ComponentModel {
+ public String componentId; // 组件的ID
+ public int type; // 1套装,2主仓,3尾翼
+ public String name; // 显示名称(商城+装配间+购买记录+...)
+ public double price; // 价格
+ public int isForever; // 永久:0非永久 1永久
+ public long validTime; // 有效期:单位是秒
+ public String imageId; // 图片ID
+ public int isLock; // 锁:0不锁 1锁
+ public int isShow; // 展示:0不展示 1展示
+ }
+
+ public static class HeadModel {
+ public String componentId; // 组件的ID
+ public int type; // 4头像(商城+装配间+购买记录+...)
+ public String name; // 显示名称
+ public double price; // 价格 暂时不考虑小数
+ public int isForever; // 永久:0非永久 1永久
+ public long validTime; // 有效期:单位是秒
+ public String userId; // 用户的userId
+ public String nickname; // 昵称
+ public int sex; // 性别 0:男 1:女
+ public String url; // 头像URL
+ }
+
+ public static class ExtraModel {
+ public String componentId; // 组件的ID
+ public int type; // 5签名,6颜色
+ public String name; // 显示名称(商城+装配间+购买记录+...)
+ public double price; // 价格
+ public int isForever; // 永久:0非永久 1永久
+ public long validTime; // 有效期:单位是秒
+ public String desc; // 描述
+ }
+ }
+
+ /**
+ * 2. 拥有模型列表回调(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_MODEL_LIST = "app_custom_rocket_model_list";
+
+ /**
+ * 2. 拥有模型列表回调(火箭) 模型
+ */
+ public static class AppCustomRocketModelList implements Serializable {
+ public String defaultModelId; // 默认模型
+ public int isScreenshot; // 截图:0不截图 1截图(app上传失败或者过期时,被动截图)
+ public List list;
+
+ public static class Model {
+ public String modelId; // 模型Id
+ public int isAvatar; // 可以换装:0不可以 1可以
+ public String serviceFlag; // 服务标识
+ public List componentList; // 列表
+
+ public static class ComponentModel {
+ public String itemId; // 唯一标识
+ public int type; // 类型
+ public String value; // 值
+ public int isForever; // 永久:0非永久 1永久
+ public long validTime; // 有效期时间戳:单位是秒
+ }
+ }
+ }
+
+ /**
+ * 3. 拥有组件列表回调(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_COMPONENT_LIST = "app_custom_rocket_component_list";
+
+ /**
+ * 3. 拥有组件列表回调(火箭) 模型
+ */
+ public static class AppCustomRocketComponentList implements Serializable {
+ public List defaultList; // 默认组件列表
+ public List list; // 组件列表
+
+ public static class ComponentModel {
+ public String itemId; // 唯一标识
+ public int type; // 类型
+ public String value; // 值
+ public int isForever; // 永久:0非永久 1永久
+ public long validTime; // 有效期时间戳:单位是秒
+ public long date; // 购买时间:1970年1月1日开始。时间戳:单位是秒
+ }
+ }
+
+ /**
+ * 4. 获取用户信息回调(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_USER_INFO = "app_custom_rocket_user_info";
+
+ /**
+ * 4. 获取用户信息回调(火箭) 模型
+ */
+ public static class AppCustomRocketUserInfo implements Serializable {
+ public int resultCode; // 0: 请求成功,1:请求失败
+ public String error; // 错误描述
+ public List userList; // 用户信息列表
+ }
+
+ /**
+ * 5. 订单记录列表回调
+ */
+ public static final String APP_CUSTOM_ROCKET_ORDER_RECORD_LIST = "app_custom_rocket_order_record_list";
+
+ /**
+ * 5. 订单记录列表回调 模型
+ */
+ public static class AppCustomRocketOrderRecordList implements Serializable {
+ public int pageIndex; // 第几页
+ public int pageCount; // 总页数
+ public List list; // 列表
+
+ /**
+ * 定制火箭,订单组件 模型
+ */
+ public static class ComponentModel {
+ public int type; // 类型
+ public String value; // 值
+ public int isForever; // 永久:0非永久 1永久
+ public long validTime; // 有效期时间戳:单位是秒
+ public long date; // 有效期时间戳:单位是秒
+ }
+ }
+
+ /**
+ * 6. 展馆内列表回调
+ */
+ public static final String APP_CUSTOM_ROCKET_ROOM_RECORD_LIST = "app_custom_rocket_room_record_list";
+
+ /**
+ * 6. 展馆内列表回调 模型
+ */
+ public static class AppCustomRocketRoomRecordList implements Serializable {
+ public int pageIndex; // 第几页
+ public int pageCount; // 总页数
+ public List list; // 列表
+
+ public static class RoomRecordModel {
+ public CustomRocketUserInfoModel fromUser; // 送礼人
+ public int number; // 火箭数量
+ }
+ }
+
+ /**
+ * 7. 展馆内玩家送出记录回调
+ */
+ public static final String APP_CUSTOM_ROCKET_USER_RECORD_LIST = "app_custom_rocket_user_record_list";
+
+ /**
+ * 7. 展馆内玩家送出记录回调 模型
+ */
+ public static class AppCustomRocketUserRecordList implements Serializable {
+ public int pageIndex; // 第几页
+ public int pageCount; // 总页数
+ public CustomRocketUserInfoModel fromUser; // 送礼人
+ public List list; // 列表
+
+ public static class UserRecordModel {
+ public long date; // 订单时间戳: 单位是秒
+ public int number; // 个数
+ public CustomRocketUserInfoModel toUser; // 收礼人
+ public List componentList; // 列表
+
+ public static class ComponentModel {
+ public int type; // 类型
+ public String value; // 值
+ public int isForever; // 永久:0非永久 1永久
+ public long validTime; // 有效期时间戳:单位是秒
+ }
+ }
+ }
+
+ /**
+ * 8. 设置默认模型(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_SET_DEFAULT_MODEL = "app_custom_rocket_set_default_model";
+
+ /**
+ * 8. 设置默认模型(火箭) 模型
+ */
+ public static class AppCustomRocketSetDefaultModel implements Serializable {
+ public int resultCode; // 0: 请求成功,1:请求失败
+ public String error; // 错误描述
+ public Data data; // 数据
+
+ public static class Data {
+ public String modelId; // 默认模型
+ }
+ }
+
+ /**
+ * 9. 动态计算一键发送价格回调
+ */
+ public static final String APP_CUSTOM_ROCKET_DYNAMIC_FIRE_PRICE = "app_custom_rocket_dynamic_fire_price";
+
+ /**
+ * 9. 动态计算一键发送价格回调 模型
+ */
+ public static class AppCustomRocketDynamicFirePrice implements Serializable {
+ public int resultCode; // 0: 请求成功,1:请求失败
+ public String error; // 错误描述
+ public Data data; // 数据
+
+ public static class Data {
+ public double price; // 发送的价格
+ }
+ }
+
+ /**
+ * 10. 一键发送回调
+ */
+ public static final String APP_CUSTOM_ROCKET_FIRE_MODEL = "app_custom_rocket_fire_model";
+
+ /**
+ * 10. 一键发送回调 模型
+ */
+ public static class AppCustomRocketFireModel implements Serializable {
+ public int resultCode; // 0: 请求成功,1:请求失败
+ public String error; // 错误描述
+ }
+
+ /**
+ * 11. 新组装模型 回调
+ */
+ public static final String APP_CUSTOM_ROCKET_CREATE_MODEL = "app_custom_rocket_create_model";
+
+ /**
+ * 11. 新组装模型 回调 模型
+ */
+ public static class AppCustomRocketCreateModel implements Serializable {
+ public int resultCode; // 0: 请求成功,1:请求失败
+ public String error; // 错误描述
+ public Data data;
+
+ public static class Data {
+ public String modelId; // 模型Id
+ public int isAvatar; // 可以换装:0不可以 1可以
+ public String serviceFlag; // 服务标识
+ public List componentList;
+
+ public static class ComponentModel {
+ public String itemId; // 模型Id
+ }
+ }
+ }
+
+ /**
+ * 12. 更换组件 回调
+ */
+ public static final String APP_CUSTOM_ROCKET_REPLACE_COMPONENT = "app_custom_rocket_replace_component";
+
+ /**
+ * 12. 更换组件 回调 模型
+ */
+ public static class AppCustomRocketReplaceComponent implements Serializable {
+ public int resultCode; // 0: 请求成功,1:请求失败
+ public String error; // 错误描述
+ public Data data;
+
+ public static class Data {
+ public String modelId; // 模型Id
+ public List componentList;
+
+ public static class ComponentModel {
+ public String itemId;
+ }
+ }
+ }
+
+ /**
+ * 13. 购买组件 回调
+ */
+ public static final String APP_CUSTOM_ROCKET_BUY_COMPONENT = "app_custom_rocket_buy_component";
+
+ /**
+ * 13. 购买组件 回调 模型
+ */
+ public static class AppCustomRocketBuyComponent implements Serializable {
+ public int resultCode; // 0: 请求成功,1:请求失败
+ public String error; // 错误描述
+ public Data data;
+
+ public static class Data {
+ public List componentList;
+
+ public static class ComponentModel {
+ public String itemId; // 唯一标识
+ public int type; // 类型
+ public String value; // 值
+ public int isForever; // 永久:0非永久 1永久
+ public long validTime; // 有效期时间戳:单位是秒
+ public long date; // 有效期时间戳:单位是秒
+ }
+ }
+ }
+
+ /**
+ * 14. app播放火箭发射动效(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_PLAY_MODEL_LIST = "app_custom_rocket_play_model_list";
+
+ /**
+ * 14. app播放火箭发射动效(火箭) 模型
+ */
+ public static class AppCustomRocketPlayModelList implements Serializable {
+ public String orderId; // 订单号
+ public List componentList; // 组件列表
+
+ public static class ComponentModel {
+ public int type; // 类型
+ public String value; // 值
+ }
+ }
+
+ /**
+ * 15. app推送主播信息(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_NEW_USER_INFO = "app_custom_rocket_new_user_info";
+
+ /**
+ * 15. app推送主播信息(火箭) 模型
+ */
+ public static class AppCustomRocketNewUserInfo implements Serializable {
+ public List userList; // 用户信息列表
+ }
+
+ /**
+ * 16. 验证签名合规(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_VERIFY_SIGN = "app_custom_rocket_verify_sign";
+
+ /**
+ * 16. 验证签名合规(火箭) 回调 模型
+ */
+ public static class AppCustomRocketVerifySign implements Serializable {
+ public int resultCode; // 0: 请求成功,1:请求失败
+ public String error; // 错误描述
+ public Data data;
+
+ public static class Data {
+ public String sign; // 验证的签名
+ }
+ }
+
+ /**
+ * 17. app主动调起火箭主界面(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_SHOW_GAME_SCENE = "app_custom_rocket_show_game_scene";
+
+ /**
+ * 17. app主动调起火箭主界面(火箭) 模型
+ */
+ public static class AppCustomRocketShowGameScene implements Serializable {
+ }
+
+ /**
+ * 18. app主动隐藏火箭主界面(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_HIDE_GAME_SCENE = "app_custom_rocket_hide_game_scene";
+
+ /**
+ * 18. app主动隐藏火箭主界面(火箭) 模型
+ */
+ public static class AppCustomRocketHideGameScene implements Serializable {
+ }
+
+ /**
+ * 19. app推送解锁组件(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_UNLOCK_COMPONENT = "app_custom_rocket_unlock_component";
+
+ /**
+ * 19. app推送解锁组件(火箭) 模型
+ */
+ public static class AppCustomRocketUnlockComponent implements Serializable {
+ public int type; // 组件类型
+ public String componentId; // 组件ID
+ }
+
+ /**
+ * 20. app推送火箭效果飞行点击(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_FLY_CLICK = "app_custom_rocket_fly_click";
+
+ /**
+ * 20. app推送火箭效果飞行点击(火箭) 模型
+ */
+ public static class AppCustomRocketFlyClick implements Serializable {
+ }
+
+ /**
+ * 21. app推送关闭火箭播放效果(火箭)
+ */
+ public static final String APP_CUSTOM_ROCKET_CLOSE_PLAY_EFFECT = "app_custom_rocket_close_play_effect";
+
+ /**
+ * 21. app推送关闭火箭播放效果(火箭) 模型
+ */
+ public static class AppCustomRocketClosePlayEffect implements Serializable {
+ }
+
+ /**
+ * 定制火箭,用户信息 模型
+ */
+ public static class CustomRocketUserInfoModel {
+ public String userId; // 用户的userId
+ public String nickname; // 昵称
+ public int sex; // 性别 0:男 1:女
+ public String url; // 头像URL
+ }
+ // endregion 定制火箭
+
+ // region 棒球
+ /**
+ * 1. 下发游戏客户端查询排行榜数据(棒球)
+ */
+ public static final String APP_BASEBALL_RANKING = "app_baseball_ranking";
+
+ /**
+ * 1. 下发游戏客户端查询排行榜数据(棒球) 模型
+ */
+ public static class AppBaseballRanking implements Serializable {
+ public List data;
+ }
+
+ /**
+ * 2. 下发游戏客户端查询我的排名数据(棒球)
+ */
+ public static final String APP_BASEBALL_MY_RANKING = "app_baseball_my_ranking";
+
+ /**
+ * 2. 下发游戏客户端查询我的排名数据(棒球) 模型
+ */
+ public static class AppBaseballMyRanking implements Serializable {
+ public AppBaseballPlayerInfo data;
+ }
+
+ /**
+ * 3. 下发游戏客户端查询排在自己前后的玩家数据(棒球)
+ */
+ public static final String APP_BASEBALL_RANGE_INFO = "app_baseball_range_info";
+
+ /**
+ * 3. 下发游戏客户端查询排在自己前后的玩家数据(棒球) 模型
+ */
+ public static class AppBaseballRangeInfo implements Serializable {
+ public AppBaseballPlayerInfo before; // 前一名
+ public AppBaseballPlayerInfo after; // 后一名
+ }
+
+ /**
+ * 4. app主动调起主界面(棒球)
+ */
+ public static final String APP_BASEBALL_SHOW_GAME_SCENE = "app_baseball_show_game_scene";
+
+ /**
+ * 4. app主动调起主界面(棒球) 模型
+ */
+ public static class AppBaseballShowGameScene implements Serializable {
+ }
+
+ /**
+ * 5. app主动隐藏主界面(棒球)
+ */
+ public static final String APP_BASEBALL_HIDE_GAME_SCENE = "app_baseball_hide_game_scene";
+
+ /**
+ * 5. app主动隐藏主界面(棒球) 模型
+ */
+ public static class AppBaseballHideGameScene implements Serializable {
+ }
+
+ /**
+ * 6. app推送需要的文本数据(棒球)
+ */
+ public static final String APP_BASEBALL_TEXT_CONFIG = "app_baseball_text_config";
+
+ /**
+ * 6. app推送需要的文本数据(棒球) 模型
+ */
+ public static class AppBaseballTextConfig implements Serializable {
+ public String mode1;
+ public String mode2;
+ public String mode3;
+ }
+
+ public static class AppBaseballPlayerInfo implements Serializable {
+ public String playerId; // 玩家Id
+ public String name; // 玩家昵称
+ public String avatar; // 头像
+ public long distance; // 距离
+ public int rank; // 排名
+ }
+ // endregion 棒球
+
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/state/SudMGPMGState.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/state/SudMGPMGState.java
new file mode 100644
index 0000000..57b919d
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/state/SudMGPMGState.java
@@ -0,0 +1,1256 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.state;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * MG to APP 的状态定义
+ * 参考文档:https://docs.sud.tech/zh-CN/app/Client/MGFSM/
+ */
+public class SudMGPMGState implements Serializable {
+
+ // region MG状态机-通用状态-游戏
+ // 参考文档:https://docs.sud.tech/zh-CN/app/Client/MGFSM/CommonStateGame.html
+ /**
+ * 1. 公屏消息(已修改)
+ * 最低版本: v1.1.30.xx
+ */
+ public static final String MG_COMMON_PUBLIC_MESSAGE = "mg_common_public_message";
+
+ /**
+ * 1. 公屏消息(已修改)
+ * 向公屏发送消息,字段含义如下
+ * type
+ * 0 通知
+ * 1 提醒
+ * 2 结算
+ * 3 其他
+ * msg
+ * 内为转义字段:
+ *
+ * 其中name/uid/color均为可选字段,字段为空的情况如下:
+ *
+ * SDK仅会缓存最新一条。
+ */
+ public static class MGCommonPublicMessage implements Serializable {
+ // 0 通知
+ // 1 提醒
+ // 2 结算
+ // 3 其他
+ public int type;
+
+ // 消息内容
+ public List msg;
+
+ public static class MGCommonPublicMessageMsg implements Serializable {
+ // 词组类型 当phrase=1时,会返回text; 当phrase=2时,会返回user
+ public int phrase;
+ public MGCommonPublicMessageMsgText text;
+ public MGCommonPublicMessageMsgUser user;
+ }
+
+ public static class MGCommonPublicMessageMsgText implements Serializable {
+ @SerializedName(value = "default")
+ public String defaultStr; // 默认文本
+
+ @SerializedName(value = "zh-CN")
+ public String zh_CN; // 中文(简体)
+
+ @SerializedName(value = "zh-HK")
+ public String zh_HK; // 中文(香港)
+
+ @SerializedName(value = "zh-MO")
+ public String zh_MO; // 中文(澳门)
+
+ @SerializedName(value = "zh-SG")
+ public String zh_SG; // 中文(新加坡)
+
+ @SerializedName(value = "zh-TW")
+ public String zh_TW; // 中文(繁体)
+
+ @SerializedName(value = "en-US")
+ public String en_US; // 英语(美国)
+
+ @SerializedName(value = "en-GB")
+ public String en_GB; // 英语(英国)
+
+ @SerializedName(value = "ms-BN")
+ public String ms_BN; // 马来语(文莱达鲁萨兰)
+
+ @SerializedName(value = "ms-MY")
+ public String ms_MY; // 马来语(马来西亚)
+
+ @SerializedName(value = "vi-VN")
+ public String vi_VN; // 越南语
+
+ @SerializedName(value = "id-ID")
+ public String id_ID; // 印度尼西亚语
+
+ @SerializedName(value = "es-ES")
+ public String es_ES; // 西班牙语(传统)
+
+ @SerializedName(value = "ja-JP")
+ public String ja_JP; // 日语
+
+ @SerializedName(value = "ko-KR")
+ public String ko_KR; // 朝鲜语
+
+ @SerializedName(value = "th-TH")
+ public String th_TH; // 泰语
+
+ @SerializedName(value = "ar-SA")
+ public String ar_SA; // 阿拉伯语(沙特阿拉伯)
+
+ @SerializedName(value = "ur-PK")
+ public String ur_PK; // 乌都语
+
+ @SerializedName(value = "tr-TR")
+ public String tr_TR; // 土耳其语
+ }
+
+ public static class MGCommonPublicMessageMsgUser implements Serializable {
+ // 默认内容
+ public String defaultStr;
+ // 用户名称
+ public String name;
+ // 用户id
+ public String uid;
+ // 颜色值
+ public String color;
+ }
+ }
+
+ /**
+ * 2. 关键词状态
+ */
+ public static final String MG_COMMON_KEY_WORD_TO_HIT = "mg_common_key_word_to_hit";
+
+ /**
+ * 2. 关键词状态
+ */
+ public static class MGCommonKeyWordToHit implements Serializable {
+ // 必填字段;text:文本包含匹配; number:数字等于匹配(必填字段);默认:text(你画我猜、你说我猜);数字炸弹填number;
+ public String wordType;
+
+ // 单个关键词,兼容老版本。轮到自己猜词时才有值,否则为null
+ public String word;
+
+ // 关键词,每一轮都会下发,不区分角色
+ public String realWord;
+
+ // 必填字段;关键词列表,可以传送多个关键词。轮到自己猜词时才有值,否则为null
+ public List wordList;
+
+ // 必填字段;关键词语言,默认:zh-CN;
+ public String wordLanguage;
+ }
+
+ /**
+ * 3. 游戏结算状态
+ */
+ public static final String MG_COMMON_GAME_SETTLE = "mg_common_game_settle";
+
+ /**
+ * 3. 游戏结算状态
+ */
+ public static class MGCommonGameSettle implements Serializable {
+ // 游戏模式默认为1
+ public int gameMode;
+
+ // 本局游戏的id
+ public String gameRoundId;
+
+ // 游戏结果玩家列表
+ public List results;
+
+ /**
+ * 游戏结果玩家定义
+ */
+ public static class PlayerResult implements Serializable {
+ public String uid; // 用户id
+ public int rank; // 排名 从 1 开始
+ public int award; // 奖励
+ public int score; // 积分
+ public int isEscaped; // 是否逃跑 1:逃跑 0:非逃跑
+ public String killerId; // 杀自己的玩家的id
+ public int isAI; // 是否是AI玩家,1为AI
+ }
+ }
+
+ /**
+ * 4. 加入游戏按钮点击状态
+ */
+ public static final String MG_COMMON_SELF_CLICK_JOIN_BTN = "mg_common_self_click_join_btn";
+
+ /**
+ * 4. 加入游戏按钮点击状态 模型
+ * 用户(本人)点击加入按钮,或者点击头像加入
+ */
+ public static class MGCommonSelfClickJoinBtn implements Serializable {
+ // 点击头像加入游戏对应的座位号,int 类型,从0开始, 如果seatIndex=-1,则是随机加入一个空位,如果seatIndex 大于座位数,则加入不成功
+ public int seatIndex;
+ }
+
+ /**
+ * 5. 取消加入(退出)游戏按钮点击状态
+ */
+ public static final String MG_COMMON_SELF_CLICK_CANCEL_JOIN_BTN = "mg_common_self_click_cancel_join_btn";
+
+ /**
+ * 5. 取消加入(退出)游戏按钮点击状态 模型
+ * 用户(本人)点击取消加入按钮
+ */
+ public static class MGCommonSelfClickCancelJoinBtn implements Serializable {
+ }
+
+ /**
+ * 6. 准备按钮点击状态
+ */
+ public static final String MG_COMMON_SELF_CLICK_READY_BTN = "mg_common_self_click_ready_btn";
+
+ /**
+ * 6. 准备按钮点击状态 模型
+ */
+ public static class MGCommonSelfClickReadyBtn implements Serializable {
+ }
+
+ /**
+ * 7. 取消准备按钮点击状态
+ */
+ public static final String MG_COMMON_SELF_CLICK_CANCEL_READY_BTN = "mg_common_self_click_cancel_ready_btn";
+
+ /**
+ * 7. 取消准备按钮点击状态 模型
+ */
+ public static class MGCommonSelfClickCancelReadyBtn implements Serializable {
+ }
+
+ /**
+ * 8. 开始游戏按钮点击状态
+ */
+ public static final String MG_COMMON_SELF_CLICK_START_BTN = "mg_common_self_click_start_btn";
+
+ /**
+ * 8. 开始游戏按钮点击状态 模型
+ */
+ public static class MGCommonSelfClickStartBtn implements Serializable {
+ }
+
+ /**
+ * 9. 分享按钮点击状态
+ */
+ public static final String MG_COMMON_SELF_CLICK_SHARE_BTN = "mg_common_self_click_share_btn";
+
+ /**
+ * 9. 分享按钮点击状态 模型
+ * 用户(本人)点击分享按钮
+ */
+ public static class MGCommonSelfClickShareBtn implements Serializable {
+ }
+
+ /**
+ * 10. 游戏状态
+ */
+ public static final String MG_COMMON_GAME_STATE = "mg_common_game_state";
+
+ /**
+ * 10. 游戏状态 模型
+ */
+ public static class MGCommonGameState implements Serializable {
+ public static final int UNKNOW = -1; // 未知
+ public static final int IDLE = 0;
+ public static final int LOADING = 1;
+ public static final int PLAYING = 2;
+
+ // gameState=0 (idle 状态,游戏未开始,空闲状态);
+ // gameState=1(loading 状态,所有玩家都准备好,队长点击了开始游戏按钮,等待加载游戏场景开始游戏,游戏即将开始提示阶段);
+ // gameState=2(playing状态,游戏进行中状态)
+ public int gameState;
+ }
+
+ /**
+ * 11. 结算界面关闭按钮点击状态(2021-12-27新增)
+ */
+ public static final String MG_COMMON_SELF_CLICK_GAME_SETTLE_CLOSE_BTN = "mg_common_self_click_game_settle_close_btn";
+
+ /**
+ * 11. 结算界面关闭按钮点击状态(2021-12-27新增) 模型
+ * 用户(本人)点击结算界面关闭按钮
+ */
+ public static class MGCommonSelfClickGameSettleCloseBtn implements Serializable {
+ }
+
+ /**
+ * 12. 结算界面再来一局按钮点击状态(2021-12-27新增)
+ */
+ public static final String MG_COMMON_SELF_CLICK_GAME_SETTLE_AGAIN_BTN = "mg_common_self_click_game_settle_again_btn";
+
+ /**
+ * 12. 结算界面再来一局按钮点击状态(2021-12-27新增)模型
+ * 用户(本人)点击结算界面再来一局按钮
+ */
+ public static class MGCommonSelfClickGameSettleAgainBtn implements Serializable {
+ }
+
+ /**
+ * 13. 游戏上报游戏中的声音列表(2021-12-30新增,现在只支持碰碰我最强)
+ */
+ public static final String MG_COMMON_GAME_SOUND_LIST = "mg_common_game_sound_list";
+
+ /**
+ * 13. 游戏上报游戏中的声音列表(2021-12-30新增,现在只支持碰碰我最强) 模型
+ * 游戏上报本游戏中所有的声音资源列表
+ */
+ public static class MGCommonGameSoundList implements Serializable {
+ // 声音资源列表
+ public List list;
+
+ public static class MGCommonGameSound implements Serializable {
+ // 声音资源的名字
+ public String name;
+ // 声音资源的URL链接
+ public String url;
+ // 声音资源类型
+ public String type;
+ }
+ }
+
+ /**
+ * 14. 游通知app层播放声音(2021-12-30新增,现在只支持碰碰我最强)
+ */
+ public static final String MG_COMMON_GAME_SOUND = "mg_common_game_sound";
+
+ /**
+ * 14. 游通知app层播放声音(2021-12-30新增,现在只支持碰碰我最强) 模型
+ * 游戏通知app层播放背景音乐的开关状态
+ */
+ public static class MGCommonGameSound implements Serializable {
+ // 是否播放 isPlay==true(播放),isPlay==false(停止)
+ public boolean isPlay;
+ // 要播放的声音文件名,不带后缀
+ public String name;
+ // 声音资源类型
+ public String type;
+ // 播放次数;注:times == 0 为循环播放
+ public String times;
+ // https://www.xxxx.xx/xxx.mp3" 声音资源的url链接
+ public String url;
+ }
+
+ /**
+ * 15. 游戏通知app层播放背景音乐状态(2022-01-07新增,现在只支持碰碰我最强)
+ */
+ public static final String MG_COMMON_GAME_BG_MUSIC_STATE = "mg_common_game_bg_music_state";
+
+ /**
+ * 15. 游戏通知app层播放背景音乐状态(2022-01-07新增,现在只支持碰碰我最强) 模型
+ * 游戏通知app层播放背景音乐的开关状态
+ */
+ public static class MGCommonGameBgMusicState implements Serializable {
+ // 背景音乐的开关状态 true: 开,false: 关
+ public boolean state;
+ }
+
+ /**
+ * 16. 游戏通知app层播放音效的状态(2022-01-07新增,现在只支持碰碰我最强)
+ */
+ public static final String MG_COMMON_GAME_SOUND_STATE = "mg_common_game_sound_state";
+
+ /**
+ * 16. 游戏通知app层播放音效的状态(2022-01-07新增,现在只支持碰碰我最强) 模型
+ * 游戏通知app层播放音效的状态
+ */
+ public static class MGCommonGameSoundState implements Serializable {
+ // 背景音乐的开关状态 true: 开,false: 关
+ public boolean state;
+ }
+
+ /**
+ * 17. ASR状态(开启和关闭语音识别状态,v1.1.45.xx 版本新增)
+ */
+ public static final String MG_COMMON_GAME_ASR = "mg_common_game_asr";
+
+ /**
+ * 17. ASR状态(开启和关闭语音识别状态,v1.1.45.xx 版本新增) 模型
+ */
+ public static class MGCommonGameASR implements Serializable {
+ // true:打开语音识别 false:关闭语音识别
+ public boolean isOpen;
+ // 必填字段;关键词列表,可以传送多个关键词
+ public List wordList;
+ // 关键词,每一轮都会下发,不区分角色
+ public String realWord;
+ // 必填字段;关键词语言,默认:zh-CN(老版本游戏可能没有);透传
+ public String wordLanguage;
+ // 必填字段;text:文本包含匹配; number:数字等于匹配(必填字段);默认:text(老版本游戏可能没有);数字炸弹填number;透传
+ public String wordType;
+ // 必填字段;false: 命中不停止;true:命中停止(必填字段);默认:true(老版本游戏可能没有) 你演我猜填false;透传
+ public boolean isCloseConnHitted;
+ // 必填字段,是否需要匹配关键字, 默认是true, 如果是false, 则只简单的返回语音识别文本;透传
+ public boolean enableIsHit;
+ // 必填字段,是否需要返回转写文本,默认是true
+ public boolean enableIsReturnText;
+ }
+
+ /**
+ * 18. 麦克风状态(2022-02-08新增)
+ */
+ public static final String MG_COMMON_SELF_MICROPHONE = "mg_common_self_microphone";
+
+ /**
+ * 18. 麦克风状态(2022-02-08新增) 模型
+ * 游戏通知app麦克风状态
+ */
+ public static class MGCommonSelfMicrophone implements Serializable {
+ // 麦克风开关状态 true: 开,false: 关
+ public boolean isOn;
+ }
+
+ /**
+ * 19. 耳机(听筒,扬声器)状态(2022-02-08新增)
+ */
+ public static final String MG_COMMON_SELF_HEADPHONE = "mg_common_self_headphone";
+
+ /**
+ * 19. 耳机(听筒,扬声器)状态(2022-02-08新增) 模型
+ */
+ public static class MGCommonSelfHeadphone implements Serializable {
+ // 耳机(听筒,喇叭)开关状态 true: 开,false: 关
+ public boolean isOn;
+ }
+
+ /**
+ * 20. App通用状态操作结果错误码(2022-05-10新增)
+ */
+ public static final String MG_COMMON_APP_COMMON_SELF_X_RESP = "mg_common_app_common_self_x_resp";
+
+ /**
+ * 20. App通用状态操作结果错误码(2022-05-10新增) 模型
+ */
+ public static class MGCommonAPPCommonSelfXResp implements Serializable {
+ public String state; // 字段必填, 参考:游戏业务错误 https://docs.sud.tech/zh-CN/app/Client/APPFST/CommonState.html
+ public int resultCode; // 字段必填,参考:游戏业务错误 https://docs.sud.tech/zh-CN/app/Server/ErrorCode.html
+ public boolean isIn; // 当state=app_common_self_in时,字段必填
+ public boolean isReady; // 当state=app_common_self_ready时,字段必填
+ public boolean isPlaying; // 当state=app_common_self_playing时,字段必填
+ public String reportGameInfoExtras; // 当state=app_common_self_playing时,字段必填
+ public String curCaptainUID; // 当state=app_common_self_captain时,字段必填
+ public String kickedUID; // 当state=app_common_self_kick时,字段必填
+ }
+
+ /**
+ * 21. 游戏通知app层添加陪玩机器人是否成功(2022-05-17新增)
+ */
+ public static final String MG_COMMON_GAME_ADD_AI_PLAYERS = "mg_common_game_add_ai_players";
+
+ /**
+ * 21. 游戏通知app层添加陪玩机器人是否成功(2022-05-17新增) 模型
+ */
+ public static class MGCommonGameAddAIPlayers implements Serializable {
+ public int resultCode; // 返回码 0:成功,非0:不成功
+ public List userIds; // 加入成功的playerId列表
+ }
+
+ /**
+ * 22. 游戏通知app层添当前网络连接状态(2022-06-21新增)
+ */
+ public static final String MG_COMMON_GAME_NETWORK_STATE = "mg_common_game_network_state";
+
+ /**
+ * 22. 游戏通知app层添当前网络连接状态(2022-06-21新增) 模型
+ */
+ public static class MGCommonGameNetworkState implements Serializable {
+ public int state; // 0:closed, 1: connected
+ }
+
+ /**
+ * 23. 游戏通知app获取积分
+ */
+ public static final String MG_COMMON_GAME_GET_SCORE = "mg_common_game_get_score";
+
+ /**
+ * 23. 游戏通知app获取积分 模型
+ */
+ public static class MGCommonGameGetScore implements Serializable {
+ }
+
+ /**
+ * 24. 游戏通知app带入积分
+ */
+ public static final String MG_COMMON_GAME_SET_SCORE = "mg_common_game_set_score";
+
+ /**
+ * 24. 游戏通知app带入积分 模型
+ */
+ public static class MGCommonGameSetScore implements Serializable {
+ public String roundId; // 局id
+ public long lastRoundScore; // 本人当前积分
+ public long incrementalScore; // 充值积分
+ public long totalScore; // 充值后总积分
+ }
+
+ /**
+ * 25. 创建订单
+ */
+ public static final String MG_COMMON_GAME_CREATE_ORDER = "mg_common_game_create_order";
+
+ /**
+ * 25. 创建订单 模型
+ */
+ public static class MGCommonGameCreateOrder implements Serializable {
+ public String cmd; // 触发的行为动作,比如打赏,购买等
+ public String fromUid; // 付费用户uid
+ public String toUid; // 目标用户uid
+ public long value; // 所属的游戏价值
+ public String payload; // 扩展数据 json 字符串, 特殊可选
+ }
+
+ /**
+ * 26. 游戏通知app玩家角色(仅对狼人杀有效)
+ */
+ public static final String MG_COMMON_PLAYER_ROLE_ID = "mg_common_player_role_id";
+
+ /**
+ * 26. 游戏通知app玩家角色(仅对狼人杀有效) 模型
+ */
+ public static class MGCommonPlayerRoleId implements Serializable {
+ public List playersRoleId; // 列表
+
+ public static class MGCommonPlayerModel implements Serializable {
+ public String uid; // 玩家id
+ public int roleId; // 角色id
+ }
+ }
+ // endregion 通用状态-游戏
+
+ // region MG状态机-通用状态-玩家
+ // 参考:https://docs.sud.tech/zh-CN/app/Client/MGFSM/CommonStatePlayer.html
+
+ /**
+ * 1.加入状态(已修改)
+ * 最低版本: v1.1.30.xx
+ */
+ public static final String MG_COMMON_PLAYER_IN = "mg_common_player_in";
+
+ /**
+ * 1.加入状态(已修改) 模型
+ * 用户是否加入游戏;
+ * 游戏开始后,未加入的用户为OB视角。
+ */
+ public static class MGCommonPlayerIn implements Serializable {
+ // true 已加入,false 未加入
+ public boolean isIn;
+
+ // 加入哪支队伍
+ public int teamId;
+
+ // 当isIn==false时有效;0 主动退出,1 被踢;(reason默认-1,无意义便于处理)
+ public int reason;
+
+ // 当reason==1时有效;kickUID为踢人的用户uid;判断被踢的人是本人条件(onPlayerStateChange(userId==kickedUID == selfUID);(kickUID默认"",无意义便于处理)
+ public String kickUID;
+ }
+
+ /**
+ * 2.准备状态(已修改)
+ * 最低版本: v1.1.30.xx
+ */
+ public static final String MG_COMMON_PLAYER_READY = "mg_common_player_ready";
+
+ /**
+ * 2.准备状态(已修改) 模型
+ * 用户是否为队长,队长在游戏中会有开始游戏的权利。
+ */
+ public static class MGCommonPlayerReady implements Serializable {
+ // 当retCode==0时有效;true 已准备,false 未准备
+ public boolean isReady;
+ }
+
+ /**
+ * 3.队长状态(已修改)
+ * 最低版本: v1.1.30.xx
+ */
+ public static final String MG_COMMON_PLAYER_CAPTAIN = "mg_common_player_captain";
+
+ /**
+ * 3.队长状态(已修改) 模型
+ * 用户是否为队长,队长在游戏中会有开始游戏的权利。
+ */
+ public static class MGCommonPlayerCaptain implements Serializable {
+ // true 是队长,false 不是队长;
+ public boolean isCaptain;
+ }
+
+ /**
+ * 4.游戏状态(已修改)
+ * 最低版本: v1.1.30.xx
+ */
+ public static final String MG_COMMON_PLAYER_PLAYING = "mg_common_player_playing";
+
+ /**
+ * 4.游戏状态(已修改)模型
+ * 用户游戏状态,如果用户在游戏中,建议:
+ * a.空出屏幕中心区:
+ * 关闭全屏礼物特效;
+ * b.部分强操作类小游戏(spaceMax为true),尽量收缩原生UI,给游戏留出尽量大的操作空间:
+ * 收缩公屏;
+ * 收缩麦位;
+ * 如果不在游戏中,则恢复。
+ */
+ public static class MGCommonPlayerPlaying implements Serializable {
+ // true 游戏中,false 未在游戏中;
+ public boolean isPlaying;
+ // 本轮游戏id,当isPlaying==true时有效
+ public String gameRoundId;
+ // 当isPlaying==false时有效;isPlaying=false, 0:正常结束 1:提前结束(自己不玩了)2:无真人可以提前结束(无真人,只有机器人) 3:所有人都提前结束;(reason默认-1,无意义便于处理)
+ public int reason;
+ // true 建议尽量收缩原生UI,给游戏留出尽量大的操作空间 false 初始状态;
+ public Boolean spaceMax;
+ }
+
+ /**
+ * 5.玩家在线状态
+ */
+ public static final String MG_COMMON_PLAYER_ONLINE = "mg_common_player_online";
+
+ /**
+ * 5.玩家在线状态 模型
+ */
+ public static class MGCommonPlayerOnline implements Serializable {
+ // true:在线,false: 离线
+ public boolean isOnline;
+ }
+
+ /**
+ * 6.玩家换游戏位状态
+ */
+ public static final String MG_COMMON_PLAYER_CHANGE_SEAT = "mg_common_player_change_seat";
+
+ /**
+ * 6.玩家换游戏位状态 模型
+ */
+ public static class MGCommonPlayerChangeSeat implements Serializable {
+ // 换位前的游戏位(座位号)
+ public int preSeatIndex;
+ // 换位成功后的游戏位(座位号)
+ public int currentSeatIndex;
+ }
+
+ /**
+ * 7. 游戏通知app点击玩家头像
+ */
+ public static final String MG_COMMON_SELF_CLICK_GAME_PLAYER_ICON = "mg_common_self_click_game_player_icon";
+
+ /**
+ * 7. 游戏通知app点击玩家头像 模型
+ */
+ public static class MGCommonSelfClickGamePlayerIcon implements Serializable {
+ // 被点击头像的用户id
+ public String uid;
+ }
+
+ /**
+ * 8. 游戏通知app玩家死亡状态(2022-04-24新增)
+ */
+ public static final String MG_COMMON_SELF_DIE_STATUS = "mg_common_self_die_status";
+
+ /**
+ * 8. 游戏通知app玩家死亡状态(2022-04-24新增)模型
+ */
+ public static class MGCommonSelfDieStatus implements Serializable {
+ public String uid; // 用户id
+ public boolean isDeath; // 玩家是否死亡 true:死亡, false: 未死亡;默认 false
+ }
+
+ /**
+ * 9. 游戏通知app轮到玩家出手状态(2022-04-24新增)
+ */
+ public static final String MG_COMMON_SELF_TURN_STATUS = "mg_common_self_turn_status";
+
+ /**
+ * 9. 游戏通知app轮到玩家出手状态(2022-04-24新增)模型
+ */
+ public static class MGCommonSelfTurnStatus implements Serializable {
+ public String uid; // 用户id
+ public boolean isTurn; // 是否轮到玩家出手 true:是上面uid玩家的出手回合, false: 不是上面uid玩家的出手回合;默认false
+ }
+
+ /**
+ * 10. 游戏通知app玩家选择状态(2022-04-24新增)
+ */
+ public static final String MG_COMMON_SELF_SELECT_STATUS = "mg_common_self_select_status";
+
+ /**
+ * 10. 游戏通知app玩家选择状态(2022-04-24新增)模型
+ */
+ public static class MGCommonSelfSelectStatus implements Serializable {
+ public String uid; // 用户id
+ public boolean isSelected; // 玩家是否选择 true:选择, false: 未选择; 默认false
+ }
+
+ /**
+ * 11. 游戏通知app层当前游戏剩余时间(2022-05-23新增,目前UMO生效)
+ */
+ public static final String MG_COMMON_GAME_COUNTDOWN_TIME = "mg_common_game_countdown_time";
+
+ /**
+ * 11. 游戏通知app层当前游戏剩余时间(2022-05-23新增,目前UMO生效)模型
+ */
+ public static class MGCommonGameCountdownTime implements Serializable {
+ public int countdown;// 剩余时间,单位为秒
+ }
+
+ /**
+ * 12. 游戏通知app层当前玩家死亡后变成ob视角(2022-08-23新增,目前狼人杀生效)
+ */
+ public static final String MG_COMMON_SELF_OB_STATUS = "mg_common_self_ob_status";
+
+ /**
+ * 12. 游戏通知app层当前玩家死亡后变成ob视角(2022-08-23新增,目前狼人杀生效)模型
+ */
+ public static class MGCommonSelfObStatus implements Serializable {
+ public boolean isOb;// 是否成为ob视角
+ }
+
+ // endregion 通用状态-玩家
+
+
+ // region 碰碰我最强
+ // endregion 碰碰我最强
+
+ // region 飞刀达人
+ // endregion 飞刀达人
+
+ // region 你画我猜
+ // 参考文档:https://docs.sud.tech/zh-CN/app/Client/MGFSM/DrawGuess.html
+
+ /**
+ * 1. 选词中状态(已修改)
+ */
+ public static final String MG_DG_SELECTING = "mg_dg_selecting";
+
+ /**
+ * 1. 选词中状态(已修改) 模型
+ * 选词中,头像正下方
+ */
+ public static class MGDGSelecting implements Serializable {
+ // bool 类型 true:正在选词中,false: 不在选词中
+ public boolean isSelecting;
+ }
+
+ /**
+ * 2. 作画中状态(已修改)
+ */
+ public static final String MG_DG_PAINTING = "mg_dg_painting";
+
+ /**
+ * 2. 作画中状态(已修改) 模型
+ * 作画中,头像正下方
+ */
+ public static class MGDGPainting implements Serializable {
+ // true: 绘画中,false: 取消绘画
+ public boolean isPainting;
+ }
+
+ /**
+ * 3. 显示错误答案状态(已修改)
+ */
+ public static final String MG_DG_ERRORANSWER = "mg_dg_erroranswer";
+
+ /**
+ * 3. 显示错误答案状态(已修改) 模型
+ * 错误的答案,最多6中文,头像正下方
+ */
+ public static class MGDGErroranswer implements Serializable {
+ // 字符串类型,展示错误答案
+ public String msg;
+ }
+
+ /**
+ * 4. 显示总积分状态(已修改)
+ */
+ public static final String MG_DG_TOTALSCORE = "mg_dg_totalscore";
+
+ /**
+ * 4. 显示总积分状态(已修改) 模型
+ * 总积分,位于头像右上角
+ */
+ public static class MGDGTotalscore implements Serializable {
+ // 字符串类型 总积分
+ public String msg;
+ }
+
+ /**
+ * 5. 本次获得积分状态(已修改)
+ */
+ public static final String MG_DG_SCORE = "mg_dg_score";
+
+ /**
+ * 5. 本次获得积分状态(已修改) 模型
+ * 本次积分,头像正下方
+ */
+ public static final class MGDGScore implements Serializable {
+ // string类型,展示本次获得积分
+ public String msg;
+ }
+
+ // endregion 你画我猜
+
+ // region 元宇宙砂砂舞
+ /**
+ * 1. 元宇宙砂砂舞指令回调
+ */
+ public static final String MG_COMMON_GAME_DISCO_ACTION = "mg_common_game_disco_action";
+
+ /**
+ * 1. 元宇宙砂砂舞指令回调 模型
+ * app指令请求游戏客户端成功与否的回调
+ */
+ public static final class MGCommonGameDiscoAction implements Serializable {
+ public int actionId; // 指令序号类型
+ public boolean isSuccess; // true 指令成功,false 指令失败
+ }
+
+ /**
+ * 2. 元宇宙砂砂舞指令动作结束通知
+ */
+ public static final String MG_COMMON_GAME_DISCO_ACTION_END = "mg_common_game_disco_action_end";
+
+ /**
+ * 2. 元宇宙砂砂舞指令动作结束通知 模型
+ * 游戏客户端通知APP指令动作结束
+ */
+ public static final class MGCommonGameDiscoActionEnd implements Serializable {
+ public int actionId; // 指令序号类型
+ public String playerId; // // 玩家ID string 类型
+ }
+ // endregion 元宇宙砂砂舞
+
+ // region 定制火箭
+ /**
+ * 1. 礼物配置文件(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_CONFIG = "mg_custom_rocket_config";
+
+ /**
+ * 1. 礼物配置文件(火箭) 模型
+ */
+ public static final class MGCustomRocketConfig implements Serializable {
+ }
+
+ /**
+ * 2. 拥有模型列表(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_MODEL_LIST = "mg_custom_rocket_model_list";
+
+ /**
+ * 2. 拥有模型列表(火箭) 模型
+ */
+ public static final class MGCustomRocketModelList implements Serializable {
+ }
+
+ /**
+ * 3. 拥有组件列表(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_COMPONENT_LIST = "mg_custom_rocket_component_list";
+
+ /**
+ * 3. 拥有组件列表(火箭) 模型
+ */
+ public static final class MGCustomRocketComponentList implements Serializable {
+ }
+
+ /**
+ * 4. 获取用户信息(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_USER_INFO = "mg_custom_rocket_user_info";
+
+ /**
+ * 4. 获取用户信息 模型
+ */
+ public static final class MGCustomRocketUserInfo implements Serializable {
+ public List userIdList;
+ }
+
+ /**
+ * 5. 订单记录列表(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_ORDER_RECORD_LIST = "mg_custom_rocket_order_record_list";
+
+ /**
+ * 5. 订单记录列表(火箭) 模型
+ */
+ public static final class MGCustomRocketOrderRecordList implements Serializable {
+ public int pageIndex; // 第几页
+ public int pageSize; // 每页多少条数据
+ }
+
+ /**
+ * 6. 展馆内列表(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_ROOM_RECORD_LIST = "mg_custom_rocket_room_record_list";
+
+ /**
+ * 6. 展馆内列表(火箭) 模型
+ */
+ public static final class MGCustomRocketRoomRecordList implements Serializable {
+ public int pageIndex; // 第几页
+ public int pageSize; // 每页多少条数据
+ }
+
+ /**
+ * 7. 展馆内玩家送出记录(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_USER_RECORD_LIST = "mg_custom_rocket_user_record_list";
+
+ /**
+ * 7. 展馆内玩家送出记录(火箭) 模型
+ */
+ public static final class MGCustomRocketUserRecordList implements Serializable {
+ public String userId; // 用户id
+ public int pageIndex; // 第几页
+ public int pageSize; // 每页多少条数据
+ }
+
+ /**
+ * 8. 设置默认模型(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_SET_DEFAULT_MODEL = "mg_custom_rocket_set_default_model";
+
+ /**
+ * 8. 设置默认模型(火箭) 模型
+ */
+ public static final class MGCustomRocketSetDefaultModel implements Serializable {
+ public String modelId; // 默认模型
+ }
+
+ /**
+ * 9. 动态计算一键发送价格(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_DYNAMIC_FIRE_PRICE = "mg_custom_rocket_dynamic_fire_price";
+
+ /**
+ * 9. 动态计算一键发送价格(火箭) 模型
+ */
+ public static final class MGCustomRocketDynamicFirePrice implements Serializable {
+ public List componentList; // 组件列表
+
+ public static class ComponentModel {
+ public String itemId; // 已购买的唯一标识
+ }
+ }
+
+ /**
+ * 10. 一键发送(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_FIRE_MODEL = "mg_custom_rocket_fire_model";
+
+ /**
+ * 10. 一键发送(火箭) 模型
+ */
+ public static final class MGCustomRocketFireModel implements Serializable {
+ public List componentList; // 组件列表
+
+ public static class ComponentModel {
+ public int type; // 类型
+ public String itemId; // 已购买的唯一标识
+ }
+ }
+
+ /**
+ * 11. 新组装模型(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_CREATE_MODEL = "mg_custom_rocket_create_model";
+
+ /**
+ * 11. 新组装模型(火箭) 模型
+ */
+ public static final class MGCustomRocketCreateModel implements Serializable {
+ public List componentList; // 组件列表
+
+ public static class ComponentModel {
+ public String itemId; // 模型Id
+ }
+ }
+
+ /**
+ * 12. 模型更换组件(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_REPLACE_COMPONENT = "mg_custom_rocket_replace_component";
+
+ /**
+ * 12. 模型更换组件(火箭) 模型
+ */
+ public static final class MGCustomRocketReplaceComponent implements Serializable {
+ public String modelId; // 模型ID
+ public List componentList; // 组件列表
+
+ public static class ComponentModel {
+ public String itemId; // 已购买的唯一标识
+ }
+ }
+
+ /**
+ * 13. 购买组件(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_BUY_COMPONENT = "mg_custom_rocket_buy_component";
+
+ /**
+ * 13. 购买组件(火箭) 模型
+ */
+ public static final class MGCustomRocketBuyComponent implements Serializable {
+ public List componentList; // 组件列表
+
+ public static class ComponentModel {
+ public String componentId; // 已购买的唯一标识
+ public String value; // 值
+ }
+ }
+
+ /**
+ * 14. 播放效果开始(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_PLAY_EFFECT_START = "mg_custom_rocket_play_effect_start";
+
+ /**
+ * 14. 播放效果开始(火箭) 模型
+ */
+ public static final class MGCustomRocketPlayEffectStart implements Serializable {
+ }
+
+ /**
+ * 15. 播放效果完成(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_PLAY_EFFECT_FINISH = "mg_custom_rocket_play_effect_finish";
+
+ /**
+ * 15. 播放效果完成(火箭) 模型
+ */
+ public static final class MGCustomRocketPlayEffectFinish implements Serializable {
+ }
+
+ /**
+ * 16. 验证签名合规(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_VERIFY_SIGN = "mg_custom_rocket_verify_sign";
+
+ /**
+ * 16. 验证签名合规(火箭) 模型
+ */
+ public static final class MGCustomRocketVerifySign implements Serializable {
+ public String sign; // 验证的内容
+ }
+
+ /**
+ * 17. 上传icon(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_UPLOAD_MODEL_ICON = "mg_custom_rocket_upload_model_icon";
+
+ /**
+ * 17. 上传icon(火箭) 模型
+ */
+ public static final class MGCustomRocketUploadModelIcon implements Serializable {
+ public String data; // 图片base64数据
+ }
+
+ /**
+ * 18. 前期准备完成(火箭)
+ * 表示app此时可以向火箭发出指令了
+ */
+ public static final String MG_CUSTOM_ROCKET_PREPARE_FINISH = "mg_custom_rocket_prepare_finish";
+
+ /**
+ * 18. 前期准备完成(火箭) 模型
+ */
+ public static final class MGCustomRocketPrepareFinish implements Serializable {
+ }
+
+ /**
+ * 19. 火箭主界面已显示(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_SHOW_GAME_SCENE = "mg_custom_rocket_show_game_scene";
+
+ /**
+ * 19. 火箭主界面已显示(火箭) 模型
+ */
+ public static final class MGCustomRocketShowGameScene implements Serializable {
+ }
+
+ /**
+ * 20. 火箭主界面已隐藏(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_HIDE_GAME_SCENE = "mg_custom_rocket_hide_game_scene";
+
+ /**
+ * 20. 火箭主界面已隐藏(火箭) 模型
+ */
+ public static final class MGCustomRocketHideGameScene implements Serializable {
+ }
+
+ /**
+ * 21. 点击锁住组件(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_CLICK_LOCK_COMPONENT = "mg_custom_rocket_click_lock_component";
+
+ /**
+ * 21. 点击锁住组件(火箭) 模型
+ */
+ public static final class MGCustomRocketClickLockComponent implements Serializable {
+ public int type; // 组件类型
+ public String componentId; // 组件ID
+ }
+
+ /**
+ * 22. 火箭效果飞行点击(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_FLY_CLICK = "mg_custom_rocket_fly_click";
+
+ /**
+ * 22. 火箭效果飞行点击(火箭) 模型
+ */
+ public static final class MGCustomRocketFlyClick implements Serializable {
+ }
+
+ /**
+ * 23. 火箭效果飞行结束(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_FLY_END = "mg_custom_rocket_fly_end";
+
+ /**
+ * 23. 火箭效果飞行结束(火箭) 模型
+ */
+ public static final class MGCustomRocketFlyEnd implements Serializable {
+ public long clickNumber; // 点击多少次
+ public long flyNumber; // 飞行多远
+ }
+
+ /**
+ * 24. 设置点击区域(火箭)
+ */
+ public static final String MG_CUSTOM_ROCKET_SET_CLICK_RECT = "mg_custom_rocket_set_click_rect";
+
+ /**
+ * 24. 设置点击区域(火箭) 模型
+ */
+ public static final class MGCustomRocketSetClickRect implements Serializable {
+ public List list; // 游戏的点击区域
+ }
+ // endregion 定制火箭
+
+ // region 棒球
+ /**
+ * 1. 查询排行榜数据(棒球)
+ * 游戏客户端通知APP查询排行榜数据
+ */
+ public static final String MG_BASEBALL_RANKING = "mg_baseball_ranking";
+
+ /**
+ * 1. 查询排行榜数据(棒球) 模型
+ */
+ public static final class MGBaseballRanking implements Serializable {
+ public int page; // 页数
+ public int size; // 每页显示的数量
+ }
+
+ /**
+ * 2. 查询我的排名(棒球)
+ * 游戏客户端通知APP查询我的排名
+ */
+ public static final String MG_BASEBALL_MY_RANKING = "mg_baseball_my_ranking";
+
+ /**
+ * 2. 查询我的排名(棒球) 模型
+ */
+ public static final class MGBaseballMyRanking implements Serializable {
+ }
+
+ /**
+ * 3. 查询当前距离我的前后玩家数据(棒球)
+ * 游戏客户端通知APP查询当前距离我的前后玩家数据(需要排除自己)
+ */
+ public static final String MG_BASEBALL_RANGE_INFO = "mg_baseball_range_info";
+
+ /**
+ * 3. 查询当前距离我的前后玩家数据(棒球) 模型
+ */
+ public static final class MGBaseballRangeInfo implements Serializable {
+ public long distance; // 自己当前的距离
+ }
+
+ /**
+ * 4. 设置app提供给游戏可点击区域(棒球)
+ * 游戏客户端通知APP指令动作设置点击区域
+ */
+ public static final String MG_BASEBALL_SET_CLICK_RECT = "mg_baseball_set_click_rect";
+
+ /**
+ * 4. 设置app提供给游戏可点击区域(棒球) 模型
+ */
+ public static final class MGBaseballSetClickRect implements Serializable {
+ public List list;
+ }
+
+ /**
+ * 5. 前期准备完成(棒球)
+ * 游戏客户端通知APP指令动作前期准备完成
+ */
+ public static final String MG_BASEBALL_PREPARE_FINISH = "mg_baseball_prepare_finish";
+
+ /**
+ * 5. 前期准备完成(棒球) 模型
+ */
+ public static final class MGBaseballPrepareFinish implements Serializable {
+ }
+
+ /**
+ * 6. 主界面已显示(棒球)
+ * 游戏客户端通知APP指令动作主界面已显示
+ */
+ public static final String MG_BASEBALL_SHOW_GAME_SCENE = "mg_baseball_show_game_scene";
+
+ /**
+ * 6. 主界面已显示(棒球) 模型
+ */
+ public static final class MGBaseballShowGameScene implements Serializable {
+ }
+
+ /**
+ * 7. 主界面已隐藏(棒球)
+ * 游戏客户端通知APP指令动作主界面已隐藏
+ */
+ public static final String MG_BASEBALL_HIDE_GAME_SCENE = "mg_baseball_hide_game_scene";
+
+ /**
+ * 7. 主界面已隐藏(棒球) 模型
+ */
+ public static final class MGBaseballHideGameScene implements Serializable {
+ }
+
+ /**
+ * 8. 获取文本配置数据(棒球)
+ */
+ public static final String MG_BASEBALL_TEXT_CONFIG = "mg_baseball_text_config";
+
+ /**
+ * 8. 获取文本配置数据(棒球) 模型
+ */
+ public static final class MGBaseballTextConfig implements Serializable {
+ }
+ // endregion 棒球
+
+ /** 点击区域定义 */
+ public static class InteractionClickRect {
+ public float x; // 区域的x
+ public float y; // 区域的y
+ public float width; // 区域的width
+ public float height; // 区域的height
+ }
+
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/utils/GameCommonStateUtils.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/utils/GameCommonStateUtils.java
new file mode 100644
index 0000000..bb5dfd4
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/utils/GameCommonStateUtils.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.utils;
+
+import android.text.TextUtils;
+
+import tech.sud.mgp.SudMGPWrapper.state.SudMGPMGState;
+
+/**
+ * 游戏通用状态工具类
+ */
+public class GameCommonStateUtils {
+
+ /**
+ * 解析公屏消息
+ *
+ * @param publicMessage
+ * @return
+ */
+ public static String parseMGCommonPublicMessage(SudMGPMGState.MGCommonPublicMessage publicMessage, String languageCode) {
+ if (publicMessage == null || publicMessage.msg == null || publicMessage.msg.size() == 0) {
+ return null;
+ }
+ StringBuilder sb = new StringBuilder();
+ for (SudMGPMGState.MGCommonPublicMessage.MGCommonPublicMessageMsg msgModel : publicMessage.msg) {
+ switch (msgModel.phrase) {
+ case 1:
+ String text = parseI18nText(languageCode, msgModel.text);
+ if (text != null) {
+ sb.append(text);
+ }
+ break;
+ case 2:
+ if (msgModel.user != null && msgModel.user.name != null) {
+ sb.append(msgModel.user.name);
+ }
+ break;
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * 根据当前的语言码,选择对应语言的文字
+ *
+ * @param languageCode 语言代码
+ * @param model 游戏发过来的文本对象
+ * @return 返回选择的字符串
+ */
+ public static String parseI18nText(String languageCode, SudMGPMGState.MGCommonPublicMessage.MGCommonPublicMessageMsgText model) {
+ if (model == null) return null;
+ if (languageCode == null) return model.defaultStr;
+
+ // 精准匹配
+ String text = i18nPrecise(languageCode, model);
+
+ if (TextUtils.isEmpty(text)) {
+ // 如果未匹配到,则尝试模糊匹配
+ if (isMatchLanguage(languageCode, "zh")) {
+ return model.zh_CN;
+ }
+ return model.en_US;
+ } else {
+ return text;
+ }
+ }
+
+ /** 精准匹配 */
+ private static String i18nPrecise(String languageCode, SudMGPMGState.MGCommonPublicMessage.MGCommonPublicMessageMsgText model) {
+ switch (languageCode) {
+ case "zh-CN":
+ return model.zh_CN;
+ case "zh-HK":
+ return model.zh_HK;
+ case "zh-MO":
+ return model.zh_MO;
+ case "zh-SG":
+ return model.zh_SG;
+ case "zh-TW":
+ return model.zh_TW;
+ case "en-US":
+ return model.en_US;
+ case "en-GB":
+ return model.en_GB;
+ case "ms-BN":
+ return model.ms_BN;
+ case "ms-MY":
+ return model.ms_MY;
+ case "vi-VN":
+ return model.vi_VN;
+ case "id-ID":
+ return model.id_ID;
+ case "es-ES":
+ return model.es_ES;
+ case "ja-JP":
+ return model.ja_JP;
+ case "ko-KR":
+ return model.ko_KR;
+ case "th-TH":
+ return model.th_TH;
+ case "ar-SA":
+ return model.ar_SA;
+ case "ur-PK":
+ return model.ur_PK;
+ case "tr-TR":
+ return model.tr_TR;
+ }
+ return null;
+ }
+
+ /**
+ * 判断是否是该语言
+ */
+ private static boolean isMatchLanguage(String languageCode, String matchLanguageCode) {
+ if (languageCode != null && matchLanguageCode != null) {
+ return matchLanguageCode.equals(languageCode) || languageCode.startsWith(matchLanguageCode + "-");
+ }
+ return false;
+ }
+
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/utils/ISudFSMStateHandleUtils.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/utils/ISudFSMStateHandleUtils.java
new file mode 100644
index 0000000..8ff26c6
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/utils/ISudFSMStateHandleUtils.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright © Sud.Tech
+ * https://sud.tech
+ */
+
+package tech.sud.mgp.SudMGPWrapper.utils;
+
+import tech.sud.mgp.core.ISudFSMStateHandle;
+import tech.sud.mgp.SudMGPWrapper.state.MGStateResponse;
+
+public class ISudFSMStateHandleUtils {
+
+ /**
+ * 回调游戏,成功
+ *
+ * @param handle
+ */
+ public static void handleSuccess(ISudFSMStateHandle handle) {
+ MGStateResponse response = new MGStateResponse();
+ response.ret_code = MGStateResponse.SUCCESS;
+ response.ret_msg = "success";
+ handle.success(SudJsonUtils.toJson(response));
+ }
+
+}
diff --git a/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/utils/SudJsonUtils.java b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/utils/SudJsonUtils.java
new file mode 100644
index 0000000..1e13c37
--- /dev/null
+++ b/SudMGPWrapper/src/main/java/tech/sud/mgp/SudMGPWrapper/utils/SudJsonUtils.java
@@ -0,0 +1,43 @@
+package tech.sud.mgp.SudMGPWrapper.utils;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+/**
+ * json解析工具
+ */
+public class SudJsonUtils {
+
+ /**
+ * 解析json
+ *
+ * @return 如果解析出错,则返回空对象
+ */
+ public static T fromJson(final String json, final Class type) {
+ try {
+ return getGson().fromJson(json, type);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 对象解析成json
+ *
+ * @param object
+ * @return
+ */
+ public static String toJson(final Object object) {
+ return getGson().toJson(object);
+ }
+
+ public static Gson getGson() {
+ return InnerClass.gson;
+ }
+
+ public static class InnerClass {
+ public static Gson gson = new GsonBuilder().serializeNulls().disableHtmlEscaping().create();
+ }
+
+}
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..956c004
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1,2 @@
+/build
+/release
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..c5c8b00
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,140 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'com.mob.sdk'
+apply plugin: 'kotlin-android-extensions'
+apply plugin: 'kotlin-kapt'
+MobSDK {
+ appKey "3635416c7fadb"
+ appSecret "c6e8c85e5b8d90220a063cdfda7d0096"
+ ShareSDK {
+ loopShare true
+ devInfo {
+ Wechat {
+ appId "wx7b5c4e89e726a72c"
+ appSecret "afc9860f4c670ac19f9efb0ab94927a3"
+// appId "wx3858bffeddfb91b8"
+// appSecret "0b59b165268b63ba6446d1dc55a21f38"
+ }
+ QQ {
+ appId "102046191"
+ appKey "dT8ZbR4TfdOuBF4e"
+ }
+ }
+ }
+
+}
+
+android {
+
+ compileSdkVersion 33
+ buildToolsVersion "30.0.2"
+ aaptOptions {
+ cruncherEnabled = false
+ useNewCruncher = false
+ }
+ defaultConfig {
+ applicationId "com.yuyin.mier"
+ minSdkVersion 22
+ targetSdkVersion 31
+
+ versionCode 46
+ versionName "1.3.6"
+ dataBinding {
+ //noinspection DataBindingWithoutKapt
+ enabled = true
+ }
+ javaCompileOptions {
+ annotationProcessorOptions {
+ arguments = [AROUTER_MODULE_NAME: project.getName()]
+ }
+ }
+ multiDexEnabled true
+ ndk {
+ abiFilters /*'armeabi-v7a',*/ 'arm64-v8a', 'x86' , 'x86_64'
+ }
+ }
+
+ signingConfigs {
+ debug {
+ storeFile file("../mier.jks")
+ storePassword "123456"
+ keyAlias "key0"
+ keyPassword "123456"
+ }
+
+ release {
+ storeFile file("../mier.jks")
+ storePassword "123456"
+ keyAlias "key0"
+ keyPassword "123456"
+ }
+ }
+
+ sourceSets {
+ main {
+ jniLibs.srcDirs = ['libs']
+ }
+ }
+
+ repositories { flatDir { dirs 'libs' } }
+ buildTypes {
+ release {
+// minifyEnabled true
+// proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_11
+ targetCompatibility JavaVersion.VERSION_11
+ }
+ kotlinOptions {
+ jvmTarget = '11'
+ }
+ // 打包 start
+ applicationVariants.all { variant ->
+ variant.outputs.all {
+ def fileName
+ def date = new Date()
+ def formattedDate = date.format('yyyyMMdd-HHmmss')
+ if (variant.buildType.name == 'release') {
+ fileName = "余音派对-v${variant.mergedFlavor.versionName}_release_${formattedDate}.apk"
+ } else if (variant.buildType.name == 'debug') {
+ fileName = "余音派对-v${variant.mergedFlavor.versionName}_debug_${formattedDate}.apk"
+ }
+ outputFileName = fileName;
+ }
+ }
+ // 打包 end
+ dataBinding {
+ enabled = true
+ }
+ lint {
+ baseline = file("lint-baseline.xml")
+ }
+
+ // 添加AAR元数据兼容性配置
+ dependenciesInfo {
+ includeInApk = false
+ includeInBundle = false
+ }
+}
+
+dependencies {
+ implementation fileTree(dir: "libs", include: ["*.jar"])
+
+ implementation fileTree(dir: '../lib_base/libs', include: ['.jar', '.aar'] )
+
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+ api 'com.alibaba:arouter-api:1.4.1'
+ kapt 'com.alibaba:arouter-compiler:1.2.2'
+
+
+
+ implementation project(':lib_base')
+ implementation project(':module_live')
+ implementation project(':module_community')
+ implementation project(path:':LocalAar:alipaySdk')
+ implementation project(path:':LocalAar:paytypelibrary')
+
+}
\ No newline at end of file
diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml
new file mode 100644
index 0000000..8d16477
--- /dev/null
+++ b/app/lint-baseline.xml
@@ -0,0 +1,642 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..f8c4802
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,22 @@
+# 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
+-keep class io.agora.**{*;}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..2455392
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/LunchActivity.kt b/app/src/main/java/com/yuyin/mier/LunchActivity.kt
new file mode 100644
index 0000000..0f98a10
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/LunchActivity.kt
@@ -0,0 +1,115 @@
+package com.yuyin.mier
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.os.Handler
+import com.alibaba.android.arouter.launcher.ARouter
+import com.google.gson.Gson
+import com.kongzue.dialog.v3.MessageDialog
+import com.tencent.qcloud.tuicore.util.SPUtils
+import com.xuexiang.xupdate.XUpdate
+import com.xuexiang.xupdate.entity.UpdateEntity
+import com.yuyin.lib_base.App
+import com.yuyin.lib_base.arouter.AroutUtil
+import com.yuyin.lib_base.base.BaseActivity
+import com.yuyin.lib_base.base.BaseViewModel
+import com.yuyin.lib_base.base.UserManager
+import com.yuyin.lib_base.model.ConfigBean
+import kotlinx.android.synthetic.main.activity_launch.*
+
+class LunchActivity : BaseActivity() {
+ private var mContext: Context? = null
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ if (!isTaskRoot) {
+ finish()
+ return
+ }
+ }
+
+ /**
+ * 设置透明状态栏
+ */
+ private fun setStatusBar() {
+// val window: Window = window
+// window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
+// window.decorView.systemUiVisibility =
+// View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
+// window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
+// window.statusBarColor = 0
+ }
+
+ override fun startObserve() {
+ viewModel.configBean.observe(this) {
+ SPUtils.getInstance().put("config",Gson().toJson(it))
+ if (it.version_is_force_update > 0) {
+ updateAPP(it)
+ return@observe
+ }
+ App.configBean = it
+ Handler().postDelayed({
+ if (UserManager.IS_LOGIN) {
+ ARouter.getInstance().build(AroutUtil.MAIN_MAIN).navigation()
+ finish()
+ } else {
+ ARouter.getInstance().build(AroutUtil.LOGIN_MAIN).navigation()
+ finish()
+ }
+ }, 100)
+ }
+ }
+
+ override fun getLayoutId(): Int {
+// requestWindowFeature(Window.FEATURE_NO_TITLE)
+// this.window.setFlags(
+// WindowManager.LayoutParams.FLAG_FULLSCREEN,
+// WindowManager.LayoutParams.FLAG_FULLSCREEN
+// )
+// setStatusBar()
+ return R.layout.activity_launch
+ }
+
+ override fun initView() {
+ mContext = this
+// Glide.with(this).load(R.mipmap.splash).into(img)
+ }
+
+ override fun initData() {
+ val code = getVersionCode()
+ viewModel.get_system_base_config("$code", "1")
+ }
+
+ override fun initEvent() {
+
+ }
+
+ private fun update(configBean: ConfigBean) {
+ MessageDialog.show(
+ this,
+ "提示",
+ configBean.version_note,
+ "去更新"
+ ).setOnOkButtonClickListener { baseDialog, v ->
+ val uri: Uri = Uri.parse(configBean.version_down_url)
+ val intent = Intent(Intent.ACTION_VIEW, uri)
+ startActivity(intent)
+ true
+ }
+ }
+
+
+ private fun updateAPP(configBean: ConfigBean) {
+ val updateEntity = UpdateEntity()
+ updateEntity.downloadUrl = configBean.version_down_url
+ updateEntity.versionCode = 3
+ updateEntity.versionName = configBean.version_app
+ updateEntity.updateContent = configBean.version_note
+ updateEntity.isForce = configBean.version_is_force_update == 2
+ updateEntity.isHasUpdate = true
+ XUpdate.newBuild(this).supportBackgroundUpdate(false) //
+ .promptWidthRatio(0.8f).build().update(updateEntity)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/BaseIndicatorAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/BaseIndicatorAdapter.kt
new file mode 100644
index 0000000..9a86ad2
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/BaseIndicatorAdapter.kt
@@ -0,0 +1,25 @@
+package com.yuyin.mier.adapter
+
+import android.widget.ImageView
+import android.widget.TextView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.mier.R
+
+class BaseIndicatorAdapter : BaseQuickAdapter(R.layout.item_indicator) {
+ private var selectPosition: Int = 0
+
+ override fun convert(helper: BaseViewHolder, item: String?) {
+ helper.setText(R.id.tv_content,item)
+ val select = helper.layoutPosition == selectPosition
+ helper.getView(R.id.tv_content).isSelected = select
+ helper.getView(R.id.v_view).isSelected = select
+ }
+
+ fun setSelectPosition(index: Int) {
+ notifyItemChanged(selectPosition)
+ notifyItemChanged(index)
+ selectPosition = index
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/CPTxListAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/CPTxListAdapter.kt
new file mode 100644
index 0000000..523f5d2
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/CPTxListAdapter.kt
@@ -0,0 +1,27 @@
+package com.yuyin.mier.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.model.MyCpTxBean
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.mier.R
+
+class CPTxListAdapter :
+ BaseQuickAdapter(R.layout.item_cp_room) {
+ override fun convert(helper: BaseViewHolder, item: MyCpTxBean) {
+ GlideUtil.loadImglogo(mContext, item.cp_tx_img, helper.getView(R.id.iv_cp_gift))
+ if(item.is_using=="1"){
+ helper.setVisible(R.id.iv_cp_use,true)
+ }else{
+ helper.setGone(R.id.iv_cp_use,false)
+ }
+ helper.setText(R.id.tv_cp_level, "LV."+item.level)
+ .setText(R.id.tv_name_cp, item.cp_tx_title)
+// if(item.js_suo=="1"){
+// helper.getView(R.id.rl_cp).alpha=1.0f
+// }else{
+// helper.getView(R.id.rl_cp).alpha=0.6f
+// }
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/CPTxkListAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/CPTxkListAdapter.kt
new file mode 100644
index 0000000..f28613d
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/CPTxkListAdapter.kt
@@ -0,0 +1,28 @@
+package com.yuyin.mier.adapter
+
+import android.view.View
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.model.MyCpTxBean
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.mier.R
+
+class CPTxkListAdapter :
+ BaseQuickAdapter(R.layout.item_cp_room) {
+ override fun convert(helper: BaseViewHolder, item: MyCpTxBean) {
+ GlideUtil.loadImglogo(mContext, item.head_decorate_img, helper.getView(R.id.iv_cp_gift))
+ if(item.is_using=="1"){
+ helper.setVisible(R.id.iv_cp_use,true)
+ }else{
+ helper.setGone(R.id.iv_cp_use,false)
+ }
+ helper.setText(R.id.tv_cp_level, "LV."+item.level)
+ .setText(R.id.tv_name_cp, item.head_decorate_title)
+
+ if(item.js_suo=="1"){
+ helper.getView(R.id.rl_cp).alpha=1.0f
+ }else{
+ helper.getView(R.id.rl_cp).alpha=0.6f
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/GHListAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/GHListAdapter.kt
new file mode 100644
index 0000000..a91e1e6
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/GHListAdapter.kt
@@ -0,0 +1,65 @@
+package com.yuyin.mier.adapter
+
+import android.graphics.Color
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.makeramen.roundedimageview.RoundedImageView
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.GHListBean
+import java.util.*
+
+class GHListAdapter :
+ BaseQuickAdapter(R.layout.item_gonghui, ArrayList()) {
+ override fun convert(helper: BaseViewHolder, item: GHListBean) {
+ GlideUtil.loadImglogo(mContext, item.cover, helper.getView(R.id.img1))
+ helper.setText(R.id.tv_text, item.guild_name)
+ .setText(R.id.tv_hot, item.total_gift_total_price)
+ .setText(R.id.tv_personal,"人数"+ item.num.toString() )
+ helper.setText(R.id.tv_num, (helper.position + 1).toString())
+
+ var img1 = helper.getView(R.id.img1)
+
+ if (helper.position < 3) {
+ helper.setGone(R.id.ll, true)
+ helper.setGone(R.id.tv_num, false)
+ helper.setVisible(R.id.view_line, false)
+ when (helper.position) {
+ 0 -> {
+// img1.setBorderColor(Color.parseColor("#FF8601"))
+// helper.setTextColor(R.id.tv_num, Color.parseColor("#FF8601"))
+// helper.setTextColor(R.id.tv_text, Color.parseColor("#FF8601"))
+// helper.setTextColor(R.id.tv_personal, Color.parseColor("#FF8601"))
+ helper.setImageResource(R.id.iv, R.mipmap.gh1)
+// helper.setBackgroundRes(R.id.root_view, R.mipmap.gonghui_listbg1)
+ }
+
+ 1 -> {
+// img1.setBorderColor(Color.parseColor("#609CFF"))
+// helper.setTextColor(R.id.tv_num, Color.parseColor("#609CFF"))
+// helper.setTextColor(R.id.tv_text, Color.parseColor("#609CFF"))
+// helper.setTextColor(R.id.tv_personal, Color.parseColor("#609CFF"))
+ helper.setImageResource(R.id.iv, R.mipmap.gh2)
+// helper.setBackgroundRes(R.id.root_view, R.mipmap.gonghui_listbg2)
+ }
+
+ 2 -> {
+// img1.setBorderColor(Color.parseColor("#F59364"))
+// helper.setTextColor(R.id.tv_num, Color.parseColor("#F59364"))
+// helper.setTextColor(R.id.tv_text, Color.parseColor("#F59364"))
+// helper.setTextColor(R.id.tv_personal, Color.parseColor("#F59364"))
+ helper.setImageResource(R.id.iv, R.mipmap.gh3)
+// helper.setBackgroundRes(R.id.root_view, R.mipmap.gonghui_listbg3)
+ }
+
+ }
+ } else {
+// img1.setBorderColor(Color.parseColor("#00F59364"))
+ helper.setTextColor(R.id.tv_num, Color.parseColor("#333333"))
+ helper.setGone(R.id.ll, false)
+ helper.setGone(R.id.tv_num, true)
+// helper.setVisible(R.id.view_line,true)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/GHRoomListAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/GHRoomListAdapter.kt
new file mode 100644
index 0000000..20003b7
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/GHRoomListAdapter.kt
@@ -0,0 +1,20 @@
+package com.yuyin.mier.adapter
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.GHRoomListBean
+import java.util.*
+
+
+class GHRoomListAdapter :
+ BaseQuickAdapter(R.layout.item_gonghui_room, ArrayList()) {
+ override fun convert(helper: BaseViewHolder, item: GHRoomListBean) {
+ GlideUtil.loadImglogo(mContext, item.room_cover, helper.getView(R.id.cover))
+ helper.setText(R.id.tv_name, item.room_name).setText(R.id.tv_id, "ID:" + item.room_number)
+ .setText(R.id.tv_num, item.total_gift_total_price)
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/GHSQUserListAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/GHSQUserListAdapter.kt
new file mode 100644
index 0000000..145329f
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/GHSQUserListAdapter.kt
@@ -0,0 +1,28 @@
+package com.yuyin.mier.adapter
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.GHUserListBean
+import java.util.*
+
+
+class GHSQUserListAdapter :
+ BaseQuickAdapter(R.layout.item_gonghui_user, ArrayList()) {
+ override fun convert(helper: BaseViewHolder, item: GHUserListBean) {
+ GlideUtil.loadImglogo(mContext, item.head_pic, helper.getView(R.id.cover))
+ helper.setText(R.id.tv_name, item.nick_name).setText(R.id.tv_id, item.uid)
+ .setText(R.id.tv_hot_value,item.total_gift_total_price)
+ helper.addOnClickListener(R.id.cover)
+ helper.addOnClickListener(R.id.tvNO)
+ helper.addOnClickListener(R.id.tvYes)
+ helper.setGone(R.id.tvNO, true)
+ helper.setGone(R.id.tvYes, true)
+ helper.setGone(R.id.tv_remove, false)
+ helper.setGone(R.id.tv_hot_value, false)
+
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/GHUserListAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/GHUserListAdapter.kt
new file mode 100644
index 0000000..b599d7d
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/GHUserListAdapter.kt
@@ -0,0 +1,33 @@
+package com.yuyin.mier.adapter
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.GHUserListBean
+import com.yuyin.lib_base.Const
+import java.util.*
+
+
+class GHUserListAdapter :
+ BaseQuickAdapter(R.layout.item_gonghui_user, ArrayList()) {
+ override fun convert(helper: BaseViewHolder, item: GHUserListBean) {
+ var type = 0
+ GlideUtil.loadImglogo(mContext, item.head_pic, helper.getView(R.id.cover))
+ helper.setText(R.id.tv_name, item.nick_name).setText(R.id.tv_id, item.uid)
+ .setText(R.id.tv_hot_value, item.total_gift_total_price)
+ helper.addOnClickListener(R.id.cover)
+ helper.addOnClickListener(R.id.tvNO)
+ helper.addOnClickListener(R.id.tvYes)
+ helper.addOnClickListener(R.id.tv_remove)
+
+ helper.setGone(R.id.iv_hz, helper.position == 0)
+
+ if (Const.GH_REMOVE) {
+ helper.setGone(R.id.tv_remove, helper.position != 0)
+ } else {
+ helper.setGone(R.id.tv_remove, false)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/HomePagerHotAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/HomePagerHotAdapter.kt
new file mode 100644
index 0000000..1c94849
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/HomePagerHotAdapter.kt
@@ -0,0 +1,58 @@
+package com.yuyin.mier.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.RoomListBean
+
+class HomePagerHotAdapter :
+ BaseQuickAdapter(R.layout.item_home_pager_hot) {
+ override fun convert(helper: BaseViewHolder, item: RoomListBean) {
+
+ GlideUtil.loadImglogo(mContext, item.room_cover, helper.getView(R.id.room_cover))
+ helper.setText(R.id.tv_value, item.hot_value)
+ .setText(R.id.tv_type, item.category_name)
+ .setText(R.id.tv_name, item.room_name)
+ .setText(R.id.tv_id, "ID " + item.room_number)
+
+
+ when (item.category_name) {
+ "男神" -> {
+ helper.setBackgroundRes(R.id.ll_type, R.mipmap.item_home_pager_hot_tag2)
+ }
+ "女神" -> {
+ helper.setBackgroundRes(R.id.ll_type, R.mipmap.item_home_pager_hot_tag1)
+ }
+ else -> {
+ helper.setBackgroundRes(R.id.ll_type, R.mipmap.item_home_pager_hot_tag3)
+ }
+ }
+
+
+ if (item.room_micro_list.isNotEmpty()) {
+ GlideUtil.loadImglogo(
+ mContext,
+ item.room_micro_list[0].head_pic,
+ helper.getView(R.id.civ1)
+ )
+ }
+
+ if (item.room_micro_list.size > 1) {
+ GlideUtil.loadImglogo(
+ mContext,
+ item.room_micro_list[1].head_pic,
+ helper.getView(R.id.civ2)
+ )
+ }
+
+ if (item.room_micro_list.size > 2) {
+ GlideUtil.loadImglogo(
+ mContext,
+ item.room_micro_list[2].head_pic,
+ helper.getView(R.id.civ3)
+ )
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/HomePagerTopAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/HomePagerTopAdapter.kt
new file mode 100644
index 0000000..8c718bb
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/HomePagerTopAdapter.kt
@@ -0,0 +1,19 @@
+package com.yuyin.mier.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.RoomListBean
+
+class HomePagerTopAdapter :
+ BaseQuickAdapter(R.layout.item_home_pager_top) {
+ override fun convert(helper: BaseViewHolder, item: RoomListBean) {
+ GlideUtil.loadImglogo(mContext, item.room_cover, helper.getView(R.id.room_cover))
+ helper.setText(R.id.tv_value, item.hot_value)
+ .setText(R.id.tv_type, item.category_name)
+ .setText(R.id.tv_name, item.room_name)
+
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/HomeRoomTypeAdapter.java b/app/src/main/java/com/yuyin/mier/adapter/HomeRoomTypeAdapter.java
new file mode 100644
index 0000000..e0838c1
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/HomeRoomTypeAdapter.java
@@ -0,0 +1,38 @@
+package com.yuyin.mier.adapter;
+
+import android.graphics.Color;
+import android.widget.TextView;
+
+import com.yuyin.lib_base.model.CategorRoomBean;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.yuyin.mier.R;
+
+import java.util.ArrayList;
+
+public class HomeRoomTypeAdapter extends BaseQuickAdapter {
+ public int getSelectPos() {
+ return selectPos;
+ }
+
+ public void setSelectPos(int selectPos) {
+ this.selectPos = selectPos;
+ }
+
+ private int selectPos = 0;
+
+ public HomeRoomTypeAdapter() {
+ super(R.layout.item_home_room_type, new ArrayList<>());
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, CategorRoomBean item) {
+
+ helper.setText(R.id.tv_text, item.getCategory_name());
+ helper.setGone(R.id.v_left, helper.getPosition() == selectPos);
+ helper.setGone(R.id.v_right, helper.getPosition() == selectPos);
+ TextView textView = helper.getView(R.id.tv_text);
+ textView.setTextColor(helper.getPosition() == selectPos ? Color.parseColor("#36DCD9") : Color.parseColor("#666666"));
+ }
+
+}
diff --git a/app/src/main/java/com/yuyin/mier/adapter/LeverListAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/LeverListAdapter.kt
new file mode 100644
index 0000000..e5ae622
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/LeverListAdapter.kt
@@ -0,0 +1,16 @@
+package com.yuyin.mier.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.Level
+
+class LeverListAdapter : BaseQuickAdapter(R.layout.item_lever) {
+ override fun convert(helper: BaseViewHolder, item: Level) {
+
+ helper.setText(R.id.tv_lever, item.level.toString())
+ .setText(R.id.tv_value, item.number.toString())
+ GlideUtil.loadImglogo(mContext, item.image, helper.getView(R.id.iv_dengji))
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/MsgAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/MsgAdapter.kt
new file mode 100644
index 0000000..31ce101
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/MsgAdapter.kt
@@ -0,0 +1,78 @@
+package com.yuyin.mier.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.tencent.qcloud.tuikit.tuiconversation.bean.ConversationInfo
+import com.tencent.qcloud.tuikit.tuiconversation.classicui.util.TUIConversationUtils
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.lib_base.util.TimeUtil
+import com.yuyin.mier.R
+import java.util.*
+
+class MsgAdapter : BaseQuickAdapter(R.layout.item_message) {
+ override fun convert(helper: BaseViewHolder, item: ConversationInfo) {
+
+ helper.setText(R.id.tv_nick_name, item.conversation.showName)
+
+
+
+ if (item.lastMessage != null) {
+ if (item.lastMessage.textElem != null) {
+ helper.setText(R.id.tv_content, item.lastMessage.textElem.text)
+ } else if (item.lastMessage.customElem != null) {
+ helper.setText(R.id.tv_content, item.lastMessage.customElem.description)
+ } else {
+ helper.setText(R.id.tv_content, "")
+ }
+ }
+
+ GlideUtil.loadImglogo(mContext, item.conversation.faceUrl, helper.getView(R.id.ci_head))
+ if (item.unRead > 0) {
+ helper.setText(R.id.tv_num, item.unRead.toString())
+ helper.setVisible(R.id.tv_num, true)
+ } else {
+ helper.setVisible(R.id.tv_num, false)
+ }
+
+
+ helper.itemView.setOnClickListener {
+ TUIConversationUtils.startChatActivity(item)
+ }
+
+
+ helper.setText(R.id.tv_time, TimeUtil.toDateYmdHan3(item.lastMessageTime))
+
+
+// V2TIMManager.getConversationManager()
+// .pinConversation(item.conversationId, true, object : V2TIMCallback {
+// override fun onSuccess() {
+// Log.i("imsdk", "success")
+// Collections.swap(datas, 1, position)
+// proxyNotifyDataSetChanged()
+// }
+//
+// override fun onError(code: Int, desc: String) {
+// Log.i("imsdk", "failure, code:$code, desc:$desc")
+// }
+// })
+
+
+// holder.dataBinding.tvDelete.setOnClickListener {
+// // 删除消息
+// V2TIMManager.getConversationManager()
+// .deleteConversation(
+// item.conversationId,
+// object : V2TIMCallback {
+// override fun onSuccess() {
+// Log.i("imsdk", "success")
+// datas.removeAt(position)
+// notifyItemRemoved(position)
+// }
+//
+// override fun onError(code: Int, desc: String) {
+// Log.i("imsdk", "failure, code:$code, desc:$desc")
+// }
+// })
+// }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/MyListAdapter.java b/app/src/main/java/com/yuyin/mier/adapter/MyListAdapter.java
new file mode 100644
index 0000000..6a2b84f
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/MyListAdapter.java
@@ -0,0 +1,28 @@
+package com.yuyin.mier.adapter;
+
+import android.widget.ImageView;
+
+import com.yuyin.lib_base.model.MyListBean;
+import com.bumptech.glide.Glide;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.yuyin.mier.R;
+
+import java.util.ArrayList;
+
+public class MyListAdapter extends BaseQuickAdapter {
+
+
+ public MyListAdapter() {
+ super(R.layout.item_my_list, new ArrayList<>());
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, MyListBean item) {
+
+ helper.setText(R.id.tv_title, item.getTitle());
+ Glide.with(mContext).load(item.getImg()).into((ImageView) helper.getView(R.id.iv_img));
+
+ }
+
+}
diff --git a/app/src/main/java/com/yuyin/mier/adapter/MyListAdapter2.java b/app/src/main/java/com/yuyin/mier/adapter/MyListAdapter2.java
new file mode 100644
index 0000000..f6eae5f
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/MyListAdapter2.java
@@ -0,0 +1,28 @@
+package com.yuyin.mier.adapter;
+
+import android.widget.ImageView;
+
+import com.bumptech.glide.Glide;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.yuyin.lib_base.model.MyListBean;
+import com.yuyin.mier.R;
+
+import java.util.ArrayList;
+
+public class MyListAdapter2 extends BaseQuickAdapter {
+
+
+ public MyListAdapter2() {
+ super(R.layout.item_my_list2, new ArrayList<>());
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, MyListBean item) {
+
+ helper.setText(R.id.tv_title, item.getTitle());
+ Glide.with(mContext).load(item.getImg()).into((ImageView) helper.getView(R.id.iv_img));
+
+ }
+
+}
diff --git a/app/src/main/java/com/yuyin/mier/adapter/OfficeListAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/OfficeListAdapter.kt
new file mode 100644
index 0000000..06bcf55
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/OfficeListAdapter.kt
@@ -0,0 +1,21 @@
+package com.yuyin.mier.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.util.TimeUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.OffiMessageBean
+import java.util.*
+
+/**
+ * 官方消息列表
+ */
+class OfficeListAdapter :
+ BaseQuickAdapter(R.layout.item_message_office, ArrayList()) {
+ override fun convert(helper: BaseViewHolder, item: OffiMessageBean) {
+ helper
+ .setText(R.id.textTime, TimeUtil.chatTimee2(item.add_time))
+ .setText(R.id.tv_content, item.content)
+ .setText(R.id.tv_title1, item.title)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/PhoneMemoryAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/PhoneMemoryAdapter.kt
new file mode 100644
index 0000000..4040398
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/PhoneMemoryAdapter.kt
@@ -0,0 +1,15 @@
+package com.yuyin.mier.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.model.PhotoMemory
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.mier.R
+
+class PhoneMemoryAdapter : BaseQuickAdapter(R.layout.item_photo_memory) {
+ override fun convert(helper: BaseViewHolder, item: PhotoMemory) {
+ helper.addOnClickListener(R.id.iv_delete)
+ helper.setText(R.id.tv_photo, item.photo)
+ GlideUtil.loadImglogo(mContext, item.head_pic, helper.getView(R.id.iv_head))
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/RoomZoneListAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/RoomZoneListAdapter.kt
new file mode 100644
index 0000000..18e2440
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/RoomZoneListAdapter.kt
@@ -0,0 +1,69 @@
+package com.yuyin.mier.adapter
+
+import android.text.TextUtils
+import android.view.View
+import android.widget.AdapterView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.lib_base.util.img.FullScreenUtil
+import com.yuyin.lib_base.view.MyGridView
+import com.yuyin.module_community.adapter.OneImageYuanJiaoAdapter
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.RoomZoneList
+import java.util.*
+
+/**
+ * 官方消息列表
+ */
+class RoomZoneListAdapter :
+ BaseQuickAdapter(R.layout.item_room_zone, ArrayList()) {
+ override fun convert(helper: BaseViewHolder, item: RoomZoneList) {
+ GlideUtil.loadImglogo(mContext, item.head_pic, helper.getView(R.id.img))
+ helper
+ .setText(
+ R.id.tvTimeAddress,
+ item.zone_time
+ )
+ .setText(R.id.tvName, item.nick_name)
+ .setText(R.id.tvText, item.content)
+ helper.addOnClickListener(R.id.tvRoom)
+ helper.addOnClickListener(R.id.tvHome)
+ helper.addOnClickListener(R.id.img)
+
+ if (item.rid == "0") {
+ helper.getView(R.id.tvRoom).visibility = View.GONE
+ } else {
+ helper.getView(R.id.tvRoom).visibility = View.VISIBLE
+ }
+
+ if (TextUtils.isEmpty(item.content)) {
+ helper.getView(R.id.tvText).visibility = View.GONE
+ } else {
+ helper.getView(R.id.tvText).visibility = View.VISIBLE
+ }
+
+
+
+
+
+ val oneImageYuanJiaoAdapter = OneImageYuanJiaoAdapter(mContext)
+ val recyclerView = helper.getView(R.id.dy_image_recyc)
+ recyclerView.numColumns = 3
+ recyclerView.adapter = oneImageYuanJiaoAdapter
+ oneImageYuanJiaoAdapter.getList_adapter().clear()
+ for (j in item.images.indices) {
+ oneImageYuanJiaoAdapter.getList_adapter().add(item.images[j])
+ }
+ oneImageYuanJiaoAdapter.notifyDataSetChanged()
+ recyclerView.onItemClickListener =
+ AdapterView.OnItemClickListener { parent: AdapterView<*>?, view: View?, position: Int, id: Long ->
+ FullScreenUtil.showFullScreenDialog(
+ mContext,
+ position,
+ oneImageYuanJiaoAdapter.getList_adapter()
+ )
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/SceneFlowAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/SceneFlowAdapter.kt
new file mode 100644
index 0000000..55c64e3
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/SceneFlowAdapter.kt
@@ -0,0 +1,30 @@
+package com.yuyin.mier.adapter
+
+import android.widget.TextView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.mier.R
+
+class SceneFlowAdapter : BaseQuickAdapter(R.layout.item_scene_flow) {
+
+ private var selectPosition = 0
+ override fun convert(helper: BaseViewHolder, item: String?) {
+
+ helper.setText(R.id.tv_name, item)
+ val isSelected = helper.layoutPosition === selectPosition
+ if (isSelected) {
+ helper.getView(R.id.tv_name).isSelected = true
+ } else {
+ helper.getView(R.id.tv_name).isSelected = false
+ }
+
+
+ }
+
+
+ fun setSelectPosition(index: Int) {
+ notifyItemChanged(selectPosition)
+ notifyItemChanged(index)
+ selectPosition = index
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/adapter/TeQuanAdapter.java b/app/src/main/java/com/yuyin/mier/adapter/TeQuanAdapter.java
new file mode 100644
index 0000000..17b045b
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/TeQuanAdapter.java
@@ -0,0 +1,68 @@
+package com.yuyin.mier.adapter;
+
+import android.text.TextUtils;
+import android.widget.ImageView;
+
+import com.bumptech.glide.Glide;
+import com.chad.library.adapter.base.BaseQuickAdapter;
+import com.chad.library.adapter.base.BaseViewHolder;
+import com.yuyin.module_live.R;
+import com.yuyin.module_live.model.TeQuanBean;
+
+import java.util.List;
+
+public class TeQuanAdapter extends BaseQuickAdapter {
+
+ public TeQuanAdapter(List data) {
+ super(R.layout.item_tequan, data);
+ }
+
+ @Override
+ protected void convert(BaseViewHolder helper, TeQuanBean item) {
+ Glide.with(mContext).load(item.getLevel_image()).into((ImageView) helper.getView(R.id.ivTitle1));
+ helper.setText(R.id.tvTitle1, "等级" + item.getLevel() + "特权");
+
+ if (item.getMan_mount_decorate() != null && !TextUtils.isEmpty(item.getMan_mount_decorate().getTitle())) {
+ helper.setGone(R.id.tv_text1, true)
+ .setGone(R.id.iv_img1, true);
+ helper.setText(R.id.tv_text1, item.getMan_mount_decorate().getTitle());
+ Glide.with(mContext).load(item.getMan_mount_decorate().getBase_image()).into((ImageView) helper.getView(R.id.iv_img1));
+ } else {
+ helper.setGone(R.id.tv_text1, false)
+ .setGone(R.id.iv_img1, false);
+ }
+
+ if (item.getMan_head_decorate() != null && !TextUtils.isEmpty(item.getMan_head_decorate().getTitle())) {
+ helper.setGone(R.id.tv_text2, true)
+ .setGone(R.id.iv_img2, true);
+ helper.setText(R.id.tv_text2, item.getMan_head_decorate().getTitle());
+ Glide.with(mContext).load(item.getMan_head_decorate().getBase_image()).into((ImageView) helper.getView(R.id.iv_img2));
+ } else {
+ helper.setGone(R.id.tv_text2, false)
+ .setGone(R.id.iv_img2, false);
+ }
+
+ if (item.getWoman_mount_decorate() != null && !TextUtils.isEmpty(item.getWoman_mount_decorate().getTitle())) {
+ helper.setGone(R.id.tv_text3, true)
+ .setGone(R.id.iv_img3, true);
+ helper.setText(R.id.tv_text3, item.getWoman_mount_decorate().getTitle());
+ Glide.with(mContext).load(item.getWoman_mount_decorate().getBase_image()).into((ImageView) helper.getView(R.id.iv_img3));
+ } else {
+ helper.setGone(R.id.tv_text3, false)
+ .setGone(R.id.iv_img3, false);
+ }
+
+ if (item.getWoman_head_decorate() != null && !TextUtils.isEmpty(item.getWoman_head_decorate().getTitle())) {
+ helper.setGone(R.id.tv_text4, true)
+ .setGone(R.id.iv_img4, true);
+ helper.setText(R.id.tv_text4, item.getWoman_head_decorate().getTitle());
+ Glide.with(mContext).load(item.getWoman_head_decorate().getBase_image()).into((ImageView) helper.getView(R.id.iv_img4));
+ } else {
+ helper.setGone(R.id.tv_text4, false)
+ .setGone(R.id.iv_img4, false);
+ }
+ helper.setGone(R.id.ivAdd1, !TextUtils.isEmpty(item.getMan_mount_decorate().getTitle()) && !TextUtils.isEmpty(item.getMan_head_decorate().getTitle()));
+ helper.setGone(R.id.ivAdd2, !TextUtils.isEmpty(item.getWoman_mount_decorate().getTitle()) && !TextUtils.isEmpty(item.getWoman_head_decorate().getTitle()));
+
+ }
+}
diff --git a/app/src/main/java/com/yuyin/mier/adapter/VipPriceAdapter.kt b/app/src/main/java/com/yuyin/mier/adapter/VipPriceAdapter.kt
new file mode 100644
index 0000000..fe8d8de
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/adapter/VipPriceAdapter.kt
@@ -0,0 +1,27 @@
+package com.yuyin.mier.adapter
+
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.mier.R
+import com.yuyin.mier.module_my.model.Vip
+
+class VipPriceAdapter : BaseQuickAdapter(R.layout.item_vip) {
+
+ override fun convert(helper: BaseViewHolder, item: Vip) {
+ helper.setText(R.id.tv_select1,item.name)
+ .setText(R.id.tv_select11,item.price)
+ if(item.isSelect){
+ helper.getView(R.id.ll_select1).isSelected=true
+ helper.getView(R.id.tv_select1).isSelected=true
+ helper.getView(R.id.tv_select11).isSelected=true
+ }else{
+ helper.getView(R.id.ll_select1).isSelected=false
+ helper.getView(R.id.tv_select1).isSelected=false
+ helper.getView(R.id.tv_select11).isSelected=false
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/MainActivity.kt b/app/src/main/java/com/yuyin/mier/module_home/MainActivity.kt
new file mode 100644
index 0000000..33a081b
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/MainActivity.kt
@@ -0,0 +1,381 @@
+package com.yuyin.mier.module_home
+
+import android.content.Intent
+import android.os.Bundle
+import android.util.Log
+import android.view.KeyEvent
+import android.view.View
+import android.view.animation.Animation
+import android.view.animation.LinearInterpolator
+import android.view.animation.RotateAnimation
+import android.widget.RadioGroup
+import android.widget.Toast
+import com.alibaba.android.arouter.facade.annotation.Route
+import com.alibaba.android.arouter.launcher.ARouter
+import com.blankj.utilcode.util.LogUtils
+import com.kongzue.dialog.v3.MessageDialog
+import com.tencent.imsdk.v2.*
+import com.tencent.qcloud.tuicore.TUILogin
+import com.tencent.qcloud.tuicore.interfaces.TUICallback
+import com.tencent.qcloud.tuicore.interfaces.TUILoginConfig
+import com.tencent.qcloud.tuikit.tuiconversation.config.TUIConversationConfig
+import com.yuyin.lib_base.App
+import com.yuyin.lib_base.Const
+import com.yuyin.lib_base.arouter.AroutUtil
+import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MAIN
+import com.yuyin.lib_base.base.BaseDataBindingActivity
+import com.yuyin.lib_base.base.UserManager
+import com.yuyin.lib_base.model.EnterRoomInfo
+import com.yuyin.lib_base.model.FirstEvent
+import com.yuyin.lib_base.model.UserBean
+import com.yuyin.lib_base.util.FragmentUtils
+import com.yuyin.lib_base.util.showToast
+import com.yuyin.lib_base.view.CircularImage
+import com.yuyin.lib_base.view.floatingview.EnFloatingView
+import com.yuyin.lib_base.view.floatingview.FloatingMagnetView
+import com.yuyin.lib_base.view.floatingview.FloatingView
+import com.yuyin.lib_base.view.floatingview.MagnetViewListener
+import com.yuyin.module_live.ui.room.AdminRoomActivity
+import com.yuyin.mier.BR
+import com.yuyin.mier.R
+import com.yuyin.mier.adapter.MyListAdapter
+import com.yuyin.mier.databinding.ActivityMainBinding
+import com.yuyin.mier.module_home.tab.center.CenterFragment
+import com.yuyin.mier.module_home.tab.dynamic.MainCommunityFragment
+import com.yuyin.mier.module_home.tab.home.HomePagerFragment
+import com.yuyin.mier.module_home.tab.home.MainHomeFragment
+import com.yuyin.mier.module_home.tab.home.teen.AdolescentModelDialog
+import com.yuyin.mier.module_home.tab.home.teen.TeenModeActivity
+import com.yuyin.mier.module_home.tab.my.MyFragment
+import com.yuyin.mier.module_home.tab.xiaoxi.MessageFragment
+
+import kotlinx.android.synthetic.main.activity_main.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import kotlin.system.exitProcess
+
+
+@Route(path = MAIN_MAIN)
+open class MainActivity : BaseDataBindingActivity(),
+ RadioGroup.OnCheckedChangeListener {
+
+ private lateinit var mAdapter: MyListAdapter
+ var mainFaXianFragment = MyFragment()
+ var mainMessageFragment = MessageFragment()
+ var mainCenterFragment = CenterFragment()
+ var homeFragment = MainHomeFragment()
+ var mainCommunityFragment = MainCommunityFragment()
+
+ val homePagerFragment = HomePagerFragment()
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ EventBus.getDefault().register(this)
+ }
+
+
+ override fun onCheckedChanged(p0: RadioGroup?, checkedId: Int) {
+ when (checkedId) {
+ R.id.radio_my -> {
+ FragmentUtils.addOrShowFragmentToActivity(
+ supportFragmentManager,
+ mainFaXianFragment, R.id.frameLayout_main
+ )
+ }
+
+ R.id.radio_rank -> {
+ FragmentUtils.addOrShowFragmentToActivity(
+ supportFragmentManager,
+ mainCommunityFragment, R.id.frameLayout_main
+ )
+ }
+
+ R.id.radio_message -> {
+ FragmentUtils.addOrShowFragmentToActivity(
+ supportFragmentManager,
+ mainMessageFragment, R.id.frameLayout_main
+ )
+ }
+
+ R.id.radio_home ->
+ FragmentUtils.addOrShowFragmentToActivity(
+ supportFragmentManager,
+ mainCenterFragment, R.id.frameLayout_main
+ )
+
+ R.id.radio_center -> {
+ FragmentUtils.addOrShowFragmentToActivity(
+ supportFragmentManager,
+ mainCenterFragment, R.id.frameLayout_main
+ )
+ }
+ }
+ }
+
+ private var exitTime: Long = 0
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
+ if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_DOWN) {
+ if (System.currentTimeMillis() - exitTime > 2000) {
+ "再按一次退出程序".showToast()
+ exitTime = System.currentTimeMillis()
+ } else {
+ exitProcess(0)
+ }
+ return true
+ }
+ return super.onKeyDown(keyCode, event)
+ }
+
+
+ override fun onStop() {
+ super.onStop()
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ EventBus.getDefault().unregister(this)
+ }
+
+ override fun onStart() {
+ super.onStart()
+ FloatingView.get().attach(this)
+
+ val code = getVersionCode()
+ viewModel.get_system_base_config("$code", "1")
+ }
+
+ override fun onRestart() {
+ super.onRestart()
+ // LogUtils.debugInfo("====onRestart");
+ if (App.isStart && App.isTop) {
+ backToRoom()
+ }
+ }
+
+ override fun startObserve() {
+
+ viewModel.userInfoData.observe(this) {
+ loginIM(it)
+// val info = V2TIMUserFullInfo()
+// info.setNickname(it.nick_name)
+// info.faceUrl = it.head_pic
+// info.selfSignature = it.autograph
+// V2TIMManager.getInstance().setSelfInfo(info, null)
+ }
+
+ viewModel.configBean.observe(this) {
+
+ App.configBean = it
+ }
+ }
+
+ override fun getLayoutId(): Int = R.layout.activity_main
+
+ override fun initView() {
+ mDataBinding.radioGroup.setOnCheckedChangeListener(this)
+ mDataBinding.radioGroup.check(R.id.radio_home) //使用了viewpager 去掉
+
+ }
+
+ override fun onResume() {
+ super.onResume()
+ viewModel.loadUserInfo()
+ viewModel.is_private_chat()
+ changeMsg()
+ }
+
+
+ override fun initData() {
+ if (!App.isStart && intent.getStringExtra("quite_room") == null) {
+ val adolescentModelDialog = AdolescentModelDialog(this)
+ adolescentModelDialog.getBinding().btnConfirm.setOnClickListener {
+ startActivity(Intent(this, TeenModeActivity::class.java))
+ adolescentModelDialog.dismiss()
+ }
+ adolescentModelDialog.getBinding().btnCancel.setOnClickListener {
+ adolescentModelDialog.dismiss()
+ }
+ adolescentModelDialog.getBinding().ivQsms.setOnClickListener {
+ adolescentModelDialog.dismiss()
+ }
+ adolescentModelDialog.show()
+ } else if (intent.getStringExtra("quite_room") != null) {
+
+ if (intent.getStringExtra("type") == "1") {
+ MessageDialog.show(
+ this,
+ "温馨提示",
+ "房间类型已更改,是否重新进入该房间",
+ "确定",
+ "取消"
+ ).setOnOkButtonClickListener { baseDialog, v ->
+ viewModel.enterRoom(intent.getStringExtra("quite_room").toString(), "", this)
+ baseDialog.doDismiss()
+ true
+ }
+ } else {
+ MessageDialog.show(
+ this,
+ "温馨提示",
+ "房间已关闭",
+ "确定",
+ ).setOnOkButtonClickListener { baseDialog, v ->
+ baseDialog.doDismiss()
+ true
+ }
+ }
+ }
+
+ }
+
+ override fun initEvent() {
+ mDataBinding.setVariable(BR.act, this)
+
+ V2TIMManager.getMessageManager()
+ .addAdvancedMsgListener(object : V2TIMAdvancedMsgListener() {
+
+ override fun onRecvNewMessage(msg: V2TIMMessage?) {
+ super.onRecvNewMessage(msg)
+ changeMsg()
+
+ }
+
+ })
+ }
+
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public fun receiveMsg(event: FirstEvent) {
+ when (event.tag) {
+ Const.LOGOUT -> {
+ if (App.isStart) {
+ App.roomActivity?.finish()
+ }
+ finish()
+ }
+
+ Const.FANHUIZHUYE -> { //显示悬浮窗
+ Log.e("aaaaa", "receiveMsg: showFlow")
+ val enterRoom: EnterRoomInfo = event.enterRoom
+ showFlow(enterRoom.room_cover)
+ }
+
+ Const.XUANFUYINCANG -> { //显示悬浮窗
+ FloatingView.get().remove()
+ }
+ }
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public fun receiveUnreadCount(msg: String) {
+ LogUtils.e(msg)
+// if (msg == "更新消息红点") {
+ changeMsg()
+// }
+ }
+
+ fun showFlow(msg: String) {
+ FloatingView.get().add()
+ val view: EnFloatingView = FloatingView.get().view
+ val imgHeader = view.findViewById(R.id.imgHeader)
+ val img1 = view.findViewById(R.id.img1)
+ val img2 = view.findViewById(R.id.img2)
+ img1.isSelected = true
+ loadImage(imgHeader, msg, R.mipmap.ic_launcher_app)
+
+ img2.setOnClickListener(View.OnClickListener { v: View? ->
+ if (App.isStart) {
+ App.isStart = false
+ App.roomActivity?.finish()
+ FloatingView.get().remove()
+ }
+ })
+ FloatingView.get().listener(object : MagnetViewListener {
+ override fun onRemove(magnetView: FloatingMagnetView?) {
+ Toast.makeText(this@MainActivity, "我没了", Toast.LENGTH_SHORT).show()
+ }
+
+ override fun onClick(magnetView: FloatingMagnetView?) {
+ startActivity(Intent(this@MainActivity, AdminRoomActivity::class.java))
+ }
+ })
+ val rotateAnimation = RotateAnimation(
+ 0f, 360f,
+ Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f
+ )
+ rotateAnimation.duration = 3000
+ rotateAnimation.fillAfter = true
+ rotateAnimation.repeatMode = Animation.RESTART
+ //让旋转动画一直转,不停顿的重点
+ rotateAnimation.interpolator = LinearInterpolator()
+ rotateAnimation.repeatCount = -1
+ imgHeader.startAnimation(rotateAnimation)
+ }
+
+ private fun loginIM(user: UserBean) {
+ //在线状态
+ TUIConversationConfig.getInstance().isShowUserStatus = false
+ val config = TUILoginConfig()
+ config.logLevel = V2TIMSDKConfig.V2TIM_LOG_INFO
+
+ LogUtils.e("当前账号", user.uid)
+ TUILogin.login(
+ App.instance!!.applicationContext,
+ /*GsonUtils.fromJson(
+ SPUtils.getInstance().getString("config"),
+ ConfigBean::class.java
+ ).tencentyun_im_appid.toInt()*/1600078180, //1600039760 正式服
+ user.uid,
+ UserManager.user.user_sig,
+ object : TUICallback() {
+ override fun onSuccess() {
+ LogUtils.e("IM登陆成功")
+ val info = V2TIMUserFullInfo()
+ info.setNickname(user.nick_name)
+ info.faceUrl = user.head_pic
+ info.selfSignature = user.autograph
+ V2TIMManager.getInstance().setSelfInfo(info, null)
+ }
+
+ override fun onError(errorCode: Int, errorMessage: String?) {
+ LogUtils.e(errorCode, errorMessage)
+ }
+ }
+ )
+
+
+ V2TIMManager.getInstance()
+ .addIMSDKListener(object : V2TIMSDKListener() {
+ override fun onKickedOffline() {
+ super.onKickedOffline()
+ Log.i("imsdk", "success")
+ EventBus.getDefault().post(FirstEvent("指定发送", Const.LOGOUT))
+ UserManager.layout()
+ ARouter.getInstance().build(AroutUtil.LOGIN_MAIN).withInt("sign", 1)
+ .navigation()
+ }
+ })
+ }
+
+ private fun changeMsg() {
+
+ V2TIMManager.getConversationManager().getTotalUnreadMessageCount(object :
+ V2TIMValueCallback {
+ override fun onSuccess(p0: Long?) {
+ if (p0!! > 0) {
+ mDataBinding.tvUnhed.text = p0.toString()
+ mDataBinding.tvUnhed.visibility = View.VISIBLE
+ } else {
+ mDataBinding.tvUnhed.visibility = View.GONE
+ }
+ }
+
+ override fun onError(p0: Int, p1: String?) {
+ LogUtils.e(p0, p1)
+ }
+ })
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/MainViewModel.kt b/app/src/main/java/com/yuyin/mier/module_home/MainViewModel.kt
new file mode 100644
index 0000000..78d0af9
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/MainViewModel.kt
@@ -0,0 +1,37 @@
+package com.yuyin.mier.module_home
+
+import androidx.lifecycle.MutableLiveData
+import com.yuyin.lib_base.App
+import com.yuyin.lib_base.Const.ROOM_TYPE
+import com.yuyin.lib_base.base.BaseViewModel
+import com.yuyin.lib_base.model.CategorRoomBean
+import com.yuyin.mier.repository.CommonRepository
+
+class MainViewModel : BaseViewModel() {
+ var repository = CommonRepository()
+ var roomCategories = MutableLiveData>()
+
+ fun loadRoomCategories() {
+ launchUI {
+ val result = repository.roomCategories(ROOM_TYPE)
+ roomCategories.value = result.data;
+ }
+ }
+
+ //获取用户基本信息详情
+ fun get_base_user_infoSss(uid: String) {
+ launchUI {
+ var data = baseRepository.get_base_user_info(uid)
+
+ }
+ }
+
+
+ fun is_private_chat() {
+ launchUI {
+ val result = repository.is_private_chat()
+ App.is_private_chat = result.data.is_private_chat
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/cproom/CPRoomActivity.kt b/app/src/main/java/com/yuyin/mier/module_home/cproom/CPRoomActivity.kt
new file mode 100644
index 0000000..e611052
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/cproom/CPRoomActivity.kt
@@ -0,0 +1,198 @@
+package com.yuyin.mier.module_home.cproom
+
+import android.graphics.Color
+import android.util.Log
+import com.tencent.qgame.animplayer.AnimView
+import com.yuyin.lib_base.base.BaseDataBindingActivity
+import com.yuyin.lib_base.base.UserManager
+import com.yuyin.lib_base.model.MyCpTxBean
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.lib_base.util.showToast
+import com.yuyin.lib_base.view.ItemDecoration
+import com.yuyin.mier.R
+import com.yuyin.mier.adapter.CPTxListAdapter
+import com.yuyin.mier.adapter.CPTxkListAdapter
+import com.yuyin.mier.databinding.ActivityCpRoomBinding
+import com.zhy.http.okhttp.OkHttpUtils
+import com.zhy.http.okhttp.callback.FileCallBack
+import kotlinx.android.synthetic.main.activity_cp_room.*
+import okhttp3.Call
+import java.io.File
+
+class CPRoomActivity : BaseDataBindingActivity() {
+
+ lateinit var cpTxListAdapter: CPTxListAdapter
+ lateinit var cpTxkListAdapter: CPTxkListAdapter
+ var tabIndex = 0
+
+ override fun startObserve() {
+ viewModel.CPBean.observe(this) {
+ tv_level.text = "LV." + it.cp_level
+ viewModel.my_cp_txk("1")
+ cp_man_name.text = it.u_nick_name
+ cp_woman_name.text = it.receive_nick_name
+ cp_man_value.text = it.cp_value.toString()
+ cp_woman_value.text = it.next_cp_value
+ GlideUtil.loadImglogo(this, it.u_head_pic, cp_head_nan)
+ GlideUtil.loadImglogo(this, it.receive_head_pic, cp_head_nv)
+ playTX(it.u_avatar_play_image, cp_man, Int.MAX_VALUE)
+ playTX(it.receive_avatar_play_image, cp_woman, Int.MAX_VALUE)
+
+ }
+ viewModel.CPTxBean.observe(this) {
+ if (tabIndex == 0) {
+ cpTxkListAdapter.setNewData(it)
+ rcy_tx.adapter = cpTxkListAdapter
+ } else {
+ cpTxListAdapter.setNewData(it)
+ rcy_tx.adapter = cpTxListAdapter
+ }
+ if (rcy_tx.itemDecorationCount == 0) {
+ rcy_tx.addItemDecoration(ItemDecoration(this,0,5f,5f))
+ }
+ }
+ viewModel.setDecorateDate.observe(this) {
+ if (tabIndex == 0) {
+ viewModel.my_cp_txk("1")
+ } else {
+ viewModel.my_cp_txk("9")
+ }
+ }
+ }
+
+ override fun getLayoutId(): Int = R.layout.activity_cp_room
+
+ override fun initView() {
+ cpTxkListAdapter = CPTxkListAdapter()
+ cpTxListAdapter = CPTxListAdapter()
+ GlideUtil.loadImglogo(this, UserManager.user.head_pic, cp_head_nan)
+ cp_man_name.text = UserManager.user.nick_name
+ }
+
+ override fun initData() {
+ viewModel.my_cp()
+ viewModel.my_cp_txk("1")
+ }
+
+ override fun initEvent() {
+ cpTxListAdapter.setOnItemClickListener { adapter, view, position ->
+ val dataBean: MyCpTxBean = adapter.data[position] as MyCpTxBean
+ if (dataBean.js_suo == "1") {
+ if (dataBean.is_using == "1") {
+ viewModel.cancel_user_decorate(dataBean.udid)
+ } else {
+ playTX(dataBean.cp_tx_play_img, cp_tx, 1)
+ viewModel.set_user_decorate(dataBean.udid)
+ }
+ } else {
+ "当前特效未解锁".showToast()
+ }
+
+ }
+ cpTxkListAdapter.setOnItemClickListener { adapter, view, position ->
+ val dataBean: MyCpTxBean = adapter.data[position] as MyCpTxBean
+ viewModel.my_cp()
+
+ if (dataBean.js_suo == "1") {
+ if (dataBean.is_using == "1") {
+ viewModel.cancel_user_decorate(dataBean.udid)
+ } else {
+ viewModel.set_user_decorate(dataBean.udid)
+ if (viewModel.CPBean.value!!.uid == UserManager.user.uid.toString()) {
+ cp_man.stopPlay()
+ cp_man.clearAnimation()
+ playTX(dataBean.head_decorate_play_img, cp_man, Int.MAX_VALUE)
+ } else {
+ cp_woman.stopPlay()
+ cp_woman.clearAnimation()
+ playTX(dataBean.head_decorate_play_img, cp_woman, Int.MAX_VALUE)
+ }
+ }
+ } else {
+ "当前头像框未解锁".showToast()
+ }
+
+ }
+ tv_txk.setOnClickListener {
+ tabIndex = 0
+ tv_txk.setTextColor(Color.parseColor("#333333"))
+ tv_rctx.setTextColor(Color.parseColor("#999999"))
+ viewModel.my_cp_txk("1")
+ }
+
+ tv_rctx.setOnClickListener {
+ tabIndex = 1
+ tv_txk.setTextColor(Color.parseColor("#999999"))
+ tv_rctx.setTextColor(Color.parseColor("#333333"))
+ viewModel.my_cp_txk("9")
+ }
+
+ }
+
+ fun playTX(url: String, animView: AnimView, count: Int) {
+ OkHttpUtils.get().url(url).build().execute(object : FileCallBack(
+ cacheDir.absolutePath, url.substring(url.lastIndexOf("/")) //
+ ) {
+
+ override fun onError(
+ call: Call?, e: java.lang.Exception?, id: Int
+ ) {
+ Log.d("sssssssssss", e.toString())
+ }
+
+ override fun onResponse(response: File?, id: Int) {
+ response?.let {
+ animView.startPlay(response)
+ animView.setLoop(count)
+ }
+ }
+ })
+// if (!FileUtils.isFileExists(
+// cacheDir?.absolutePath + url.substring(
+// url.lastIndexOf(
+// "/"
+// )
+// )
+// )
+// ) {
+// OkHttpUtils
+// .get()
+// .url(url)
+// .build()
+// .execute(object : FileCallBack(
+// cacheDir?.absolutePath,
+// url.substring(url.lastIndexOf("/")) //
+// ) {
+//
+// override fun onError(
+// call: Call?,
+// e: java.lang.Exception?,
+// id: Int
+// ) {
+// Log.d("sssssssssss", e.toString())
+// }
+//
+// override fun onResponse(response: File?, id: Int) {
+// response?.let {
+// animView.setLoop(count)
+// animView.startPlay(response)
+// }
+// }
+// })
+// } else {
+// LogUtils.e("有缓存")
+// animView.setLoop(count)
+// animView.startPlay(
+// File(
+// cacheDir?.absolutePath + url.substring(
+// url.lastIndexOf(
+// "/"
+// )
+// )
+// )
+// )
+//
+//
+// }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/cproom/CPRoomViewModel.kt b/app/src/main/java/com/yuyin/mier/module_home/cproom/CPRoomViewModel.kt
new file mode 100644
index 0000000..5ac19f0
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/cproom/CPRoomViewModel.kt
@@ -0,0 +1,47 @@
+package com.yuyin.mier.module_home.cproom
+
+import androidx.lifecycle.MutableLiveData
+import com.yuyin.lib_base.base.BaseViewModel
+import com.yuyin.lib_base.model.MyCpBean
+import com.yuyin.lib_base.model.MyCpTxBean
+import com.yuyin.lib_base.util.showToast
+import com.yuyin.mier.repository.CommonRepository
+
+class CPRoomViewModel : BaseViewModel() {
+
+ var repository = CommonRepository()
+ var CPBean = MutableLiveData()
+ var setDecorateDate = MutableLiveData()
+
+ fun my_cp() {
+ launchUI {
+ val result = repository.my_cp()
+ CPBean.value=result.data
+ }
+ }
+
+ var CPTxBean= MutableLiveData>()
+
+ fun my_cp_txk(type:String) {
+ launchUI {
+ val result = repository.my_cp_txk(type)
+ CPTxBean.value=result.data
+ }
+ }
+
+ fun set_user_decorate(udid: String) {
+ launchUI {
+ val result = repository.set_user_decorate(udid)
+ result.msg.showToast()
+ setDecorateDate.value = result.data
+ }
+ }
+
+ fun cancel_user_decorate(udid: String) {
+ launchUI {
+ val result = repository.cancel_user_decorate(udid)
+ result.msg.showToast()
+ setDecorateDate.value = result.data
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/model/MainBean.kt b/app/src/main/java/com/yuyin/mier/module_home/model/MainBean.kt
new file mode 100644
index 0000000..f939381
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/model/MainBean.kt
@@ -0,0 +1,347 @@
+package com.yuyin.mier.module_home.model
+
+import java.io.Serializable
+
+
+data class Mic(
+ var head_pic: String = "",
+ var uid: Int = 0
+)
+
+
+data class GHSet(
+ var is_deacon: String = "",
+ var quit_money: String = "",
+ var guild_name: String = "",
+ var is_join_guild: String = "",
+)
+
+
+data class GHMain(
+ var list: ArrayList = ArrayList()
+)
+
+data class GHRoomMain(
+ var is_deacon: String = "",
+ var list: ArrayList = ArrayList(),
+ val total_gift_price: String = ""
+)
+
+data class GHDeatileBean(
+ var id: String = "",
+ var guild_special_id: String = "",
+ var uid: String = "",
+ var guild_name: String = "",
+ var cover: String = "",
+ var intro: String = "",
+ var money: String = "",
+ var num: String = "",
+ var add_time: Long = 0,
+ var contribution_value: String = "",
+ var last_week_income: String = "",
+ var this_week_income: String = "",
+ var last_week_income_money: String = "",
+ val ghz: GHDeatileHzBean,
+)
+
+data class GHDeatileHzBean(
+ var uid: String = "",
+ var nick_name: String = "",
+ var head_pic: String = "",
+ var special_uid: String = "",
+ var noblity_image: String = "",
+ var charm_level_image: String = "",
+ var contribution_level_image: String = "",
+)
+
+data class GHUserMain(
+ var is_deacon: String = "",
+ var list: ArrayList = ArrayList(),
+ val total_gift_price: String = ""
+)
+
+data class GHListBean(
+ var guild_id: String = "",
+ var guild_name: String = "",
+ var cover: String = "",
+ var total_gift_total_price: String = "",
+ val num: Int = 0
+)
+
+data class GHRoomListBean(
+ var rid: String = "",
+ var room_owner_uid: String = "",
+ var room_name: String = "",
+ var room_cover: String = "",
+ var total_gift_total_price: String = "",
+ val room_number: String = ""
+)
+
+data class GHUserListBean(
+ var id: String = "",
+ var uid: String = "",
+ var guild_id: String = "",
+ var nick_name: String = "",
+ var head_pic: String = "",
+ var total_gift_total_price: String = "",
+)
+
+data class RoomZoneList(
+ var uid: String = "",
+ var rid: String = "",
+ var nick_name: String = "",
+ var head_pic: String = "",
+ var sex: String = "",
+ var zid: String = "",
+ var content: String = "",
+ var zone_time: String = "",
+ var last_operate_time: String = "",
+ var distance: String = "",
+ var images: ArrayList = ArrayList(),
+)
+
+data class BlackList(
+ val room_black_list: ArrayList,
+ val room_visitor_list: ArrayList,
+
+ )
+
+data class BlackBean(
+ var uid: String = "",
+ var nick_name: String = "",
+ var head_pic: String = "",
+ var sex: String = "",
+ val special_uid: String = ""
+)
+
+data class userWithdrawalListBean(
+ var all: String = "",
+ val detail: ArrayList = ArrayList(),
+)
+
+data class userWithdrawalBean(
+ var rid: String = "",
+ var wid: String = "",
+ var type: String = "",
+ var general_money: String = "",
+ var money: String = "",
+ var server_money: String = "",
+ var surplus_money: String = "",
+ var status: String = "",
+ var deal_type: String = "",
+ var remarke: String = "",
+ var account: String = "",
+ var add_time: Long = 0,
+)
+
+data class RoomListBean(
+ var rid: String = "",
+ var room_number: String = "",
+ var tid: String = "",
+ var cate_id: String = "",
+ var room_name: String = "",
+ var room_cover: String = "",
+ var is_need_password: String = "",
+ var is_hot: String = "",
+ var hot_value: String = "",
+ var is_online: String = "",
+ var visitor_num: String = "",
+ var room_status: String = "",
+ var is_top: String = "",
+ var base64_nick_name: String = "",
+ var sex: String = "",
+ var nick_name: String = "",
+ var category_name: String = "",
+ var base64_room_name: String = "",
+ var game_list: String = "",
+ var head_pic: String = "",
+ var room_frame_base_image: String = "",
+ var room_frame_play_image: String = "",
+ var room_micro: String = "",
+ var room_owner_uid: Int = 0,
+ var special_uid: Int = 0,
+ var today_hot_value: Int = 0,
+ val room_visitor_list: ArrayList = arrayListOf(),
+ var room_micro_member: ArrayList = arrayListOf(),
+ var game_ico_list: ArrayList = arrayListOf(),
+ var room_micro_list: ArrayList = arrayListOf()
+)
+
+data class SearchBean(
+ val user: ArrayList = ArrayList(),
+ val room: ArrayList = ArrayList()
+)
+
+data class SearchUserBean(
+ val uid: String = "",
+ val head_pic: String = "",
+ val special_uid: String = "",
+ val nick_name: String = "",
+)
+
+data class SearchRoomBean(
+ val rid: String = "",
+ val room_number: String = "",
+ val room_name: String = "",
+ val room_cover: String = "",
+ val uid: String = "",
+ val head_pic: String = "",
+ val special_uid: String = "",
+ val nick_name: String = ""
+)
+
+data class BannerBean(
+ val bid: String = "",
+ val aid: String = "",
+ val image: String = "",
+ val sort: String = "",
+ val url: String = "",
+ val type: String = ""
+)
+
+data class OffiMessageBean(
+ val mid: String = "",
+ val title: String = "",
+ val type: String = "",
+ val content: String = "",
+ val id: String = "",
+ val is_read: String = "",
+ val add_time: String = "",
+)
+
+data class OffiMessageSub1Bean(
+ val aid: String = "",
+ val type: String = "",
+ val uid: String = "",
+ val recived_uid: String = "",
+ val status: String = "",
+ val deal_time: String = "",
+ //下面开始订单消息的字段
+ val oid: String = "",
+ val is_player: Int = 0,
+)
+
+
+data class HomeScene(
+
+ var sex_type: String = "",
+ var age_type: String = "",
+
+ )
+
+
+data class LeverBean(
+ val level_list: List, val user_info: UserInfo, val user_level_info: UserLevelInfo
+)
+
+data class Level(
+ val image: String, val level: Int, val number: Int
+)
+
+data class UserInfo(
+ val base64_nick_name: String,
+ val charm_level_image: String,
+ val contribution_level_image: String,
+ val head_pic: String,
+ val nick_name: String,
+ val uid: Int
+)
+
+data class UserLevelInfo(
+ val next_level: Int,
+ val next_level_image: String,
+ val next_value: Int,
+ val now_level: Int,
+ val now_level_image: String,
+ val now_value: Int
+)
+
+
+data class IsPrivateChat(
+ var is_private_chat: Int = 2
+)
+
+data class DaySignBean(
+ val sign_log: List,
+ val sign_num: String = "",
+ val today_sign: String = "",
+)
+
+data class SignSuccesBean(
+ val award: String = ""
+)
+
+data class DaySignBeanInfo(
+ val is_sign: Int = 0,
+ val award: String = "",
+)
+
+data class NobilityInfo(
+ val image: String,
+ val lid: Int,
+ val name: String,
+ val change_value: String,
+ val pay_price: String,
+ val day_num: String,
+ val renew_coin: String,
+ val pay_coin: String,
+ val renew_price: String,
+ var play_image: String,
+)
+
+data class NobilityPower(
+ val id: Int,
+ val image: String,
+ val images: String,
+ val content: String,
+ val name: String,
+ val checked_icon: String,
+ val is_power: Int,
+)
+
+data class UserNobility(
+ val is_nobility: Int,
+ val nobility_type: String,
+ val noblity_end_time: Int,
+)
+
+data class NobilityListBean(
+ val image: String, val name: String, val change_value: Int, val lid: Int
+) : Serializable
+
+data class NobilityInfoBean(
+ val nobility_info: NobilityInfo,
+ val nobility_power_list: List,
+ val user_nobility: UserNobility,
+ val user_nobility_end_time: Long
+)
+
+data class NobilityPayBean(
+ val order_id: String
+)
+
+data class MyRoomList(
+ val rid: Int,
+ val room_cover: String,
+ val room_name: String,
+ val room_number: Int,
+ val user_type: Int
+)
+
+
+data class WeekHomeBean(
+ val uid: String = "",
+ val receive_uid: String = "",
+ val total_gift_num: String = "",
+ val gid: String = "",
+ val gift_price: String = "",
+ val gift_name: String = "",
+ val head_pic: String = "",
+)
+
+data class TopCpBean(
+ val u_head_pic: String = "",
+ val receive_head_pic: String = "",
+)
+
+
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/center/CenterFragment.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/center/CenterFragment.kt
new file mode 100644
index 0000000..8b48884
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/center/CenterFragment.kt
@@ -0,0 +1,366 @@
+package com.yuyin.mier.module_home.tab.center
+
+import android.content.Intent
+import android.graphics.Color
+import android.graphics.Typeface
+import android.util.TypedValue
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentPagerAdapter
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.alibaba.android.arouter.launcher.ARouter
+import com.google.android.material.tabs.TabLayout
+import com.youth.banner.BannerConfig
+import com.yuyin.lib_base.App
+import com.yuyin.lib_base.Const
+import com.yuyin.lib_base.adapter.MyPagerAdapter
+import com.yuyin.lib_base.arouter.AroutUtil
+import com.yuyin.lib_base.base.BaseDataBindingFragment
+import com.yuyin.lib_base.base.UserManager
+import com.yuyin.lib_base.model.UserBean
+import com.yuyin.lib_base.ui.X5WebViewActivity
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.lib_base.util.showToast
+import com.yuyin.lib_base.view.GlideImageLoader
+import com.yuyin.mier.R
+import com.yuyin.mier.databinding.FragmentCenterBinding
+import com.yuyin.mier.module_home.cproom.CPRoomActivity
+import com.yuyin.mier.module_home.model.BannerBean
+import com.yuyin.mier.module_home.tab.center.sign.SginDialog
+import com.yuyin.mier.module_home.tab.center.sign.SginSuccessDialog
+import com.yuyin.mier.module_home.tab.center.sub.HomeRecomAdapter
+import com.yuyin.mier.module_home.tab.center.sub.RoomListFragment
+import com.yuyin.module_live.ui.rank.WeekRankActivity
+import kotlinx.android.synthetic.main.fragment_center.*
+import java.util.*
+
+class CenterFragment : BaseDataBindingFragment() {
+
+ lateinit var adapter: HomeRecomAdapter
+ private val fsRes: ArrayList = ArrayList() //fragment集合
+ private val titleRes = ArrayList() //tab标题集合
+ private var mUserBean: UserBean? = null
+
+ override fun startObserve() {
+ /*viewModel.TopCpBean.observe(this){
+ if(it!=null){
+ GlideUtil.loadImglogo(context as AppCompatActivity,it.u_head_pic,rv_nan)
+ GlideUtil.loadImglogo(context as AppCompatActivity,it.receive_head_pic,rv_nv)
+ }
+ }
+ viewModel.WeekHomeList.observe(this){
+ if(it.size>0){
+ GlideUtil.loadImglogo(context as AppCompatActivity,it[0].head_pic,iv_week1)
+ }
+ if(it.size>1){
+ GlideUtil.loadImglogo(context as AppCompatActivity,it[1].head_pic,iv_week2)
+ }
+ if(it.size>2){
+ GlideUtil.loadImglogo(context as AppCompatActivity,it[2].head_pic,iv_week3)
+ }
+ if(it.size>3){
+ GlideUtil.loadImglogo(context as AppCompatActivity,it[3].head_pic,iv_week4)
+ }
+ }*/
+
+ viewModel.userInfoData.observe(this) {
+ mUserBean = it
+ }
+ viewModel.bannerListBean.observe(this) {
+ if (it == null) return@observe
+ initBanner(it)
+ }
+ viewModel.roomData.observe(requireActivity()) {
+ adapter.list.clear()
+ adapter.list.addAll(it)
+ adapter.notifyDataSetChanged()
+ }
+ viewModel.roomCategories.observe(this) {
+ titleRes.add("推荐")
+ fsRes.add(RoomListFragment.getInstance(Const.ROOM_TYPE_HOT, -1))
+ for (i in it.indices) {
+ titleRes.add(it[i].category_name)
+ fsRes.add(RoomListFragment.getInstance(Const.ROOM_TYPE_COMM, it[i].cate_id.toInt()))
+ }
+// //设置数据
+// mDataBinding.tabLayout.setTabData(titleRes.toTypedArray())
+// mDataBinding.viewpager.adapter = MyPagerAdapter(
+// childFragmentManager, fsRes
+// )
+ mAdapter = MyPagerAdapter(childFragmentManager, fsRes, titleRes)
+ mDataBinding.viewpager.adapter = mAdapter
+ mDataBinding.tabLayout.setSelectedTabIndicatorHeight(0)
+ mDataBinding.tabLayout.setupWithViewPager(mDataBinding.viewpager)
+ mDataBinding.viewpager.offscreenPageLimit = fsRes.size
+ //设置自定义tab
+ setCustomViews()
+ mDataBinding.tabLayout.addOnTabSelectedListener(object :
+ TabLayout.OnTabSelectedListener {
+ override fun onTabSelected(tab: TabLayout.Tab?) {
+ val text = tab?.customView?.findViewById(R.id.tv_name)
+ val v_view = tab?.customView?.findViewById(R.id.v_view)
+ text?.setTextColor(Color.parseColor("#333333"))
+ text?.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f)
+ text?.typeface = Typeface.DEFAULT_BOLD
+ v_view?.isSelected = true
+ }
+
+ override fun onTabUnselected(tab: TabLayout.Tab?) {
+ val text = tab?.customView?.findViewById(R.id.tv_name)
+ val v_view = tab?.customView?.findViewById(R.id.v_view)
+ text?.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
+ text?.typeface = Typeface.DEFAULT
+ text?.setTextColor(Color.parseColor("#666666"))
+ v_view?.isSelected = false
+ }
+
+ override fun onTabReselected(tab: TabLayout.Tab?) {
+// val text = tab?.customView?.findViewById(R.id.tv_name)
+// val v_view = tab?.customView?.findViewById(R.id.v_view)
+// v_view?.isSelected = false
+// text?.setTextColor(Color.parseColor("#666666"))
+ }
+
+ })
+
+ //设置自定义tab
+ }
+
+ viewModel.roomRandom.observe(this) {
+ viewModel.enterRoom(it.rid, "", context as AppCompatActivity)
+ }
+ viewModel.signDayList.observe(this) {
+ if (it.today_sign == "2") { //未签到
+ SginDialog(context as AppCompatActivity,viewModel,it).show()
+ }
+ }
+
+ viewModel.signSucces.observe(this){
+ SginSuccessDialog(context as AppCompatActivity,viewModel,it.award).show()
+ }
+ }
+
+
+ private fun setCustomViews() {
+ val mSelectedTabPosition = mDataBinding.tabLayout.selectedTabPosition
+ for (i in titleRes.indices) {
+ mDataBinding.tabLayout.getTabAt(i)!!.customView = getTabView(i, mSelectedTabPosition)
+ }
+ }
+
+
+ private fun getTabView(index: Int, mSelectedTabPosition: Int): View {
+ //自定义View布局
+ val view: View = LayoutInflater.from(context).inflate(R.layout.item_tablayout_header3, null)
+ val title = view.findViewById(R.id.tv_name) as TextView
+ val v_view = view.findViewById(R.id.v_view)
+ title.text = titleRes[index]
+ title.isSelected = index == mSelectedTabPosition
+ v_view.isSelected = index == mSelectedTabPosition
+ if (index == mSelectedTabPosition) {
+ title.setTextColor(Color.parseColor("#333333"))
+ title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f)
+ title.typeface = Typeface.DEFAULT_BOLD
+ } else {
+ title.setTextColor(Color.parseColor("#666666"))
+ title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f)
+ title.typeface = Typeface.DEFAULT
+ }
+ return view
+ }
+
+
+ private lateinit var mAdapter: com.yuyin.lib_base.adapter.MyPagerAdapter
+
+
+ override fun getLayoutId(): Int = R.layout.fragment_center
+
+ override fun initView() {
+ adapter = HomeRecomAdapter(activity, -2)
+ mDataBinding.rvView.adapter = adapter
+ val gridLayoutManager = LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false)
+ mDataBinding.rvView.layoutManager = gridLayoutManager
+ adapter.setOnItemClickListener { bean, position ->
+ viewModel.enterRoom(bean.rid, "", activity as AppCompatActivity)
+ }
+ if(App.isShangJia){
+ iv_search.setImageResource(R.mipmap.search_ic2)
+ }else{
+ iv_search.setImageResource(R.mipmap.search_ic)
+ }
+ }
+
+ fun resubData(cate_id: String) {
+ (fsRes[1] as RoomListFragment).resubData(cate_id)
+ }
+
+ override fun initData() {
+
+ viewModel.loadRoomData(getMap())
+ viewModel.loadRoomCategories()
+
+// viewModel.now_week_rank_four()
+// viewModel.top_cp()
+ if (!App.isStart && requireActivity().intent.getStringExtra("quite_room") == null) {
+ viewModel.user_day_sign_log()
+ }
+ }
+
+ override fun onResume() {
+ super.onResume()
+ viewModel.loadUserInfo()
+ viewModel.getBannerList()
+ }
+
+ override fun initEvent() {
+ mDataBinding.ivXqf.setOnClickListener {
+ viewModel.now_room_category("37")
+ }
+ mDataBinding.ivJbt.setOnClickListener {
+ viewModel.now_room_category("19")
+ }
+ mDataBinding.ivYxt.setOnClickListener {
+ viewModel.now_room_category("35")
+ }
+ mDataBinding.ivCp.setOnClickListener {
+ val intent = Intent(activity, CPRoomActivity::class.java)
+ startActivity(intent)
+ }
+ mDataBinding.ivWeek.setOnClickListener {
+ val intent = Intent(activity, WeekRankActivity::class.java)
+ startActivity(intent)
+ }
+ mDataBinding.ivRoom.setOnClickListener {
+ if (mUserBean == null) return@setOnClickListener
+ when (mUserBean!!.is_real) {
+ "2" -> ARouter.getInstance().build(AroutUtil.PLAY_REAL_NAME).navigation()
+ "1" -> {
+ if (mUserBean!!.rid == "0") {
+ "房间信息读取失败...".showToast()
+ } else {
+ viewModel.enterRoom(mUserBean!!.rid, "", activity as AppCompatActivity)
+ }
+ }
+ "3" -> "实名认证审核中...".showToast()
+ }
+ }
+
+ mDataBinding.ivSearch.setOnClickListener {
+ ARouter.getInstance().build(AroutUtil.MAIN_SEARCH_MAIN).navigation()
+ }
+ mDataBinding.llSousuo.setOnClickListener {
+ ARouter.getInstance().build(AroutUtil.MAIN_SEARCH_MAIN).navigation()
+ }
+
+ mDataBinding.ivRank.setOnClickListener {
+ ARouter.getInstance().build(AroutUtil.LIVE_RANK).withInt("selectTab", 0).navigation()
+ }
+
+ mDataBinding.ivNewRoom.setOnClickListener {
+ viewModel.now_room_category("18")
+ }
+
+ mDataBinding.ivAuctionRoom.setOnClickListener {
+ viewModel.now_room_category("28")
+ }
+
+ mDataBinding.ivKsong.setOnClickListener {
+ viewModel.now_room_category("27")
+ }
+
+ mDataBinding.ivFriend.setOnClickListener {
+ viewModel.now_room_category("29")
+ }
+
+ }
+
+ private fun initBanner(data: List) {
+ val imgurls: MutableList = ArrayList()
+ for (list in data) {
+ imgurls.add(list.image)
+ }
+ //设置图片加载器
+ mDataBinding.banner.setImageLoader(GlideImageLoader())
+ //设置图片集合
+ mDataBinding.banner.setImages(imgurls)
+ //设置指示器位置(当banner模式中有指示器时)
+ mDataBinding.banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR)
+ mDataBinding.banner.setIndicatorGravity(BannerConfig.CENTER)
+ //设置自动轮播,默认为true
+ mDataBinding.banner.isAutoPlay(true)
+ //banner设置方法全部调用完毕时最后调用
+ mDataBinding.banner.start()
+ mDataBinding.banner.setOnBannerListener {
+ when (data[it].type) {
+ "1" -> {
+
+ }
+ "2" -> {
+ context?.let { it1 -> X5WebViewActivity.forward(it1, data[it].url, "") }
+ }
+ "3" -> {
+ viewModel.enterRoom(data[it].aid, "", activity as AppCompatActivity)
+ }
+ "4" -> {
+ ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+ .withString("from_id", data[it].aid).navigation()
+ }
+ "5" -> {
+ context?.let { it1 ->
+ X5WebViewActivity.forward(
+ it1, data[it].url + "?login_token=" + UserManager.user.login_token, ""
+ )
+ }
+ }
+ }
+ }
+ mDataBinding.banner.setOnClickListener {
+ when (data[0].type) {
+ "1" -> {
+
+ }
+ "2" -> {
+ context?.let { it1 -> X5WebViewActivity.forward(it1, data[0].url, "") }
+ }
+ "3" -> {
+ viewModel.enterRoom(data[0].aid, "", activity as AppCompatActivity)
+ }
+ "4" -> {
+ ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+ .withString("from_id", data[0].aid).navigation()
+ }
+ "5" -> {
+ context?.let { it1 ->
+ X5WebViewActivity.forward(
+ it1, data[0].url + "?login_token=" + UserManager.user.login_token, ""
+ )
+ }
+ }
+ }
+ }
+ }
+
+ class MyPagerAdapter(fm: FragmentManager, private val fs: ArrayList) :
+ FragmentPagerAdapter(fm) {
+ override fun getCount(): Int = fs.size
+
+ override fun getItem(i: Int): Fragment {
+ return fs[i]
+ }
+
+ }
+
+ private fun getMap(): MutableMap {
+ val map: MutableMap = HashMap()
+ map["tid"] = Const.ROOM_TYPE
+ map["is_top"] = "2"
+// map["is_hot"] = "2"
+ map["page"] = "1"
+ return map
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/center/MainCenterViewModel.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/center/MainCenterViewModel.kt
new file mode 100644
index 0000000..c06b233
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/center/MainCenterViewModel.kt
@@ -0,0 +1,260 @@
+package com.yuyin.mier.module_home.tab.center
+
+import androidx.lifecycle.MutableLiveData
+import com.yuyin.lib_base.Const
+import com.yuyin.mier.module_home.model.BannerBean
+import com.yuyin.mier.module_home.model.RoomListBean
+import com.yuyin.mier.repository.CommonRepository
+import com.yuyin.lib_base.base.BaseViewModel
+import com.yuyin.lib_base.base.UserManager
+import com.yuyin.lib_base.model.CategorRoomBean
+import com.yuyin.lib_base.model.RankTopThreeBean
+import com.yuyin.lib_base.model.Wxmodel
+import com.yuyin.lib_base.util.showToast
+import com.yuyin.mier.module_home.model.DaySignBean
+import com.yuyin.mier.module_home.model.MyRoomList
+import com.yuyin.mier.module_home.model.SignSuccesBean
+import com.yuyin.mier.module_home.model.TopCpBean
+import com.yuyin.mier.module_home.model.WeekHomeBean
+import com.yuyin.mier.module_my.model.InviteInfoBean
+import com.yuyin.mier.module_my.model.RenewalAmountBean
+import com.yuyin.mier.module_my.model.UserRoomVisitor
+import com.yuyin.mier.module_my.model.VIPData
+import com.yuyin.module_live.model.RankListBean
+import com.yuyin.module_live.model.SignedArtistBean
+import com.yuyin.module_live.repository.LiveRepository
+
+class MainCenterViewModel : BaseViewModel() {
+ var repository = CommonRepository()
+
+ var rankTopThreeBean = MutableLiveData()
+
+ var roomData = MutableLiveData>()
+
+ var roomData2 = MutableLiveData>()
+
+ var openVerify = MutableLiveData()
+
+ var roomCategories = MutableLiveData>()
+ fun loadRoomCategories() {
+ launchUI {
+ val result = repository.roomCategories(Const.ROOM_TYPE)
+ roomCategories.value = result.data;
+ }
+ }
+
+ fun loadRoomData(map: MutableMap) {
+ launchUI {
+ val result = repository.getRoomList(map)
+ roomData.value = result.data;
+ }
+ }
+
+ fun loadRoomData2(map: MutableMap) {
+ launchUI {
+ val result = repository.getRoomList(map)
+ roomData2.value = result.data;
+ }
+ }
+
+
+ var bannerListBean = MutableLiveData>()
+ fun getBannerList() {
+ launchUI {
+ val result = repository.get_banner_list()
+ bannerListBean.value = result.data;
+ }
+ }
+
+ fun get_user_rank_top() {
+ launchUI {
+ val result = repository.get_user_rank_top()
+ rankTopThreeBean.value = result.data;
+ }
+ }
+
+ fun user_open_verify_token() {
+ launchUI {
+ val result = repository.user_open_verify_token()
+ openVerify.value = result.data
+ }
+ }
+
+
+ var liveRepository = LiveRepository()
+ var rankDataTop = MutableLiveData>()
+ fun loadRankData(rid: String, time: String, type: String) {
+ launchUI {
+ val result = liveRepository.get_room_rank(rid, time, type)
+ rankDataTop.value = result.data.list
+ }
+ }
+
+
+ val vipData = MutableLiveData()
+ fun get_vip_list() {
+ launchUI {
+ val result = repository.get_vip_list()
+ vipData.value = result.data
+ }
+ }
+
+
+ fun pay_vip_order(
+ vid: String, pay_type: String
+ ) {
+ launchUI {
+ val result = repository.pay_vip_order(vid, pay_type)
+ result.msg.showToast()
+ get_vip_list()
+ }
+ }
+
+
+ var sendCodeClick: MutableLiveData = MutableLiveData(true)
+
+ var sendCode: MutableLiveData = MutableLiveData()
+
+ var phone: MutableLiveData = MutableLiveData()
+ var code: MutableLiveData = MutableLiveData()
+
+ fun verification(captcha_code: String, captcha_key: String) {
+ if (phone.value.isNullOrEmpty()) {
+ "请输入手机号".showToast()
+ return
+ }
+ if (sendCodeClick.value == false) return
+ sendCodeClick.value = false
+ sendCode.value = "发送"
+ launchUI {
+ val result = repository.verification(phone.value.toString(), "2",captcha_code,captcha_key)
+ result.msg.showToast()
+ }
+
+ }
+
+
+ val inviteInfoBean = MutableLiveData()
+ fun get_update_invite_info() {
+ launchUI {
+ val result = repository.get_update_invite_info()
+ inviteInfoBean.value = result.data
+ }
+ }
+
+
+ var weixin = MutableLiveData()
+ var alipay = MutableLiveData()
+
+ fun update_user_inviter(
+ user_id: String, sms_code: String, pay_type: String
+ ) {
+ launchUI {
+ val result = repository.update_user_inviter(user_id, sms_code, pay_type)
+
+ }
+ }
+
+
+ val roomRandom = MutableLiveData()
+ fun now_room_category(rid: String) {
+ launchUI {
+ val result = repository.now_room_category(rid)
+ roomRandom.value = result.data
+ }
+ }
+
+
+ var renewalAmountBean = MutableLiveData()
+ fun user_renewal_contract_status(id: String) {
+ launchUI {
+ val result = repository.user_renewal_contract_status(id)
+ result.data.id = id
+ renewalAmountBean.value = result.data
+ }
+ }
+
+ fun user_renewal_contract(id: String) {
+ launchUI {
+ val result = repository.user_renewal_contract(id)
+ result.data
+ get_user_contract_list(UserManager.user.uid.toString(), "1", "20")
+
+ }
+ }
+
+ val signedArtist = MutableLiveData>()
+ fun get_user_contract_list(
+ uid: String, page: String, page_limit: String
+ ) {
+
+ launchUI {
+ val result = liveRepository.get_user_contract_list(uid, page, page_limit)
+ signedArtist.value = result.data
+ }
+ }
+
+ fun user_cancel_contract(id: String, uid: String) {
+ launchUI {
+ repository.user_cancel_contract(id)
+ get_user_contract_list(uid, "1", "20")
+ }
+ }
+
+
+ val myRoomList = MutableLiveData>()
+ fun get_user_room_power_list() {
+ launchUI {
+ val result = repository.get_user_room_power_list()
+ myRoomList.value = result.data
+ }
+ }
+
+
+ fun user_retire_room_power(rid: String, user_type: String) {
+ launchUI {
+ val result = repository.user_retire_room_power(rid, user_type)
+ get_user_room_power_list()
+ }
+ }
+
+
+ val WeekHomeList = MutableLiveData>()
+ fun now_week_rank_four() {
+ launchUI {
+ val result = repository.now_week_rank_four()
+ WeekHomeList.value=result.data
+ }
+ }
+
+ val TopCpBean = MutableLiveData()
+ fun top_cp() {
+ launchUI {
+ val result = repository.top_cp()
+ TopCpBean.value=result.data
+ }
+ }
+
+ var signDayList = MutableLiveData()
+ var signSucces = MutableLiveData()
+ fun user_day_sign_log() {
+ launchUI {
+ val result = repository.user_day_sign_log()
+ signDayList.value=result.data
+ }
+ }
+ var signDayList2 = MutableLiveData()
+ fun user_day_sign_log2() {
+ launchUI {
+ val result = repository.user_day_sign_log()
+ signDayList2.value=result.data
+ }
+ }
+
+ fun user_day_sign() {
+ launchUI {
+ val result = repository.user_day_sign()
+ signSucces.value=result.data
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/center/sign/SginDialog.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sign/SginDialog.kt
new file mode 100644
index 0000000..7b83921
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sign/SginDialog.kt
@@ -0,0 +1,97 @@
+package com.yuyin.mier.module_home.tab.center.sign
+
+import android.app.Dialog
+import android.content.Context
+import android.graphics.Color
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.WindowManager
+import androidx.databinding.DataBindingUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.databinding.DialogSignBinding
+import com.yuyin.mier.module_home.model.DaySignBean
+import com.yuyin.mier.module_home.tab.center.MainCenterViewModel
+import kotlinx.android.synthetic.main.day_sgin.view.*
+import kotlinx.android.synthetic.main.day_sgin2.view.*
+
+class SginDialog(context: Context, val main: MainCenterViewModel, val it: DaySignBean) :
+ Dialog(context) {
+
+ private lateinit var mBinding: DialogSignBinding
+
+ init {
+ initDailog(context)
+ }
+
+ private fun initDailog(context: Context) {
+ val inflater = LayoutInflater.from(context)
+ mBinding = DataBindingUtil.inflate(inflater, R.layout.dialog_sign, null, false)
+ setContentView(mBinding.getRoot())
+ val win = this.window
+ val params = win!!.attributes
+ params.width = WindowManager.LayoutParams.MATCH_PARENT
+ params.height = WindowManager.LayoutParams.WRAP_CONTENT
+ params.gravity = Gravity.CENTER
+ params.horizontalMargin = 10f
+ win.attributes = params
+ win.setBackgroundDrawable(context.resources.getDrawable(com.yuyin.lib_base.R.color.translant))
+
+ mBinding.tvSignTime.text = "已累计签到" + it.sign_num + "天"
+ if (it.today_sign == "1") {
+ mBinding.btnSign.setImageResource(R.mipmap.sign_icon7)
+ } else {
+ mBinding.btnSign.setImageResource(R.mipmap.sign_icon5)
+ }
+
+ mBinding.day1.tv_day.text = "1"
+ mBinding.day1.tv_sigin_price.text = it.sign_log[0].award + "金币"
+// mBinding.day1.sign_now.visibility = if (it.sign_log[0].is_sign == 1) View.VISIBLE else View.GONE
+ mBinding.day1.ll_sign.isSelected = if (it.sign_log[0].is_sign == 1) true else false
+
+ mBinding.day2.tv_day.text = "2"
+ mBinding.day2.tv_sigin_price.text = it.sign_log[1].award + "金币"
+// mBinding.day2.sign_now.visibility = if (it.sign_log[1].is_sign == 1) View.VISIBLE else View.GONE
+ mBinding.day2.ll_sign.isSelected = if (it.sign_log[1].is_sign == 1) true else false
+
+ mBinding.day3.tv_day.text = "3"
+ mBinding.day3.tv_sigin_price.text = it.sign_log[2].award + "金币"
+// mBinding.day3.sign_now.visibility = if (it.sign_log[2].is_sign == 1) View.VISIBLE else View.GONE
+ mBinding.day3.ll_sign.isSelected = if (it.sign_log[2].is_sign == 1) true else false
+
+ mBinding.day4.tv_day.text = "4"
+ mBinding.day4.tv_sigin_price.text = it.sign_log[3].award + "金币"
+// mBinding.day4.sign_now.visibility = if (it.sign_log[3].is_sign == 1) View.VISIBLE else View.GONE
+ mBinding.day4.ll_sign.isSelected = if (it.sign_log[3].is_sign == 1) true else false
+
+ mBinding.day5.tv_day.text = "5"
+ mBinding.day5.tv_sigin_price.text = it.sign_log[4].award + "金币"
+// mBinding.day5.sign_now.visibility = if (it.sign_log[4].is_sign == 1) View.VISIBLE else View.GONE
+ mBinding.day5.ll_sign.isSelected = if (it.sign_log[4].is_sign == 1) true else false
+
+ mBinding.day6.tv_day.text = "6"
+ mBinding.day6.tv_sigin_price.text = it.sign_log[5].award + "金币"
+// mBinding.day6.sign_now.visibility = if (it.sign_log[5].is_sign == 1) View.VISIBLE else View.GONE
+ mBinding.day6.ll_sign.isSelected = if (it.sign_log[5].is_sign == 1) true else false
+
+ mBinding.day7.tv_day2.text = "7"
+ mBinding.day7.tv_sigin_price2.text = it.sign_log[6].award + "金币"
+
+ if (it.sign_log[6].is_sign == 1){
+ mBinding.day7.tv_sigin_price2.setTextColor(Color.parseColor("#FFFFFF"))
+// mBinding.day7.sign_now2.visibility = View.VISIBLE
+ mBinding.day7.ll_sign2.isSelected = true
+ }else{
+ mBinding.day7.tv_sigin_price2.setTextColor(Color.parseColor("#333333"))
+// mBinding.day7.sign_now2.visibility = View.GONE
+ mBinding.day7.ll_sign2.isSelected = false
+ }
+
+ mBinding.btnSign.setOnClickListener { its ->
+ dismiss()
+ if (it.today_sign == "2") {
+ main.user_day_sign()
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/center/sign/SginSuccessDialog.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sign/SginSuccessDialog.kt
new file mode 100644
index 0000000..6729768
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sign/SginSuccessDialog.kt
@@ -0,0 +1,38 @@
+package com.yuyin.mier.module_home.tab.center.sign
+
+import android.app.Dialog
+import android.content.Context
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.WindowManager
+import androidx.databinding.DataBindingUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.databinding.DialogSignSuccesBinding
+import com.yuyin.mier.module_home.tab.center.MainCenterViewModel
+
+class SginSuccessDialog(context: Context, val main: MainCenterViewModel, val award:String) :
+ Dialog(context) {
+ private lateinit var mBinding: DialogSignSuccesBinding
+ init {
+ initDailog(context)
+ }
+
+ private fun initDailog(context: Context) {
+ val inflater = LayoutInflater.from(context)
+ mBinding = DataBindingUtil.inflate(inflater, R.layout.dialog_sign_succes, null, false)
+ setContentView(mBinding.getRoot())
+ val win = this.window
+ val params = win!!.attributes
+ params.width = WindowManager.LayoutParams.MATCH_PARENT
+ params.height = WindowManager.LayoutParams.WRAP_CONTENT
+ params.gravity = Gravity.CENTER
+ win.attributes = params
+ win.setBackgroundDrawable(context.resources.getDrawable(com.yuyin.lib_base.R.color.translant))
+ mBinding.tvSignPrice.text="签到成功 金币"+award
+ mBinding!!.btnSign.setOnClickListener {
+ dismiss()
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/HomeRecomAdapter.java b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/HomeRecomAdapter.java
new file mode 100644
index 0000000..696fbf3
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/HomeRecomAdapter.java
@@ -0,0 +1,188 @@
+package com.yuyin.mier.module_home.tab.center.sub;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.bumptech.glide.Glide;
+import com.yuyin.lib_base.adapter.RefreshAdapter;
+import com.yuyin.mier.R;
+import com.yuyin.mier.module_home.model.RoomListBean;
+
+import java.util.Random;
+
+/**
+ *
+ */
+
+public class HomeRecomAdapter extends RefreshAdapter {
+
+ private Context context;
+
+ private int TYPE_N = -2;
+ public int TYPE_O = -3;
+ private int type = 0;
+
+ private View.OnClickListener mOnClickListener;
+
+ /**
+ * @param context
+ * @param type -1全部0推荐1热门2其它(目前包含-1,0)
+ */
+ public HomeRecomAdapter(Context context, int type) {
+ super(context);
+ this.context = context;
+ this.type = type;
+ mOnClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (!canClick()) {
+ return;
+ }
+ Object tag = v.getTag();
+ if (tag != null) {
+ int position = (int) tag;
+ if (mOnItemClickListener != null) {
+ mOnItemClickListener.onItemClick(mList.get(position), position);
+ }
+ }
+ }
+ };
+ }
+
+ @Override
+ public int getItemViewType(int position) {
+ return type;
+ }
+
+ @Override
+ public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ if (viewType == TYPE_N)
+ return new Vh(mInflater.inflate(R.layout.item_main_home_recom_hot2, parent, false), viewType);
+ return new Vh(mInflater.inflate(R.layout.item_main_home_recom_hot, parent, false), viewType);
+ }
+
+ @Override
+ public void onBindViewHolder(RecyclerView.ViewHolder vh, int position) {
+ ((Vh) vh).setData(mList.get(position), position);
+ }
+
+
+ class Vh extends RecyclerView.ViewHolder {
+ int viewType;
+ ImageView mCover, riv;
+ TextView tv_title, tv_title2;
+ TextView tv_num;
+ TextView tv_type, tv_id, tv_vis_num,tv_name;
+ View iv_lianghao;
+ RecyclerView riv_person;
+
+
+ public Vh(View itemView, int viewType) {
+ super(itemView);
+ this.viewType = viewType;
+ mCover = itemView.findViewById(R.id.cover);
+ riv = itemView.findViewById(R.id.riv);
+ tv_title = itemView.findViewById(R.id.tv_title);
+ tv_title2 = itemView.findViewById(R.id.tv_title2);
+ tv_num = itemView.findViewById(R.id.tv_num);
+ tv_type = itemView.findViewById(R.id.tv_type);
+ tv_id = itemView.findViewById(R.id.tv_id);
+ iv_lianghao = itemView.findViewById(R.id.iv_lianghao);
+ tv_vis_num = itemView.findViewById(R.id.tv_vis_num);
+ riv_person = itemView.findViewById(R.id.riv_person);
+ tv_name = itemView.findViewById(R.id.tv_name);
+ itemView.setOnClickListener(mOnClickListener);
+ }
+
+ void setData(RoomListBean bean, int position) {
+ itemView.setTag(position);
+ /*int sss = new Random().nextInt(4);
+ int[] bg22 = {R.mipmap.home_list_img21, R.mipmap.home_list_img22, R.mipmap.home_list_img23,
+ R.mipmap.home_list_img24, R.mipmap.home_list_img25, R.mipmap.home_list_img26,
+ R.mipmap.home_list_img27, R.mipmap.home_list_img28, R.mipmap.home_list_img29};
+
+ if (bean.getCategory_name().equals("交友")) {
+ tv_type.setBackground(mContext.getResources().getDrawable(bg22[0]));
+ tv_type.setText("");
+ } else if (bean.getCategory_name().equals("点歌")) {
+ tv_type.setBackground(mContext.getResources().getDrawable(bg22[1]));
+ tv_type.setText("");
+ } else if (bean.getCategory_name().equals("相亲")) {
+ tv_type.setBackground(mContext.getResources().getDrawable(bg22[2]));
+ tv_type.setText("");
+ } else if (bean.getCategory_name().equals("游戏")) {
+ tv_type.setBackground(mContext.getResources().getDrawable(bg22[3]));
+ tv_type.setText("");
+ } else if (bean.getCategory_name().equals("酒吧")) {
+ tv_type.setBackground(mContext.getResources().getDrawable(bg22[4]));
+ tv_type.setText("");
+ } else if (bean.getCategory_name().equals("互娱")) {
+ tv_type.setBackground(mContext.getResources().getDrawable(bg22[5]));
+ tv_type.setText("");
+ } else if (bean.getCategory_name().equals("拍卖")) {
+ tv_type.setBackground(mContext.getResources().getDrawable(bg22[6]));
+ tv_type.setText("");
+ } else if (bean.getCategory_name().equals("K歌")) {
+ tv_type.setBackground(mContext.getResources().getDrawable(bg22[7]));
+ tv_type.setText("");
+ } else {
+ tv_type.setBackground(mContext.getResources().getDrawable(bg22[8]));
+ tv_type.setText("" + bean.getCategory_name());
+ }*/
+
+ if (tv_type!= null) tv_type.setText("" + bean.getCategory_name());
+
+ if (tv_id != null) {
+// if (bean.getSpecial_uid() == 0) {
+// iv_lianghao.setVisibility(View.GONE);
+ tv_id.setText(bean.getRoom_number());
+// } else {
+// iv_lianghao.setVisibility(View.VISIBLE);
+// tv_id.setText("ID:" + bean.getSpecial_uid());
+// }
+ }
+ if (riv != null) {
+ Glide.with(context).load(bean.getHead_pic()).into(riv);
+ }
+ if (mCover != null)
+ Glide.with(context).load(bean.getRoom_cover())
+ .error(R.mipmap.ic_launcher_app).into(mCover);
+ if (tv_title2 != null) tv_title2.setText("" + bean.getCategory_name());
+ if (tv_num != null) tv_num.setText("" + bean.getHot_value());
+ if (tv_title != null) tv_title.setText("" + bean.getRoom_name());
+ if (tv_vis_num != null) tv_vis_num.setText(bean.getVisitor_num() + "人");
+
+ if (tv_name != null) tv_name.setText(bean.getNick_name());
+
+ if (riv_person != null) {
+ LinearLayoutManager layoutManager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, true);
+ riv_person.setLayoutManager(layoutManager);
+
+ PersonAdapter personAdapter = new PersonAdapter();
+ riv_person.setAdapter(personAdapter);
+ if (riv_person.getItemDecorationCount() == 0) {
+ riv_person.addItemDecoration(itemDecoration);
+ }
+ personAdapter.setNewData(bean.getRoom_micro_list());
+
+ }
+ }
+ }
+
+ RecyclerView.ItemDecoration itemDecoration = new RecyclerView.ItemDecoration() {
+ @Override
+ public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
+ if (parent.getChildPosition(view) != 0) {
+ outRect.right = -15;
+ }
+ }
+ };
+}
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/PersonAdapter.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/PersonAdapter.kt
new file mode 100644
index 0000000..103be5f
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/PersonAdapter.kt
@@ -0,0 +1,17 @@
+package com.yuyin.mier.module_home.tab.center.sub
+
+import com.bumptech.glide.Glide
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.Mic
+
+class PersonAdapter :
+ BaseQuickAdapter(R.layout.item_person, arrayListOf()) {
+ override fun convert(helper: BaseViewHolder, item: Mic) {
+// helper
+// .setText(R.id.tv_name, item.send_user_info.nick_name)
+ Glide.with(mContext).load(item.head_pic).error(R.mipmap.ic_launcher_app)
+ .placeholder(R.mipmap.ic_launcher_app).into(helper.getView(R.id.head))
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/RoomListFragment.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/RoomListFragment.kt
new file mode 100644
index 0000000..43b9d7a
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/RoomListFragment.kt
@@ -0,0 +1,148 @@
+package com.yuyin.mier.module_home.tab.center.sub
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.recyclerview.widget.GridLayoutManager
+import com.scwang.smartrefresh.layout.api.RefreshLayout
+import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener
+import com.yuyin.lib_base.Const
+import com.yuyin.lib_base.base.BaseDataBindingFragment
+import com.yuyin.lib_base.view.ItemDecoration
+import com.yuyin.mier.R
+import com.yuyin.mier.databinding.FragmentRoomListBinding
+import java.util.*
+
+class RoomListFragment : BaseDataBindingFragment() {
+ var cateId: String = ""
+ lateinit var adapter: HomeRecomAdapter
+
+ companion object {
+ fun getInstance(tag_type: Int, cateId: Int): RoomListFragment {
+ val fragment = RoomListFragment()
+ val bundle = Bundle()
+ bundle.putInt("tag_type", tag_type)
+ bundle.putInt("cateId", cateId)
+ fragment.arguments = bundle
+ return fragment
+ }
+ }
+
+ override fun startObserve() {
+ viewModel.roomData.observe(requireActivity(), {
+ if (page == 1)
+ adapter.list.clear()
+ adapter.list.addAll(it)
+ adapter.notifyDataSetChanged()
+ })
+ viewModel.getFinally().observe(requireActivity(), {
+ mDataBinding.srlView.finishLoadMore()
+ mDataBinding.srlView.finishRefresh()
+ })
+// viewModel.roomCategories.observe(this, {
+// cateId = it[0].cate_id
+// viewModel.loadRoomData(getMap())
+// })
+ }
+
+ fun resubData(cate_id: String) {
+ cateId = cate_id
+ viewModel.loadRoomData(getMap())
+ }
+
+
+ override fun getLayoutId(): Int = R.layout.fragment_room_list
+
+ override fun initView() {
+ }
+
+ override fun onResume() {
+ super.onResume()
+ page = 1
+ viewModel.loadRoomData(getMap())
+ }
+
+ override fun initData() {
+ val type = requireArguments().getInt("tag_type")
+ adapter = HomeRecomAdapter(activity, -3)
+// val decoration = ItemDecoration(context, 0x00000000, 7F, 7F)
+// decoration.isOnlySetItemOffsetsButNoDraw = true
+// mDataBinding.rvView.addItemDecoration(decoration)
+
+ mDataBinding.rvView.adapter = adapter
+ val gridLayoutManager = GridLayoutManager(this.context, 2)
+// gridLayoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
+// override fun getSpanSize(position: Int): Int {
+// if (position < 6) {
+// return 2
+// }
+//// if (position < 10) {
+//// return 4
+//// }
+// return 3
+// }
+//
+// }
+ mDataBinding.rvView.layoutManager = gridLayoutManager
+ if (mDataBinding.rvView.itemDecorationCount == 0) {
+ mDataBinding.rvView.addItemDecoration(ItemDecoration(context, 0x00000000, 7F, 10F))
+ }
+
+ adapter.setOnItemClickListener { bean, position ->
+ viewModel.enterRoom(bean.rid, "", activity as AppCompatActivity)
+ }
+
+ if (type == Const.ROOM_TYPE_HOT) {
+// mDataBinding.ivRightShow.visibility = View.GONE
+ viewModel.loadRoomData(getMap())
+ } else {
+// mDataBinding.ivRightShow.visibility = View.VISIBLE
+// viewModel.loadRoomCategories()
+ viewModel.loadRoomData(getMap())
+ }
+ }
+
+ override fun initEvent() {
+
+
+ mDataBinding.srlView.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
+ override fun onRefresh(refreshLayout: RefreshLayout) {
+ page = 1
+ viewModel.loadRoomData(getMap())
+ }
+
+ override fun onLoadMore(refreshLayout: RefreshLayout) {
+ page++
+ viewModel.loadRoomData(getMap())
+ }
+
+ })
+ }
+
+
+ var page = 1
+ private fun getMap(): MutableMap {
+ val map: MutableMap = HashMap()
+ val type = requireArguments().getInt("tag_type")
+ cateId = requireArguments().getInt("cateId").toString()
+ map["tid"] = Const.ROOM_TYPE
+ when (type) {
+ Const.ROOM_TYPE_ALL -> {
+ }
+
+ Const.ROOM_TYPE_TOP -> {
+ map["is_top"] = "2"
+ }
+
+ Const.ROOM_TYPE_HOT -> {
+ map["is_hot"] = "2"
+ }
+
+ else -> {
+ if (cateId != "-1")
+ map["cate_id"] = cateId
+ }
+ }
+ map["page"] = page.toString()
+ return map
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/RoomListViewModel.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/RoomListViewModel.kt
new file mode 100644
index 0000000..5e91ff1
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/RoomListViewModel.kt
@@ -0,0 +1,53 @@
+package com.yuyin.mier.module_home.tab.center.sub
+
+import androidx.lifecycle.MutableLiveData
+import com.yuyin.lib_base.Const
+import com.yuyin.lib_base.base.BaseViewModel
+import com.yuyin.lib_base.model.CategorRoomBean
+import com.yuyin.mier.module_home.model.BannerBean
+import com.yuyin.mier.module_home.model.RoomListBean
+import com.yuyin.mier.repository.CommonRepository
+
+class RoomListViewModel : BaseViewModel() {
+ var repository = CommonRepository()
+
+ var roomData = MutableLiveData>()
+ fun loadRoomData(map: MutableMap) {
+ launchUI {
+ val result = repository.getRoomList(map)
+ roomData.value = result.data;
+ }
+ }
+
+ var roomData2 = MutableLiveData>()
+ fun loadRoomData2(map: MutableMap) {
+ launchUI {
+ val result = repository.getRoomList(map)
+ roomData2.value = result.data;
+ }
+ }
+
+ var roomData3 = MutableLiveData>()
+ fun loadRoomData3(map: MutableMap) {
+ launchUI {
+ val result = repository.getRoomList(map)
+ roomData3.value = result.data;
+ }
+ }
+ var roomCategories = MutableLiveData>()
+ fun loadRoomCategories() {
+ launchUI {
+ val result = repository.roomCategories(Const.ROOM_TYPE)
+ roomCategories.value = result.data;
+ }
+ }
+
+ var bannerListBean = MutableLiveData>()
+ fun getBannerList() {
+ launchUI {
+ val result = repository.get_banner_list()
+ bannerListBean.value = result.data;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/RoomTypeFragment.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/RoomTypeFragment.kt
new file mode 100644
index 0000000..817e533
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/center/sub/RoomTypeFragment.kt
@@ -0,0 +1,230 @@
+package com.yuyin.mier.module_home.tab.center.sub
+
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.TextView
+import androidx.appcompat.app.AppCompatActivity
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.alibaba.android.arouter.launcher.ARouter
+import com.youth.banner.BannerConfig
+import com.yuyin.lib_base.Const
+import com.yuyin.lib_base.adapter.MyPagerAdapter
+import com.yuyin.lib_base.arouter.AroutUtil
+import com.yuyin.lib_base.base.BaseViewModelFragment
+import com.yuyin.lib_base.ui.X5WebViewActivity
+import com.yuyin.lib_base.view.GlideImageLoader
+import com.yuyin.mier.R
+import com.yuyin.mier.module_home.model.BannerBean
+import kotlinx.android.synthetic.main.fragment_room_type.*
+import java.util.*
+
+class RoomTypeFragment : BaseViewModelFragment() {
+ lateinit var adapter2: HomeRecomAdapter
+ lateinit var adapter: HomeRecomAdapter
+ private val fsRes: ArrayList = ArrayList() //fragment集合
+ private val titleRes = ArrayList() //tab标题集合
+ private lateinit var mAdapter: MyPagerAdapter
+ override fun getLayoutId(): Int = R.layout.fragment_room_type
+
+ override fun initView() {
+ adapter2 = HomeRecomAdapter(activity, 0)
+ rv_view2.adapter = adapter2
+ val gridLayoutManager2 = LinearLayoutManager(activity, RecyclerView.HORIZONTAL,false)
+ rv_view2.layoutManager = gridLayoutManager2
+ adapter2.setOnItemClickListener { bean, position ->
+ viewModel.enterRoom(bean.rid, "", activity as AppCompatActivity)
+ }
+
+ adapter = HomeRecomAdapter(activity, -3)
+ rv_view.adapter = adapter
+ val gridLayoutManager = GridLayoutManager(activity,2)
+ rv_view.layoutManager = gridLayoutManager
+ adapter.setOnItemClickListener { bean, position ->
+ viewModel.enterRoom(bean.rid, "", activity as AppCompatActivity)
+ }
+ }
+
+ override fun initData() {
+// viewModel.loadRoomCategories()
+ viewModel.getBannerList()
+ viewModel.loadRoomData2(getMap1())
+ viewModel.loadRoomData3(getMap2())
+ }
+
+
+ private fun initBanner(data: List) {
+ val imgurls: MutableList = ArrayList()
+ for (list in data) {
+ imgurls.add(list.image)
+ }
+ //设置图片加载器
+ banner.setImageLoader(GlideImageLoader())
+ //设置图片集合
+ banner.setImages(imgurls)
+ //设置指示器位置(当banner模式中有指示器时)
+ banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR)
+ banner.setIndicatorGravity(BannerConfig.CENTER)
+ //设置自动轮播,默认为true
+ banner.isAutoPlay(true)
+ //banner设置方法全部调用完毕时最后调用
+ banner.start()
+ banner.setOnBannerListener {
+ when (data[it].type) {
+ "1" -> {
+
+ }
+ "2" -> {
+ context?.let { it1 -> X5WebViewActivity.forward(it1, data[it].url, "") }
+ }
+ "3" -> {
+ viewModel.enterRoom(data[it].aid, "", activity as AppCompatActivity)
+ }
+ "4" -> {
+ ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+ .withString("from_id", data[it].aid)
+ .navigation()
+ }
+ }
+ }
+ banner.setOnClickListener {
+ when (data[0].type) {
+ "1" -> {
+
+ }
+ "2" -> {
+ context?.let { it1 -> X5WebViewActivity.forward(it1, data[0].url, "") }
+ }
+ "3" -> {
+ viewModel.enterRoom(data[0].aid, "", activity as AppCompatActivity)
+ }
+ "4" -> {
+ ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+ .withString("from_id", data[0].aid)
+ .navigation()
+ }
+ }
+ }
+ }
+
+
+ override fun initEvent() {
+
+ }
+
+ override fun startObserve() {
+ viewModel.roomData2.observe(requireActivity(), {
+ adapter2.list.clear()
+ adapter2.list.addAll(it)
+ adapter2.notifyDataSetChanged()
+ })
+ viewModel.roomData3.observe(requireActivity(), {
+ adapter.list.clear()
+ adapter.list.addAll(it)
+ adapter.notifyDataSetChanged()
+ })
+ viewModel.bannerListBean.observe(this, {
+ if (it == null) return@observe
+ initBanner(it)
+ })
+ viewModel.roomCategories.observe(this, {
+ titleRes.add("热门")
+ fsRes.add(RoomListFragment.getInstance(Const.ROOM_TYPE_HOT, -1))
+// for(i in it.indices){
+// titleRes.add(it[i].category_name)
+// fsRes.add(RoomListFragment.getInstance(Const.ROOM_TYPE_COMM,it[i].cate_id.toInt()))
+// }
+ mAdapter = MyPagerAdapter(childFragmentManager, fsRes, titleRes)
+
+// view_pager.adapter = mAdapter
+// tabLayout.setupWithViewPager(view_pager)
+// view_pager.offscreenPageLimit = fsRes.size
+// //设置自定义tab
+// setCustomViews()
+
+ view_pager.adapter = mAdapter
+ tabLayout.setViewPager(view_pager)
+ tabLayout.setSnapOnTabClick(true)
+ view_pager.offscreenPageLimit = fsRes.size
+ })
+ }
+
+
+// /**
+// * 热门,房间
+// */
+ // private void loadRecommentData() {
+ // //热门推荐
+ // RxUtils.loading(commonModel.is_popular(), this)
+ // .subscribe(new ErrorHandleSubscriber(mErrorHandler) {
+ // @Override
+ // public void onNext(RecommenRoomBean categorRoomBean) {
+ // RecomFragment recomFragment = (RecomFragment) mFragments.get(0);
+ // recomFragment.setPopularData(categorRoomBean);
+ // }
+ // });
+ // //密聊推荐
+ // RxUtils.loading(commonModel.secret_chat(), this)
+ // .subscribe(new ErrorHandleSubscriber(mErrorHandler) {
+ // @Override
+ // public void onNext(RecommenRoomBean categorRoomBean) {
+ // RecomFragment recomFragment = (RecomFragment) mFragments.get(0);
+ // recomFragment.setSecretData(categorRoomBean);
+ // }
+ // });
+ // }
+ /**
+ * 设置每个TabLayout的自定义View
+ * 注意:TabLayout和Viewpager配合使用的时候必须先mViewPager.setAdapter(),再初始化该方法,然后addOnTabSelectedListener;因为adapter刷新会让mCustomViewView空,
+ */
+ fun setCustomViews() {
+// val mSelectedTabPosition = tabLayout.selectedTabPosition
+// for (i in titleRes.indices) {
+// tabLayout.getTabAt(i)!!.customView = getTabView(i, mSelectedTabPosition)
+// // if (i == mSelectedTabPosition) {
+//// changeTabSelect(mTab);
+//// } else {
+//// changeTabNormal(mTab);
+//// }
+// }
+ }
+
+
+ /**
+ * 提供TabLayout的View
+ * 根据index返回不同的View
+ * 主意:默认选中的View要返回选中状态的样式
+ */
+ private fun getTabView(index: Int, mSelectedTabPosition: Int): View? {
+ //自定义View布局
+ val view: View = LayoutInflater.from(context).inflate(R.layout.item_tablayout_header, null)
+ val title = view.findViewById(R.id.tv_name) as TextView
+ val v_view = view.findViewById(R.id.v_view)
+ title.text = titleRes.get(index)
+ title.isSelected = index == mSelectedTabPosition
+ v_view.isSelected = index == mSelectedTabPosition
+ title.textSize = if (index == mSelectedTabPosition) 14f else 14f
+ return view
+ }
+
+ var page = 1
+
+ private fun getMap1(): MutableMap {
+ val map: MutableMap = HashMap()
+ map["tid"] = Const.ROOM_TYPE
+ map["is_top"] = "2"
+// map["is_hot"] = "2"
+ map["page"] = page.toString()
+ return map
+ }
+ private fun getMap2(): MutableMap {
+ val map: MutableMap = HashMap()
+ map["tid"] = Const.ROOM_TYPE
+// map["is_top"] = "2"
+ map["is_hot"] = "2"
+ map["page"] = page.toString()
+ return map
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/dynamic/MainCommunityFragment.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/dynamic/MainCommunityFragment.kt
new file mode 100644
index 0000000..8fbab0c
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/dynamic/MainCommunityFragment.kt
@@ -0,0 +1,135 @@
+package com.yuyin.mier.module_home.tab.dynamic
+
+import android.graphics.Color
+import android.graphics.Typeface
+import android.util.TypedValue
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.alibaba.android.arouter.launcher.ARouter
+import com.flyco.tablayout.listener.CustomTabEntity
+import com.flyco.tablayout.listener.OnTabSelectListener
+import com.yuyin.lib_base.adapter.MyPagerAdapter
+import com.yuyin.lib_base.arouter.AroutUtil
+import com.yuyin.lib_base.base.BaseViewModel
+import com.yuyin.lib_base.base.BaseViewModelFragment
+import com.yuyin.module_community.ui.main.DynamicFragment
+import com.yuyin.mier.R
+import kotlinx.android.synthetic.main.fragment_community.*
+import java.util.*
+
+class MainCommunityFragment : BaseViewModelFragment() {
+
+
+ private val fsRes: ArrayList = ArrayList() //fragment集合
+ private val titleRes = ArrayList() //tab标题集合
+ private val dataTab: MutableList =
+ ArrayList() //CommonTabLayout 所需数据集合
+
+ private lateinit var mAdapter: MyPagerAdapter
+
+ override fun startObserve() {
+ }
+
+ override fun getLayoutId(): Int = R.layout.fragment_community
+
+ override fun initView() {
+ titleRes.add("最新")
+ titleRes.add("推荐")
+ titleRes.add("关注")
+
+ // 初始化 Fragment
+ fsRes.add(DynamicFragment().getInstance("1"))
+ fsRes.add(DynamicFragment().getInstance("2"))
+ fsRes.add(DynamicFragment().getInstance("3"))
+
+ // 初始化图标
+ val icon1 = arrayOf(R.mipmap.zuiixn1, R.mipmap.tuijian1, R.mipmap.guanzhi1)
+ val icon2 = arrayOf(R.mipmap.zuiixn2, R.mipmap.tuijian2, R.mipmap.guanzhi2)
+
+ // 添加 Tab 数据
+ for (i in titleRes.indices) {
+ dataTab.add(object : CustomTabEntity {
+ override fun getTabTitle(): String = ""
+ override fun getTabSelectedIcon(): Int = icon1[i]
+ override fun getTabUnselectedIcon(): Int = icon2[i]
+ })
+ }
+
+ // 设置 TabLayout 数据
+ tab_layout.setTabData(dataTab as ArrayList)
+ view_pager.offscreenPageLimit = dataTab.size
+ // 设置 ViewPager 适配器
+ mAdapter = MyPagerAdapter(childFragmentManager, fsRes, titleRes)
+ view_pager.adapter = mAdapter
+
+ // 手动实现联动
+ view_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+ override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
+ override fun onPageScrollStateChanged(state: Int) {}
+ override fun onPageSelected(position: Int) {
+ tab_layout.currentTab = position
+ }
+ })
+
+ // 设置 Tab 选择监听
+ tab_layout.setOnTabSelectListener(object : OnTabSelectListener {
+ override fun onTabSelect(position: Int) {
+ view_pager.currentItem = position
+ }
+ override fun onTabReselect(position: Int) {}
+ })
+ }
+
+ override fun initData() {
+ }
+
+
+ override fun initEvent() {
+ iv_fabu.setOnClickListener {
+ ARouter.getInstance().build(AroutUtil.COMMUNITY_FABU).navigation()
+ }
+
+ //TabLayout监听
+ tab_layout.setOnTabSelectListener(object : OnTabSelectListener {
+ override fun onTabSelect(position: Int) {
+ //显示相应的item界面
+ view_pager.currentItem = position
+ }
+ override fun onTabReselect(position: Int) {}
+ })
+ }
+
+
+ private fun setCustomViews() {
+ /*val mSelectedTabPosition = tab_layout.selectedTabPosition
+ for (i in titleRes.indices) {
+ tab_layout.getTabAt(i)!!.customView = getTabView(i, mSelectedTabPosition)
+ }*/
+ }
+
+
+ private fun getTabView(index: Int, mSelectedTabPosition: Int): View {
+ //自定义View布局
+ val view: View = LayoutInflater.from(context).inflate(R.layout.item_tablayout_header5, null)
+ val title = view.findViewById(R.id.tv_name) as TextView
+// val v_view = view.findViewById(R.id.v_view)
+ title.text = titleRes[index]
+ title.isSelected = index == mSelectedTabPosition
+// v_view.isSelected = index == mSelectedTabPosition
+ if (index == mSelectedTabPosition) {
+ title.setTextColor(Color.parseColor("#111111"))
+ title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f)
+ title.typeface = Typeface.DEFAULT_BOLD
+ } else {
+ title.setTextColor(Color.parseColor("#666666"))
+ title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f)
+ title.typeface = Typeface.DEFAULT
+ }
+
+ return view
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/home/HomeFragment.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/home/HomeFragment.kt
new file mode 100644
index 0000000..ca2f9cd
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/home/HomeFragment.kt
@@ -0,0 +1,121 @@
+package com.yuyin.mier.module_home.tab.home
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.alibaba.android.arouter.launcher.ARouter
+import com.scwang.smartrefresh.layout.api.RefreshLayout
+import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener
+import com.yuyin.lib_base.arouter.AroutUtil
+import com.yuyin.lib_base.base.BaseDataBindingFragment
+import com.yuyin.mier.R
+import com.yuyin.mier.adapter.RoomZoneListAdapter
+import com.yuyin.mier.databinding.FragmentHomeBinding
+import com.yuyin.mier.module_home.model.HomeScene
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+class HomeFragment : BaseDataBindingFragment() {
+ lateinit var roomZoneListAdapter: RoomZoneListAdapter
+
+ var age_type = ""
+ var sex_type = ""
+
+ override fun startObserve() {
+ viewModel.getFinally().observe(this) {
+ mDataBinding.srlView.finishRefresh()
+ mDataBinding.srlView.finishLoadMore()
+ }
+ viewModel.roomZoneList.observe(this) {
+ if (page == 1) roomZoneListAdapter.data.clear()
+ roomZoneListAdapter.addData(it)
+ }
+ }
+
+ private var type = "1"
+ private var page = 1
+
+ companion object {
+ fun getInstance(type: String): HomeFragment {
+ val fragment = HomeFragment()
+ val bundle = Bundle()
+ bundle.putString("type", type)
+ fragment.arguments = bundle
+ return fragment
+ }
+ }
+
+ override fun getLayoutId(): Int = R.layout.fragment_home
+
+ override fun initView() {
+ mDataBinding.rvView.layoutManager = LinearLayoutManager(activity)
+ roomZoneListAdapter = RoomZoneListAdapter()
+ mDataBinding.rvView.adapter = roomZoneListAdapter
+ EventBus.getDefault().register(this)
+ }
+
+ override fun initData() {
+ type = requireArguments().getString("type", "1")
+ viewModel.get_room_zone_list(getMap())
+ }
+
+ override fun initEvent() {
+ roomZoneListAdapter.setOnItemChildClickListener { adapter, view, position ->
+ when (view.id) {
+ R.id.img -> {
+ ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+ .withString("from_id", roomZoneListAdapter.data.get(position).uid)
+ .navigation()
+ }
+ R.id.tvRoom -> {
+ viewModel.enterRoom(
+ roomZoneListAdapter.data.get(position).rid, "",
+ requireActivity() as AppCompatActivity
+ )
+ }
+ R.id.tvHome -> {
+ ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+ .withString("from_id", roomZoneListAdapter.data.get(position).uid)
+ .navigation()
+ }
+ }
+ }
+ mDataBinding.srlView.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
+ override fun onRefresh(refreshLayout: RefreshLayout) {
+ page = 1
+ viewModel.get_room_zone_list(getMap())
+ }
+
+ override fun onLoadMore(refreshLayout: RefreshLayout) {
+ page++
+ viewModel.get_room_zone_list(getMap())
+ }
+
+ })
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ EventBus.getDefault().unregister(this)
+ }
+
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ fun getSelectType(event: HomeScene){
+ sex_type = event.sex_type
+ age_type = event.age_type
+ page = 1
+ viewModel.get_room_zone_list(getMap())
+ }
+
+
+ fun getMap(): HashMap {
+ var map = HashMap()
+ map["page"] = page.toString()
+ map["zone_type"] = type
+ map["sex_type"] = sex_type
+ map["age_type"] = age_type
+ return map
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/home/HomePagerFragment.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/home/HomePagerFragment.kt
new file mode 100644
index 0000000..3b34dee
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/home/HomePagerFragment.kt
@@ -0,0 +1,277 @@
+package com.yuyin.mier.module_home.tab.home
+
+import android.content.Intent
+import androidx.appcompat.app.AppCompatActivity
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.alibaba.android.arouter.launcher.ARouter
+import com.scwang.smartrefresh.layout.api.RefreshLayout
+import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener
+import com.youth.banner.BannerConfig
+import com.yuyin.lib_base.Const
+import com.yuyin.lib_base.arouter.AroutUtil
+import com.yuyin.lib_base.base.BaseDataBindingFragment
+import com.yuyin.lib_base.base.UserManager
+import com.yuyin.lib_base.ui.X5WebViewActivity
+import com.yuyin.lib_base.util.GlideUtil
+import com.yuyin.lib_base.view.GlideImageLoader
+import com.yuyin.mier.R
+import com.yuyin.mier.adapter.HomePagerHotAdapter
+import com.yuyin.mier.adapter.HomePagerTopAdapter
+import com.yuyin.mier.databinding.FragmentHomePagerBinding
+import com.yuyin.mier.module_home.model.BannerBean
+import com.yuyin.mier.module_home.tab.center.MainCenterViewModel
+import com.yuyin.mier.search.SearchHisActivity
+import java.util.ArrayList
+import java.util.HashMap
+
+
+class HomePagerFragment : BaseDataBindingFragment() {
+
+ lateinit var homePagerTopAdapter: HomePagerTopAdapter
+
+ lateinit var homePagerHotAdapter: HomePagerHotAdapter
+
+ private var page = 1
+
+
+ override fun startObserve() {
+
+ viewModel.roomData2.observe(this) {
+ homePagerTopAdapter.setNewData(it)
+ }
+
+
+ viewModel.roomData.observe(this) {
+ if (page == 1) {
+ homePagerHotAdapter.setNewData(it)
+ } else {
+ homePagerHotAdapter.addData(it)
+ }
+ }
+
+
+ viewModel.getFinally().observe(this) {
+
+ mDataBinding.smart.finishLoadMore()
+ mDataBinding.smart.finishRefresh()
+
+ }
+
+ viewModel.bannerListBean.observe(this) {
+ initBanner(it)
+ }
+
+
+ viewModel.rankDataTop.observe(this) {
+
+ if (it.isNullOrEmpty()) {
+ mDataBinding.ivRankHead1.setImageResource(R.mipmap.ic_launcher_app)
+ mDataBinding.tvRankValue1.text = "0"
+ mDataBinding.tvRankNickName1.text = "虚位以待"
+
+ mDataBinding.topRingHead.setImageResource(R.mipmap.ic_launcher_app)
+ mDataBinding.topRingValue.text = "0"
+ mDataBinding.topRingNickName.text = "虚位以待"
+
+
+ } else if (it.isNotEmpty()) {
+
+
+ GlideUtil.loadImglogo(requireContext(), it[0].head_pic, mDataBinding.ivRankHead1)
+ mDataBinding.tvRankValue1.text = it[0].contribution_value.toString()
+ mDataBinding.tvRankNickName1.text = it[0].nick_name
+
+
+ GlideUtil.loadImglogo(requireContext(), it[0].head_pic, mDataBinding.topRingHead)
+ mDataBinding.topRingValue.text = it[0].contribution_value.toString()
+ mDataBinding.topRingNickName.text = it[0].nick_name
+
+
+ }
+
+ if (it.size < 2 || it.isNullOrEmpty()) {
+ mDataBinding.ivRankHead2.setImageResource(R.mipmap.ic_launcher_app)
+ mDataBinding.tvRankValue2.text = "0"
+ mDataBinding.tvRankNickName2.text = "虚位以待"
+ } else if (it.size > 1) {
+ GlideUtil.loadImglogo(requireContext(), it[1].head_pic, mDataBinding.ivRankHead2)
+ mDataBinding.tvRankValue2.text = it[1].contribution_value
+ mDataBinding.tvRankNickName2.text = it[1].nick_name
+ }
+
+ if (it.size < 3 || it.isNullOrEmpty()) {
+ mDataBinding.ivRankHead3.setImageResource(R.mipmap.ic_launcher_app)
+ mDataBinding.tvRankValue3.text = "0"
+ mDataBinding.tvRankNickName3.text = "虚位以待"
+ } else if (it.size > 2) {
+ GlideUtil.loadImglogo(requireContext(), it[2].head_pic, mDataBinding.ivRankHead3)
+ mDataBinding.tvRankValue3.text = it[2].contribution_value
+ mDataBinding.tvRankNickName3.text = it[2].nick_name
+ }
+
+ }
+ }
+
+ override fun getLayoutId(): Int {
+ return R.layout.fragment_home_pager
+ }
+
+ override fun initView() {
+
+ }
+
+ override fun initData() {
+
+ mDataBinding.rvTop.layoutManager = GridLayoutManager(requireContext(), 3)
+ homePagerTopAdapter = HomePagerTopAdapter()
+ mDataBinding.rvTop.adapter = homePagerTopAdapter
+
+ mDataBinding.rvHot.layoutManager = LinearLayoutManager(requireContext())
+ homePagerHotAdapter = HomePagerHotAdapter()
+ mDataBinding.rvHot.adapter = homePagerHotAdapter
+
+ viewModel.loadRoomData(getHotMap())
+ viewModel.loadRoomData2(getTopMap())
+ viewModel.getBannerList()
+ viewModel.loadRankData("", "1", "1")
+ }
+
+ override fun initEvent() {
+
+ mDataBinding.constraint.setOnClickListener {
+ ARouter.getInstance().build(AroutUtil.LIVE_RANK).withInt("selectTab", 0).navigation()
+ }
+
+
+ mDataBinding.ivSearch.setOnClickListener {
+ startActivity(Intent(requireContext(), SearchHisActivity::class.java))
+ }
+
+ mDataBinding.ivRank.setOnClickListener {
+ ARouter.getInstance().build(AroutUtil.LIVE_RANK).withInt("selectTab", 0).navigation()
+ }
+
+ mDataBinding.smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener {
+ override fun onRefresh(refreshLayout: RefreshLayout) {
+ page = 1
+ viewModel.loadRoomData(getHotMap())
+
+ }
+
+ override fun onLoadMore(refreshLayout: RefreshLayout) {
+ page++
+ viewModel.loadRoomData(getHotMap())
+ }
+ })
+
+ homePagerTopAdapter.setOnItemClickListener { adapter, view, position ->
+ viewModel.enterRoom(
+ homePagerTopAdapter.data[position].rid.toString(), "",
+ requireActivity() as AppCompatActivity
+ )
+ }
+
+ homePagerHotAdapter.setOnItemClickListener { adapter, view, position ->
+ viewModel.enterRoom(
+ homePagerHotAdapter.data[position].rid.toString(), "",
+ requireActivity() as AppCompatActivity
+ )
+ }
+
+
+ }
+
+
+ private fun initBanner(data: List) {
+ val imgurls: MutableList = ArrayList()
+ for (list in data) {
+ imgurls.add(list.image)
+ }
+ //设置图片加载器
+ mDataBinding.banner.setImageLoader(GlideImageLoader())
+ //设置图片集合
+ mDataBinding.banner.setImages(imgurls)
+ //设置指示器位置(当banner模式中有指示器时)
+ mDataBinding.banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR)
+ mDataBinding.banner.setIndicatorGravity(BannerConfig.CENTER)
+ //设置自动轮播,默认为true
+ mDataBinding.banner.isAutoPlay(true)
+ //banner设置方法全部调用完毕时最后调用
+ mDataBinding.banner.start()
+ mDataBinding.banner.setOnBannerListener {
+ when (data[it].type) {
+ "1" -> {
+
+ }
+ "2" -> {
+ context?.let { it1 -> X5WebViewActivity.forward(it1, data[it].url, "") }
+ }
+ "3" -> {
+ viewModel.enterRoom(data[it].aid, "", activity as AppCompatActivity)
+ }
+ "4" -> {
+ ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+ .withString("from_id", data[it].aid)
+ .navigation()
+ }
+ "5" -> {
+ context?.let { it1 ->
+ X5WebViewActivity.forward(
+ it1,
+ data[it].url + "?login_token=" + UserManager.user.login_token,
+ ""
+ )
+ }
+ }
+ }
+ }
+ mDataBinding.banner.setOnClickListener {
+ when (data[0].type) {
+ "1" -> {
+
+ }
+ "2" -> {
+ context?.let { it1 -> X5WebViewActivity.forward(it1, data[0].url, "") }
+ }
+ "3" -> {
+ viewModel.enterRoom(data[0].aid, "", activity as AppCompatActivity)
+ }
+ "4" -> {
+ ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+ .withString("from_id", data[0].aid)
+ .navigation()
+ }
+ "5" -> {
+ context?.let { it1 ->
+ X5WebViewActivity.forward(
+ it1,
+ data[0].url + "?login_token=" + UserManager.user.login_token,
+ ""
+ )
+ }
+ }
+ }
+ }
+ }
+
+
+ private fun getHotMap(): MutableMap {
+ val map: MutableMap = HashMap()
+ map["tid"] = Const.ROOM_TYPE
+ map["is_hot"] = "2"
+ map["page"] = page.toString()
+ return map
+ }
+
+
+ private fun getTopMap(): MutableMap {
+ val map: MutableMap = HashMap()
+ map["tid"] = Const.ROOM_TYPE
+ map["is_top"] = "2"
+ map["page"] = "1"
+ return map
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/home/MainHomeFragment.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/home/MainHomeFragment.kt
new file mode 100644
index 0000000..0e45d47
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/home/MainHomeFragment.kt
@@ -0,0 +1,63 @@
+package com.yuyin.mier.module_home.tab.home
+
+import android.content.Intent
+import androidx.fragment.app.Fragment
+import com.yuyin.lib_base.adapter.MyPagerAdapter
+import com.yuyin.lib_base.base.BaseDataBindingFragment
+import com.yuyin.mier.R
+import com.yuyin.mier.databinding.FragmentHomeMainBinding
+import com.yuyin.mier.module_home.model.HomeScene
+import com.yuyin.mier.search.SearchHisActivity
+import com.yuyin.mier.view.SceneDialog
+import kotlinx.android.synthetic.main.fragment_home_main.*
+import org.greenrobot.eventbus.EventBus
+
+class MainHomeFragment : BaseDataBindingFragment() {
+ private val titleList: ArrayList = ArrayList()
+ private val mFragments: ArrayList = ArrayList()
+ private var mAdapter: MyPagerAdapter? = null
+ override fun startObserve() {
+ }
+
+ override fun getLayoutId(): Int = R.layout.fragment_home_main
+
+ override fun initView() {
+ }
+
+ override fun initData() {
+ titleList.add("推荐")
+ mFragments.add(HomeFragment.getInstance("1"))
+ titleList.add("在线")
+ mFragments.add(HomeFragment.getInstance("2"))
+ mAdapter = MyPagerAdapter(childFragmentManager, mFragments, titleList)
+ view_pager.adapter = mAdapter
+ tab_layout.setViewPager(view_pager)
+ tab_layout.setSnapOnTabClick(true)
+ view_pager.offscreenPageLimit = mFragments.size
+ tab_layout.currentTab = 1
+ }
+
+ override fun initEvent() {
+
+ mDataBinding.scene.setOnClickListener {
+
+ var sceneDialog = SceneDialog(requireContext())
+
+ sceneDialog.setOnReturnSectListener(object : SceneDialog.OnReturnSectListener {
+ override fun getType(sex_type: String, age_type: String) {
+ EventBus.getDefault().post(HomeScene(sex_type, age_type))
+ }
+ })
+
+ sceneDialog.show()
+
+
+ }
+
+ mDataBinding.search.setOnClickListener {
+
+ startActivity(Intent(requireContext(), SearchHisActivity::class.java))
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/home/MainHomeViewModel.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/home/MainHomeViewModel.kt
new file mode 100644
index 0000000..a020191
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/home/MainHomeViewModel.kt
@@ -0,0 +1,20 @@
+package com.yuyin.mier.module_home.tab.home
+
+import androidx.lifecycle.MutableLiveData
+import com.yuyin.lib_base.base.BaseViewModel
+import com.yuyin.mier.module_home.model.RoomZoneList
+import com.yuyin.mier.repository.CommonRepository
+
+class MainHomeViewModel : BaseViewModel() {
+ var repository = CommonRepository()
+ var roomZoneList = MutableLiveData>()
+
+ fun get_room_zone_list(map: MutableMap) {
+ launchUI {
+ var result = repository.get_room_zone_list(map)
+ roomZoneList.value = result.data
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/AdolescentModelDialog.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/AdolescentModelDialog.kt
new file mode 100644
index 0000000..ab13397
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/AdolescentModelDialog.kt
@@ -0,0 +1,48 @@
+package com.yuyin.mier.module_home.tab.home.teen
+
+import android.app.Dialog
+import android.content.Context
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.WindowManager
+import androidx.databinding.DataBindingUtil
+import com.yuyin.mier.R
+import com.yuyin.mier.databinding.DialogAdolescentModelBinding
+
+class AdolescentModelDialog(context: Context) : Dialog(context) {
+ private lateinit var binding: DialogAdolescentModelBinding
+
+ init {
+
+ initDialog()
+ }
+
+ private fun initDialog() {
+
+ val inflater = LayoutInflater.from(context)
+ binding = DataBindingUtil.inflate(inflater, R.layout.dialog_adolescent_model, null, false)
+ setContentView(binding.root)
+ val win = this.window
+ val params = win?.attributes
+ params?.gravity = Gravity.CENTER
+ params?.width = WindowManager.LayoutParams.MATCH_PARENT
+ params?.height = WindowManager.LayoutParams.WRAP_CONTENT
+ win?.attributes = params
+ win?.setBackgroundDrawableResource(android.R.color.transparent)
+
+ initView()
+ }
+
+
+ fun getBinding(): DialogAdolescentModelBinding {
+
+ return binding
+ }
+
+ private fun initView() {
+
+
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenModeActivity.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenModeActivity.kt
new file mode 100644
index 0000000..48cbf6f
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenModeActivity.kt
@@ -0,0 +1,90 @@
+package com.yuyin.mier.module_home.tab.home.teen
+
+import com.yuyin.lib_base.Const
+
+import com.yuyin.lib_base.base.BaseDataBindingActivity
+import com.yuyin.lib_base.ui.X5WebViewActivity
+import com.yuyin.lib_base.util.showToast
+import com.yuyin.mier.R
+import com.yuyin.mier.databinding.ActivityTeenModeBinding
+
+class TeenModeActivity : BaseDataBindingActivity() {
+
+
+ lateinit var passwordDialog: TeenPasswordDialog
+ override fun startObserve() {
+
+ viewModel.userInfoData.observe(this) {
+
+ if (it.is_teenager == 1) {
+ mDataBinding.tvOpen.text = "关闭"
+ mDataBinding.tvTeenType.text = "青少年模式已开启"
+ mDataBinding.ivIcon.setImageResource(R.mipmap.teen_model_ic2)
+ passwordDialog = TeenPasswordDialog(this,1,viewModel)
+ } else {
+ mDataBinding.tvOpen.text = "开启"
+ mDataBinding.tvTeenType.text = "青少年模式已关闭"
+ mDataBinding.ivIcon.setImageResource(R.mipmap.teen_model_ic)
+ passwordDialog = TeenPasswordDialog(this,0,viewModel)
+ }
+
+ }
+ }
+
+ override fun getLayoutId(): Int {
+ return R.layout.activity_teen_mode
+ }
+
+ override fun initView() {
+// mDataBinding.toolbar.findViewById(R.id.tv_main_title).text = "青少年模式"
+
+ }
+
+ override fun initData() {
+
+ viewModel.loadUserInfo()
+
+ }
+
+ override fun initEvent() {
+
+// mDataBinding.changePsd.setOnClickListener {
+//
+// val intent = Intent(this, TeenModeChangeActivity::class.java)
+// intent.putExtra("type", "2")
+// ActivityUtils.startActivity(intent)
+//
+// }
+//
+
+ mDataBinding.tvAgreement.setOnClickListener {
+ X5WebViewActivity.forward(this, Const.PAGE_ERTONG, "《语音儿童个人信息保护规则》")
+
+ }
+
+
+ mDataBinding.tvOpen.setOnClickListener {
+//
+// if (viewModel.userInfoData.value?.is_real == "2") {
+// "未实名认证不能开启青少年模式".showToast()
+// return@setOnClickListener
+// }
+
+//
+ if (!mDataBinding.checkbox.isChecked) {
+ "请同意儿童个人信息保护规则".showToast()
+ return@setOnClickListener
+ }
+ passwordDialog.show()
+
+// val intent = Intent(this, TeenModeChangeActivity::class.java)
+// if (mDataBinding.tvTeenType.text.toString() == "青少年模式已关闭") {
+// intent.putExtra("type", "1")
+// } else {
+// intent.putExtra("type", "3")
+// }
+// ActivityUtils.startActivity(intent)
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenModeChangeActivity.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenModeChangeActivity.kt
new file mode 100644
index 0000000..7f4bc58
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenModeChangeActivity.kt
@@ -0,0 +1,147 @@
+package com.yuyin.mier.module_home.tab.home.teen
+
+import android.content.Intent
+import com.blankj.utilcode.util.ActivityUtils
+
+import com.yuyin.lib_base.base.BaseDataBindingActivity
+import com.yuyin.lib_base.util.showToast
+import com.yuyin.mier.R
+import com.yuyin.mier.databinding.ActivityTeenModeChangeBinding
+
+class TeenModeChangeActivity :
+ BaseDataBindingActivity() {
+
+ private var type = ""
+
+ private var set_pass = ""
+
+ private var confirm_pass = ""
+
+ private var old_pass = ""
+
+ private var new_pass = ""
+
+ private var close_pass = ""
+
+ override fun startObserve() {
+ /*viewModel.success.observe(this) {
+ ARouter.getInstance().build(AroutUtil.MAIN_MAIN).navigation()
+ finish()
+ }*/
+
+
+ viewModel.verifySucceeded.observe(this) {
+// ARouter.getInstance().build(AroutUtil.MAIN_MAIN).navigation()
+// finish()
+ val intent = Intent(this, TeenModeChangeActivity::class.java)
+ intent.putExtra("type", "1")
+ ActivityUtils.startActivity(intent)
+ }
+
+ /*viewModel.getError().observe(this){
+ if (it is ApiException){
+ if (it.code == 201){
+ mDataBinding.etContent.clear()
+
+ }
+ }
+ }*/
+
+ }
+
+ override fun getLayoutId(): Int {
+ return R.layout.activity_teen_mode_change
+ }
+
+ override fun initView() {
+
+
+ }
+
+ override fun initData() {
+ type = intent.getStringExtra("type").toString()
+ /*when (type) {
+ "1" -> {
+ mDataBinding.tvTop.text = "设置密码"
+ mDataBinding.tvPassTip.text = "关闭青少年模式时,需输入该密码"
+ }
+ "2" -> {
+ mDataBinding.tvTop.text = "验证密码"
+ mDataBinding.llComplaint.visibility = View.VISIBLE
+ mDataBinding.pass.visibility = View.GONE
+ mDataBinding.tvPassTip.text = "关闭青少年模式,请输入开启时设置的密码"
+ }
+ else -> {
+ mDataBinding.tvTop.text = "验证密码"
+ mDataBinding.llComplaintTip.visibility = View.VISIBLE
+ }
+
+ }*/
+
+
+ }
+
+ override fun initEvent() {
+
+ /*mDataBinding.etContent.setOnInputFinishListener {
+
+ if (type == "1") {
+
+ if (mDataBinding.tvTitle.text.toString() == "输入密码") {
+ set_pass = mDataBinding.etContent.content
+ mDataBinding.tvTitle.text = "确认密码"
+ mDataBinding.etContent.clear()
+ } else {
+ confirm_pass = mDataBinding.etContent.content
+ viewModel.open_teen_mode("1", set_pass, set_pass)
+ }
+
+ } else if (type == "2") {
+
+ if (mDataBinding.tvTitle.text.toString() == "请输入旧密码") {
+ old_pass = mDataBinding.etContent.content
+ mDataBinding.tvTitle.text = "请输入新密码"
+ mDataBinding.etContent.clear()
+ } else {
+ new_pass = mDataBinding.etContent.content
+ viewModel.open_teen_mode("2", new_pass, old_pass)
+ }
+
+ } else {
+ if (mDataBinding.tvTitle.text.toString() == "输入密码") {
+ close_pass = mDataBinding.etContent.content
+ viewModel.close_teen_mode("1", close_pass)
+ }
+ }
+
+
+ }*/
+
+ /*mDataBinding.tvComplaint.setOnClickListener {
+ val intent = Intent(this, TeenModeChangeActivity::class.java)
+ intent.putExtra("type", "2")
+ ActivityUtils.startActivity(intent)
+
+ }*/
+
+ mDataBinding.tvNext.setOnClickListener {
+
+ if (mDataBinding.etNickname.text.isEmpty()) {
+
+ "请输入真实姓名".showToast()
+ return@setOnClickListener
+ }
+
+ if (mDataBinding.etCard.text.isEmpty()) {
+ "请输入身份证号".showToast()
+ return@setOnClickListener
+ }
+
+ viewModel.edit_teen_mode(
+ mDataBinding.etCard.text.toString(),
+ mDataBinding.etNickname.text.toString(),
+ )
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenModeViewModel.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenModeViewModel.kt
new file mode 100644
index 0000000..1bcb992
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenModeViewModel.kt
@@ -0,0 +1,51 @@
+package com.yuyin.mier.module_home.tab.home.teen
+
+import androidx.lifecycle.MutableLiveData
+
+import com.yuyin.lib_base.base.BaseViewModel
+import com.yuyin.lib_base.util.showToast
+import com.yuyin.mier.repository.CommonRepository
+
+class TeenModeViewModel : BaseViewModel() {
+
+ private val repository = CommonRepository()
+
+
+ var success = MutableLiveData()
+
+ fun open_teen_mode(
+ type: String,
+ password: String,
+ again_password: String
+ ) {
+ launchUI {
+ val result = repository.open_teen_mode(type, password, again_password)
+ result.msg.showToast()
+ success.value = result.data
+ }
+ }
+
+
+ fun close_teen_mode(
+ type: String,
+ password: String,
+ ) {
+ launchUI {
+ val result = repository.close_teen_mode(type, password)
+ result.msg.showToast()
+ success.value = result.data
+ }
+ }
+
+
+ val verifySucceeded = MutableLiveData()
+ fun edit_teen_mode(
+ card_id: String,
+ real_name: String,
+ ) {
+ launchUI {
+ val result = repository.edit_teen_mode(card_id, real_name)
+ verifySucceeded.value = result.data
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenPasswordDialog.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenPasswordDialog.kt
new file mode 100644
index 0000000..4f05453
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/home/teen/TeenPasswordDialog.kt
@@ -0,0 +1,90 @@
+package com.yuyin.mier.module_home.tab.home.teen
+
+import android.app.Dialog
+import android.content.Intent
+import android.view.Gravity
+import android.view.LayoutInflater
+import android.view.View
+import android.view.WindowManager
+import androidx.databinding.DataBindingUtil
+import com.blankj.utilcode.util.ActivityUtils
+import com.yuyin.lib_base.http.ApiException
+import com.yuyin.lib_base.util.showToast
+import com.yuyin.mier.R
+import com.yuyin.mier.databinding.DialogTeenPasswordBinding
+
+class TeenPasswordDialog(val context: TeenModeActivity, val mType: Int, val viewModel: TeenModeViewModel) :
+ Dialog(context) {
+ private lateinit var binding: DialogTeenPasswordBinding
+
+ init {
+ initDialog()
+ }
+
+ private fun initDialog() {
+ val inflater = LayoutInflater.from(context)
+ binding = DataBindingUtil.inflate(inflater, R.layout.dialog_teen_password, null, false)
+ setContentView(binding.root)
+ val win = this.window
+ val params = win?.attributes
+ params?.gravity = Gravity.CENTER
+ params?.width = WindowManager.LayoutParams.MATCH_PARENT
+ params?.height = WindowManager.LayoutParams.WRAP_CONTENT
+ win?.attributes = params
+ win?.setBackgroundDrawableResource(android.R.color.transparent)
+ initView()
+ }
+
+
+ fun getBinding(): DialogTeenPasswordBinding {
+ return binding
+ }
+
+ private fun initView() {
+ viewModel.success.observe(context){
+ dismiss()
+ context.finish()
+ }
+ viewModel.getError().observe(context) {
+ if (it is ApiException) {
+ if (it.code == 201) {
+ binding.etContent.clear()
+ }
+ }
+ }
+
+ if (mType == 0) {
+ binding.tv1.visibility = View.VISIBLE
+ binding.llComplaintTip.visibility = View.GONE
+ binding.tvTitle.text = "请设置密码开启"
+ } else {
+ binding.tv1.visibility = View.GONE
+ binding.llComplaintTip.visibility = View.VISIBLE
+ binding.tvTitle.text = "请输入密码关闭"
+
+ binding.tvComplaint.setOnClickListener {
+ val intent = Intent(context, TeenModeChangeActivity::class.java)
+ intent.putExtra("type", "2")
+ ActivityUtils.startActivity(intent)
+ }
+ }
+
+ binding.btnAgree.setOnClickListener {
+ var set_pass = binding.etContent.content
+ if (set_pass.isEmpty() || set_pass.length < 4) {
+ "请输入密码".showToast()
+ return@setOnClickListener
+ }
+
+ if (mType == 0) {
+ viewModel.open_teen_mode("1", set_pass, set_pass)
+ } else {
+ viewModel.close_teen_mode("1", set_pass)
+ }
+ }
+ binding.btnRefuse.setOnClickListener {
+ dismiss()
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/my/MainMyViewModel.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/my/MainMyViewModel.kt
new file mode 100644
index 0000000..d5b5aed
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/my/MainMyViewModel.kt
@@ -0,0 +1,6 @@
+package com.yuyin.mier.module_home.tab.my
+
+import com.yuyin.lib_base.base.BaseViewModel
+
+class MainMyViewModel : BaseViewModel() {
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/my/MyFragment.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/my/MyFragment.kt
new file mode 100644
index 0000000..89dbf75
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/my/MyFragment.kt
@@ -0,0 +1,249 @@
+package com.yuyin.mier.module_home.tab.my
+
+import android.content.Intent
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import androidx.recyclerview.widget.GridLayoutManager
+import com.alibaba.android.arouter.launcher.ARouter
+import com.blankj.utilcode.util.ClipboardUtils
+import com.yuyin.lib_base.App
+import com.yuyin.lib_base.Const
+import com.yuyin.lib_base.arouter.AroutUtil
+import com.yuyin.lib_base.base.BaseDataBindingFragment
+import com.yuyin.lib_base.base.UserManager
+import com.yuyin.lib_base.model.UserBean
+import com.yuyin.lib_base.util.showToast
+import com.yuyin.lib_base.view.WebViewActivity
+import com.yuyin.mier.BR
+import com.yuyin.mier.R
+import com.yuyin.mier.adapter.MyListAdapter
+import com.yuyin.mier.adapter.MyListAdapter2
+import com.yuyin.mier.databinding.FragmentMyBinding
+import com.yuyin.mier.module_home.tab.center.MainCenterViewModel
+import com.yuyin.mier.module_home.tab.center.sign.SginDialog
+import com.yuyin.mier.module_my.YaoQingActivity
+import com.yuyin.mier.module_my.auction.SignedArtistActivity
+import com.yuyin.mier.module_my.cp.CPActivity
+import com.yuyin.mier.module_my.edituser.ModifyDataActivity
+import com.yuyin.mier.module_my.peerage.PeerageActivity
+import com.yuyin.mier.module_my.room.MyRoomActivity
+import com.yuyin.mier.module_my.set.WxKeFuAt
+import com.yuyin.mier.module_my.vip.VipActivity
+import kotlinx.android.synthetic.main.activity_user_homepage.*
+import kotlinx.android.synthetic.main.fragment_my.*
+
+class MyFragment : BaseDataBindingFragment() {
+ private lateinit var mAdapter: MyListAdapter
+ private lateinit var mAdapter2: MyListAdapter2
+ private var mUserBean: UserBean? = null
+ override fun startObserve() {
+ viewModel.userInfoData.observe(this) {
+ App.guild_id = it.guild_id
+ App.rid = it.rid
+ mUserBean = it
+
+ loadImage(mDataBinding.ivHead, it.head_pic, R.mipmap.ic_launcher_app)
+
+// loadImage(mDataBinding.ivCover, it.head_pic, R.mipmap.ic_launcher_app)
+
+ loadImage(mDataBinding.ivJuewei, it.nobility_image)
+
+ if (it.nobility_image.isNotEmpty()) {
+ mDataBinding.ivJuewei.visibility = View.VISIBLE
+ } else {
+ mDataBinding.ivJuewei.visibility = View.GONE
+ }
+
+ mDataBinding.textCP.text = it.cp_num.toString()
+
+ loadImage(
+ mDataBinding.ivGongxian, it.contribution_level_image, R.mipmap.no_tu
+ )
+
+ loadImage(
+ mDataBinding.ivMeili, it.charm_level_image, R.mipmap.no_tu
+ )
+// if (it.is)
+ if (it.vid > 0) {
+ mDataBinding.vipIsOpen.setBackgroundResource(R.mipmap.my_peeg2)
+ } else {
+ mDataBinding.vipIsOpen.setBackgroundResource(R.mipmap.my_peeg)
+ }
+
+ mDataBinding.ivUsername.text = it.nick_name
+ if (it.special_uid == "0") {
+ mDataBinding.textVip.text = "" + it.uid
+ loadImage(mDataBinding.ivLianghao, R.mipmap.common_id_img1)
+ } else {
+ mDataBinding.textVip.text = "ID:" + it.special_uid
+ loadImage(mDataBinding.ivLianghao, R.mipmap.common_id_img2)
+ }
+ mDataBinding.textCollection.text = it.follow_num
+ mDataBinding.textFans.text = it.fans_num
+ mDataBinding.textShouCang.text = it.collect_room_num
+ }
+
+ viewModel.signDayList.observe(this) {
+ SginDialog(context as AppCompatActivity,viewModel,it).show()
+ }
+
+ }
+
+ override fun getLayoutId(): Int = R.layout.fragment_my
+
+ override fun initView() {
+
+ }
+
+ override fun onResume() {
+ super.onResume()
+ viewModel.loadUserInfo()
+ }
+
+ override fun initData() {
+ mAdapter = MyListAdapter()
+ mAdapter.setNewData(Const.myList1)
+ mDataBinding.recyclerView1.layoutManager = GridLayoutManager(context, 4)
+ mDataBinding.recyclerView1.adapter = mAdapter
+
+ mAdapter2 = MyListAdapter2()
+ mAdapter2.setNewData(Const.myList2)
+ mDataBinding.recyclerView2.layoutManager = GridLayoutManager(context, 2)
+ mDataBinding.recyclerView2.adapter = mAdapter2
+
+ }
+
+ override fun initEvent() {
+
+
+ mDataBinding.setVariable(BR.act, this)
+
+
+ mDataBinding.ivEdit.setOnClickListener {
+// ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+// .withString("from_id", UserManager.user.uid.toString()).navigation()
+ startActivity(Intent(requireContext(), ModifyDataActivity::class.java))
+ }
+
+ mDataBinding.ivUsername.setOnClickListener {
+ startActivity(Intent(requireContext(), ModifyDataActivity::class.java))
+ }
+
+ mDataBinding.ivHead.setOnClickListener {
+ ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+ .withString("from_id", UserManager.user.uid.toString()).navigation()
+ }
+
+
+ mDataBinding.ivCopy.setOnClickListener {
+ ClipboardUtils.copyText(viewModel.userInfoData.value!!.uid.toString())
+ "复制成功".showToast()
+ }
+
+ mAdapter.setOnItemClickListener { adapter, view, position ->
+ if (mAdapter.getItem(position) == null) return@setOnItemClickListener
+ val title = mAdapter.getItem(position)!!.title
+ listClick(title)
+ }
+ mAdapter2.setOnItemClickListener { adapter, view, position ->
+ if (mAdapter2.getItem(position) == null) return@setOnItemClickListener
+ val title = mAdapter2.getItem(position)!!.title
+ listClick(title)
+ }
+
+ mDataBinding.ivAdd.setOnClickListener {
+ ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE)
+ .withString("from_id", UserManager.user.uid.toString()).navigation()
+ }
+
+ mDataBinding.ivSetting.setOnClickListener {
+ ARouter.getInstance().build(AroutUtil.MY_COMM_SET).navigation()
+ }
+ mDataBinding.ivQiandao.setOnClickListener {
+ viewModel.user_day_sign_log()
+ }
+ }
+
+ open fun listClick(title: String) {
+ when (title) {
+ "我的房间" -> {
+ if (mUserBean == null) return
+ when (mUserBean!!.is_real) {
+ "2" -> ARouter.getInstance().build(AroutUtil.PLAY_REAL_NAME).navigation()
+ "1" -> {
+// if (mUserBean!!.rid == "0") {
+// "房间信息读取失败...".showToast()
+// } else {
+
+
+// viewModel.enterRoom(mUserBean!!.rid, "", activity as AppCompatActivity)
+// }
+
+ startActivity(Intent(requireContext(),MyRoomActivity::class.java))
+ }
+ "3" -> "实名认证审核中...".showToast()
+ }
+ }
+ "我的装扮" -> ARouter.getInstance().build(AroutUtil.MY_COMM_ZHUANGBAN).navigation()
+ "装扮商城" -> ARouter.getInstance().build(AroutUtil.MY_COMM_ZHUANGBAN_SHANGCHENG)
+ .navigation()
+ "实名认证" -> {
+ if (mUserBean == null) return
+ when (mUserBean!!.is_real) {
+ "2" -> ARouter.getInstance().build(AroutUtil.PLAY_REAL_NAME).navigation()
+ "1" -> "已认证...".showToast()
+ "3" -> "实名认证审核中...".showToast()
+ }
+ }
+ "我的钱包" -> ARouter.getInstance().build(AroutUtil.MAIN_MY_MONEY).navigation()
+ "我的等级" -> ARouter.getInstance().build(AroutUtil.MY_COMM_DENGJI).withString("type", "0")
+ .navigation()
+ "魅力等级" -> ARouter.getInstance().build(AroutUtil.MY_COMM_DENGJI).withString("type", "1")
+ .navigation()
+ "等级" -> ARouter.getInstance().build(AroutUtil.MY_COMM_DENGJI).navigation()
+
+ "礼物记录" -> ARouter.getInstance().build(AroutUtil.MAIN_MY_GIFT_LOG)
+ .withString("type", "1").withString("title", "礼物收入记录").navigation()
+ "赠送记录" -> ARouter.getInstance().build(AroutUtil.MAIN_MY_GIFT_LOG)
+ .withString("type", "2").withString("title", "礼物赠送记录").navigation()
+ "帮助反馈" -> ARouter.getInstance().build(AroutUtil.MY_COMM_FEEDBACK).navigation()
+ "系统设置" -> ARouter.getInstance().build(AroutUtil.MY_COMM_SET).navigation()
+ "我的公会" -> ARouter.getInstance().build(AroutUtil.GHMainActivity).navigation()
+ "邀请好友" -> {
+ var intent = Intent(activity, YaoQingActivity::class.java)
+ intent.putExtra("reg_code", mUserBean?.reg_code)
+ intent.putExtra("reg_url", mUserBean?.reg_url)
+ startActivity(intent)
+ }
+ //
+ "关注" -> ARouter.getInstance().build(AroutUtil.LIB_FOLLOW_FANS).withInt("selectTab", 0)
+ .navigation()
+ "粉丝" -> ARouter.getInstance().build(AroutUtil.LIB_FOLLOW_FANS).withInt("selectTab", 1)
+ .navigation()
+ "收藏" -> ARouter.getInstance().build(AroutUtil.MAIN_MY_SHOUCANG).navigation()
+ "我的爵位" -> {
+ startActivity(Intent(requireContext(), PeerageActivity::class.java))
+ }
+ "CP" -> {
+ startActivity(Intent(requireContext(), CPActivity::class.java))
+ }
+ "开通会员" -> {
+ startActivity(Intent(requireContext(), VipActivity::class.java))
+ }
+
+ "签约艺人" -> {
+ startActivity(Intent(requireContext(), SignedArtistActivity::class.java))
+ }
+ "在线客服" ->{
+ startActivity(Intent(requireContext(), WebViewActivity::class.java))
+ }
+ "签到" ->{
+ viewModel.user_day_sign_log()
+ }
+ "入驻联系运营" ->{
+ startActivity(Intent(requireContext(), WxKeFuAt::class.java))
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/MessageFragment.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/MessageFragment.kt
new file mode 100644
index 0000000..8d020f1
--- /dev/null
+++ b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/MessageFragment.kt
@@ -0,0 +1,80 @@
+package com.yuyin.mier.module_home.tab.xiaoxi
+
+import android.content.Intent
+import android.view.View
+import androidx.databinding.ViewDataBinding
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentTransaction
+import com.alibaba.android.arouter.launcher.ARouter
+import com.tencent.qcloud.tuikit.tuiconversation.classicui.page.TUIConversationFragment
+import com.yuyin.lib_base.arouter.AroutUtil
+import com.yuyin.lib_base.base.BaseDataBindingFragment
+import com.yuyin.lib_base.base.BaseViewModel
+import com.yuyin.lib_base.view.WebViewActivity
+import com.yuyin.mier.R
+import com.yuyin.mier.adapter.MsgAdapter
+
+import kotlinx.android.synthetic.main.fragment_message.*
+
+class MessageFragment : BaseDataBindingFragment