commit 7e2dcad9c96a66cc9bcb543378959d45986ed8bf Author: 梁小江 <461355754@qq.com> Date: Mon Aug 11 11:01:55 2025 +0800 初次提交,修改了头像不能展示 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..30438e6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ + +# Gradle files +.gradle/ +build/ +#IMKit/ +#IMLib/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# Intellij +*.iml +.idea + +# Keystore files +#*.jks + +# MacOS +.DS_Store +*.json +*.aab +proguardMapping.txt +CallKit/ diff --git a/LocalAar/.gitignore b/LocalAar/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/LocalAar/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/LocalAar/alipaySdk/alipaySdk-15.6.5-20190718211159-noUtdid.aar b/LocalAar/alipaySdk/alipaySdk-15.6.5-20190718211159-noUtdid.aar new file mode 100644 index 0000000..d692ef9 Binary files /dev/null and b/LocalAar/alipaySdk/alipaySdk-15.6.5-20190718211159-noUtdid.aar differ diff --git a/LocalAar/alipaySdk/build.gradle b/LocalAar/alipaySdk/build.gradle new file mode 100644 index 0000000..1e9e8eb --- /dev/null +++ b/LocalAar/alipaySdk/build.gradle @@ -0,0 +1,2 @@ +configurations.maybeCreate("default") +artifacts.add("default", file('alipaySdk-15.6.5-20190718211159-noUtdid.aar')) \ No newline at end of file diff --git a/LocalAar/build.gradle b/LocalAar/build.gradle new file mode 100644 index 0000000..9b904dc --- /dev/null +++ b/LocalAar/build.gradle @@ -0,0 +1,35 @@ +plugins { + id 'com.android.library' +} + +android { + namespace 'com.example.localaar' + compileSdk 32 + + defaultConfig { + minSdk 24 + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } +} + +dependencies { + + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.10.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' +} \ No newline at end of file diff --git a/LocalAar/consumer-rules.pro b/LocalAar/consumer-rules.pro new file mode 100644 index 0000000..e69de29 diff --git a/LocalAar/paytypelibrary/build.gradle b/LocalAar/paytypelibrary/build.gradle new file mode 100644 index 0000000..3dfd904 --- /dev/null +++ b/LocalAar/paytypelibrary/build.gradle @@ -0,0 +1,2 @@ +configurations.maybeCreate("default") +artifacts.add("default", file('paytypelibrary3.5.2.aar')) \ No newline at end of file diff --git a/LocalAar/paytypelibrary/paytypelibrary3.5.2.aar b/LocalAar/paytypelibrary/paytypelibrary3.5.2.aar new file mode 100644 index 0000000..eb44b54 Binary files /dev/null and b/LocalAar/paytypelibrary/paytypelibrary3.5.2.aar differ diff --git a/LocalAar/proguard-rules.pro b/LocalAar/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/LocalAar/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/Muti-Barrage/.gitignore b/Muti-Barrage/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/Muti-Barrage/.gitignore @@ -0,0 +1 @@ +/build diff --git a/Muti-Barrage/build.gradle b/Muti-Barrage/build.gradle new file mode 100644 index 0000000..f8973d2 --- /dev/null +++ b/Muti-Barrage/build.gradle @@ -0,0 +1,35 @@ +apply plugin: 'com.android.library' + +tasks.withType(JavaCompile) { + options.encoding = "UTF-8" +} + +android { + compileSdkVersion 30 + + defaultConfig { + minSdkVersion 22 + targetSdkVersion 30 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + +// implementation 'com.android.support:appcompat-v7:27.1.1' + implementation 'androidx.appcompat:appcompat:1.2.0' +} + diff --git a/Muti-Barrage/proguard-rules.pro b/Muti-Barrage/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/Muti-Barrage/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 diff --git a/Muti-Barrage/src/androidTest/java/com/orient/tea/barragephoto/ExampleInstrumentedTest.java b/Muti-Barrage/src/androidTest/java/com/orient/tea/barragephoto/ExampleInstrumentedTest.java new file mode 100644 index 0000000..1de6472 --- /dev/null +++ b/Muti-Barrage/src/androidTest/java/com/orient/tea/barragephoto/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.orient.tea.barragephoto; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() throws Exception { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.orient.tea.barragephoto.test", appContext.getPackageName()); + } +} diff --git a/Muti-Barrage/src/main/AndroidManifest.xml b/Muti-Barrage/src/main/AndroidManifest.xml new file mode 100644 index 0000000..e88548e --- /dev/null +++ b/Muti-Barrage/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + diff --git a/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/adapter/AdapterListener.java b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/adapter/AdapterListener.java new file mode 100644 index 0000000..68b5fa7 --- /dev/null +++ b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/adapter/AdapterListener.java @@ -0,0 +1,12 @@ +package com.orient.tea.barragephoto.adapter; + +/** + * ViewHolder click Listener + * + * Created by wangjie on 2019/3/12. + */ + +public interface AdapterListener { + // 点击事件 + void onItemClick(BarrageAdapter.BarrageViewHolder holder, T item); +} diff --git a/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/adapter/BarrageAdapter.java b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/adapter/BarrageAdapter.java new file mode 100644 index 0000000..ccbf985 --- /dev/null +++ b/Muti-Barrage/src/main/java/com/orient/tea/barragephoto/adapter/BarrageAdapter.java @@ -0,0 +1,298 @@ +package com.orient.tea.barragephoto.adapter; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; + +import androidx.annotation.LayoutRes; + +import com.orient.tea.barragephoto.R; +import com.orient.tea.barragephoto.model.DataSource; +import com.orient.tea.barragephoto.ui.IBarrageView; + +import java.lang.ref.WeakReference; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * 基础的适配器 + * Created by wangjie on 2019/3/7. + */ + +@SuppressWarnings({"unchecked"}) +public abstract class BarrageAdapter + implements View.OnClickListener { + + private static final int MSG_CREATE_VIEW = 1; + + // View的点击监听 + private AdapterListener mAdapterListener; + // 类型List + private Set mTypeList; + // 持有的barrageView + private IBarrageView barrageView; + // 当前的数据 + private LinkedList mDataList; + + private Context mContext; + // 默认的间隔 + private long interval; + // 循环的次数 + private int repeat; + // 当前的 + private AtomicBoolean isDestroy = new AtomicBoolean(false); + + // 单线程的消息对立 + private ExecutorService mService = Executors.newSingleThreadExecutor(); + // 主线程的Handler + private BarrageAdapterHandler mHandler = new BarrageAdapterHandler<>(Looper.getMainLooper(), this); + + + @SuppressWarnings("WeakerAccess") + public BarrageAdapter(AdapterListener adapterListener, Context context) { + this.mAdapterListener = adapterListener; + this.mTypeList = new HashSet<>(); + this.mContext = context; + this.mDataList = new LinkedList<>(); + } + + public void setAdapterListener(AdapterListener adapterListener) { + this.mAdapterListener = adapterListener; + } + + + public void setBarrageView(IBarrageView barrageView) { + this.barrageView = barrageView; + this.interval = barrageView.getInterval(); + this.repeat = barrageView.getRepeat(); + } + + // TODO 数据的增加处理 + + /** + * 创建子视图的过程 + * + * @param cacheView 缓存视图 + */ + private void createItemView(T data, View cacheView) { + // 1.获取子布局 + // 2. 创建ViewHolder + // 3. 绑定ViewHolder + // 4. 返回视图 + int layoutType = getItemLayout(data); + BarrageViewHolder holder = null; + if (cacheView != null) { + holder = (BarrageViewHolder) cacheView.getTag(R.id.barrage_view_holder); + } + if (null == holder) { + holder = createViewHolder(mContext, layoutType); + mTypeList.add(data.getType()); + } + bindViewHolder(holder, data); + if (barrageView != null) + barrageView.addBarrageItem(holder.getItemView()); + } + + /** + * 创建ViewHolder + * + * @param type 布局类型 + * @return ViewHolder + */ + private BarrageViewHolder createViewHolder(Context context, int type) { + View root = LayoutInflater.from(context).inflate(type, null); + BarrageViewHolder holder = onCreateViewHolder(root, type); + + // 设置点击事件 + root.setTag(R.id.barrage_view_holder, holder); + root.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.e("AAAAAAAAAAAAAA","点击事件啦啦啦啦"); + } + }); + return holder; + } + + /** + * 真正创建ViewHolder的方法 + * + * @param type 类型 + * @return ViewHolder + */ + protected abstract BarrageViewHolder onCreateViewHolder(View root, int type); + + /** + * 得到布局的xml文件 + * + * @return xml文件 + */ + public abstract @LayoutRes + int getItemLayout(T t); + + /** + * 绑定数据 + * + * @param holder BarrageViewHolder + * @param data T + */ + private void bindViewHolder(BarrageViewHolder holder, T data) { + if (null == data) + return; + holder.bind(data); + } + + public Set getTypeList() { + return mTypeList; + } + + @Override + public void onClick(View v) { +// BarrageViewHolder holder = (BarrageViewHolder) v.getTag(R.id.barrage_view_holder); +// if (holder != null) { +// if (mAdapterListener != null) { +// mAdapterListener.onItemClick(holder, holder.mData); +// } +// } + } + + /** + * 添加一组数据 + * + * @param data T + */ + public void add(T data) { + if (data == null) + return; + mDataList.add(data); + mService.submit(new DelayRunnable(1)); + } + + /** + * 添加一组数据 + * + * @param dataList 一组数据 + */ + public void addList(List dataList) { + if (dataList == null || dataList.size() == 0) + return; + int len = dataList.size(); + mDataList.addAll(dataList); + mService.submit(new DelayRunnable(len)); + } + + public void clearAll() { + if (mDataList == null || mDataList.size() == 0) + return; + mDataList.clear(); + } + + + public void destroy() { + while (!isDestroy.get()) + isDestroy.compareAndSet(false, true); + // 数据清空 + mDataList.clear(); + if (!mService.isShutdown()) + mService.shutdownNow(); + mHandler.removeCallbacksAndMessages(null); + mHandler = null; + barrageView = null; + } + + public abstract static class BarrageViewHolder { + public T mData; + private View itemView; + + public BarrageViewHolder(View itemView) { + this.itemView = itemView; + } + + View getItemView() { + return itemView; + } + + void bind(T data) { + mData = data; + onBind(data); + } + + protected abstract void onBind(T data); + } + + /** + * 延迟的Runnable + */ + public class DelayRunnable implements Runnable { + + private int len; + + DelayRunnable(int len) { + this.len = len; + } + + @Override + public void run() { + if (repeat != -1 && repeat > 0) { + for (int j = 0; j < repeat; j++) { + sendMsg(len); + } + } else if (repeat == -1) { + while (!isDestroy.get()) { + sendMsg(len); + } + } + } + } + + private void sendMsg(int len) { + for (int i = 0; i < len; i++) { + mHandler.sendEmptyMessage(MSG_CREATE_VIEW); + try { + Thread.sleep(interval * 20); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + public static class BarrageAdapterHandler extends Handler { + private WeakReference 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() { + private lateinit var msgAdapter: MsgAdapter + override fun startObserve() { + viewModel.messageCount.observe(this) { + if (it.system_no_read_count > 0) { + system_num.visibility = View.VISIBLE + system_num.text = it.system_no_read_count.toString() + tv_content.text = it.system_last_message.title + } else { + system_num.visibility = View.GONE + system_num.text = "" + } + + } + + } + + override fun getLayoutId(): Int = R.layout.fragment_message + + override fun initView() { + val conversationListFragment = TUIConversationFragment() + val manager: FragmentManager = childFragmentManager + val transaction: FragmentTransaction = manager.beginTransaction() + transaction.replace(R.id.container, conversationListFragment as Fragment) + transaction.commit() + } + + override fun initData() { +// container.layoutManager = LinearLayoutManager(requireContext()) +// msgAdapter = MsgAdapter() +// container.adapter = msgAdapter + } + + override fun onResume() { + super.onResume() +// setConversationListener() + viewModel.get_user_message_cover_info() + } + + override fun initEvent() { + iv_guanzhu.setOnClickListener { + ARouter.getInstance().build(AroutUtil.LIB_FOLLOW_FANS).withInt("selectTab", 0) + .navigation() + } + iv_fensi.setOnClickListener { + ARouter.getInstance().build(AroutUtil.LIB_FOLLOW_FANS).withInt("selectTab", 1) + .navigation() + } + iv_black.setOnClickListener { + ARouter.getInstance().build(AroutUtil.BLACK_LIST).navigation() + } + gf.setOnClickListener { + ARouter.getInstance().build(AroutUtil.MAIN_MESSAGE_OFFICE).navigation() + } + kf.setOnClickListener { + startActivity(Intent(requireContext(), WebViewActivity::class.java)) + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/black/BlackAdapter.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/black/BlackAdapter.kt new file mode 100644 index 0000000..5a4eef3 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/black/BlackAdapter.kt @@ -0,0 +1,26 @@ +package com.yuyin.mier.module_home.tab.xiaoxi.black + +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.BlackBean +import java.util.* + +class BlackAdapter : + BaseQuickAdapter(R.layout.item_black, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: BlackBean) { + Glide.with(mContext).load(item.head_pic).into(helper.getView(R.id.v_img)) + helper + .setText(R.id.tv_title, item.nick_name) + .setText(R.id.tv_title2, "" + item.uid) + helper.addOnClickListener(R.id.tv_enter) + + if (item.sex == "") { + helper.setImageResource(R.id.iv_sex, R.mipmap.login_reg_nan1) + } else { + helper.setImageResource(R.id.iv_sex, R.mipmap.login_reg_nv1) + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/black/BlackListActivity.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/black/BlackListActivity.kt new file mode 100644 index 0000000..bd664d6 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/black/BlackListActivity.kt @@ -0,0 +1,60 @@ +package com.yuyin.mier.module_home.tab.xiaoxi.black + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.arouter.AroutUtil.BLACK_LIST +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.mier.R +import com.yuyin.mier.module_home.model.BlackBean +import kotlinx.android.synthetic.main.activity_black_list.* + +@Route(path = BLACK_LIST) +class BlackListActivity : BaseActivity() { + private lateinit var blackAdapter: BlackAdapter + override fun startObserve() { + viewModel.blackData.observe(this) { + if (it.room_visitor_list.isEmpty() && it.room_black_list.isEmpty()) { + ll_nodata.visibility = View.VISIBLE + } else { + ll_nodata.visibility = View.GONE + } + + val blackBean = ArrayList() + blackBean.addAll(it.room_black_list) + blackBean.addAll(it.room_visitor_list) + blackAdapter.setNewData(blackBean) + + } + viewModel.removeData.observe(this) { + viewModel.get_blacklist() + } + + } + + override fun getLayoutId(): Int = R.layout.activity_black_list + + override fun initView() { + } + + override fun initData() { + blackAdapter = BlackAdapter() + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = blackAdapter + viewModel.get_blacklist() + } + + override fun initEvent() { + blackAdapter.setOnItemChildClickListener { adapter, view, position -> + if (view.id == R.id.tv_enter) { + viewModel.remove_blacklist(blackAdapter.data[position].uid) + } + } + blackAdapter.setOnItemClickListener { adapter, view, position -> + ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE).withString("from_id", + blackAdapter.data[position].uid).navigation() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/black/BlackListViewModel.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/black/BlackListViewModel.kt new file mode 100644 index 0000000..d832b2b --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/black/BlackListViewModel.kt @@ -0,0 +1,26 @@ +package com.yuyin.mier.module_home.tab.xiaoxi.black + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_home.model.BlackList +import com.yuyin.mier.repository.CommonRepository + +class BlackListViewModel : BaseViewModel() { + var repository = CommonRepository() + var blackData = MutableLiveData() + var removeData = MutableLiveData() + + fun get_blacklist() { + launchUI { + val result = repository.get_blacklist() + blackData.value = result.data + } + } + + fun remove_blacklist(uid: String) { + launchUI { + val result = repository.remove_blacklist(uid) + removeData.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/xitong/MessageGFViewModel.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/xitong/MessageGFViewModel.kt new file mode 100644 index 0000000..7bee0de --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/xitong/MessageGFViewModel.kt @@ -0,0 +1,19 @@ +package com.yuyin.mier.module_home.tab.xiaoxi.xitong + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_home.model.OffiMessageBean +import com.yuyin.mier.repository.CommonRepository + +class MessageGFViewModel : BaseViewModel() { + var repository = CommonRepository() + var offiMessageData = MutableLiveData>() + + fun loadData(type: String, page: Int) { + launchUI { + var data = repository.official_message(type, page.toString()) + offiMessageData.value = data.data + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/xitong/MessageOfficeActivity.kt b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/xitong/MessageOfficeActivity.kt new file mode 100644 index 0000000..4835a59 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_home/tab/xiaoxi/xitong/MessageOfficeActivity.kt @@ -0,0 +1,67 @@ +package com.yuyin.mier.module_home.tab.xiaoxi.xitong + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MESSAGE_OFFICE +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.mier.R +import com.yuyin.mier.adapter.OfficeListAdapter +import kotlinx.android.synthetic.main.activity_message_office.* + +@Route(path = MAIN_MESSAGE_OFFICE) +class MessageOfficeActivity : BaseActivity() { + + private var page = 1 + + private var officeListAdapter: OfficeListAdapter? = null + override fun startObserve() { + viewModel.getFinally().observe(this) { + smart.finishRefresh() + smart.finishLoadMore() + } + viewModel.offiMessageData.observe(this) { + if (officeListAdapter == null) return@observe + if (page == 1 && it.isEmpty()) { + ll_nodata.visibility = View.VISIBLE + } else { + ll_nodata.visibility = View.GONE + } + if (page == 1) { + officeListAdapter!!.setNewData(it) + } else { + officeListAdapter!!.data.addAll(it) + officeListAdapter!!.notifyDataSetChanged() + } + } + + } + + override fun getLayoutId(): Int = R.layout.activity_message_office + + override fun initView() { + } + + override fun initData() { + officeListAdapter = OfficeListAdapter() + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = officeListAdapter + viewModel.loadData("1", page) + } + + override fun initEvent() { + smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.loadData("1", page) + } + + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.loadData("1", page) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/ForgetActivity.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/ForgetActivity.kt new file mode 100644 index 0000000..76e6cef --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/ForgetActivity.kt @@ -0,0 +1,22 @@ +package com.yuyin.mier.module_login.ui + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction +import com.yuyin.mier.R +import com.yuyin.mier.module_login.ui.forget.ForgotFragment +import com.yuyin.mier.module_login.ui.forget.ForgotFragment2 + +class ForgetActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_forget) + val conversationListFragment = ForgotFragment.newInstance("1") + val manager: FragmentManager = supportFragmentManager + val transaction: FragmentTransaction = manager.beginTransaction() + transaction.replace(R.id.container, conversationListFragment as Fragment) + transaction.commit() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/ModuleLoginMainActivity.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/ModuleLoginMainActivity.kt new file mode 100644 index 0000000..0bd90fd --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/ModuleLoginMainActivity.kt @@ -0,0 +1,17 @@ +package com.yuyin.mier.module_login.ui + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.alibaba.android.arouter.facade.annotation.Route +import com.yuyin.lib_base.arouter.AroutUtil.LOGIN_MAIN +import com.yuyin.mier.R + +@Route(path = LOGIN_MAIN) +class ModuleLoginMainActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_module_login_main) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/bindZL/BindZLActivity.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/bindZL/BindZLActivity.kt new file mode 100644 index 0000000..0b13cfd --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/bindZL/BindZLActivity.kt @@ -0,0 +1,135 @@ +package com.yuyin.mier.module_login.ui.bindZL + +import android.graphics.Color +import com.alibaba.android.arouter.launcher.ARouter +import com.bigkoo.pickerview.builder.TimePickerBuilder +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.model.Login +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityBindZlBinding +import com.yuyin.mier.module_my.edituser.ModifyDataViewModel + +import kotlinx.android.synthetic.main.activity_bind_zl.* +import org.litepal.LitePal +import java.text.SimpleDateFormat +import java.util.* + +class BindZLActivity : BaseDataBindingActivity() { + + var saxString = "1" + private var startDate: Calendar = Calendar.getInstance() + private var endDate: Calendar = Calendar.getInstance() + private var seleteDate: Calendar = Calendar.getInstance() + private var nowDate: String = "" + override fun startObserve() { + + viewModel.editFinish.observe(this) { + + var login = LitePal.findFirst(Login::class.java) + login.nick_name = it.nick_name + login.head_pic = it.head_pic + login.save() + UserManager.initData() + ARouter.getInstance().build(AroutUtil.MAIN_MAIN).navigation() + finish() + } + } + + override fun getLayoutId(): Int = R.layout.activity_bind_zl + + override fun initView() { + } + + override fun initData() { + } + + override fun initEvent() { + flNan.setOnClickListener { + saxString = "1" + tvNan.setTextColor(Color.parseColor("#ffffffff")) + tvNv.setTextColor(Color.parseColor("#979BA1")) + flNv.background = resources.getDrawable(R.drawable.shape_white_bg10_5) + flNan.background = resources.getDrawable(R.drawable.shape_white_bg10_6) + iv_woman.setImageResource(R.mipmap.login_reg_nv1) + + } + + flNv.setOnClickListener { + saxString = "2" + tvNan.setTextColor(Color.parseColor("#979BA1")) + tvNv.setTextColor(Color.parseColor("#ffffffff")) + flNan.background = resources.getDrawable(R.drawable.shape_white_bg10_5) + flNv.background = resources.getDrawable(R.drawable.shape_white_bg10_6) + iv_man.setImageResource(R.mipmap.login_reg_nan1) + } + + tv_birthday.setOnClickListener { + + + val string = getTimeYmd() + val timeYmd: String = getTimeYmd() + val split1 = string.split("-".toRegex()).toTypedArray() + val split = timeYmd.split("-".toRegex()).toTypedArray() + startDate.set(1900, 0, 1) + try { + endDate.set(split[0].toInt(), split[1].toInt() - 1, split[2].toInt()) + } catch (e: NumberFormatException) { + e.printStackTrace() + } +// try { +// seleteDate.set(split1[0].toInt(), split1[1].toInt() - 1, split1[2].toInt()) +// } catch (e: NumberFormatException) { +// e.printStackTrace() +// } + seleteDate.set(2001, 1, 1) + + val pvTime = TimePickerBuilder( + this + + ) { date, _ -> + if (date != null) { + nowDate = getNowDate(date) + tv_birthday.text = nowDate + } + } + .setRangDate(startDate, endDate) + .setDate(seleteDate) + .build() + pvTime.show() + + } + + + btn_ok.setOnClickListener { + viewModel.editUserInfo( + "", + et_name.text.toString(), + saxString, + tv_birthday.text.toString(), + "", "" + ); + } + + + } + + private fun getNowDate(date: Date): String { + val formatter = SimpleDateFormat("yyyy-MM-dd") + return formatter.format(date) + } + + /** + * 获取当前时间 + * + * @return + */ + private fun getTimeYmd(): String { + val date = Date() // 创建一个时间对象,获取到当前的时间 + val sdf = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) // 设置时间显示格式 + sdf.timeZone = TimeZone.getTimeZone("GMT+8") + return sdf.format(date) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/forget/ForgotFragment.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/forget/ForgotFragment.kt new file mode 100644 index 0000000..a271a39 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/forget/ForgotFragment.kt @@ -0,0 +1,109 @@ +package com.yuyin.mier.module_login.ui.forget + +import android.os.Bundle +import android.os.CountDownTimer +import androidx.databinding.ViewDataBinding +import androidx.navigation.Navigation +import com.yuyin.lib_base.base.BaseDataBindingFragment +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.mixin.module_login.ui.GraphicCodeDialog +import com.yuyin.mier.BR +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.login_forgot_fragment.* +import kotlinx.android.synthetic.main.login_fragment.send_code + +class ForgotFragment : BaseDataBindingFragment() { + + + companion object { + fun newInstance(type: String): ForgotFragment { + val fragment = ForgotFragment() + val bundle = Bundle() + bundle.putString("type", type) + fragment.arguments = bundle + return fragment + } + } + + private var timer: CountDownTimer? = null + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + + override fun onStop() { + super.onStop() + if (timer != null) + timer!!.cancel() + } + + override fun startObserve() { + mDataBinding.setVariable(BR.layout, viewModel) + mDataBinding.executePendingBindings() + viewModel.getError().observe(this, { + viewModel.sendCodeClick.postValue(true) + }) + viewModel.sendCode.observe(requireActivity(), { + showCode() + }) + viewModel.forgetPwdResult.observe(requireActivity(), { + Navigation.findNavController(btn_ok).navigateUp() + }) + } + + override fun getLayoutId(): Int = R.layout.login_forgot_fragment + + override fun initView() { + } + + override fun initData() { + } + + override fun initEvent() { + iv_back.setOnClickListener { + Navigation.findNavController(it).navigateUp() + } + + // 调用代码,记得把xml 里面的点击时间去掉 + send_code.setOnClickListener { + + val graphicCodeDialog = GraphicCodeDialog(requireContext()) + viewModel.create_captcha() + viewModel.captchaBean.observe(this) { + GlideUtil.loadImglogo( + requireContext(), + it.image, + graphicCodeDialog.getBinding().graphicCode + ) + } + graphicCodeDialog.getBinding().graphicCode.setOnClickListener { + viewModel.create_captcha() + } + + graphicCodeDialog.getBinding().btnConfirm.setOnClickListener { + viewModel.verification( + graphicCodeDialog.getBinding().etCode.text.toString(), + viewModel.captchaBean.value!!.key + ) + graphicCodeDialog.dismiss() + + } + + graphicCodeDialog.show() + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/forget/ForgotFragment2.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/forget/ForgotFragment2.kt new file mode 100644 index 0000000..09e79cd --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/forget/ForgotFragment2.kt @@ -0,0 +1,77 @@ +package com.yuyin.mier.module_login.ui.forget + +import android.os.Bundle +import android.os.CountDownTimer +import androidx.databinding.ViewDataBinding +import androidx.navigation.Navigation +import com.yuyin.lib_base.base.BaseDataBindingFragment +import com.yuyin.mier.BR +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.login_forgot_fragment.* + +class ForgotFragment2 : BaseDataBindingFragment() { + + + companion object { + fun newInstance(type: String): ForgotFragment2 { + val fragment = ForgotFragment2() + val bundle = Bundle() + bundle.putString("type", type) + fragment.arguments = bundle + return fragment + } + } + + private var timer: CountDownTimer? = null + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + + override fun onStop() { + super.onStop() + if (timer != null) + timer!!.cancel() + } + + override fun startObserve() { + mDataBinding.setVariable(BR.layout, viewModel) + mDataBinding.executePendingBindings() + viewModel.getError().observe(this, { + viewModel.sendCodeClick.postValue(true) + }) + viewModel.sendCode.observe(requireActivity(), { + showCode() + }) + viewModel.forgetPwdResult.observe(requireActivity(), { + Navigation.findNavController(btn_ok).navigateUp() + }) + } + + override fun getLayoutId(): Int = R.layout.login_forgot_fragment + + override fun initView() { + } + + override fun initData() { + } + + override fun initEvent() { + iv_back.setOnClickListener { + requireActivity().finish() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/forget/ForgotViewModel.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/forget/ForgotViewModel.kt new file mode 100644 index 0000000..ff6bbe4 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/forget/ForgotViewModel.kt @@ -0,0 +1,73 @@ +package com.yuyin.mier.module_login.ui.forget + +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 ForgotViewModel : BaseViewModel() { + + private val repository = CommonRepository() + + var phone: MutableLiveData = MutableLiveData() + + var code: MutableLiveData = MutableLiveData() + + var passWord: MutableLiveData = MutableLiveData() + var passWord1: MutableLiveData = MutableLiveData() + + var sendCodeClick: MutableLiveData = MutableLiveData(true) + + var sendCode: MutableLiveData = MutableLiveData() + + var forgetPwdResult: 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(), "1",captcha_code,captcha_key) + result.msg.showToast() + } + + } + + fun forgetPwd() { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (code.value.isNullOrEmpty()) { + "请输入验证码".showToast() + return + } + if (passWord.value.isNullOrEmpty()) { + "请输入密码".showToast() + return + } + if (passWord1.value.isNullOrEmpty()) { + "请再次输入密码".showToast() + return + } + if (passWord.value != passWord1.value) { + "两次密码不一致".showToast() + return + } + + launchUI { + val resultPwd = repository.forgetPwd( + phone.value.toString(), + code.value.toString(), + passWord.value.toString() + ) + resultPwd.msg.showToast() + forgetPwdResult.value = "成功" + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/login/CodeLoginFragment.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/login/CodeLoginFragment.kt new file mode 100644 index 0000000..e17c5fb --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/login/CodeLoginFragment.kt @@ -0,0 +1,171 @@ +package com.yuyin.mier.module_login.ui.login + +import android.os.CountDownTimer +import android.view.KeyEvent +import android.view.View +import androidx.databinding.ViewDataBinding +import androidx.navigation.Navigation +import com.alibaba.android.arouter.launcher.ARouter +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.Login +import com.yuyin.lib_base.model.PhotoMemory +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.lib_base.util.showToast +import com.yuyin.mixin.module_login.ui.GraphicCodeDialog +import com.yuyin.mier.BR +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.login_fragment.send_code +import kotlinx.android.synthetic.main.login_fragment2.* +import kotlinx.android.synthetic.main.login_fragment2.btn_ok +import kotlinx.android.synthetic.main.login_fragment2.iv_back +import org.litepal.LitePal +import java.util.* + + +class CodeLoginFragment : BaseDataBindingFragment() { + private var timer: CountDownTimer? = null + + override fun onStop() { + super.onStop() + if (timer != null) + timer!!.cancel() + } + + override fun startObserve() { + mDataBinding.setVariable(BR.layout, viewModel) + + viewModel.sendCode.observe(requireActivity()) { + showCode() + } + viewModel.getError().observe(this) { + viewModel.sendCodeClick.postValue(true) + } + viewModel.loginValue.observe(requireActivity()) { + "登录成功".showToast() + //用户信息存入数据库 + val loginData: Login = it + LitePal.deleteAll(it::class.java) + loginData.save() //litepal数据库,不能随便改LoginData数据 + UserManager.initData() //存储完,初始化 + + + var isSaveMemory = false + val photoMemoryList: List = + LitePal.findAll(PhotoMemory::class.java) // 查询所有数据 + for (i in photoMemoryList.indices) { + if (photoMemoryList[i].photo == it.user_name) { + isSaveMemory = true + } + } + + if (!isSaveMemory){ + val photoMemory = PhotoMemory() + photoMemory.photo = it.user_name + photoMemory.head_pic = it.head_pic + photoMemory.save() + } + + +// if (it.is_reg == "1") { +// startActivity(Intent(requireContext(), BindZLActivity::class.java)) +// } else { + ARouter.getInstance().build(AroutUtil.MAIN_MAIN).navigation() + activity?.finish() +// } + + } + } + + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + + override fun getLayoutId(): Int = R.layout.login_fragment2 + + override fun initView() { + } + + override fun initData() { + + val photoMemoryList: List = + LitePal.findAll(PhotoMemory::class.java) // 查询所有数据 + photo_memory_view.setAdapterList(photoMemoryList) + } + + override fun initEvent() { + + + btn_ok.setOnClickListener { + viewModel.phone_verification_code_log() + } + + iv_back.setOnClickListener { + Navigation.findNavController(it).popBackStack() + } + +// photo_memory_view.setOnSelectNumberListener { +// viewModel.phone.value = it.photo +// } + +// 调用代码,记得把xml 里面的点击时间去掉 + send_code.setOnClickListener { + + val graphicCodeDialog = GraphicCodeDialog(requireContext()) + viewModel.create_captcha() + viewModel.captchaBean.observe(this) { + GlideUtil.loadImglogo( + requireContext(), + it.image, + graphicCodeDialog.getBinding().graphicCode + ) + } + graphicCodeDialog.getBinding().graphicCode.setOnClickListener { + viewModel.create_captcha() + } + + graphicCodeDialog.getBinding().btnConfirm.setOnClickListener { + viewModel.verification( + graphicCodeDialog.getBinding().etCode.text.toString(), + viewModel.captchaBean.value!!.key + ) + graphicCodeDialog.dismiss() + + } + + graphicCodeDialog.show() + + } + } + + override fun onResume() { + super.onResume() + val view: View? = view + if (view != null) { + view.isFocusableInTouchMode = true + view.requestFocus() + view.setOnKeyListener { view1, i, keyEvent -> + if (i === KeyEvent.KEYCODE_BACK && keyEvent.action === KeyEvent.ACTION_UP) { + Navigation.findNavController(view1).navigateUp() + return@setOnKeyListener true + } + false + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/login/LoginFragment.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/login/LoginFragment.kt new file mode 100644 index 0000000..b819952 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/login/LoginFragment.kt @@ -0,0 +1,313 @@ +package com.yuyin.mier.module_login.ui.login + +import android.os.CountDownTimer +import android.util.Log +import android.view.KeyEvent +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.ViewDataBinding +import androidx.navigation.Navigation +import cn.sharesdk.framework.Platform +import cn.sharesdk.framework.PlatformActionListener +import cn.sharesdk.framework.ShareSDK +import cn.sharesdk.tencent.qq.QQ +import cn.sharesdk.wechat.friends.Wechat +import com.alibaba.android.arouter.launcher.ARouter +import com.flyco.tablayout.listener.CustomTabEntity +import com.flyco.tablayout.listener.OnTabSelectListener +import com.kongzue.dialog.v3.MessageDialog +import com.mob.MobSDK +import com.yuyin.lib_base.App +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.Login +import com.yuyin.lib_base.util.SBUtils +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.BR +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.login_fragment.* +import org.litepal.LitePal +import java.util.* +import kotlin.collections.HashMap + + +class LoginFragment : BaseDataBindingFragment() { + private var timer: CountDownTimer? = null + + override fun onStop() { + super.onStop() + if (timer != null) + timer!!.cancel() + } + + override fun startObserve() { + mDataBinding.setVariable(BR.layout, viewModel) + viewModel.sendCode.observe(requireActivity()) { + showCode() + } + viewModel.getError().observe(this) { + viewModel.sendCodeClick.postValue(true) + } + viewModel.loginValue.observe(requireActivity()) { + "登录成功".showToast() + //用户信息存入数据库 + val loginData: Login = it + LitePal.deleteAll(it::class.java) + loginData.save() //litepal数据库,不能随便改LoginData数据 + UserManager.initData() //存储完,初始化 +// if (loginData.is_reg == "1") { +// startActivity(Intent(activity, BindZLActivity::class.java)) +// } else { + ARouter.getInstance().build(AroutUtil.MAIN_MAIN).navigation() + activity?.finish() +// } + } + } + + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + + override fun getLayoutId(): Int = R.layout.login_fragment + + override fun initView() { + + } + + override fun initData() { + +// btnOneKey.setOnClickListener { +// val uiConfig = ShanYanUIConfig.Builder() //添加协议弹窗 +// .setPrivacyState(false) +// .build() +// OneKeyLoginManager.getInstance().setAuthThemeConfig(uiConfig) +// OneKeyLoginManager.getInstance() +// .init( +// activity, "yVdzbOkO" +// ) { code, result -> +//// if (code == 1022) { +//// val oneKeyLogin = LoginConfig() +//// OneKeyLoginManager.getInstance().setAuthThemeConfig( +//// oneKeyLogin.getGConfig(App.instance?.applicationContext), null +//// ) +//// OneKeyLoginManager.getInstance().setCheckBoxValue(false); +//// OneKeyLoginManager.getInstance().getPhoneInfo { code, result -> +//// OneKeyLoginManager.getInstance().openLoginAuth(true, +//// { code, result -> +//// if (code != 1000) { +//// "请稍后再试...".showToast() +//// } +//// } +//// ) { code, result -> +//// if (code != 1000) { +//// "请稍后再试...".showToast() +//// } else { +//// var jsonString = JSONObject(result) +//// viewModel.loginGo2(jsonString.getString("token")) +//// } +//// } +//// } +//// } else { +//// "获取失败,请稍后再试...".showToast() +//// } +// } +// +// } + + + if (activity?.intent?.getIntExtra("sign", 0) === 1) { + tv_forget.postDelayed({ + MessageDialog.show( + activity as AppCompatActivity, + "下线通知", + "您的账号在别的设备登录,您已被迫下线", + "确定" + ) + }, 2000) + } + + val titleRes = ArrayList() //tab标题集合 + + val dataTab: MutableList = ArrayList() //CommonTabLayout 所需数据集合 + + titleRes.add("登录") + titleRes.add("注册") + for (i in titleRes.indices) { + dataTab.add(object : CustomTabEntity { + override fun getTabTitle(): String { + return titleRes[i] + } + + override fun getTabSelectedIcon(): Int { + return 0 + } + + override fun getTabUnselectedIcon(): Int { + return 0 + } + }) + } + //设置数据 + //设置数据 + common_tab_layout.setTabData(dataTab as ArrayList) + common_tab_layout.setOnTabSelectListener(object : OnTabSelectListener { + override fun onTabSelect(position: Int) { + if (position == 0) { + rl_yanzhengma.setVisibility(View.GONE) + btn_ok.setText("登录") + tv_forget.setVisibility(View.VISIBLE) + } else { + rl_yanzhengma.setVisibility(View.VISIBLE) + btn_ok.setText("注册") + tv_forget.setVisibility(View.GONE) + } + } + + override fun onTabReselect(position: Int) {} + }) + } + + override fun initEvent() { + ivPass.setOnClickListener { +// llPas.visibility = View.VISIBLE +// llOne.visibility = View.GONE + Navigation.findNavController(it) + .navigate(R.id.loginFragment2) + } + ivWeiXin.setOnClickListener { + //设置授权登录的平台 + MobSDK.submitPolicyGrantResult(true, null) + val plat: Platform = ShareSDK.getPlatform(Wechat.NAME) + //授权回调监听,监听oncomplete,onerror,oncancel三种状态 + plat.platformActionListener = object : PlatformActionListener { + override fun onComplete(p0: Platform?, p1: Int, p2: HashMap?) { + p2?.let { + var map = HashMap() + map["last_login_device"] = SBUtils.getAndroidId(App.instance) + map["type"] = "1" + map["system"] = "1" + map["wx_openid"] = p2["openid"].toString() + map["head_image"] = p2["headimgurl"].toString() + map["nick_name"] = p2["nickname"].toString() + map["channel_code"] = "" + viewModel.wx_reg_log(map) + } + + } + + override fun onError(p0: Platform?, p1: Int, p2: Throwable?) { + Log.d("Aaa", "AA") + } + + override fun onCancel(p0: Platform?, p1: Int) { + Log.d("Aaa", "AA") + } + + } + plat.showUser(null) + plat.authorize() + } + + ivQQ.setOnClickListener { + //设置授权登录的平台 + MobSDK.submitPolicyGrantResult(true, null) + val plat: Platform = ShareSDK.getPlatform(QQ.NAME) + //授权回调监听,监听oncomplete,onerror,oncancel三种状态 + plat.platformActionListener = object : PlatformActionListener { + override fun onComplete(p0: Platform?, p1: Int, p2: HashMap?) { + Log.d("Aaa", "AA") + p2?.let { + var map = HashMap() + map["last_login_device"] = SBUtils.getAndroidId(App.instance) + map["type"] = "2" + map["system"] = "1" + map["wx_openid"] = plat.db.userId + map["head_image"] = plat.db.userIcon + map["nick_name"] = plat.db.userName + map["channel_code"] = "" + viewModel.wx_reg_log(map) + } + + } + + override fun onError(p0: Platform?, p1: Int, p2: Throwable?) { + Log.d("Aaa", "AA") + } + + override fun onCancel(p0: Platform?, p1: Int) { + Log.d("Aaa", "AA") + } + + } + plat.showUser(null) + plat.authorize() + } + + + tvLoginType.setOnClickListener { + if (tvLoginType.text.toString() == "切换验证码登录") { + tvLoginType.text = "切换密码登录" + rl_yanzhengma.visibility = View.VISIBLE + rl_mima.visibility = View.GONE + } else { + tvLoginType.text = "切换验证码登录" + rl_yanzhengma.visibility = View.GONE + rl_mima.visibility = View.VISIBLE + } + } + tv_forget.setOnClickListener { +// Navigation.findNavController(it) +// .navigate(R.id.action_loginFragment_to_forgotFragment) + } + btn_ok.setOnClickListener { + if (!checkbox.isChecked) { + "请先阅读并同意用户协议和隐私协议".showToast() + return@setOnClickListener + } + if (btn_ok.text.toString().equals("登录")) { +// if (tvLoginType.text.toString() == "切换验证码登录") { +// viewModel.loginGo() +// } else { + viewModel.phone_verification_code_log() +// } + } else { + viewModel.isVerification() + } + } + tv_regist.setOnClickListener { + Navigation.findNavController(it) + .navigate(R.id.action_loginFragment_to_registMainFragment) + } + } + + override fun onResume() { + super.onResume() + val view: View? = view + if (view != null) { + view.isFocusableInTouchMode = true + view.requestFocus() + view.setOnKeyListener { view1, i, keyEvent -> + if (i === KeyEvent.KEYCODE_BACK && keyEvent.action === KeyEvent.ACTION_UP) { + Navigation.findNavController(view1).navigateUp() + return@setOnKeyListener true + } + false + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/login/LoginViewModel.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/login/LoginViewModel.kt new file mode 100644 index 0000000..35c14a0 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/login/LoginViewModel.kt @@ -0,0 +1,124 @@ +package com.yuyin.mier.module_login.ui.login + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.App +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.model.Login +import com.yuyin.lib_base.util.SBUtils +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.repository.CommonRepository + +class LoginViewModel : BaseViewModel() { + private val repository = CommonRepository() + + var loginValue: MutableLiveData = MutableLiveData() + + var phone: MutableLiveData = MutableLiveData() + + var code: MutableLiveData = MutableLiveData() + + var passWord: MutableLiveData = MutableLiveData() + + + fun loginGo2(token: String) { + launchUI { + val result = repository.phone_reg_log( + token, "1", + SBUtils.getAndroidId(App.instance) + ) + loginValue.value = result.data; + } + } + + + fun loginGo() { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (passWord.value.isNullOrEmpty()) { + "请输入密码".showToast() + return + } + launchUI { + val result = repository.loginLogin( + phone.value.toString(), passWord.value.toString(), + SBUtils.getAndroidId(App.instance) + ) + loginValue.value = result.data; + } + } + + fun wx_reg_log(map: MutableMap) { + launchUI { + val result = repository.wx_reg_log(map) + loginValue.value = result.data; + } + } + + //点击发送验证码事件监听 + var sendCodeClick: MutableLiveData = MutableLiveData(true) + + var sendCode: MutableLiveData = MutableLiveData() + + fun verification(captcha_code: String, captcha_key: String) { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (sendCodeClick.value == false) return + sendCodeClick.value = false + launchUI { + val result = repository.verification(phone.value.toString(), "2",captcha_code,captcha_key) + sendCode.value = "发送" + result.msg.showToast() + } + + } + + fun isVerification() { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (code.value.isNullOrEmpty()) { + "请输入验证码".showToast() + return + } + if (passWord.value.isNullOrEmpty()) { + "请输入密码".showToast() + return + } + launchUI { + var resultReg = repository.register( + phone.value.toString(), + passWord.value.toString(), + code.value.toString(), + "", + "" + ) + loginGo() + } + + } + + fun phone_verification_code_log() { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (code.value.isNullOrEmpty()) { + "请输入验证码".showToast() + return + } + launchUI { + var result = repository.phone_verification_code_log( + phone.value.toString(), + code.value.toString(), SBUtils.getAndroidId(App.instance) + ) + loginValue.value = result.data; + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/login/PassWordLoginFragment.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/login/PassWordLoginFragment.kt new file mode 100644 index 0000000..785b060 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/login/PassWordLoginFragment.kt @@ -0,0 +1,260 @@ +package com.yuyin.mier.module_login.ui.login + +import android.graphics.Color +import android.os.Build +import android.os.CountDownTimer +import android.text.SpannableString +import android.text.Spanned +import android.text.TextPaint +import android.text.method.LinkMovementMethod +import android.text.style.ClickableSpan +import android.view.KeyEvent +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.ViewDataBinding +import androidx.navigation.Navigation +import com.alibaba.android.arouter.launcher.ARouter +import com.kongzue.dialog.v3.MessageDialog +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.Login +import com.yuyin.lib_base.model.PhotoMemory +import com.yuyin.lib_base.ui.X5WebViewActivity +import com.yuyin.lib_base.util.SharedPreferencesUtils +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.BR +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.login_fragment3.* +import org.litepal.LitePal + +import com.tencent.bugly.crashreport.CrashReport +import com.yuyin.mier.BuildConfig + +class PassWordLoginFragment : BaseDataBindingFragment() { + private var timer: CountDownTimer? = null + + override fun onStop() { + super.onStop() + if (timer != null) + timer!!.cancel() + } + + override fun startObserve() { + mDataBinding.setVariable(BR.layout, viewModel) + + + viewModel.getError().observe(this) { + viewModel.sendCodeClick.postValue(true) + } + viewModel.loginValue.observe(requireActivity()) { + "登录成功".showToast() + //用户信息存入数据库 + val loginData: Login = it + LitePal.deleteAll(it::class.java) + loginData.save() //litepal数据库,不能随便改LoginData数据 + UserManager.initData() //存储完,初始化 + + var isSaveMemory = false + val photoMemoryList: List = + LitePal.findAll(PhotoMemory::class.java) // 查询所有数据 + for (i in photoMemoryList.indices) { + if (photoMemoryList[i].photo == it.user_name) { + isSaveMemory = true + } + } + + if (!isSaveMemory) { + val photoMemory = PhotoMemory() + photoMemory.photo = it.user_name + photoMemory.head_pic = it.head_pic + photoMemory.save() + } + +// if (it.is_reg == "1") { +// startActivity(Intent(requireContext(), BindZLActivity::class.java)) +// } else { + ARouter.getInstance().build(AroutUtil.MAIN_MAIN).navigation() + activity?.finish() +// } + + } + } + + + override fun getLayoutId(): Int = R.layout.login_fragment3 + + override fun initView() { + if (!SharedPreferencesUtils.getParam(activity, "LOGIN", "1").equals("2")) { + llystk.visibility = View.VISIBLE + tv_content.text = "" + tv_content.append("感谢您信任并使用") + var clickStringJR = SpannableString("余音派对,") + clickStringJR.setSpan(object : ClickableSpan() { + + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = Color.parseColor("#FF5057") + ds.isUnderlineText = false //去掉下划线 + } + + override fun onClick(p0: View) { + //点击事件 + } + }, 0, clickStringJR.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + tv_content?.append(clickStringJR) + tv_content?.append( + "当您使用本APP前,请您务必仔细阅读、充分理解“用户协议”和“隐私政策”各条款,包括但不限于: " + + "为您提供服务并保障您的相关信息,以及为您提供的访问、修改、删除和您先关的信息的方式。" + ) + tv_content?.append("如您同意") + var clickStringJR3 = SpannableString("《服务协议") + clickStringJR3.setSpan(object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = Color.parseColor("#FF5057") + ds.isUnderlineText = false //去掉下划线 + } + + override fun onClick(p0: View) { + //点击事件 + X5WebViewActivity.forward(requireContext(), Const.PAGE_USER_XIEYI, "服务协议") + } + }, 0, clickStringJR3.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + tv_content?.append(clickStringJR3) + var clickStringJR5 = SpannableString("隐私政策》") + clickStringJR5.setSpan(object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = Color.parseColor("#FF5057") + ds.isUnderlineText = false //去掉下划线 + } + + override fun onClick(p0: View) { + //点击事件 + X5WebViewActivity.forward(requireContext(), Const.PAGE_USER_XIEYI2, "隐私政策") + } + }, 0, clickStringJR3.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + tv_content?.append(clickStringJR5) + tv_content?.append(",请点击“确认”开始使用我们的产品和服务。") + tv_content?.movementMethod = LinkMovementMethod.getInstance() + tv_cancel.setOnClickListener { + SharedPreferencesUtils.setParam(activity, "LOGIN", "1") + llystk.visibility = View.GONE + activity?.finish() + } + tv_confirm.setOnClickListener { + SharedPreferencesUtils.setParam(activity, "LOGIN", "2") + llystk.visibility = View.GONE + initBugly() + } + } else { + initBugly() + + } + + } + + fun initBugly() { + + //初始化bugly + val strategy: CrashReport.UserStrategy = CrashReport.UserStrategy(requireContext()) + strategy.setDeviceModel(Build.MODEL) + //设置包名 + strategy.setAppPackageName(BuildConfig.APPLICATION_ID) + // 设置App版本号 + strategy.setAppVersion(BuildConfig.VERSION_NAME) + // 初始化崩溃报告服务,传入应用上下文、AppKey、是否调试模式和自定义策略 + CrashReport.initCrashReport(requireContext(), "4bf6f2912b", BuildConfig.DEBUG, strategy) + + val photoMemoryList: List = + LitePal.findAll(PhotoMemory::class.java) // 查询所有数据 + photo_memory_view.setAdapterList(photoMemoryList) + } + + override fun initData() { + if (activity?.intent?.getIntExtra("sign", 0) === 1) { +// tv_forget.postDelayed({ + MessageDialog.show( + activity as AppCompatActivity, + "下线通知", + "您的账号在别的设备登录,您已被迫下线", + "确定" + ) +// }, 2000) + } + } + + override fun initEvent() { + + tv_forget.setOnClickListener { + Navigation.findNavController(it) + .navigate(R.id.action_loginFragment_to_forgotFragment2) + } + + btn_ok.setOnClickListener { + if (!iv_check.isChecked) { + "请同意用户协议".showToast() + return@setOnClickListener + } + viewModel.loginGo() + } + + iv_back.setOnClickListener { + Navigation.findNavController(it).popBackStack() + } + + + v_register.setOnClickListener { + Navigation.findNavController(it) + .navigate(R.id.action_loginFragment_to_registMainFragment) + } + + v_code_login.setOnClickListener { + + Navigation.findNavController(it) + .navigate(R.id.action_loginFragment_to_loginFragment2) + } + + xieyi.setOnClickListener { + X5WebViewActivity.forward(requireContext(), Const.PAGE_USER_XIEYI, "服务协议") + } + xieyi2.setOnClickListener { + X5WebViewActivity.forward(requireContext(), Const.PAGE_USER_XIEYI2, "隐私政策") + } + + iv_unfold.setOnClickListener { + photo_memory_view.visibility = View.VISIBLE + iv_unfold.setImageResource(R.mipmap.unfold_icon) + photo_memory_view.setOnSelectNumberListener { + viewModel.phone.value = it.photo + } + + } + + main.setOnClickListener { + photo_memory_view.visibility = View.GONE + iv_unfold.setImageResource(R.mipmap.unfold_icon2) + } + + + + } + + override fun onResume() { + super.onResume() + val view: View? = view + if (view != null) { + view.isFocusableInTouchMode = true + view.requestFocus() + view.setOnKeyListener { view1, i, keyEvent -> + if (i === KeyEvent.KEYCODE_BACK && keyEvent.action === KeyEvent.ACTION_UP) { + Navigation.findNavController(view1).navigateUp() + return@setOnKeyListener true + } + false + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/regist/RegistMainFragment.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/regist/RegistMainFragment.kt new file mode 100644 index 0000000..4724d33 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/regist/RegistMainFragment.kt @@ -0,0 +1,165 @@ +package com.yuyin.mier.module_login.ui.regist + +import android.os.CountDownTimer +import android.view.View +import androidx.databinding.ViewDataBinding +import androidx.navigation.Navigation +import com.alibaba.android.arouter.launcher.ARouter +import com.yuyin.lib_base.Const +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.model.Login +import com.yuyin.lib_base.util.showToast +import com.yuyin.lib_base.base.BaseDataBindingFragment +import com.yuyin.lib_base.model.PhotoMemory +import com.yuyin.lib_base.ui.X5WebViewActivity +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.mixin.module_login.ui.GraphicCodeDialog +import com.yuyin.mier.R +import com.yuyin.mier.BR +import kotlinx.android.synthetic.main.login_regist_main_fragment.* +import org.litepal.LitePal + +class RegistMainFragment : BaseDataBindingFragment() { + private var timer: CountDownTimer? = null + + companion object { + fun newInstance() = RegistMainFragment() + } + + override fun onStop() { + super.onStop() + if (timer != null) + timer!!.cancel() + } + + override fun startObserve() { + mDataBinding.setVariable(BR.layout, viewModel) + mDataBinding.executePendingBindings() + viewModel.sendCode.observe(requireActivity(), { + showCode() + }) + viewModel.getError().observe(this, { + viewModel.sendCodeClick.postValue(true) + }) + viewModel.loginValue.observe(requireActivity()) { + "登录成功".showToast() + //用户信息存入数据库 + var loginData: Login = it + LitePal.deleteAll(it::class.java) + loginData.save() //litepal数据库,不能随便改LoginData数据 + UserManager.initData() //存储完,初始化 + + var isSaveMemory = false + val photoMemoryList: List = + LitePal.findAll(PhotoMemory::class.java) // 查询所有数据 + for (i in photoMemoryList.indices) { + if (photoMemoryList[i].photo == it.user_name) { + isSaveMemory = true + } + } + + if (!isSaveMemory){ + val photoMemory = PhotoMemory() + photoMemory.photo = it.user_name + photoMemory.head_pic = it.head_pic + photoMemory.save() + } + + + ARouter.getInstance().build(AroutUtil.MAIN_MAIN).navigation() + activity?.finish() + } + } + + override fun getLayoutId(): Int = R.layout.login_regist_main_fragment + + override fun initView() { + } + + override fun initData() { + } + + override fun initEvent() { + + back.setOnClickListener { + Navigation.findNavController(back).navigateUp() + } + +// v_login.setOnClickListener { +// Navigation.findNavController(back).navigateUp() +// } + +// iv_unfold.setOnClickListener { +// photo_memory_view.visibility = View.VISIBLE +// } + + main.setOnClickListener { + photo_memory_view.visibility = View.GONE + + } + xieyi.setOnClickListener { + X5WebViewActivity.forward(requireContext(), Const.PAGE_USER_XIEYI, "服务协议") + } + xieyi2.setOnClickListener { + X5WebViewActivity.forward(requireContext(), Const.PAGE_USER_XIEYI2, "隐私政策") + } + btn_ok.setOnClickListener { + if (!iv_check.isChecked) { + "请同意用户协议".showToast() + return@setOnClickListener + } + viewModel.isVerification() + } +// photo_memory_view.setOnSelectNumberListener { +// viewModel.phone.value = it.photo +// } + +// 调用代码,记得把xml 里面的点击时间去掉 + send_code.setOnClickListener { + val graphicCodeDialog = GraphicCodeDialog(requireContext()) + viewModel.create_captcha() + viewModel.captchaBean.observe(this) { + GlideUtil.loadImglogo( + requireContext(), + it.image, + graphicCodeDialog.getBinding().graphicCode + ) + } + graphicCodeDialog.getBinding().graphicCode.setOnClickListener { + viewModel.create_captcha() + } + + graphicCodeDialog.getBinding().btnConfirm.setOnClickListener { + viewModel.verification( + graphicCodeDialog.getBinding().etCode.text.toString(), + viewModel.captchaBean.value!!.key + ) + graphicCodeDialog.dismiss() + + } + + graphicCodeDialog.show() + + } + } + + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_login/ui/regist/RegistMainViewModel.kt b/app/src/main/java/com/yuyin/mier/module_login/ui/regist/RegistMainViewModel.kt new file mode 100644 index 0000000..b61db64 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_login/ui/regist/RegistMainViewModel.kt @@ -0,0 +1,102 @@ +package com.yuyin.mier.module_login.ui.regist + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.App +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.model.Login +import com.yuyin.lib_base.util.SBUtils +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.repository.CommonRepository + +class RegistMainViewModel : BaseViewModel() { + + private val repository = CommonRepository() + + var sex: MutableLiveData = MutableLiveData("1") + + var loginValue: MutableLiveData = MutableLiveData() + + var phone: MutableLiveData = MutableLiveData() + + var code: MutableLiveData = MutableLiveData() + + var yaoqing: MutableLiveData = MutableLiveData("") + + var passWord: MutableLiveData = MutableLiveData() + + var passWord2: MutableLiveData = MutableLiveData() + + //点击发送验证码事件监听 + var sendCodeClick: MutableLiveData = MutableLiveData(true) + + var sendCode: MutableLiveData = MutableLiveData() + + fun verification(captcha_code: String, captcha_key: String) { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (sendCodeClick.value == false) return + sendCodeClick.value = false + launchUI { + val result = repository.verification(phone.value.toString(), "2",captcha_code,captcha_key) + sendCode.value = "发送" + result.msg.showToast() + } + + } + + + fun isVerification() { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (code.value.isNullOrEmpty()) { + "请输入验证码".showToast() + return + } +// if (passWord.value.isNullOrEmpty() || passWord2.value.isNullOrEmpty()) { +// "请输入密码".showToast() +// return +// } +// if (passWord.value.isNullOrEmpty() != passWord2.value.isNullOrEmpty()) { +// "两次输入的密码不一致".showToast() +// return +// } + + if (passWord.value.isNullOrEmpty()) { + "请输入密码".showToast() + return + } + launchUI { + var resultReg = repository.register( + phone.value.toString(), + passWord.value.toString(), + code.value.toString(), + yaoqing.value.toString(), + sex.value.toString() + ) + loginGo() + } + + } + + private fun loginGo() { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (passWord.value.isNullOrEmpty()) { + "请输入密码".showToast() + return + } + launchUI { + val result = repository.loginLogin( + phone.value.toString(), passWord.value.toString(), + SBUtils.getAndroidId(App.instance) + ) + loginValue.value = result.data; + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/YaoQingActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/YaoQingActivity.kt new file mode 100644 index 0000000..a0eff30 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/YaoQingActivity.kt @@ -0,0 +1,196 @@ +package com.yuyin.mier.module_my + +import android.Manifest +import android.content.ClipData +import android.content.ClipboardManager +import android.content.ContentValues +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.MediaStore +import android.view.View +import com.tbruyelle.rxpermissions2.RxPermissions +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.PermissionsChecker +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityYaoqingBinding +import com.yuyin.mier.module_my.zhuangban.FriendListActivity +import com.yuyin.mier.view.ZXingUtils +import java.io.File +import java.io.FileOutputStream +import java.io.OutputStream + +class YaoQingActivity : BaseDataBindingActivity() { + var permissionListTmp = arrayOf( + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE) + override fun startObserve() { + viewModel.bindCode.observe(this) { + mDataBinding.flMa.visibility = View.GONE + finish() + } + } + + override fun getLayoutId(): Int = R.layout.activity_yaoqing + + override fun initView() { + mDataBinding.tvSure.setOnClickListener { + viewModel.bind_reg_code(mDataBinding.etCode.text.toString()) + } + mDataBinding.tvBc.setOnClickListener { + var mPermissionsChecker= PermissionsChecker(this@YaoQingActivity) + if (mPermissionsChecker!!.lacksPermissions(*permissionListTmp)) { + mDataBinding.llQuanxian.visibility= View.VISIBLE + }else{ + mDataBinding.llQuanxian.visibility= View.GONE + } + val rxPermissions = RxPermissions(this) + rxPermissions + .request(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .subscribe { granted: Boolean -> + if (granted) { + mDataBinding.llQuanxian.visibility= View.GONE + saveMediaToStorage(this, getViewBitmap(mDataBinding.llbg)!!) + "保存图片成功".showToast() + }else{ + mDataBinding.llQuanxian.visibility= View.GONE + } + } + + } + } + + override fun initData() { + loadImage(mDataBinding.civHead, UserManager.user.head_pic) + mDataBinding.tvName1.text = UserManager.user.nick_name + val bitmap = ZXingUtils.createQRImage( + intent.getStringExtra("reg_url"), 400, 400 + ) + mDataBinding.ivQR.setImageBitmap(bitmap) + mDataBinding.tvYQM.text = intent.getStringExtra("reg_code") + + } + + override fun initEvent() { + + mDataBinding.tvCOPY.setOnClickListener { + copyContentToClipboard(intent.getStringExtra("reg_url"), this) + "复制成功".showToast() + } + + + mDataBinding.ivClose.setOnClickListener { + mDataBinding.flMa.visibility = View.GONE + } + + mDataBinding.tvMingXi.setOnClickListener { + val intent = Intent(this, FriendListActivity::class.java) + startActivity(intent) + } + } + + /** + * 复制内容到剪贴板 + * + * @param content + * @param context + */ + fun copyContentToClipboard(content: String?, context: Context) { + //获取剪贴板管理器: + val cm = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + // 创建普通字符型ClipData + val mClipData = ClipData.newPlainText("Label", content) + // 将ClipData内容放到系统剪贴板里。 + cm.setPrimaryClip(mClipData) + } + + fun getViewBitmap(v: View?): Bitmap? { + if (null == v) { + return null + } + v.isDrawingCacheEnabled = true + v.buildDrawingCache() + if (Build.VERSION.SDK_INT >= 11) { + v.measure( + View.MeasureSpec.makeMeasureSpec(v.width, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(v.height, View.MeasureSpec.EXACTLY) + ) + v.layout( + v.x.toInt(), + v.y.toInt(), + v.x.toInt() + v.measuredWidth, + v.y.toInt() + v.measuredHeight + ) + } else { + v.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + v.layout(0, 0, v.measuredWidth, v.measuredHeight) + } + val bitmap = Bitmap.createBitmap(v.drawingCache, 0, 0, v.measuredWidth, v.measuredHeight) + v.isDrawingCacheEnabled = false + v.destroyDrawingCache() + return bitmap + } + + private fun saveMediaToStorage(context: Context, bitmap: Bitmap) { + //Generating a file name + val filename = "${System.currentTimeMillis()}.jpg" + + //Output stream + var fos: OutputStream? = null + + //For devices running android >= Q + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + //getting the contentResolver + context?.contentResolver?.also { resolver -> + + //Content resolver will process the contentvalues + val contentValues = ContentValues().apply { + + //putting file information in content values + put(MediaStore.MediaColumns.DISPLAY_NAME, filename) + put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg") + put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM) + } + + //Inserting the contentValues to contentResolver and getting the Uri + val imageUri: Uri? = + resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) + + //Opening an outputstream with the Uri that we got + fos = imageUri?.let { resolver.openOutputStream(it) } + } + } else { + //These for devices running on android < Q + //So I don't think an explanation is needed here + val imagesDir = + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + val image = File(imagesDir, filename) + fos = FileOutputStream(image) + } + + fos?.use { + //Finally writing the bitmap to the output stream that we opened + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, it) +// ToastUtils.showShort(context.getString(R.string.save_success)) + sendBroadcast( + Intent( + Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, + Uri.fromFile( + File( + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), + filename + ) + ) + ) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/YaoQingViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/YaoQingViewModel.kt new file mode 100644 index 0000000..2b630c3 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/YaoQingViewModel.kt @@ -0,0 +1,29 @@ +package com.yuyin.mier.module_my + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.repository.CommonRepository +import com.yuyin.module_live.model.InvitationList + +class YaoQingViewModel : BaseViewModel() { + + var myRepository = CommonRepository() + + var bindCode = MutableLiveData() + + fun bind_reg_code(reg_code: String) { + launchUI { + val result = myRepository.bind_reg_code(reg_code) + bindCode.value = result.data + } + } + + var friendBean = MutableLiveData() + fun get_my_reg_friend_list(page:Int) { + launchUI { + val result = myRepository.get_my_reg_friend_list(page.toString(),"20") + friendBean.value = result.data + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/ChargeAdapter.java b/app/src/main/java/com/yuyin/mier/module_my/adapter/ChargeAdapter.java new file mode 100644 index 0000000..f1e8cfc --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/ChargeAdapter.java @@ -0,0 +1,63 @@ +package com.yuyin.mier.module_my.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.yuyin.lib_base.adapter.MyBaseAdapter; +import com.yuyin.mier.R; +import com.yuyin.mier.module_my.model.GoodsListBean; + + +/** + * 充值 + */ +public class ChargeAdapter extends MyBaseAdapter { + + private Context context; + + public ChargeAdapter(Context context) { + this.context = context; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final ViewHolder VH; + if (convertView == null) { + convertView = LayoutInflater.from(context).inflate(R.layout.item_chager, null); + VH = new ViewHolder(convertView); + convertView.setTag(VH); + } else { + VH = (ViewHolder) convertView.getTag(); + } + VH.textNum1.setText(list_adapter.get(position).getIntegral() + ""); + VH.textNum3.setText("¥ " + list_adapter.get(position).getMoney()); + + if (list_adapter.get(position).isSelect()) { + VH.rlBg.setSelected(true); + VH.textNum1.setSelected(true); + VH.textNum3.setSelected(true); + } else { + VH.rlBg.setSelected(false); + VH.textNum1.setSelected(false); + VH.textNum3.setSelected(false); + } + return convertView; + } + + + public static class ViewHolder { + RelativeLayout rlBg; + TextView textNum1, textNum3; + + public ViewHolder(View convertView) { + rlBg = (RelativeLayout) convertView.findViewById(R.id.rlBg); + textNum1 = (TextView) convertView.findViewById(R.id.textNum1); + textNum3 = (TextView) convertView.findViewById(R.id.textNum3); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/FriendAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/FriendAdapter.kt new file mode 100644 index 0000000..9392021 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/FriendAdapter.kt @@ -0,0 +1,20 @@ +package com.yuyin.mier.module_my.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.module_live.model.FriendBean +import java.util.* + +class FriendAdapter : + BaseQuickAdapter(R.layout.item_friend, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: FriendBean) { + + GlideUtil.loadImglogo(mContext, item.head_pic, helper.getView(R.id.iv_head)) + + helper.setText(R.id.tv_name, item.nick_name) + .setText(R.id.tv_time, item.add_time) + .setText(R.id.tv_shouyi,"收益:"+item.give_earnings+"钻石") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/GiftLogAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/GiftLogAdapter.kt new file mode 100644 index 0000000..9934df0 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/GiftLogAdapter.kt @@ -0,0 +1,22 @@ +package com.yuyin.mier.module_my.adapter + +import com.bumptech.glide.Glide +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_my.model.GiftLogBean +import java.util.* + +class GiftLogAdapter : + BaseQuickAdapter(R.layout.item_gift_log_list, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: GiftLogBean) { + helper + .setText(R.id.tv_name, item.send_user_info.nick_name) + .setText(R.id.tv_id, "ID:" + item.send_user_info.uid) + .setText(R.id.tv_num, item.total_send_amount) + .setText(R.id.tv_time, TimeUtil.toDateYmd(item.last_send_time)) + Glide.with(mContext).load(item.send_user_info.head_pic).error(R.mipmap.ic_launcher_app) + .placeholder(R.mipmap.ic_launcher_app).into(helper.getView(R.id.v_img)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/GiftLogSubAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/GiftLogSubAdapter.kt new file mode 100644 index 0000000..fa903d9 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/GiftLogSubAdapter.kt @@ -0,0 +1,18 @@ +package com.yuyin.mier.module_my.adapter + +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_my.model.GiftLogSubBean +import java.util.* + +class GiftLogSubAdapter : + BaseQuickAdapter(R.layout.item_gift_log_list_sub, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: GiftLogSubBean) { + helper + .setText(R.id.tv_title2, "${item.gift_name}x${item.gift_num}") + .setText(R.id.tv_title3, "${item.gift_total_price}金币") + Glide.with(mContext).load(item.base_image).into(helper.getView(R.id.v_img)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/HomePageGiftAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/HomePageGiftAdapter.kt new file mode 100644 index 0000000..7494479 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/HomePageGiftAdapter.kt @@ -0,0 +1,20 @@ +package com.yuyin.mier.module_my.adapter + +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.module_live.model.UserGiftList +import java.util.* + +class HomePageGiftAdapter : + BaseQuickAdapter(R.layout.item_homepage_gift, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: UserGiftList) { + helper + .setText(R.id.tv_num, "x${item.gift_total_sum}") + .setText(R.id.tv_title1, item.gift_name) + .setText(R.id.tv_title2, "${item.gift_price}金币") + Glide.with(mContext).load(item.base_image).error(R.mipmap.no_tu) + .into(helper.getView(R.id.iv_img)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/MyPicListAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/MyPicListAdapter.kt new file mode 100644 index 0000000..b4c61c5 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/MyPicListAdapter.kt @@ -0,0 +1,40 @@ +package com.yuyin.mier.module_my.adapter + +import android.view.View +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.mier.R +import com.yuyin.mier.module_my.model.UserAlbumsList +import java.util.* + +class MyPicListAdapter(private val showDel: Boolean) : + BaseQuickAdapter( + R.layout.item_my_pics, ArrayList() + ) { + override fun convert(helper: BaseViewHolder, item: UserAlbumsList) { + helper.addOnClickListener(R.id.iv_del) + val ivDel = helper.getView(R.id.iv_del) + if (item.type == 1) { + ivDel.visibility = View.VISIBLE + Glide.with(mContext) + .load(item.image) + .placeholder(R.mipmap.no_tu) + .error(R.mipmap.no_tu) + .into((helper.getView(R.id.iv_img) as ImageView)) + } else { + ivDel.visibility = View.GONE + Glide.with(mContext) + .load(item.image) + .placeholder(R.mipmap.icon_add_pic22) + .error(R.mipmap.icon_add_pic22) + .into((helper.getView(R.id.iv_img) as ImageView)) + } + if (showDel && item.type == 1) { + ivDel.visibility = View.VISIBLE + } else { + ivDel.visibility = View.GONE + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/MyRoomListAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/MyRoomListAdapter.kt new file mode 100644 index 0000000..d102474 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/MyRoomListAdapter.kt @@ -0,0 +1,36 @@ +package com.yuyin.mier.module_my.adapter + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.yuyin.lib_base.App +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.mier.R +import com.yuyin.mier.module_home.model.MyRoomList + +class MyRoomListAdapter : BaseQuickAdapter(R.layout.item_my_room) { + + override fun convert(helper: BaseViewHolder, item: MyRoomList) { + + helper.addOnClickListener(R.id.iv_quite_room) + .addOnClickListener(R.id.iv_enter_room) + + GlideUtil.loadImglogo(mContext, item.room_cover, helper.getView(R.id.iv_cover)) + helper.setText(R.id.tv_room_name, item.room_name).setText(R.id.tv_room_id, "ID:" + item.room_number) + if (item.user_type == 1) { + helper.setText(R.id.tv_user_type, "房主") + if (App.rid==item.rid.toString()){ + helper.setGone(R.id.iv_quite_room, false) + }else{ + helper.setGone(R.id.iv_quite_room, true) + } + } else if (item.user_type == 2) { + helper.setText(R.id.tv_user_type, "管理员") + helper.setGone(R.id.iv_quite_room, true) + } else { + helper.setText(R.id.tv_user_type, "主持人") + helper.setGone(R.id.iv_quite_room, true) + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/PeerageAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/PeerageAdapter.kt new file mode 100644 index 0000000..62c6ec0 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/PeerageAdapter.kt @@ -0,0 +1,26 @@ +package com.yuyin.mier.module_my.adapter + +import android.graphics.Color +import android.widget.TextView +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.NobilityPower + + +class PeerageAdapter : BaseQuickAdapter(R.layout.item_peerage) { + override fun convert(helper: BaseViewHolder, item: NobilityPower) { + + helper.setText(R.id.tv_name, item.name) +// .setText(R.id.tv_content, item.content) + if (item.is_power == 1) { + GlideUtil.loadImglogo(mContext, item.image, helper.getView(R.id.iv_icon)) + helper.getView(R.id.tv_name).setTextColor(Color.parseColor("#FFFFBB3A")) + } else { + GlideUtil.loadImglogo(mContext, item.images, helper.getView(R.id.iv_icon)) + helper.getView(R.id.tv_name).setTextColor(Color.parseColor("#FF999999")) + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/ShouCangRoomAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/ShouCangRoomAdapter.kt new file mode 100644 index 0000000..1135a45 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/ShouCangRoomAdapter.kt @@ -0,0 +1,25 @@ +package com.yuyin.mier.module_my.adapter + +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_my.model.CollectRoomListBean +import java.util.* + +class ShouCangRoomAdapter : + BaseQuickAdapter(R.layout.item_shoucang, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: CollectRoomListBean) { + helper.addOnClickListener(R.id.tv_enter) + Glide.with(mContext).load(item.room_cover).into(helper.getView(R.id.v_img)) + helper + .setText(R.id.tv_title, item.room_name) + .setText(R.id.tv_title2, "ID:" + item.room_number.toString()) + helper.addOnClickListener(R.id.tv_enter) + if(item.is_online=="1"){ + helper.setImageResource(R.id.iv_online,R.mipmap.online1) + }else{ + helper.setImageResource(R.id.iv_online,R.mipmap.online2) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/SignedArtistAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/SignedArtistAdapter.kt new file mode 100644 index 0000000..97c1459 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/SignedArtistAdapter.kt @@ -0,0 +1,26 @@ +package com.yuyin.mier.module_my.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.lib_base.util.TimeUtil +import com.yuyin.mier.R +import com.yuyin.module_live.model.SignedArtistBean + +class SignedArtistAdapter : + BaseQuickAdapter(R.layout.item_signed_artists2) { + override fun convert(helper: BaseViewHolder, item: SignedArtistBean) { + + helper.addOnClickListener(R.id.btn_confirm,R.id.btn_cancel) + GlideUtil.loadImglogo(mContext, item.head_pic, helper.getView(R.id.iv_head)) + helper.setText(R.id.tv_name, item.nick_name) + .setText(R.id.tv_time,"ID:${item.uid}") + .setText(R.id.tv_time2,"到期时间"+TimeUtil.toDateYmdHan3(item.end_time.toLong())) + if (item.sex == 1) { + helper.setImageResource(R.id.iv_sex, R.mipmap.login_reg_nan1) + } else { + helper.setImageResource(R.id.iv_sex, R.mipmap.login_reg_nv1) + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/TxLogDeatileAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/TxLogDeatileAdapter.kt new file mode 100644 index 0000000..fcb3629 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/TxLogDeatileAdapter.kt @@ -0,0 +1,32 @@ +package com.yuyin.mier.module_my.adapter + +import android.graphics.Color +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.userWithdrawalBean +import java.util.* + +class TxLogDeatileAdapter : + BaseQuickAdapter(R.layout.item_txmx_new, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: userWithdrawalBean) { + + if(item.status=="1"){ // 1待审核 2已到账3打款失败 + helper.setText(R.id.tv_tx_status, "待审核") + helper.setBackgroundRes(R.id.tv_tx_status,R.drawable.shape_tx_mxbg1) + helper.setTextColor(R.id.tv_tx_status,Color.parseColor("#999999")) + }else if(item.status=="2"){ // 1待审核 2已到账 3打款失败 + helper.setText(R.id.tv_tx_status, "已到账") + helper.setBackgroundRes(R.id.tv_tx_status,R.drawable.shape_tx_mxbg2) + helper.setTextColor(R.id.tv_tx_status,Color.parseColor("#00AA58")) + }else if(item.status=="3"){ // 1待审核 2已到账 3打款失败 + helper.setText(R.id.tv_tx_status, "打款失败") + helper.setBackgroundRes(R.id.tv_tx_status,R.drawable.shape_tx_mxbg1) + helper.setTextColor(R.id.tv_tx_status,Color.parseColor("#999999")) + } + + helper.setText(R.id.tv_tx_date, TimeUtil.toDateYmd5(item.add_time)) + .setText(R.id.tv_tx_money, item.general_money+"") + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/adapter/UserGiftWallAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/adapter/UserGiftWallAdapter.kt new file mode 100644 index 0000000..5cf37e8 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/adapter/UserGiftWallAdapter.kt @@ -0,0 +1,49 @@ +package com.yuyin.mier.module_my.adapter + +import android.view.View +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.module_live.model.UserGiftList + +class UserGiftWallAdapter : + BaseQuickAdapter(R.layout.item_user_gift_wall) { + override fun convert(helper: BaseViewHolder, item: UserGiftList) { + GlideUtil.loadImglogo(mContext, item.base_image, helper.getView(R.id.iv_cover)) + + helper.setText(R.id.tv_name, item.gift_name) + .setText(R.id.tv_num, "x" + item.num) + .setText(R.id.tv_price, item.gift_price) + + + helper.getView(R.id.rl_wall_bg).isSelected = item.isSelect + + if (item.isSelect) { +// helper.getView(R.id.rl_wall_bg).alpha = 1f + helper.setVisible(R.id.tv_num, true) + helper.setVisible(R.id.iv_head, true) +// helper.setVisible(R.id.tv_num, item.num.isNotEmpty()) + helper.setVisible(R.id.tv_num, true) +// if(!TextUtils.isEmpty(item.max_gift_num_user.head_pic)){ +// GlideUtil.loadImglogo( +// mContext, +// item.max_gift_num_user.head_pic, +// helper.getView(R.id.iv_head) +// ) +// } + + + helper.addOnClickListener(R.id.iv_head) + + } else { +// helper.getView(R.id.rl_wall_bg).alpha = 0.6f + helper.setVisible(R.id.tv_num, false) + helper.setVisible(R.id.iv_head, false) + } + + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/auction/SignedArtistActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/auction/SignedArtistActivity.kt new file mode 100644 index 0000000..586b31b --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/auction/SignedArtistActivity.kt @@ -0,0 +1,110 @@ +package com.yuyin.mier.module_my.auction + +import androidx.recyclerview.widget.LinearLayoutManager +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivitySignedArtistBinding +import com.yuyin.mier.module_home.tab.center.MainCenterViewModel +import com.yuyin.mier.module_my.adapter.SignedArtistAdapter +import com.yuyin.mier.module_my.set.SetTipsDialog + +class SignedArtistActivity : BaseDataBindingActivity() { + + var page = 1 + + lateinit var signedArtistAdapter: SignedArtistAdapter + + override fun startObserve() { + + viewModel.signedArtist.observe(this) { + if (page == 1) { + signedArtistAdapter.setNewData(it) + } else { + signedArtistAdapter.addData(it) + } + } + viewModel.getFinally().observe(this) { + mDataBinding.smart.finishRefresh() + mDataBinding.smart.finishLoadMore() + } + + viewModel.renewalAmountBean.observe(this) { money -> + + val setTipsDialog = SetTipsDialog(this); + if (money.money.toInt() > 0) { + setTipsDialog.getBinding().tvContent.text = "本次需花费${money.money}金币续约7天,确定续约吗?" + } else { + setTipsDialog.getBinding().tvContent.text = + "前三次免费续约,本次可花费${money.money}金币续约7天,确定续约吗?" + } + + setTipsDialog.getBinding().btnConfirm.setOnClickListener { + //在子线程执行删除缓存 + viewModel.user_renewal_contract(money.id) + setTipsDialog.dismiss() + } + setTipsDialog.show() + } + } + + override fun getLayoutId(): Int { + return R.layout.activity_signed_artist + } + + override fun initView() { + + + mDataBinding.rvContainer.layoutManager = LinearLayoutManager(this) + signedArtistAdapter = SignedArtistAdapter() + mDataBinding.rvContainer.adapter = signedArtistAdapter + } + + override fun initData() { + + viewModel.get_user_contract_list(UserManager.user.uid.toString(), page.toString(), "20") + + } + + override fun initEvent() { + + signedArtistAdapter.setOnItemChildClickListener { adapter, view, position -> + + if (view.id == R.id.btn_confirm) { + + viewModel.user_renewal_contract_status(signedArtistAdapter.data[position].id.toString()) + + } else if (view.id == R.id.btn_cancel) { + + viewModel.user_cancel_contract( + signedArtistAdapter.data[position].id.toString(), + UserManager.user.uid.toString() + ) + } + + } + + mDataBinding.smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.get_user_contract_list( + UserManager.user.uid.toString(), + page.toString(), + "20" + ) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.get_user_contract_list( + UserManager.user.uid.toString(), + page.toString(), + "20" + ) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/chongzhi/ChongZhiActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/chongzhi/ChongZhiActivity.kt new file mode 100644 index 0000000..19b5035 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/chongzhi/ChongZhiActivity.kt @@ -0,0 +1,166 @@ +package com.yuyin.mier.module_my.chongzhi + +import android.annotation.SuppressLint +import android.os.Handler +import android.os.Message +import android.text.TextUtils +import androidx.databinding.ViewDataBinding +import com.alipay.sdk.app.PayTask +import com.tencent.mm.opensdk.modelpay.PayReq +import com.tencent.mm.opensdk.openapi.WXAPIFactory +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.R +import com.yuyin.mier.module_my.adapter.ChargeAdapter +import com.yuyin.mier.module_my.model.GoodsListBean +import com.yuyin.mier.module_my.model.PayResult +import kotlinx.android.synthetic.main.activity_chongzhi.* +import java.util.ArrayList + +class ChongZhiActivity : BaseDataBindingActivity() { + private lateinit var chargeAdapter: ChargeAdapter + + override fun startObserve() { + viewModel.goodsListData.observe(this, { + chargeAdapter.getList_adapter().clear() + chargeAdapter.getList_adapter().addAll(it) + chargeAdapter.notifyDataSetChanged() + }) + viewModel.alipay.observe(this, { + val payRunnable = Runnable { + val alipay = PayTask(this) + val result: Map = alipay.payV2( + it, + true + ) + val msg = Message() + msg.what = SDK_PAY_FLAG + msg.obj = result + mHandler.sendMessage(msg) + } + // 必须异步调用 + val payThread = Thread(payRunnable) + payThread.start() + }) + viewModel.weixin.observe(this, { + val mWxApi = WXAPIFactory.createWXAPI( + this,null) + // 将该app注册到微信 + mWxApi.registerApp("wx7b5c4e89e726a72c") + // 判断是否安装客户端 + if (!mWxApi.isWXAppInstalled) { + "请您先安装微信客户端!".showToast() + return@observe + } + val req = PayReq() + req.appId = "wx7b5c4e89e726a72c" // 微信开放平台审核通过的应用APPID + + req.partnerId = it.partnerid // 微信支付分配的商户号 + + req.prepayId = it.prepayid // 预支付订单号,app服务器调用“统一下单”接口获取 + + req.nonceStr = it.noncestr // 随机字符串,不长于32位 + + req.timeStamp = java.lang.String.valueOf(it.timestamp) // 时间戳 + + req.packageValue = it.packageX // 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值 + + req.sign = it.sign // 签名, + + // 调用微信SDK,发起支付,回调WxPayEntryActivity + mWxApi.sendReq(req) + }) + } + + override fun getLayoutId(): Int = R.layout.activity_chongzhi + + override fun initView() { + } + + override fun initData() { + chargeAdapter = ChargeAdapter(this) + myGrid.adapter = chargeAdapter + viewModel.loadData(UserManager.user.uid.toString()) + } + + override fun initEvent() { + textVx.setOnClickListener { + checkbox2.isChecked = true + checkbox.isChecked = false + } + textZfb.setOnClickListener { + checkbox2.isChecked = false + checkbox.isChecked = true + } + + myGrid.setOnItemClickListener { adapterView, view, position, l -> + val list_adapter: List = chargeAdapter.getList_adapter() + if (list_adapter[position].isSelect) { + } else { + for (list in list_adapter) { + list.isSelect = false + } + list_adapter[position].isSelect = true + chargeAdapter.notifyDataSetChanged() + } + } + btn_ok.setOnClickListener { + val list_adapter: List = chargeAdapter.getList_adapter() + val listNew: MutableList = ArrayList() + for (list in list_adapter) { + if (list.isSelect) { + listNew.add(list) + } + } + if (listNew.size > 0) { + if (checkbox2.isChecked) { + loadWxData(java.lang.String.valueOf(listNew[0].crid)) + } else if (checkbox.isChecked) { + loadZfbData(java.lang.String.valueOf(listNew[0].crid)) +// ToastUtil.showToast(context,"暂不支持") + } else if (!textVx.isSelected && !textZfb.isSelected) { + "请选择充值方式".showToast() + } + } else { + "请选择充值金额".showToast() + } + } + } + + private fun loadWxData(valueOf: String) { + viewModel.rechargeWxPay(UserManager.user.uid.toString(), valueOf, "2") + } + private fun loadZfbData(valueOf: String) { + viewModel.rechargePay(UserManager.user.uid.toString(), valueOf, "1") + } + private val SDK_PAY_FLAG = 1 + + @SuppressLint("HandlerLeak") + private val mHandler: Handler = object : Handler() { + override fun handleMessage(msg: Message) { + val payResult2 = PayResult(msg.obj as Map) + when (msg.what) { + SDK_PAY_FLAG -> { + val payResult = PayResult(msg.obj as Map) + + /** + * 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 + */ + val resultInfo: String = payResult.getResult() // 同步返回需要验证的信息 + val resultStatus: String = payResult.getResultStatus() + // 判断resultStatus 为9000则代表支付成功 + if (TextUtils.equals(resultStatus, "9000")) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + "支付成功".showToast() + } else { + // 失败。 + "支付失败,请重试".showToast() + } + } + else -> { + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/chongzhi/ChongZhiViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/chongzhi/ChongZhiViewModel.kt new file mode 100644 index 0000000..4c54846 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/chongzhi/ChongZhiViewModel.kt @@ -0,0 +1,38 @@ +package com.yuyin.mier.module_my.chongzhi + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.model.Wxmodel +import com.yuyin.mier.module_my.model.GoodsListBean +import com.yuyin.mier.repository.CommonRepository + +class ChongZhiViewModel : BaseViewModel() { + var repository = CommonRepository() + var weixin = MutableLiveData() + + var goodsListData = MutableLiveData>() + + fun loadData(uid: String) { + launchUI { + val result = repository.goodsList(uid) + goodsListData.value = result.data + } + } + + var alipay = MutableLiveData() + fun rechargePay(user_id: String, goods_id: String, type: String) { + launchUI { + val result = repository.rechargePay(user_id, goods_id, type) + alipay.value = result.data + } + } + + + fun rechargeWxPay(user_id: String, goods_id: String, type: String) { + launchUI { + val result = repository.rechargeWxPay(user_id, goods_id, type) + weixin.value = result.data + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/cp/CPActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/cp/CPActivity.kt new file mode 100644 index 0000000..a236ee9 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/cp/CPActivity.kt @@ -0,0 +1,65 @@ +package com.yuyin.mier.module_my.cp + +import android.view.View +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityCpBinding + + +class CPActivity : BaseDataBindingActivity() { + + override fun startObserve() { + + + viewModel.cpDetail.observe(this) { + + if (it.is_have_cp == 2) { + mDataBinding.emptyView.visibility = View.VISIBLE + mDataBinding.llCp.visibility = View.GONE + } else { + mDataBinding.emptyView.visibility = View.GONE + mDataBinding.llCp.visibility = View.VISIBLE + mDataBinding.cpLeftName.text = it.nick_name + mDataBinding.cpRightName.text = it.receive_nick_name + GlideUtil.loadImglogo(this, it.head_pic, mDataBinding.leftHead) + GlideUtil.loadImglogo(this, it.receive_head_pic, mDataBinding.rightHead) +// loadImage( mDataBinding.leftFrame, it.win_base_image,R.mipmap.) +// loadImage( mDataBinding.rightFrame, it.receive_win_base_image,) + mDataBinding.tvValue.text = it.now_value.toString()+"/"+it.next_value + if(it.is_online=="1"){ + mDataBinding.ivOnline.setImageResource(R.mipmap.online1) + }else{ + mDataBinding.ivOnline.setImageResource(R.mipmap.online2) + } + if(it.receive_is_online=="1"){ + mDataBinding.ivOnline2.setImageResource(R.mipmap.online1) + }else{ + mDataBinding.ivOnline2.setImageResource(R.mipmap.online2) + } + } + } + } + + + override fun getLayoutId(): Int { + return R.layout.activity_cp + } + + + override fun initView() { + } + + + override fun initData() { + viewModel.user_coupling_info(UserManager.user.uid.toString()) + } + + override fun initEvent() { + mDataBinding.ivRemoveCp.setOnClickListener { + + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/cp/CPViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/cp/CPViewModel.kt new file mode 100644 index 0000000..7b57dab --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/cp/CPViewModel.kt @@ -0,0 +1,21 @@ +package com.yuyin.mier.module_my.cp + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_my.model.CPDetailsBean +import com.yuyin.mier.repository.CommonRepository + +class CPViewModel : BaseViewModel() { + + private val repository = CommonRepository() + + + val cpDetail = MutableLiveData() + + fun user_coupling_info(uid: String) { + launchUI { + val result = repository.user_coupling_info(uid) + cpDetail.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/dengji/DengJiActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/dengji/DengJiActivity.kt new file mode 100644 index 0000000..02950ff --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/dengji/DengJiActivity.kt @@ -0,0 +1,98 @@ +package com.yuyin.mier.module_my.dengji + +import android.content.Intent +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.flyco.tablayout.listener.CustomTabEntity +import com.flyco.tablayout.listener.OnTabSelectListener +import com.yuyin.mier.BR +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityDjBinding +import com.yuyin.mier.module_my.tequan.TeQuanActivity +import com.yuyin.lib_base.arouter.AroutUtil.MY_COMM_DENGJI +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.mier.adapter.LeverListAdapter +import kotlinx.android.synthetic.main.activity_dj.* + +@Route(path = MY_COMM_DENGJI) +class DengJiActivity : BaseDataBindingActivity() { + + private val titleRes = ArrayList() //tab标题集合 + private val dataTab: ArrayList = ArrayList() //CommonTabLayout 所需数据集合 + private lateinit var leverListAdapter: LeverListAdapter + + override fun startObserve() { + viewModel.dengJiBeanData.observe(this) { + mDataBinding.setVariable(BR.data1, it.contribution_level_info) + mDataBinding.setVariable(BR.data2, it.charm_level_info) + mDataBinding.setVariable(BR.vm1, viewModel) + } + viewModel.lever.observe(this) { + + + leverListAdapter.setNewData(it.level_list) + + } + + } + + override fun getLayoutId(): Int = R.layout.activity_dj + + override fun initView() { + loadImage(mDataBinding.headImage, UserManager.user.head_pic, R.mipmap.ic_launcher_app) + loadImage(mDataBinding.headImage2, UserManager.user.head_pic, R.mipmap.ic_launcher_app) + mDataBinding.idd1.text = UserManager.user.nick_name + mDataBinding.idd2.text = UserManager.user.nick_name + titleRes.add("贡献等级介绍") + titleRes.add("魅力等级介绍") + + for (i in titleRes.indices) { + dataTab.add(object : CustomTabEntity { + override fun getTabTitle(): String { + return titleRes[i] + } + + override fun getTabSelectedIcon(): Int { + return 0 + } + + override fun getTabUnselectedIcon(): Int { + return 0 + } + }) + } + tab_layout.setTabData(dataTab) + tab_layout.setOnTabSelectListener(object : OnTabSelectListener { + override fun onTabSelect(position: Int) { + if (position == 0) { + viewModel.get_level_list("2") + } else { + viewModel.get_level_list("1") + } + } + + override fun onTabReselect(position: Int) {} + }) + + } + + override fun initData() { + viewModel.getUserLevelInfo() + viewModel.get_level_list("2") + + + mDataBinding.rvContainer.layoutManager = LinearLayoutManager(this) + leverListAdapter = LeverListAdapter() + mDataBinding.rvContainer.adapter = leverListAdapter + + } + + override fun initEvent() { + mDataBinding.tequan.setOnClickListener { + var intent = Intent(this, TeQuanActivity::class.java) + startActivity(intent) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/dengji/DengJiViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/dengji/DengJiViewModel.kt new file mode 100644 index 0000000..bb1916d --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/dengji/DengJiViewModel.kt @@ -0,0 +1,39 @@ +package com.yuyin.mier.module_my.dengji + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.App +import com.yuyin.lib_base.Const +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.ui.X5WebViewActivity +import com.yuyin.mier.module_home.model.LeverBean +import com.yuyin.mier.module_my.model.DengJiBean +import com.yuyin.mier.repository.CommonRepository + +class DengJiViewModel : BaseViewModel() { + private val repository = CommonRepository() + var dengJiBeanData: MutableLiveData = MutableLiveData() + + fun getUserLevelInfo() { + launchUI { + var result = repository.get_user_level_info() + dengJiBeanData.value = result.data + } + } + + fun goShuoMing() { + + App.instance?.baseContext?.let { X5WebViewActivity.forward(it, Const.PAGE_DENGJI, "等级说明") } + } + + + var lever = MutableLiveData() + fun get_level_list(type:String) { + launchUI { + var result = repository.get_level_list(type) + lever.value = result.data + + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/edituser/ModifyDataActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/edituser/ModifyDataActivity.kt new file mode 100644 index 0000000..3e366dd --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/edituser/ModifyDataActivity.kt @@ -0,0 +1,676 @@ +package com.yuyin.mier.module_my.edituser + +import android.Manifest +import android.annotation.SuppressLint +import android.app.AlertDialog +import android.content.Context +import android.content.DialogInterface +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.provider.Settings +import android.text.TextUtils +import android.view.View +import android.widget.ImageView +import androidx.annotation.RequiresApi +import androidx.recyclerview.widget.GridLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.baoyz.actionsheet.ActionSheet +import com.baoyz.actionsheet.ActionSheet.ActionSheetListener +import com.bigkoo.pickerview.builder.TimePickerBuilder +import com.bumptech.glide.Glide +import com.bumptech.glide.Priority +import com.bumptech.glide.request.RequestOptions +import com.luck.picture.lib.basic.PictureSelector +import com.luck.picture.lib.config.PictureConfig +import com.luck.picture.lib.engine.ImageEngine +import com.luck.picture.lib.entity.LocalMedia +import com.luck.picture.lib.style.PictureSelectorStyle +import com.lzy.imagepicker.ImagePicker +import com.lzy.imagepicker.bean.ImageItem +import com.lzy.imagepicker.ui.ImageGridActivity +import com.tbruyelle.rxpermissions2.RxPermissions +import com.tencent.imsdk.v2.V2TIMManager +import com.tencent.imsdk.v2.V2TIMUserFullInfo +import com.tencent.qcloud.tuicore.component.imageEngine.impl.GlideEngine +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_USER_INFO +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.model.Login +import com.yuyin.lib_base.util.PermissionsChecker +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.R +import com.yuyin.module_community.adapter.FBPicListAdapter +import com.yuyin.module_community.adapter.FullyGridLayoutManager +import com.yuyin.module_community.model.ImageItems +import kotlinx.android.synthetic.main.activity_modify_data.birthday +import kotlinx.android.synthetic.main.activity_modify_data.birthday_btn +import kotlinx.android.synthetic.main.activity_modify_data.head_image +import kotlinx.android.synthetic.main.activity_modify_data.id +import kotlinx.android.synthetic.main.activity_modify_data.ll_quanxian +import kotlinx.android.synthetic.main.activity_modify_data.rl_sex +import kotlinx.android.synthetic.main.activity_modify_data.sex +import kotlinx.android.synthetic.main.activity_modify_data.sor_release_rv +import kotlinx.android.synthetic.main.activity_modify_data.textSend +import kotlinx.android.synthetic.main.activity_modify_data.tv_aihao +import kotlinx.android.synthetic.main.activity_modify_data.tv_baocun +import kotlinx.android.synthetic.main.activity_modify_data.tv_qianming +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import org.litepal.LitePal +import java.io.File +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Date +import java.util.Locale +import java.util.TimeZone + + +@Route(path = MAIN_MY_USER_INFO) +class ModifyDataActivity : BaseActivity() { + private var startDate: Calendar = Calendar.getInstance() + private var endDate: Calendar = Calendar.getInstance() + private var seleteDate: Calendar = Calendar.getInstance() + var permissionListTmp = arrayOf( + Manifest.permission.CAMERA, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE + ) + + //图片 + val REQUEST_CODE_SELECT = 100 + val REQUEST_CODE_SELEC2 = 101 + private var sexStr: String = "" + private var nowDate: String = "" + + private var maxSelectNum = 9 //最多显示的图片数量 + override fun startObserve() { + //绑定数据 + viewModel.userInfoData.observe(this) { + loadImage(head_image, it.head_pic, R.mipmap.ic_launcher_app) + //昵称 + textSend.setText(it.nick_name) + //性别 + sexStr = it.sex + if (it.sex == "1") { + sex.text = "男" + } else { + sex.text = "女" + } + //ID号 + id.text = it.uid + //出生日期 + birthday.text = it.birthday + imgString = it.head_pic + tv_qianming.setText(it.autograph) + tv_aihao.setText(it.hobby) + + } + viewModel.editFinish.observe(this) { + "修改成功".showToast() + var login = LitePal.findFirst(Login::class.java) + login.nick_name = it.nick_name + login.head_pic = it.head_pic + login.save() + UserManager.initData() + val info = V2TIMUserFullInfo() + info.setNickname(it.nick_name) + info.faceUrl = it.head_pic + V2TIMManager.getInstance().setSelfInfo(info, null) + finish() + } + viewModel.imgListData.observe(this) { + if (it.isEmpty()) return@observe + val nickname = textSend.text.toString().trim() + val birthDay = birthday.text.toString().trim() + val qianming = tv_qianming.text.toString().trim() + val aihao = tv_aihao.text.toString().trim() + imgString = it[0] + viewModel.editUserInfo( + imgString, + nickname, + sexStr, + birthDay, + qianming, + aihao + ) + } + } + + override fun getLayoutId(): Int = R.layout.activity_modify_data + + override fun initView() { + } + + override fun initData() { + + + adapter = FBPicListAdapter() + val manager = FullyGridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false) + sor_release_rv.layoutManager = manager + sor_release_rv.adapter = adapter + imageListAll2.add(ImageItems(2, ImageItem())) + adapter.setNewData(imageListAll2) + + viewModel.loadUserInfo() + } + + override fun initEvent() { + rl_sex.setOnClickListener { + ActionSheet.createBuilder(this, supportFragmentManager) + .setCancelButtonTitle("取消") + .setOtherButtonTitles("男", "女") + .setCancelableOnTouchOutside(true) + .setListener(object : ActionSheetListener { + override fun onDismiss(actionSheet: ActionSheet, isCancel: Boolean) {} + override fun onOtherButtonClick(actionSheet: ActionSheet, index: Int) { + when (index) { + 0 -> { + sexStr = "1" + sex.text = "男" + } + + 1 -> { + sexStr = "2" + sex.text = "女" + } + } + } + }).show() + } + tv_baocun.setOnClickListener { + val nickname = textSend.text.toString().trim() + if (TextUtils.isEmpty(nickname)) { + "昵称为空".showToast() + return@setOnClickListener + } + val birthDay = birthday.text.toString().trim() + if (TextUtils.isEmpty(birthDay)) { + "生日为空".showToast() + return@setOnClickListener + } + val qianming = tv_qianming.text.toString().trim() + if (TextUtils.isEmpty(qianming)) { + "签名不能为空".showToast() + return@setOnClickListener + } + val aihao = tv_aihao.text.toString().trim() + if (TextUtils.isEmpty(aihao)) { + "爱好不能为空".showToast() + return@setOnClickListener + } +// if (tempList.size == 0) { + if (selImageList.size == 0) { + viewModel.editUserInfo( + imgString, + nickname, + sexStr, + birthDay, + qianming, + aihao + ) + } else { + uploadFile(selImageList[0].path) + } +// }else{ +// uploadFile(tempList[0].path) +// } + } + head_image.setOnClickListener { +// showImgPop() +// var my :GlideEngine + PictureSelector.create(this) + .openGallery(1) + .setImageEngine(TUIEngine()) + .setSelectorUIStyle(PictureSelectorStyle()) + .isGif(false) + .setMaxSelectNum(1) + .isPreviewImage(true) + .isDisplayCamera(true) + .isOriginalSkipCompress(true) + .forResult(REQUEST_CODE_SELECT) //结果回调onActivityResult code + } + birthday_btn.setOnClickListener { + val string = birthday.text.toString() + val timeYmd: String = getTimeYmd() + val split1 = string.split("-".toRegex()).toTypedArray() + val split = timeYmd.split("-".toRegex()).toTypedArray() + startDate.set(1900, 0, 1) + try { + endDate.set(split[0].toInt(), split[1].toInt() - 1, split[2].toInt()) + } catch (e: NumberFormatException) { + e.printStackTrace() + } + try { + seleteDate.set(split1[0].toInt(), split1[1].toInt() - 1, split1[2].toInt()) + } catch (e: NumberFormatException) { + e.printStackTrace() + } + val pvTime = TimePickerBuilder( + this@ModifyDataActivity + ) { date, _ -> + if (date != null) { + nowDate = getNowDate(date) + birthday.text = nowDate + } + } + .setRangDate(startDate, endDate) + .setDate(seleteDate) + .build() + pvTime.show() + } + + adapter.setOnItemClickListener { adapter2, view, position -> +// var mPermissionsChecker = PermissionsChecker(this@ModifyDataActivity) +// if (mPermissionsChecker!!.lacksPermissions(*permissionListTmp)) { +// ll_quanxian.visibility = View.VISIBLE +// } else { +// ll_quanxian.visibility = View.GONE +// } + + if (adapter.data[position].type == 2) { + + PictureSelector.create(this) + .openGallery(1) + .setImageEngine(TUIEngine()) + .setSelectorUIStyle(PictureSelectorStyle()) + .isGif(false) + .setMaxSelectNum(9) + .isPreviewImage(true) + .isDisplayCamera(true) + .isOriginalSkipCompress(true) + .forResult(REQUEST_CODE_SELEC2) //结果回调onActivityResult code + +// var numss = 9 - (adapter.data.size - 1) +// if (numss > 3) numss = 3 +// val rxPermissions = RxPermissions(this) +// val finalNumss = numss +// rxPermissions +// .request( +// Manifest.permission.CAMERA, +// Manifest.permission.WRITE_EXTERNAL_STORAGE, +// Manifest.permission.READ_MEDIA_IMAGES +// ) +// .subscribe { granted: Boolean -> +// if (granted) { // Always true pre-M +// // 跳转到相册 +// ll_quanxian.visibility = View.GONE +// ImagePicker.getInstance().selectLimit = finalNumss +// ImagePicker.getInstance().isMultiMode = true +// ImagePicker.getInstance().isCrop = false +// val intent = Intent(this, ImageGridActivity::class.java) +// //显示选中的图片 +// startActivityForResult(intent, REQUEST_CODE_SELEC2) +// } else { +// ll_quanxian.visibility = View.GONE +// AlertDialog.Builder(this@ModifyDataActivity) +// .setMessage("需要存储权限来访问相册") +// .setPositiveButton("去设置") { dialog, which -> +// val intent: Intent = +// Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) +// val uri = Uri.fromParts("package", packageName, null) +// intent.setData(uri) +// startActivity(intent) +// } +// .setNegativeButton("取消", null) +// .show() +// } +// } + } + } + + + +// adapter.setOnItemClickListener { adapter2, view, position -> +// // 在这里调用 checkStoragePermission 检查权限 +// if (!checkStoragePermission()) { +// // 如果权限不足,显示权限提示布局 +// ll_quanxian.visibility = View.VISIBLE +// "请授予存储权限以选择图片".showToast() +// return@setOnItemClickListener +// } +// +// var mPermissionsChecker= PermissionsChecker(this@ModifyDataActivity) +// if (mPermissionsChecker!!.lacksPermissions(*permissionListTmp)) { +// ll_quanxian.visibility= View.VISIBLE +// }else{ +// ll_quanxian.visibility= View.GONE +// } +// if (adapter.data[position].type == 2) { +// var numss = 9 - (adapter.data.size - 1) +// if (numss > 3) numss = 3 +// val rxPermissions = RxPermissions(this) +// val finalNumss = numss +// rxPermissions +// .request(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) +// .subscribe { granted: Boolean -> +// if (granted) { // Always true pre-M +// // 跳转到相册 +// ll_quanxian.visibility= View.GONE +// ImagePicker.getInstance().selectLimit = finalNumss +// ImagePicker.getInstance().isMultiMode = true +// ImagePicker.getInstance().isCrop = false +// val intent = Intent(this, ImageGridActivity::class.java) +// //显示选中的图片 +// startActivityForResult(intent, REQUEST_CODE_SELEC2) +// }else{ +// ll_quanxian.visibility= View.GONE +// } +// } +// } +// } + adapter.setOnItemChildClickListener { adapter, view, position -> + when (view.id) { + R.id.iv_del -> { + try { + tempList.removeAt(position) + imageListAll1.removeAt(position) + imageListAll2 = imageListAll1 + if (tempList.size == maxSelectNum - 1) { + imageListAll2.add(ImageItems(2, ImageItem())) + adapter.setNewData(imageListAll2) + } else { + adapter.notifyDataSetChanged() + } + } catch (e: Exception) { + e.printStackTrace() + } + + + } + } + } + } + + class TUIEngine : ImageEngine { + override fun loadImage(context: Context, url: String, imageView: ImageView) { + GlideEngine.loadImage(imageView, url) + } + + override fun loadImage( + context: Context?, + imageView: ImageView?, + url: String?, + maxWidth: Int, + maxHeight: Int + ) { + if (imageView != null) { + Glide.with(context!!) + .load(url) + .apply( + RequestOptions() + .override(maxWidth, maxHeight) + .priority(Priority.HIGH) + .fitCenter() + ) + .into(imageView) + } + } + + override fun loadAlbumCover(context: Context, url: String, imageView: ImageView) { + GlideEngine.loadImage(imageView, url) + } + + override fun loadGridImage(context: Context, url: String, imageView: ImageView) { + GlideEngine.loadImage(imageView, url) + } + + override fun pauseRequests(context: Context) { + // GlideEngine中没有对应方法,可以留空 + } + + override fun resumeRequests(context: Context) { + // GlideEngine中没有对应方法,可以留空 + } + + fun clearMemory(context: Context) { + // 可以调用Glide的清理方法 + Glide.get(context).clearMemory() + } + + fun loadPreImage(context: Context, url: String, imageView: ImageView) { + GlideEngine.loadImage(imageView, url) + } + + + } + + private fun uploadFile(pic: String) { + val parts = ArrayList() + val listPos: MutableList = ArrayList() +// if (tempList.size != 0){ +// for (i in tempList.indices) { +// val file = File(tempList[i].path) +// val requestFile = +// RequestBody.create("multipart/form-data".toMediaTypeOrNull(), file) +// val body = MultipartBody.Part.createFormData("file[]", file.name, requestFile) +// parts.add(body) +// listPos.add(i) +// } +// } + if (!TextUtils.isEmpty(pic)) { + val file2 = File(pic) + val requestFile2 = RequestBody.create("multipart/form-data".toMediaTypeOrNull(), file2) + val body2 = MultipartBody.Part.createFormData("file[]", file2.name, requestFile2) + parts.add(body2) + listPos.add(1) + } + if (parts.size != 0) { + + viewModel.uploadImages(parts) + } + } + + //图片的弹窗 + private fun showImgPop() { + ActionSheet.createBuilder(this, supportFragmentManager) + .setCancelButtonTitle("取消") + .setOtherButtonTitles("拍照", "从手机选择") + .setCancelableOnTouchOutside(true) + .setListener(object : ActionSheetListener { + override fun onDismiss(actionSheet: ActionSheet, isCancel: Boolean) {} + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + @SuppressLint("CheckResult") + override fun onOtherButtonClick(actionSheet: ActionSheet, index: Int) { + var mPermissionsChecker = PermissionsChecker(this@ModifyDataActivity) + if (mPermissionsChecker!!.lacksPermissions(*permissionListTmp)) { + ll_quanxian.visibility = View.VISIBLE + } else { + ll_quanxian.visibility = View.GONE + } + val rxPermissions = RxPermissions(this@ModifyDataActivity) + rxPermissions + .request( + Manifest.permission.CAMERA, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE, + Manifest.permission.READ_MEDIA_IMAGES + ) + .subscribe { granted: Boolean -> + if (granted) { // Always true pre-M + ll_quanxian.visibility = View.GONE + when (index) { + 0 -> { + //相机 + ImagePicker.getInstance().isCrop = true + val intent = Intent( + this@ModifyDataActivity, + ImageGridActivity::class.java + ) + intent.putExtra( + ImageGridActivity.EXTRAS_TAKE_PICKERS, + true + ) // 是否是直接打开相机 + startActivityForResult( + intent, + REQUEST_CODE_SELECT + ) + } + + 1 -> { + // 跳转到相册 + // Always true pre-M + // 跳转到相册 + ImagePicker.getInstance().selectLimit = 1 + ImagePicker.getInstance().isMultiMode = false + ImagePicker.getInstance().isCrop = true + ImagePicker.getInstance().isShowCamera = true + val intent = Intent( + this@ModifyDataActivity, + ImageGridActivity::class.java + ) + //显示选中的图片 + //显示选中的图片 + startActivityForResult( + intent, + REQUEST_CODE_SELECT + ) + } + } + + } else { + ll_quanxian.visibility = View.GONE + AlertDialog.Builder(this@ModifyDataActivity) + .setMessage("需要存储权限来访问相册") + .setPositiveButton("去设置") { dialog: DialogInterface?, which: Int -> + val intent = + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + val uri = Uri.fromParts("package", packageName, null) + intent.setData(uri) + startActivity(intent) + } + .setNegativeButton("取消", null) + .show() + } + } + + } + }).show() + } + + + private fun getNowDate(date: Date): String { + val formatter = SimpleDateFormat("yyyy-MM-dd") + return formatter.format(date) + } + + /** + * 获取当前时间 + * + * @return + */ + private fun getTimeYmd(): String { + val date = Date() // 创建一个时间对象,获取到当前的时间 + val sdf = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) // 设置时间显示格式 + sdf.timeZone = TimeZone.getTimeZone("GMT+8") + return sdf.format(date) + } + /*-----------------------图片选择回调------------------------------*/ + + private val selImageList = ArrayList() + private var imgString = "" + + private var tempList: ArrayList = ArrayList() + private lateinit var adapter: FBPicListAdapter + private var imageListAll1 = ArrayList() + private var imageListAll2 = ArrayList() + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (data == null) { + return + } +// val tempList: ArrayList? +// if (resultCode == RESULT_OK && data != null) { +// //添加图片返回 +// if (requestCode == REQUEST_CODE_SELECT) { +//// tempList = +//// data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS) as ArrayList? +// tempList = PictureSelector.obtainSelectorList(data) as ArrayList? +// if (tempList == null) { +// return +// } +// selImageList.clear() +// selImageList.addAll(tempList) +// if (selImageList.size > 0) { +// Glide.with(this).load(selImageList[0].path).into(head_image) +// } +// } else if (requestCode == REQUEST_CODE_SELEC2) { +// tempList = +// data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS) as ArrayList? +// if (tempList == null) { +// return +// } +// +// adapter.data.clear() +// for (i in tempList.indices) { +// imageListAll1.add(ImageItems(1, tempList[i])) +// } +// +// imageListAll2 = imageListAll1 +// if (imageListAll2.size < maxSelectNum) { +// imageListAll2.add(ImageItems(2, ImageItem())) +// } +// +// adapter.setNewData(imageListAll2) +// } +// } + if (resultCode == RESULT_OK && data != null) { + //添加图片返回 + if (requestCode == REQUEST_CODE_SELECT) { + // 处理 PictureSelector 返回的结果 + val localMediaList: ArrayList = PictureSelector.obtainSelectorList(data) + + // 清空原有选择 + selImageList.clear() + + // 将 LocalMedia 转换为 ImageItem + for (localMedia in localMediaList) { + val imageItem = ImageItem() + imageItem.path = localMedia.realPath // 或者使用 localMedia.compressPath + + selImageList.add(imageItem) + } + + if (selImageList.size > 0) { + Glide.with(this).load(selImageList[0].path).into(head_image) + } + } else if (requestCode == REQUEST_CODE_SELEC2) { + // 处理 ImagePicker 返回的结果 + val localMediaList: ArrayList = PictureSelector.obtainSelectorList(data) + +// val tempList = data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS) as ArrayList? +// if (tempList == null) { +// return +// } + + + adapter.data.clear() +// for (i in tempList.indices) { +// imageListAll1.add(ImageItems(1, tempList[i])) +// } + tempList.clear() + for (localMedia in localMediaList) { + val imageItem = ImageItem() + imageItem.path = localMedia.realPath + tempList.add(imageItem) + imageListAll1.add(ImageItems(1, imageItem)) + } + + imageListAll2 = imageListAll1 + if (imageListAll2.size < maxSelectNum) { + imageListAll2.add(ImageItems(2, ImageItem())) + } + + adapter.setNewData(imageListAll2) + } + } + } + + override fun onDestroy() { + super.onDestroy() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/edituser/ModifyDataViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/edituser/ModifyDataViewModel.kt new file mode 100644 index 0000000..58582d7 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/edituser/ModifyDataViewModel.kt @@ -0,0 +1,27 @@ +package com.yuyin.mier.module_my.edituser + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_my.model.UserInfoBean +import com.yuyin.mier.repository.CommonRepository +import java.net.URLEncoder + +class ModifyDataViewModel : BaseViewModel() { + var repository = CommonRepository() + var editFinish = MutableLiveData() + //修改资料 + fun editUserInfo( + img: String, + nickname: String, + sex: String, + birthday: String, + autograph: String, + hobby: String + ) { + launchUI { + var data = + repository.setUserInfo(img, nickname, sex, birthday, "",autograph,hobby) + editFinish.value = data.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/feedback/FeedBackActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/feedback/FeedBackActivity.kt new file mode 100644 index 0000000..e607876 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/feedback/FeedBackActivity.kt @@ -0,0 +1,42 @@ +package com.yuyin.mier.module_my.feedback + +import android.text.TextUtils +import com.alibaba.android.arouter.facade.annotation.Route +import com.yuyin.lib_base.arouter.AroutUtil.MY_COMM_FEEDBACK +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.activity_feedback.* + +@Route(path = MY_COMM_FEEDBACK) +class FeedBackActivity : BaseActivity() { + override fun startObserve() { + viewModel.feedbackData.observe(this, { + "提交成功".showToast() + finish() + }) + } + + override fun getLayoutId(): Int = R.layout.activity_feedback + + override fun initView() { + } + + override fun initData() { + } + + override fun initEvent() { + butt_ok.setOnClickListener { + if (TextUtils.isEmpty(et_content.text.toString().trim())) { + "请填写您的反馈建议".showToast() + } else { + viewModel.feedBack( + UserManager.user.uid.toString(), + et_content.text.toString().trim() + ) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/feedback/FeedBackViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/feedback/FeedBackViewModel.kt new file mode 100644 index 0000000..090d726 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/feedback/FeedBackViewModel.kt @@ -0,0 +1,17 @@ +package com.yuyin.mier.module_my.feedback + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.repository.CommonRepository + +class FeedBackViewModel : BaseViewModel() { + private val repository = CommonRepository() + var feedbackData: MutableLiveData = MutableLiveData() + + fun feedBack(userID: String, content: String) { + launchUI { + var result = repository.feedBack(userID, content) + feedbackData.value = "成功" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/deatile/GHBuTieActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/deatile/GHBuTieActivity.kt new file mode 100644 index 0000000..4977d00 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/deatile/GHBuTieActivity.kt @@ -0,0 +1,30 @@ +package com.yuyin.mier.module_my.gh.deatile + +import com.yuyin.lib_base.Const +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityGonghuiButieBinding +import com.yuyin.mier.module_my.gh.home.GHHomeViewModel +import kotlinx.android.synthetic.main.activity_gonghui_butie.* + +class GHBuTieActivity : + BaseDataBindingActivity() { + override fun startObserve() { + + } + + override fun getLayoutId(): Int= R.layout.activity_gonghui_butie + + override fun initView() { + webview.loadUrl(Const.GH_BUTIE) + title3.text="上周流水:"+intent.getStringExtra("last_week_income") + title4.text="本周流水:"+intent.getStringExtra("this_week_income") + title5.text="上周收益:"+intent.getStringExtra("last_week_income_money") + } + + override fun initData() { + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/deatile/GongHuiDeatileActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/deatile/GongHuiDeatileActivity.kt new file mode 100644 index 0000000..0b59a7b --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/deatile/GongHuiDeatileActivity.kt @@ -0,0 +1,203 @@ +package com.yuyin.mier.module_my.gh.deatile + +import android.content.Intent +import android.text.TextUtils +import android.view.View +import android.widget.RelativeLayout +import android.widget.TextView +import com.alibaba.android.arouter.launcher.ARouter +import com.blankj.utilcode.util.ClipboardUtils +import com.kongzue.dialog.util.BaseDialog +import com.kongzue.dialog.v3.CustomDialog +import com.yuyin.lib_base.App +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.lib_base.util.TimeUtil +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityGonghuiDeatileBinding +import com.yuyin.mier.module_my.gh.home.GHHomeActivity +import com.yuyin.mier.module_my.gh.home.GHHomeViewModel +import com.yuyin.mier.module_my.gh.shenqing.GHSQActivity +import kotlinx.android.synthetic.main.activity_gh_home.flADD +import kotlinx.android.synthetic.main.activity_gonghui_deatile.* + +class GongHuiDeatileActivity : + BaseDataBindingActivity() { + var money = "0" + private var guild_id = "" + + override fun startObserve() { + viewModel.userInfoData.observe(this) { + App.guild_id = it.guild_id + } + viewModel.guildInfoBean.observe(this) { + money = it.money + if (TextUtils.isEmpty(it.intro)) { + tv_ghjj.text = "暂无简介" + } else { + tv_ghjj.text = it.intro + } + GlideUtil.loadImglogo(this, it.cover, iv_gh_img) + tv_guild_name.text = it.guild_name + tv_gh_id.text = + if (it.guild_special_id == "0") "ID:" + it.id else "ID:" + it.guild_special_id + tv_gh_num.text = it.num + tv_add_time.text = "创建时间:" + TimeUtil.toDateYmd(it.add_time) + tv_gxz.text = it.contribution_value + tv_ghhz.text = it.ghz.nick_name + GlideUtil.loadImglogo(this, it.ghz.head_pic, hz_head) + if (it.ghz.noblity_image.isNotEmpty()) { + GlideUtil.loadImglogo(this, it.ghz.noblity_image, iv_juewei) + } + if (it.ghz.contribution_level_image.isNotEmpty()) { + GlideUtil.loadImglogo(this, it.ghz.contribution_level_image, iv_gongxian) + } + if (it.ghz.charm_level_image.isNotEmpty()) { + GlideUtil.loadImglogo(this, it.ghz.charm_level_image, iv_meili) + } + + if (it.ghz.uid == UserManager.user.uid.toString()) { + tv_gh_butie.visibility = View.VISIBLE + out.visibility = View.GONE + add.visibility = View.GONE + jiesan.visibility = View.VISIBLE +// tv_title2.visibility=View.VISIBLE + } + } + } + + override fun getLayoutId(): Int = R.layout.activity_gonghui_deatile + + override fun initView() { + guild_id = intent.getStringExtra("ghID").toString() + viewModel.get_the_guild_info(guild_id) + if (guild_id == App.guild_id) { + out.visibility = View.VISIBLE + } else { + add.visibility = View.VISIBLE + } + } + + override fun initData() { + } + + override fun onResume() { + super.onResume() + viewModel.loadUserInfo() + } + + override fun initEvent() { + ll_go_info.setOnClickListener { + ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE) + .withString("from_id", viewModel.guildInfoBean.value!!.uid) + .navigation() + } + tv_copy.setOnClickListener { + if (viewModel.guildInfoBean.value!!.guild_special_id == "0") { + ClipboardUtils.copyText(viewModel.guildInfoBean.value!!.id) + "复制成功".showToast() + } else { + ClipboardUtils.copyText(viewModel.guildInfoBean.value!!.guild_special_id) + "复制成功".showToast() + } + } + //申请列表 + tv_title2.setOnClickListener { + var intent = Intent(this, GHSQActivity::class.java) + startActivity(intent) + } + tv_gh_fj.setOnClickListener { + var intent = Intent(this, GHHomeActivity::class.java) + intent.putExtra("ghID", guild_id) + intent.putExtra("type", "room") + startActivity(intent) + } + tv_gh_ren.setOnClickListener { + var intent = Intent(this, GHHomeActivity::class.java) + intent.putExtra("ghID", guild_id) + intent.putExtra("type", "people") + startActivity(intent) + } + tv_gh_butie.setOnClickListener { + var intent = Intent(this, GHBuTieActivity::class.java) + intent.putExtra("last_week_income", viewModel.guildInfoBean.value!!.last_week_income) + intent.putExtra("this_week_income", viewModel.guildInfoBean.value!!.this_week_income) + intent.putExtra( + "last_week_income_money", + viewModel.guildInfoBean.value!!.last_week_income_money + ) + startActivity(intent) + } + + + add.setOnClickListener { + flADD.visibility = View.VISIBLE + } + no1.setOnClickListener { + flADD.visibility = View.GONE + } + sure1.setOnClickListener { + viewModel.join_guild(guild_id) + flADD.visibility = View.GONE + } + out.setOnClickListener { + val dialog = + CustomDialog.build( + this, + R.layout.dialog_gh_exit + ) { dialog, v -> + var cancel = v?.findViewById(R.id.tv_cancel) + var confirm = v?.findViewById(R.id.tv_confirm) + var tv_content = v?.findViewById(R.id.tv_content) + tv_content?.text = + "退出公会需要支付${money}金币,退出公会20天不能加入别的公会!您确定要退出吗?" + cancel?.setOnClickListener { + dialog?.doDismiss() + } + confirm?.setOnClickListener { + viewModel.quit_guild(intent.getStringExtra("ghID").toString()) + finish() + dialog?.doDismiss() + } + } + val layoutParams = RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.MATCH_PARENT, + RelativeLayout.LayoutParams.WRAP_CONTENT + ) + dialog?.customLayoutParams = layoutParams + dialog?.align = BaseDialog.ALIGN.DEFAULT + dialog?.show() + } + + jiesan.setOnClickListener { + val dialog = + CustomDialog.build( + this, + R.layout.dialog_gh_exit + ) { dialog, v -> + var cancel = v?.findViewById(R.id.tv_cancel) + var confirm = v?.findViewById(R.id.tv_confirm) + var tv_content = v?.findViewById(R.id.tv_content) + tv_content?.text = "确定解散此公会吗?" + cancel?.setOnClickListener { + dialog?.doDismiss() + } + confirm?.setOnClickListener { + viewModel.diss_guild(guild_id) + finish() + dialog?.doDismiss() + } + } + val layoutParams = RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.MATCH_PARENT, + RelativeLayout.LayoutParams.WRAP_CONTENT + ) + dialog?.customLayoutParams = layoutParams + dialog?.align = BaseDialog.ALIGN.DEFAULT + dialog?.show() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/home/GHHomeActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/home/GHHomeActivity.kt new file mode 100644 index 0000000..dc14072 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/home/GHHomeActivity.kt @@ -0,0 +1,202 @@ +package com.yuyin.mier.module_my.gh.home + +import android.content.Intent +import android.view.View +import android.widget.RelativeLayout +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager +import com.blankj.utilcode.util.LogUtils +import com.flyco.tablayout.listener.CustomTabEntity +import com.flyco.tablayout.listener.OnTabSelectListener +import com.kongzue.dialog.util.BaseDialog +import com.kongzue.dialog.v3.CustomDialog +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityGhHomeBinding +import com.yuyin.mier.module_my.gh.home.sub1.GHHomeFragment +import com.yuyin.mier.module_my.gh.home.sub1.GHHomeFragment2 +import com.yuyin.mier.module_my.gh.shenqing.GHSQActivity +import com.yuyin.lib_base.App +import com.yuyin.lib_base.Const +import com.yuyin.lib_base.adapter.MyPagerAdapter +import com.yuyin.lib_base.base.BaseDataBindingActivity +import kotlinx.android.synthetic.main.activity_gh_home.* + +class GHHomeActivity : BaseDataBindingActivity() { + private val fsRes: ArrayList = ArrayList() //fragment集合 + private val titleRes = ArrayList() //tab标题集合 + private val dataTab: MutableList = + ArrayList() //CommonTabLayout 所需数据集合 +// lateinit var baseIndicatorAdapter: BaseIndicatorAdapter +var money = "0" + override fun startObserve() { + viewModel.ghSet.observe(this) { +// tvTitle.text = it.guild_name + money=it.quit_money + LogUtils.e("is_deacon"+it.is_deacon) + if (it.is_deacon == "1") { +// tvSQ.visibility = View.VISIBLE + Const.GH_REMOVE = true +//// out.visibility = View.GONE + } else { +// tvSQ.visibility = View.GONE + Const.GH_REMOVE = false + } + + //is_join_guild 1 加入 2 未加入 +// if (it.is_join_guild == "1") { +// add.visibility = View.GONE +// out.visibility = View.VISIBLE +// } else { +// add.visibility = View.VISIBLE +// out.visibility = View.GONE +// } + } + viewModel.ghListBean2.observe(this) { + if (it.size > 0 && tvSQ.visibility==View.VISIBLE) { + mDataBinding.tvNum.visibility = View.VISIBLE + mDataBinding.tvNum.text = it.size.toString() + } else { + mDataBinding.tvNum.visibility = View.GONE + } + } + } + + override fun getLayoutId(): Int = R.layout.activity_gh_home + var ghID = "" + override fun initView() { + ghID = intent.getStringExtra("ghID").toString() +// var ghName = intent.getStringExtra("ghName").toString() +// +// if (ghID == App.guild_id) { +// add.visibility = View.GONE +// out.visibility = View.VISIBLE +// } else { +// add.visibility = View.VISIBLE +// out.visibility = View.GONE +// } + + + titleRes.add("公会成员") + titleRes.add("公会房间") + fsRes.add(GHHomeFragment2.getInstance(ghID)) + fsRes.add(GHHomeFragment.getInstance(ghID)) + + //设置数据 + view_pager.adapter = MyPagerAdapter( + supportFragmentManager, fsRes, titleRes + ) + mDataBinding.tabLayout.setViewPager(mDataBinding.viewPager) + + +// mDataBinding.rvContainer.layoutManager = GridLayoutManager(this, 2) +// baseIndicatorAdapter = BaseIndicatorAdapter() +// mDataBinding.rvContainer.adapter = baseIndicatorAdapter +// baseIndicatorAdapter.setNewData(titleRes) + +// baseIndicatorAdapter.setOnItemClickListener { adapter, view, position -> +// baseIndicatorAdapter.setSelectPosition(position) +// view_pager.currentItem = position +// } + initListener() +// viewModel.get_apply_guild_list(getMap()) + viewModel.user_is_deacon(intent.getStringExtra("ghID").toString()) + if(intent.getStringExtra("type").toString()=="room"){ + view_pager.currentItem=1 + tvTitle.text ="公会房间" + }else{ + view_pager.currentItem=0 + tvTitle.text ="公会人员" + } + } + + override fun initData() { + + } + + override fun initEvent() { + tvSQ.setOnClickListener { + var intent = Intent(this, GHSQActivity::class.java) + startActivity(intent) + } + add.setOnClickListener { + flADD.visibility = View.VISIBLE + } + out.setOnClickListener { + val dialog = + CustomDialog.build( + this, + R.layout.dialog_gh_exit + ) { dialog, v -> + var cancel = v?.findViewById(R.id.tv_cancel) + var confirm = v?.findViewById(R.id.tv_confirm) + var tv_content = v?.findViewById(R.id.tv_content) + tv_content?.text = "退出公会需要支付${money}金币,退出公会20天不能加入别的公会!您确定要退出吗?" + cancel?.setOnClickListener { + dialog?.doDismiss() + } + confirm?.setOnClickListener { + viewModel.quit_guild(intent.getStringExtra("ghID").toString()) + finish() + dialog?.doDismiss() + } + } + val layoutParams = RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.MATCH_PARENT, + RelativeLayout.LayoutParams.WRAP_CONTENT + ) + dialog?.customLayoutParams = layoutParams + dialog?.align = BaseDialog.ALIGN.DEFAULT + dialog?.show() + } + flADD.setOnClickListener { + flADD.visibility = View.GONE + } + sure1.setOnClickListener { + viewModel.join_guild(intent.getStringExtra("ghID").toString()) + flADD.visibility = View.GONE + } + + } + + /**quit_guild + * 初始化监听 + */ + private fun initListener() { + //TabLayout监听 + tab_layout.setOnTabSelectListener(object : OnTabSelectListener { + override fun onTabSelect(position: Int) { + //显示相应的item界面 + view_pager.currentItem = position + if(position==0){ + tab_layout.setBackgroundResource(R.mipmap.gh_tab1) + }else{ + tab_layout.setBackgroundResource(R.mipmap.gh_tab2) + } + } + + override fun onTabReselect(position: Int) {} + }) + //ViewPager监听 + view_pager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrolled(i: Int, v: Float, i1: Int) {} + override fun onPageSelected(i: Int) { + //设置相应选中图标和颜色 + tab_layout.currentTab = i +// baseIndicatorAdapter.setSelectPosition(i) + + } + + override fun onPageScrollStateChanged(i: Int) {} + }) + //设置默认第0个 + view_pager.currentItem = 0 + } + + fun getMap(): HashMap { + var map = HashMap() + map["page"] = 1.toString() + map["guild_id"] = App.guild_id + return map + } +} diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/home/GHHomeViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/home/GHHomeViewModel.kt new file mode 100644 index 0000000..e06fdc8 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/home/GHHomeViewModel.kt @@ -0,0 +1,67 @@ +package com.yuyin.mier.module_my.gh.home + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.module_home.model.GHDeatileBean +import com.yuyin.mier.module_home.model.GHSet +import com.yuyin.mier.module_home.model.GHUserListBean +import com.yuyin.mier.repository.CommonRepository + +class GHHomeViewModel : BaseViewModel() { + var repository = CommonRepository() + var ghListBean = MutableLiveData() + var ghSet = MutableLiveData() + + fun join_guild(guild_id: String) { + launchUI { + var result = repository.join_guild(guild_id) + ghListBean.value = result.data + if (result.code==200){ + result.msg.showToast() + } + } + } + + fun user_is_deacon(guild_id: String) { + launchUI { + var result = repository.user_is_deacon(guild_id) + ghSet.value = result.data + } + } + + fun quit_guild(guild_id: String) { + launchUI { + var result = repository.quit_guild(guild_id) + ghListBean.value = result.data + if (result.code==200){ + result.msg.showToast() + } + } + } + + var ghListBean2 = MutableLiveData>() + fun get_apply_guild_list(map: MutableMap) { + launchUI { + var result = repository.get_apply_guild_list(map) + ghListBean2.value = result.data.list + } + } + + var guildInfoBean = MutableLiveData() + fun get_the_guild_info(guild_id: String) { + launchUI { + var result = repository.get_the_guild_info(guild_id) + guildInfoBean.value=result.data + } + } + + fun diss_guild(guild_id: String) { + launchUI { + var result = repository.diss_guild(guild_id) + if (result.code==200){ + result.msg.showToast() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub1/GHHomeFragment.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub1/GHHomeFragment.kt new file mode 100644 index 0000000..b49f741 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub1/GHHomeFragment.kt @@ -0,0 +1,89 @@ +package com.yuyin.mier.module_my.gh.home.sub1 + +import android.os.Bundle +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.GridLayoutManager +import androidx.viewpager.widget.ViewPager +import com.yuyin.lib_base.adapter.MyPagerAdapter +import com.yuyin.lib_base.base.BaseDataBindingFragment +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.R +import com.yuyin.mier.adapter.BaseIndicatorAdapter +import com.yuyin.mier.databinding.FragmentGhHomeSubBinding +import com.yuyin.mier.module_my.gh.home.sub2.GHRoomSubFragment +import kotlinx.android.synthetic.main.activity_gh_home.* +import java.util.* + +class GHHomeFragment : BaseDataBindingFragment() { + private val fsRes: ArrayList = ArrayList() //fragment集合 + private val titleRes = ArrayList() //tab标题集合 + lateinit var baseIndicatorAdapter: BaseIndicatorAdapter + companion object { + fun getInstance(type: String): GHHomeFragment { + val fragment = GHHomeFragment() + val bundle = Bundle() + bundle.putString("ghID", type) + fragment.arguments = bundle + return fragment + } + } + + override fun startObserve() { + } + + override fun getLayoutId(): Int = R.layout.fragment_gh_home_sub + + override fun initView() { + val ghID = arguments?.getString("ghID").toString() + titleRes.add("昨日") + titleRes.add("今日") + titleRes.add("本周") + titleRes.add("上周") + titleRes.add("月榜") + fsRes.add(GHRoomSubFragment.getInstance("1", ghID)) + fsRes.add(GHRoomSubFragment.getInstance("2", ghID)) + fsRes.add(GHRoomSubFragment.getInstance("3", ghID)) + fsRes.add(GHRoomSubFragment.getInstance("4", ghID)) + fsRes.add(GHRoomSubFragment.getInstance("5", ghID)) + + mAdapter = MyPagerAdapter(childFragmentManager, fsRes, titleRes) + mDataBinding.viewpager.adapter = mAdapter +// mDataBinding.tabLayout.setViewPager(mDataBinding.viewpager) + mDataBinding.viewpager.offscreenPageLimit = fsRes.size + mDataBinding.rvContainer.layoutManager = GridLayoutManager(requireContext(), 5) + baseIndicatorAdapter = BaseIndicatorAdapter() + mDataBinding.rvContainer.adapter = baseIndicatorAdapter + baseIndicatorAdapter.setNewData(titleRes) + + baseIndicatorAdapter.setOnItemClickListener { adapter, view, position -> + baseIndicatorAdapter.setSelectPosition(position) + mDataBinding.viewpager.currentItem = position + } + + mDataBinding.viewpager.addOnPageChangeListener(object :ViewPager.OnPageChangeListener{ + override fun onPageScrolled( + position: Int, positionOffset: Float, positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + baseIndicatorAdapter.setSelectPosition(position) + } + + override fun onPageScrollStateChanged(state: Int) { + } + }) + + } + + override fun initData() { + + } + + override fun initEvent() { + } + + + private lateinit var mAdapter: MyPagerAdapter +} diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub1/GHHomeFragment2.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub1/GHHomeFragment2.kt new file mode 100644 index 0000000..6368a64 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub1/GHHomeFragment2.kt @@ -0,0 +1,88 @@ +package com.yuyin.mier.module_my.gh.home.sub1 + +import android.os.Bundle +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.GridLayoutManager +import androidx.viewpager.widget.ViewPager +import com.yuyin.lib_base.adapter.MyPagerAdapter +import com.yuyin.lib_base.base.BaseDataBindingFragment +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.R +import com.yuyin.mier.adapter.BaseIndicatorAdapter +import com.yuyin.mier.databinding.FragmentGhHomeSubBinding +import com.yuyin.mier.module_my.gh.home.sub2.GHUserSubFragment +import kotlinx.android.synthetic.main.activity_gh_home.* +import java.util.* + +class GHHomeFragment2 : BaseDataBindingFragment() { + private val fsRes: ArrayList = ArrayList() //fragment集合 + private val titleRes = ArrayList() //tab标题集合 + override fun startObserve() { + } + + companion object { + fun getInstance(type: String): GHHomeFragment2 { + val fragment = GHHomeFragment2() + val bundle = Bundle() + bundle.putString("ghID", type) + fragment.arguments = bundle + return fragment + } + } + + lateinit var baseIndicatorAdapter: BaseIndicatorAdapter + override fun getLayoutId(): Int = R.layout.fragment_gh_home_sub + + override fun initView() { + val ghID = arguments?.getString("ghID").toString() + titleRes.add("昨日") + titleRes.add("今日") + titleRes.add("本周") + titleRes.add("上周") + titleRes.add("月榜") + + fsRes.add(GHUserSubFragment.getInstance("1", ghID)) + fsRes.add(GHUserSubFragment.getInstance("2", ghID)) + fsRes.add(GHUserSubFragment.getInstance("3", ghID)) + fsRes.add(GHUserSubFragment.getInstance("4", ghID)) + fsRes.add(GHUserSubFragment.getInstance("5", ghID)) + + mAdapter = MyPagerAdapter(childFragmentManager, fsRes, titleRes) + mDataBinding.viewpager.adapter = mAdapter +// mDataBinding.tabLayout.setViewPager(mDataBinding.viewpager) + mDataBinding.viewpager.offscreenPageLimit = fsRes.size + mDataBinding.rvContainer.layoutManager = GridLayoutManager(requireContext(), 5) + baseIndicatorAdapter = BaseIndicatorAdapter() + mDataBinding.rvContainer.adapter = baseIndicatorAdapter + baseIndicatorAdapter.setNewData(titleRes) + + baseIndicatorAdapter.setOnItemClickListener { adapter, view, position -> + baseIndicatorAdapter.setSelectPosition(position) + mDataBinding.viewpager.currentItem = position + } + + mDataBinding.viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrolled( + position: Int, positionOffset: Float, positionOffsetPixels: Int + ) { + + } + + override fun onPageSelected(position: Int) { + baseIndicatorAdapter.setSelectPosition(position) + } + + override fun onPageScrollStateChanged(state: Int) { + } + }) + } + + override fun initData() { + } + + override fun initEvent() { + } + + + private lateinit var mAdapter: MyPagerAdapter +} diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHRoomSubFragment.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHRoomSubFragment.kt new file mode 100644 index 0000000..97f7db4 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHRoomSubFragment.kt @@ -0,0 +1,95 @@ +package com.yuyin.mier.module_my.gh.home.sub2 + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.base.BaseDataBindingFragment +import com.yuyin.mier.R +import com.yuyin.mier.adapter.GHRoomListAdapter +import com.yuyin.mier.databinding.FragmentGhSub2Binding + +class GHRoomSubFragment : BaseDataBindingFragment() { + + companion object { + fun getInstance(type: String, ghID: String): GHRoomSubFragment { + val fragment = GHRoomSubFragment() + val bundle = Bundle() + bundle.putString("type", type) + bundle.putString("ghID", ghID) + fragment.arguments = bundle + return fragment + } + } + + private var type = "1" + private var ghID = "1" + private var page = 1 + + lateinit var ghRoomListAdapter: GHRoomListAdapter + override fun startObserve() { + viewModel.getFinally().observe(this, { + mDataBinding.srlView.finishRefresh() + mDataBinding.srlView.finishLoadMore() + }) + viewModel.ghListBean.observe(this, { + if (page == 1) ghRoomListAdapter.data.clear() + ghRoomListAdapter.addData(it) + }) + + viewModel.ghTotalPrice.observe(this) { + mDataBinding.tvNum.text = "总流水:" + it + } + } + + override fun getLayoutId(): Int = R.layout.fragment_gh_sub2 + + override fun initView() { + mDataBinding.rvView.layoutManager = LinearLayoutManager(activity) + ghRoomListAdapter = GHRoomListAdapter() + mDataBinding.rvView.adapter = ghRoomListAdapter + ghRoomListAdapter.setOnItemChildClickListener { adapter, view, position -> + when (view.id) { + R.id.cover -> { + viewModel.enterRoom( + ghRoomListAdapter.data.get(position).rid, "", activity as AppCompatActivity + ) + } + + } + } + + } + + override fun initData() { + + ghID = requireArguments().getString("ghID", "1") + type = requireArguments().getString("type", "1") + viewModel.get_guild_money_log_list1(getMap()) + } + + override fun initEvent() { + mDataBinding.srlView.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.get_guild_money_log_list1(getMap()) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.get_guild_money_log_list1(getMap()) + } + + }) + } + + fun getMap(): HashMap { + var map = HashMap() + map["page"] = page.toString() + map["time"] = type + map["type"] = "1" + map["guild_id"] = ghID + return map + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHSubRoomViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHSubRoomViewModel.kt new file mode 100644 index 0000000..fd3ba2c --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHSubRoomViewModel.kt @@ -0,0 +1,20 @@ +package com.yuyin.mier.module_my.gh.home.sub2 + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_home.model.GHRoomListBean +import com.yuyin.mier.repository.CommonRepository + +class GHSubRoomViewModel : BaseViewModel() { + var repository = CommonRepository() + var ghListBean = MutableLiveData>() + + var ghTotalPrice = MutableLiveData() + fun get_guild_money_log_list1(map: MutableMap) { + launchUI { + var result = repository.get_guild_money_log_list1(map) + ghListBean.value = result.data.list + ghTotalPrice.value = result.data.total_gift_price + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHSubRoomViewModel2.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHSubRoomViewModel2.kt new file mode 100644 index 0000000..ab8cf0e --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHSubRoomViewModel2.kt @@ -0,0 +1,35 @@ +package com.yuyin.mier.module_my.gh.home.sub2 + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_home.model.* +import com.yuyin.mier.repository.CommonRepository + +class GHSubRoomViewModel2 : BaseViewModel() { + var repository = CommonRepository() + var ghListBean = MutableLiveData>() + var ghSet = MutableLiveData() + var ghTotalPrice = MutableLiveData() + fun get_guild_money_log_list2(map: MutableMap) { + launchUI { + var result = repository.get_guild_money_log_list2(map) + ghListBean.value = result.data.list + ghTotalPrice.value = result.data.total_gift_price + } + } + + fun user_is_deacon(guild_id: String) { + launchUI { + var result = repository.user_is_deacon(guild_id) + ghSet.value = result.data + } + } + + var removeMemberResult = MutableLiveData() + fun kick_out_guild(userId : String, guildId : String) { + launchUI { + var result = repository.kick_out_guild(userId, guildId) + removeMemberResult.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHUserSubFragment.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHUserSubFragment.kt new file mode 100644 index 0000000..a24a840 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/home/sub2/GHUserSubFragment.kt @@ -0,0 +1,132 @@ +package com.yuyin.mier.module_my.gh.home.sub2 + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.launcher.ARouter +import com.kongzue.dialog.v3.MessageDialog +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.GHUserListAdapter +import com.yuyin.mier.databinding.FragmentGhSub2Binding + +class GHUserSubFragment : BaseDataBindingFragment() { + + companion object { + fun getInstance(type: String, ghID: String): GHUserSubFragment { + val fragment = GHUserSubFragment() + val bundle = Bundle() + bundle.putString("type", type) + bundle.putString("ghID", ghID) + fragment.arguments = bundle + return fragment + } + } + + private var ghID = "1" + private var type = "1" + private var page = 1 + private var ghHZID="" + + lateinit var ghUserListAdapter: GHUserListAdapter + override fun startObserve() { + viewModel.getFinally().observe(this, { + mDataBinding.srlView.finishRefresh() + mDataBinding.srlView.finishLoadMore() + }) + viewModel.ghListBean.observe(this, { + if (page == 1){ + ghUserListAdapter.data.clear() + } + ghUserListAdapter.addData(it) + }) + viewModel.ghSet.observe(this, { + if (it.is_deacon == "1") { + ghUserListAdapter + } + }) + viewModel.ghTotalPrice.observe(this) { + mDataBinding.tvNum.text = "总流水:" + it + } + } + + override fun getLayoutId(): Int = R.layout.fragment_gh_sub2 + + override fun initView() { + + + mDataBinding.rvView.layoutManager = LinearLayoutManager(activity) + ghUserListAdapter = GHUserListAdapter() + mDataBinding.rvView.adapter = ghUserListAdapter + ghUserListAdapter.setOnItemChildClickListener { adapter, view, position -> + when (view.id) { + R.id.cover -> { + ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE) + .withString("from_id", ghUserListAdapter.data.get(position).uid) + .navigation() + } + R.id.tv_remove->{ + MessageDialog.show( + activity as AppCompatActivity, + "提示", + "确定踢出该用户吗?", + "确定", + "取消" + ).setOnOkButtonClickListener { baseDialog, v -> + + removeMember( + ghUserListAdapter.data.get(position).uid, + guildId = ghID + ) + + ghUserListAdapter.remove(position) + + ghUserListAdapter.notifyDataSetChanged() + + baseDialog?.doDismiss() + + true + } + } + + } + } + } + + override fun initData() { + ghID = requireArguments().getString("ghID", "1") + type = requireArguments().getString("type", "1") + viewModel.get_guild_money_log_list2(getMap()) + viewModel.user_is_deacon(requireArguments().getString("ghID", "1")) + } + + override fun initEvent() { + mDataBinding.srlView.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.get_guild_money_log_list2(getMap()) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.get_guild_money_log_list2(getMap()) + } + + }) + } + + fun getMap(): HashMap { + var map = HashMap() + map["page"] = page.toString() + map["time"] = type + map["type"] = "2" + map["guild_id"] = ghID + return map + } + fun removeMember(userId: String, guildId: String) { + viewModel.kick_out_guild(userId, guildId) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/main/GHMainActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/main/GHMainActivity.kt new file mode 100644 index 0000000..f40e49c --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/main/GHMainActivity.kt @@ -0,0 +1,163 @@ +package com.yuyin.mier.module_my.gh.main + +import android.content.Intent +import android.view.LayoutInflater +import android.view.View +import android.view.inputmethod.EditorInfo +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.GridLayoutManager +import androidx.viewpager.widget.ViewPager +import com.alibaba.android.arouter.facade.annotation.Route +import com.blankj.utilcode.util.KeyboardUtils +import com.blankj.utilcode.util.LogUtils +import com.yuyin.lib_base.App +import com.yuyin.lib_base.adapter.MyPagerAdapter +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityGhMainBinding +import com.yuyin.mier.module_my.gh.main.sub.GHSubFragment +import com.yuyin.mier.module_my.gh.main.sub.GHSubViewModel +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.mier.adapter.BaseIndicatorAdapter +import com.yuyin.mier.module_my.gh.deatile.GongHuiDeatileActivity +import kotlinx.android.synthetic.main.activity_gh_main.* +import java.util.* + +@Route(path = AroutUtil.GHMainActivity) +class GHMainActivity : BaseDataBindingActivity() { + private val fsRes: ArrayList = ArrayList() //fragment集合 + private val titleRes = ArrayList() //tab标题集合 + override fun startObserve() { + } + + lateinit var baseIndicatorAdapter: BaseIndicatorAdapter + override fun getLayoutId(): Int = R.layout.activity_gh_main + + override fun initView() { + titleRes.add("昨日") + titleRes.add("今日") + titleRes.add("本周") + titleRes.add("上周") + titleRes.add("月榜") + + fsRes.add(GHSubFragment.getInstance("1")) + fsRes.add(GHSubFragment.getInstance("2")) + fsRes.add(GHSubFragment.getInstance("3")) + fsRes.add(GHSubFragment.getInstance("4")) + fsRes.add(GHSubFragment.getInstance("5")) + + mDataBinding.rvContainer.layoutManager = GridLayoutManager(this, 5) + baseIndicatorAdapter = BaseIndicatorAdapter() + mDataBinding.rvContainer.adapter = baseIndicatorAdapter + baseIndicatorAdapter.setNewData(titleRes) + + baseIndicatorAdapter.setOnItemClickListener { adapter, view, position -> + baseIndicatorAdapter.setSelectPosition(position) + mDataBinding.viewpager.currentItem = position + } + +// fsRes.add(GHSubFragment.getInstance("4")) +// fsRes.add(GHSubFragment.getInstance("5")) +// titleRes.add("月榜") +// fsRes.add(GHSubFragment.getInstance("3")) +// //设置数据 +// mDataBinding.tabLayout.setTabData(titleRes.toTypedArray()) +// mDataBinding.viewpager.adapter = MyPagerAdapter( +// childFragmentManager, fsRes +// ) + mAdapter = MyPagerAdapter(supportFragmentManager, fsRes, titleRes) + mDataBinding.viewpager.adapter = mAdapter +// tabLayout.setViewPager(mDataBinding.viewpager) +// tabLayout.setSnapOnTabClick(true) + mDataBinding.viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + } + + override fun onPageSelected(position: Int) { + baseIndicatorAdapter.setSelectPosition(position) + } + + override fun onPageScrollStateChanged(state: Int) { + + } + }) + + + mDataBinding.viewpager.offscreenPageLimit = fsRes.size +// //设置自定义tab + setCustomViews() + + if (App.guild_id == "0") { + tvMyGH.visibility = View.GONE + } else { + tvMyGH.visibility = View.VISIBLE + } + } + + override fun initData() { + } + + + + override fun initEvent() { + tvMyGH.setOnClickListener { + LogUtils.e(App.guild_id) + var intent = Intent(this, GongHuiDeatileActivity::class.java) + intent.putExtra("ghID", App.guild_id) + startActivity(intent) + } + mDataBinding.etSearch.setOnEditorActionListener { textView, i, keyEvent -> + if (i == EditorInfo.IME_ACTION_SEARCH || i == EditorInfo.IME_ACTION_UNSPECIFIED) { + val key = mDataBinding.etSearch.text.toString() + fsRes.map { + (it as GHSubFragment).updateView(key) + } + KeyboardUtils.hideSoftInput(this) + true + } + false + } + } + + + /** + * 设置每个TabLayout的自定义View + * 注意:TabLayout和Viewpager配合使用的时候必须先mViewPager.setAdapter(),再初始化该方法,然后addOnTabSelectedListener;因为adapter刷新会让mCustomViewView空, + */ + fun setCustomViews() { +// val mSelectedTabPosition = mDataBinding.tabLayout.selectedTabPosition +// for (i in titleRes.indices) { +// mDataBinding.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(this).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 + } + + private lateinit var mAdapter: MyPagerAdapter +} diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/main/sub/GHSubFragment.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/main/sub/GHSubFragment.kt new file mode 100644 index 0000000..4ee004d --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/main/sub/GHSubFragment.kt @@ -0,0 +1,97 @@ +package com.yuyin.mier.module_my.gh.main.sub + +import android.content.Intent +import android.os.Bundle +import androidx.recyclerview.widget.LinearLayoutManager +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.base.BaseDataBindingFragment +import com.yuyin.mier.R +import com.yuyin.mier.adapter.GHListAdapter +import com.yuyin.mier.databinding.FragmentGhSubBinding +import com.yuyin.mier.module_my.gh.deatile.GongHuiDeatileActivity + +class GHSubFragment : BaseDataBindingFragment() { + + companion object { + fun getInstance(type: String): GHSubFragment { + val fragment = GHSubFragment() + val bundle = Bundle() + bundle.putString("type", type) + fragment.arguments = bundle + return fragment + } + } + + private var keywords = "" + private var type = "1" + private var page = 1 + + lateinit var ghListAdapter: GHListAdapter + override fun startObserve() { + viewModel.getFinally().observe(this) { + mDataBinding.srlView.finishRefresh() + mDataBinding.srlView.finishLoadMore() + } + viewModel.ghListBean.observe(this) { + if (page == 1) { + ghListAdapter.setNewData(it) + } else { + ghListAdapter.addData(it) + } + + } + } + + override fun getLayoutId(): Int = R.layout.fragment_gh_sub + + override fun initView() { + mDataBinding.rvView.layoutManager = LinearLayoutManager(activity) + ghListAdapter = GHListAdapter() + mDataBinding.rvView.adapter = ghListAdapter + } + + override fun initData() { + type = requireArguments().getString("type", "1") + viewModel.get_guild_list(getMap()) + } + + override fun initEvent() { + mDataBinding.srlView.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.get_guild_list(getMap()) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.get_guild_list(getMap()) + } + + }) + ghListAdapter.setOnItemClickListener { adapter, view, position -> + var intent = Intent(activity, GongHuiDeatileActivity::class.java) + intent.putExtra("ghID", ghListAdapter.data[position].guild_id) + intent.putExtra("ghName", ghListAdapter.data[position].guild_name) + startActivity(intent) + } + + + } + + fun getMap(): HashMap { + var map = HashMap() + map["page"] = page.toString() + map["time"] = type + if (keywords.isNotEmpty()) { + map["keywords"] = keywords + } + return map + } + + fun updateView(key: String) { + keywords = key + page = 1 + viewModel.get_guild_list(getMap()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/main/sub/GHSubViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/main/sub/GHSubViewModel.kt new file mode 100644 index 0000000..6bc81a2 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/main/sub/GHSubViewModel.kt @@ -0,0 +1,18 @@ +package com.yuyin.mier.module_my.gh.main.sub + +import androidx.lifecycle.MutableLiveData +import com.yuyin.mier.module_home.model.GHListBean +import com.yuyin.mier.repository.CommonRepository +import com.yuyin.lib_base.base.BaseViewModel + +class GHSubViewModel : BaseViewModel() { + var repository = CommonRepository() + var ghListBean = MutableLiveData>() + + fun get_guild_list(map: MutableMap) { + launchUI { + var result = repository.get_guild_list(map) + ghListBean.value = result.data.list + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/shenqing/GHSQActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/shenqing/GHSQActivity.kt new file mode 100644 index 0000000..dbb99bc --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/shenqing/GHSQActivity.kt @@ -0,0 +1,85 @@ +package com.yuyin.mier.module_my.gh.shenqing + +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.App +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.mier.R +import com.yuyin.mier.adapter.GHSQUserListAdapter +import com.yuyin.mier.databinding.ActivityGhApplyBinding + +class GHSQActivity : BaseDataBindingActivity() { + + + private var ghID = "1" + private var type = "1" + private var page = 1 + + lateinit var ghUserListAdapter: GHSQUserListAdapter + override fun startObserve() { + viewModel.getFinally().observe(this, { + mDataBinding.srlView.finishRefresh() + mDataBinding.srlView.finishLoadMore() + }) + viewModel.ghListBean.observe(this, { + if (page == 1) ghUserListAdapter.data.clear() + ghUserListAdapter.addData(it) + }) + viewModel.audit.observe(this, { + page = 1 + viewModel.get_apply_guild_list(getMap()) + }) + } + + override fun getLayoutId(): Int = R.layout.activity_gh_apply + + override fun initView() { + mDataBinding.rvView.layoutManager = LinearLayoutManager(this) + ghUserListAdapter = GHSQUserListAdapter() + mDataBinding.rvView.adapter = ghUserListAdapter + ghUserListAdapter.setOnItemChildClickListener { adapter, view, position -> + when (view.id) { + R.id.cover -> { + ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE) + .withString("from_id", ghUserListAdapter.data.get(position).uid) + .navigation() + } + R.id.tvNO -> { + viewModel.operate_guild(ghUserListAdapter.data[position].id, "2") + } + R.id.tvYes -> { + viewModel.operate_guild(ghUserListAdapter.data[position].id, "1") + } + } + } + } + + override fun initData() { + viewModel.get_apply_guild_list(getMap()) + } + + override fun initEvent() { + mDataBinding.srlView.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.get_apply_guild_list(getMap()) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.get_apply_guild_list(getMap()) + } + + }) + } + + fun getMap(): HashMap { + var map = HashMap() + map["page"] = page.toString() + map["guild_id"] = App.guild_id + return map + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/gh/shenqing/GHSQViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/gh/shenqing/GHSQViewModel.kt new file mode 100644 index 0000000..f11bb50 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/gh/shenqing/GHSQViewModel.kt @@ -0,0 +1,26 @@ +package com.yuyin.mier.module_my.gh.shenqing + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_home.model.* +import com.yuyin.mier.repository.CommonRepository + +class GHSQViewModel : BaseViewModel() { + var repository = CommonRepository() + var ghListBean = MutableLiveData>() + var audit = MutableLiveData() + + fun get_apply_guild_list(map: MutableMap) { + launchUI { + var result = repository.get_apply_guild_list(map) + ghListBean.value = result.data.list + } + } + + fun operate_guild(id: String,type: String) { + launchUI { + var result = repository.operate_guild(id, type) + audit.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/giftlog/GiftLogActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/giftlog/GiftLogActivity.kt new file mode 100644 index 0000000..5cebdc3 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/giftlog/GiftLogActivity.kt @@ -0,0 +1,117 @@ +package com.yuyin.mier.module_my.giftlog + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_GIFT_LOG +import com.yuyin.lib_base.base.BaseActivity +import com.flyco.tablayout.listener.CustomTabEntity +import com.flyco.tablayout.listener.OnTabSelectListener +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.mier.R +import com.yuyin.mier.module_my.adapter.GiftLogAdapter +import kotlinx.android.synthetic.main.activity_gift_log_list.* +import java.util.* + +@Route(path = MAIN_MY_GIFT_LOG) +class GiftLogActivity : BaseActivity() { + var page: Int = 1 + private var cashHisAdapter: GiftLogAdapter? = null + private val titleRes = ArrayList() //tab标题集合 + private val dataTab: ArrayList = ArrayList() //CommonTabLayout 所需数据集合 + + override fun startObserve() { + viewModel.giftLogData.observe(this, { + if (page == 1 && it.isEmpty()) { + ll_nodata.visibility = View.VISIBLE + }else{ + ll_nodata.visibility = View.GONE + } + if (page == 1) { + cashHisAdapter?.setNewData(it) + smart.finishRefresh() + } else { + cashHisAdapter?.addData(it) + smart.finishLoadMore() + } + }) + viewModel.getFinally().observe(this, { + smart.finishRefresh() + smart.finishLoadMore() + }) + } + + override fun getLayoutId(): Int = R.layout.activity_gift_log_list + + override fun initView() { + tv_title.text = intent.getStringExtra("title") + titleRes.add("金币礼物") + titleRes.add("背包礼物") + for (i in titleRes.indices) { + dataTab.add(object : CustomTabEntity { + override fun getTabTitle(): String { + return titleRes[i] + } + + override fun getTabSelectedIcon(): Int { + return 0 + } + + override fun getTabUnselectedIcon(): Int { + return 0 + } + }) + } + tab_layout.setTabData(dataTab) + tab_layout.setOnTabSelectListener(object : OnTabSelectListener { + override fun onTabSelect(position: Int) { + page = 1 + initData() + } + + override fun onTabReselect(position: Int) { + + } + }) + + smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + initData() + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + initData() + } + + }) + cashHisAdapter = GiftLogAdapter() + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = cashHisAdapter + cashHisAdapter!!.setOnItemClickListener { adapter, view, position -> + ARouter + .getInstance() + .build(AroutUtil.MAIN_MY_GIFT_LOG_SUB) + .withString("type", intent.getStringExtra("type")!!) + .withString("s_type", (tab_layout.currentTab + 1).toString()) + .withString("uid", cashHisAdapter?.data?.get(position)?.send_user_info?.uid) + .navigation() + } + } + + override fun initData() { + viewModel.loadData( + page.toString(), + (tab_layout.currentTab + 1).toString(), + intent.getStringExtra("type")!! + ) + } + + override fun initEvent() { + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/giftlog/GiftLogViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/giftlog/GiftLogViewModel.kt new file mode 100644 index 0000000..2202914 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/giftlog/GiftLogViewModel.kt @@ -0,0 +1,23 @@ +package com.yuyin.mier.module_my.giftlog + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_my.model.GiftLogBean +import com.yuyin.mier.repository.CommonRepository + +class GiftLogViewModel : BaseViewModel() { + + var myRepository = CommonRepository() + + var giftLogData = MutableLiveData>() + + fun loadData(page: String, gift_from_type: String, type: String) { + launchUI { + val result = if (type == "1") myRepository.get_receive_gift_user_list( + page, + gift_from_type + ) else myRepository.get_send_gift_user_list(page, gift_from_type) + giftLogData.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/giftlog/sub/GiftLogSubActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/giftlog/sub/GiftLogSubActivity.kt new file mode 100644 index 0000000..7c96993 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/giftlog/sub/GiftLogSubActivity.kt @@ -0,0 +1,67 @@ +package com.yuyin.mier.module_my.giftlog.sub + +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_GIFT_LOG_SUB +import com.yuyin.lib_base.base.BaseActivity +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.mier.R +import com.yuyin.mier.module_my.adapter.GiftLogSubAdapter +import kotlinx.android.synthetic.main.activity_log_tixian.* + +@Route(path = MAIN_MY_GIFT_LOG_SUB) +class GiftLogSubActivity : BaseActivity() { + var page: Int = 1 + private var cashHisAdapter: GiftLogSubAdapter? = null + override fun startObserve() { + viewModel.giftLogSubData.observe(this, { + if (page == 1) { + cashHisAdapter?.setNewData(it) + smart.finishRefresh() + } else { + cashHisAdapter?.addData(it) + smart.finishLoadMore() + } + }) + viewModel.getFinally().observe(this, { + smart.finishRefresh() + smart.finishLoadMore() + }) + } + + override fun getLayoutId(): Int = R.layout.activity_log_gift_sub + + override fun initView() { + + cashHisAdapter = GiftLogSubAdapter() + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = cashHisAdapter + + smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + initData() + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + initData() + } + + }) + } + + + override fun initData() { + viewModel.loadData( + page.toString(), + intent.getStringExtra("s_type")!!, + intent.getStringExtra("type")!!, + intent.getStringExtra("uid")!! + ) + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/giftlog/sub/GiftLogSubViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/giftlog/sub/GiftLogSubViewModel.kt new file mode 100644 index 0000000..8e24c13 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/giftlog/sub/GiftLogSubViewModel.kt @@ -0,0 +1,23 @@ +package com.yuyin.mier.module_my.giftlog.sub + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_my.model.GiftLogSubBean +import com.yuyin.mier.repository.CommonRepository + +class GiftLogSubViewModel : BaseViewModel() { + + var myRepository = CommonRepository() + + var giftLogSubData = MutableLiveData>() + + fun loadData(page: String, gift_from_type: String, type: String, uid: String) { + launchUI { + val result = if (type == "1") myRepository.get_receive_gift_list( + page, + gift_from_type, uid + ) else myRepository.get_send_gift_list(page, gift_from_type, uid) + giftLogSubData.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/homepage/UserDynamicAdapter.java b/app/src/main/java/com/yuyin/mier/module_my/homepage/UserDynamicAdapter.java new file mode 100644 index 0000000..ebc910c --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/homepage/UserDynamicAdapter.java @@ -0,0 +1,465 @@ +package com.yuyin.mier.module_my.homepage; + +import android.content.Context; +import android.media.MediaPlayer; +import android.os.CountDownTimer; +import android.os.Handler; +import android.os.Looper; +import android.text.TextUtils; +import android.view.View; +import android.view.ViewTreeObserver; +import android.widget.ImageView; +import android.widget.TextView; + +import com.android.tu.loadingdialog.LoadingDailog; +import com.blankj.utilcode.util.LogUtils; +import com.bumptech.glide.Glide; +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.yuyin.lib_base.base.UserManager; +import com.yuyin.lib_base.util.MediaManager; +import com.yuyin.lib_base.util.TimeUtil; +import com.yuyin.lib_base.util.img.FullScreenUtil; +import com.yuyin.lib_base.view.MyGridView; +import com.yuyin.module_community.R; +import com.yuyin.module_community.adapter.OneImageYuanJiaoAdapter; +import com.yuyin.module_community.model.DynamicBean; + +import java.util.ArrayList; +import java.util.List; + + +public class UserDynamicAdapter extends BaseQuickAdapter { + //该变量如果设置成全局的会发生数据紊乱 + //private ArrayList oneImageList = new ArrayList<>(); //单图的数据源 +// private ArrayList tagsList = new ArrayList<>(); //标签的数据源 + + //用于退出 Activity,避免 Countdown,造成资源浪费。 +// private SparseArray mCountDownCounters; + private static MediaPlayer mMediaPlayer; + + private CountDownTimer mSingleCountDownTimer; + + boolean mHasFinishTimer = true; + + Handler mHandler = new Handler(Looper.getMainLooper()); + + public LoadingDailog dialog; + + private Context mContext; + + public UserDynamicAdapter(Context context) { + super(R.layout.comm_dy_item, new ArrayList<>()); + this.mContext = context; +// this.mCountDownCounters = new SparseArray<>(); + LoadingDailog.Builder loadBuilder = new LoadingDailog.Builder(context) + .setMessage("加载中...") + .setCancelable(true) + .setCancelOutside(true); + dialog = loadBuilder.create(); + } + + @Override + protected void convert(BaseViewHolder helper, DynamicBean item) { + + helper.addOnClickListener(R.id.dianzan) + .addOnClickListener(R.id.delete) + .addOnClickListener(R.id.zhuanfa) + .addOnClickListener(R.id.dy_lookmore_tv) + .addOnClickListener(R.id.dy_head_image) + .addOnClickListener(R.id.dy_oneimage_iv); + + //先让单图,多图,音频的布局显示 + helper.getView(R.id.dy_oneimage_iv).setVisibility(View.VISIBLE); + helper.getView(R.id.dy_image_recyc).setVisibility(View.VISIBLE); + helper.getView(R.id.dy_voice).setVisibility(View.VISIBLE); + helper.getView(R.id.iv_jubao).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { +// ARouter.getInstance().build(AroutUtil.COMMUNITY_JUBAO).withString("uid", item.getUid() + "").navigation(); + } + }); + //昵称 + helper.setText(R.id.dy_name_text, item.getNick_name()); + + //头像 + if (!TextUtils.isEmpty(item.getHead_pic())) { + Glide + .with(mContext) + .load(item.getHead_pic()) + .placeholder(R.mipmap.no_tu) + .error(R.mipmap.no_tu) + .into((ImageView) helper.getView(R.id.dy_head_image)); + } + + //动态内容以富文本展示 + String content = item.getContent(); + if (content == null || content.length() == 0) { + helper.getView(R.id.dy_lookmore_tv).setVisibility(View.GONE); + helper.getView(R.id.dy_content_tv).setVisibility(View.GONE); + } else { + helper.getView(R.id.dy_lookmore_tv).setVisibility(View.VISIBLE); + helper.getView(R.id.dy_content_tv).setVisibility(View.VISIBLE); + } + helper.getView(R.id.dy_lookmore_tv).getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + //这个回调会调用多次,获取完行数记得注销监听 + TextView view = helper.getView(R.id.dy_content_tv); + int lineCount = view.getLineCount(); + if (lineCount >= 7) { + helper.getView(R.id.dy_lookmore_tv).setVisibility(View.VISIBLE); + helper.getView(R.id.dy_content_tv).getViewTreeObserver().removeOnPreDrawListener(this);//销毁 + } else { + helper.getView(R.id.dy_lookmore_tv).setVisibility(View.GONE); + helper.getView(R.id.dy_content_tv).getViewTreeObserver().removeOnPreDrawListener(this);//销毁 + } + return true; + } + }); + helper.setText(R.id.dy_content_tv, content); + helper.setText(R.id.tvAddress, item.getDistance()); + + if (TextUtils.isEmpty(content)) { + TextView view = helper.getView(R.id.dy_content_tv); + view.setVisibility(View.GONE); + } else { + TextView view = helper.getView(R.id.dy_content_tv); + view.setVisibility(View.VISIBLE); + } + + //置顶 + if (item.is_top() == 2) { + helper.getView(R.id.dy_top_text).setVisibility(View.VISIBLE); + } else { + helper.getView(R.id.dy_top_text).setVisibility(View.GONE); + } + + //关注 + TextView guanzhu_btn = helper.getView(R.id.guanzhu_btn); + guanzhu_btn.setVisibility(View.GONE); + ImageView delete = helper.getView(R.id.delete); + + if (item.getUid() == UserManager.INSTANCE.getUser().getUid()) { + guanzhu_btn.setVisibility(View.GONE); +// delete.setVisibility(View.VISIBLE); + } else { + guanzhu_btn.setVisibility(View.VISIBLE); +// delete.setVisibility(View.GONE); + } + + if (item.is_follow() == 1) { +// guanzhu_btn.setTextColor(mContext.getResources().getColor(R.color.white)); +// guanzhu_btn.setText("已关注"); +// guanzhu_btn.setBackgroundResource(R.drawable.shape_boder_gz2); + + guanzhu_btn.setBackgroundResource(R.mipmap.yi_follow); + } else { +// guanzhu_btn.setTextColor(mContext.getResources().getColor(R.color.white)); +// guanzhu_btn.setText("+关注"); +// guanzhu_btn.setBackgroundResource(R.drawable.shape_boder_gz1); + + guanzhu_btn.setBackgroundResource(R.mipmap.no_follow); + } + + //点赞 + helper.setText(R.id.dy_fabulous, item.getPraise_num() + ""); + if (item.is_praise() == 1) { + TextView dy_fabulous = helper.getView(R.id.dy_fabulous); + dy_fabulous.setTextColor(mContext.getResources().getColor(R.color.dianzan2)); + helper.setImageResource(R.id.dianzan_image, R.drawable.dongtai_hudong_yidianzan); + } else { + TextView dy_fabulous = helper.getView(R.id.dy_fabulous); + dy_fabulous.setTextColor(mContext.getResources().getColor(R.color.dianzan1)); + helper.setImageResource(R.id.dianzan_image, R.drawable.dongtai_hudong_dianzan); + } + + //分享数 + helper.setText(R.id.dy_share, item.getShare_num() + ""); + //评论数 + helper.setText(R.id.dy_comment, item.getComment_num() + ""); + + //男女 1 男 2 女 +// if (item.getSex() == 1) { +// helper.setImageResource(R.id.dy_sex_image, R.mipmap.no_tu); +// } else { +// helper.setImageResource(R.id.dy_sex_image, R.mipmap.no_tu); +// } + + //时间 + + if (!item.getAdd_time().isEmpty()) { + try { + helper.setText(R.id.dy_time_text, TimeUtil.chatTimee(item.getAdd_time())); + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + + //音频时长 + if (!item.isPlay()) { + //音频时长 + helper.setText(R.id.dy_voice_time, item.getSound_duration() + "s"); + helper.setImageResource(R.id.dy_voice_play, R.mipmap.shequ_yuyin_bofang); + } else { + helper.setText(R.id.dy_voice_time, item.getCurrentTime() + "s"); + helper.setImageResource(R.id.dy_voice_play, R.mipmap.shequ_yuyin_zanting); + } + + String audio = item.getSound(); //音频 + if (item.getImages().size() != 0) { + String[] arrIv = item.getImages().toArray(new String[item.getImages().size()]); + int length = arrIv.length; + helper.getView(R.id.dy_voice).setVisibility(View.GONE); + if (length == 1) { //单图 + //该变量如果设置成全局的会发生数据紊乱 + ArrayList oneImageList = new ArrayList<>(); + String img1Iv = arrIv[0]; + oneImageList.add(img1Iv); + helper.getView(R.id.dy_image_recyc).setVisibility(View.GONE); + + ImageView imgSingle = helper.getView(R.id.dy_oneimage_iv); + +// int screenWidth = QMUIDisplayHelper.getScreenWidth(mContext) - QMUIDisplayHelper.dp2px(mContext, 24); + +// int imgWidth = screenWidth * 2 / 3; +// +// ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) imgSingle.getLayoutParams(); +// +// params.width = imgWidth; +// +// imgSingle.setLayoutParams(params); + + Glide.with(mContext) + .load(img1Iv) + .placeholder(R.mipmap.no_tu) + .error(R.mipmap.no_tu) + .into((ImageView) helper.getView(R.id.dy_oneimage_iv)); + helper.getView(R.id.dy_oneimage_iv).setOnClickListener(v -> { + FullScreenUtil.showFullScreenDialog(mContext, 0, oneImageList); + }); + } else { //多图 + + if (length == 4) { + + OneImageYuanJiaoAdapter oneImageYuanJiaoAdapter = new OneImageYuanJiaoAdapter(mContext); + MyGridView recyclerView = helper.getView(R.id.dy_image_recyc); +// int screenWidth = QMUIDisplayHelper.getScreenWidth(mContext) - QMUIDisplayHelper.dp2px(mContext, 24); +// int imgWidth = screenWidth * 2 / 3; +// ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) recyclerView.getLayoutParams(); +// params.width = imgWidth; +// recyclerView.setLayoutParams(params); + recyclerView.setNumColumns(3); + recyclerView.setAdapter(oneImageYuanJiaoAdapter); + oneImageYuanJiaoAdapter.getList_adapter().clear(); + + for (int j = 0; j < arrIv.length; j++) { + oneImageYuanJiaoAdapter.getList_adapter().add(arrIv[j]); + } + helper.getView(R.id.dy_oneimage_iv).setVisibility(View.GONE); + + oneImageYuanJiaoAdapter.notifyDataSetChanged(); + + recyclerView.setOnItemClickListener((parent, view, position, id) -> { + FullScreenUtil.showFullScreenDialog(mContext, position, oneImageYuanJiaoAdapter.getList_adapter()); + }); + + } else { + + OneImageYuanJiaoAdapter oneImageYuanJiaoAdapter = new OneImageYuanJiaoAdapter(mContext); + MyGridView recyclerView = helper.getView(R.id.dy_image_recyc); + recyclerView.setNumColumns(3); + recyclerView.setAdapter(oneImageYuanJiaoAdapter); + oneImageYuanJiaoAdapter.getList_adapter().clear(); + + for (int j = 0; j < arrIv.length; j++) { + oneImageYuanJiaoAdapter.getList_adapter().add(arrIv[j]); + } + helper.getView(R.id.dy_oneimage_iv).setVisibility(View.GONE); + + oneImageYuanJiaoAdapter.notifyDataSetChanged(); + + recyclerView.setOnItemClickListener((parent, view, position, id) -> { + FullScreenUtil.showFullScreenDialog(mContext, position, oneImageYuanJiaoAdapter.getList_adapter()); + }); + } + + } + } else if (audio != null && audio.length() != 0 && !"".equals(audio)) { //音频模式 + helper.getView(R.id.dy_oneimage_iv).setVisibility(View.GONE); + helper.getView(R.id.dy_image_recyc).setVisibility(View.GONE); + helper.getView(R.id.dy_voice).setOnClickListener(v -> { + + if (!item.isPlay()) { + if (dialog != null) { + dialog.show(); + } + //停止其它正在播放的录音 + if (mSingleCountDownTimer != null && !mHasFinishTimer) { + mSingleCountDownTimer.cancel(); + MediaManager.pause(); + List list = getData(); + int size = list.size(); + int position = 0; + for (int i = 0; i < size; i++) { + DynamicBean dynamicsBean = list.get(i); + if (dynamicsBean.isPlay()) { + position = i; + dynamicsBean.setPlay(false); + break; + } + } + LogUtils.d("==正在倒计时,要停止它"); + notifyItemChanged(position, "text_stop_timer"); +// notifyItemChanged(position); + } + mHasFinishTimer = false; + MediaManager.playSoundAsync(item.getSound(), null, new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + if (dialog != null) { + dialog.dismiss(); + } + item.setPlay(true); + helper.setImageResource(R.id.dy_voice_play, R.mipmap.shequ_yuyin_zanting); + mp.start(); +// CountDownTimer countDownTimer = mCountDownCounters.get(helper.getView(R.id.dy_voice_time).hashCode()); +// if (countDownTimer != null) { +// //将复用的倒计时清除 +// countDownTimer.cancel(); +// } + int t = item.getSound_duration(); + long time = (long) t * 1000; + mSingleCountDownTimer = new CountDownTimer(time, 1000) { + @Override + public void onTick(long l) { + + int times = (int) (l / 1000); + + item.setCurrentTime(times + ""); + +// helper.setText(R.id.dy_voice_time, (int) (l / 1000) + "s"); + LogUtils.d("====倒计时", (l / 1000) + "s"); + +// notifyDataSetChanged(); + int position = helper.getPosition(); + + notifyItemChanged(position, "text_timer"); + + } + + @Override + public void onFinish() {//倒计时结束了 + helper.setText(R.id.dy_voice_time, item.getSound_duration() + "s"); + helper.setImageResource(R.id.dy_voice_play, R.mipmap.shequ_yuyin_bofang); + MediaManager.pause(); + MediaManager.release(); + item.setPlay(false); + int position = helper.getPosition(); + notifyItemChanged(position, "text_timer"); + mHasFinishTimer = true; + } + }.start(); + +// mCountDownCounters.put(helper.getView(R.id.dy_voice_time).hashCode(), countDownTimer); + } + }); + + + } else { + item.setPlay(false); + helper.setImageResource(R.id.dy_voice_play, R.mipmap.shequ_yuyin_bofang); + helper.setText(R.id.dy_voice_time, item.getSound_duration() + ""); + MediaManager.pause(); + MediaManager.release(); + } + }); + + } else { + helper.getView(R.id.dy_oneimage_iv).setVisibility(View.GONE); + helper.getView(R.id.dy_image_recyc).setVisibility(View.GONE); + helper.getView(R.id.dy_voice).setVisibility(View.GONE); + } + + } + + @Override + protected void convertPayloads(BaseViewHolder helper, DynamicBean item, List payloads) { + super.convertPayloads(helper, item, payloads); + if (payloads.isEmpty()) { + convert(helper, item); + } else { + String payload = (String) payloads.get(0); + int praise_num = item.getPraise_num(); + if ("like".equals(payload)) { + item.set_praise(1); + item.setPraise_num(praise_num + 1); + helper.setText(R.id.dy_fabulous, praise_num + 1 + ""); + helper.setImageResource(R.id.dianzan_image, R.drawable.dongtai_hudong_yidianzan); + TextView dy_fabulous = helper.getView(R.id.dy_fabulous); + dy_fabulous.setTextColor(mContext.getResources().getColor(R.color.dianzan2)); + } else if ("unlike".equals(payload)) { + item.set_praise(0); + item.setPraise_num((praise_num - 1) > 0 ? praise_num - 1 : 0); + helper.setText(R.id.dy_fabulous, praise_num - 1 + ""); + helper.setImageResource(R.id.dianzan_image, R.drawable.dongtai_hudong_dianzan); + TextView dy_fabulous = helper.getView(R.id.dy_fabulous); + dy_fabulous.setTextColor(mContext.getResources().getColor(R.color.dianzan1)); + } else if ("follow".equals(payload)) { + //关注 + TextView guanzhu_btn = helper.getView(R.id.guanzhu_btn); + if (item.is_follow() == 1) { +// guanzhu_btn.setTextColor(mContext.getResources().getColor(R.color.white)); +// guanzhu_btn.setText("已关注"); +// guanzhu_btn.setBackgroundResource(R.drawable.shape_boder_gz2); + guanzhu_btn.setBackgroundResource(R.mipmap.yi_follow); + } else { +// guanzhu_btn.setTextColor(mContext.getResources().getColor(R.color.white)); +// guanzhu_btn.setText("+关注"); +// guanzhu_btn.setBackgroundResource(R.drawable.shape_boder_gz1); + guanzhu_btn.setBackgroundResource(R.mipmap.no_follow); + } + } else if ("share".equals(payload)) { + int forward_num = item.getShare_num(); + helper.setText(R.id.dy_share, forward_num + 1 + ""); + } else if ("text_timer".equals(payload)) { + + mHandler.post(new Runnable() { + @Override + public void run() { + String time = item.getCurrentTime(); + if (item.isPlay()) { + helper.setText(R.id.dy_voice_time, item.getCurrentTime() + "s"); + LogUtils.d("====倒计时更新======", time + ""); + } else { + helper.setText(R.id.dy_voice_time, item.getSound_duration() + ""); + } + LogUtils.d("====时间======", time + ""); + } + }); + + } else if ("text_stop_timer".equals(payload)) { + + LogUtils.d("====停止了哈哈哈======"); + + mHandler.post(new Runnable() { + @Override + public void run() { + String time = item.getCurrentTime(); + if (item.isPlay()) { + helper.setText(R.id.dy_voice_time, item.getCurrentTime() + "s"); + LogUtils.d("==停止==倒计时更新======", time + ""); + } else { + helper.setText(R.id.dy_voice_time, item.getSound_duration() + ""); + helper.setImageResource(R.id.dy_voice_play, R.mipmap.shequ_yuyin_bofang); + LogUtils.d("==停止==停止倒计时更新======", item.getSound_duration() + ""); + } + LogUtils.d("==停止==时间======", time + ""); + } + }); + + } + } + } + +} diff --git a/app/src/main/java/com/yuyin/mier/module_my/homepage/UserGiftWallActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/homepage/UserGiftWallActivity.kt new file mode 100644 index 0000000..d243731 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/homepage/UserGiftWallActivity.kt @@ -0,0 +1,173 @@ +package com.yuyin.mier.module_my.homepage + +import androidx.recyclerview.widget.GridLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.adapter.RecyclerTabAdapter + +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityUserGiftWallBinding +import com.yuyin.mier.module_my.adapter.UserGiftWallAdapter + +@Route(path = AroutUtil.GIFT_WALL) +class UserGiftWallActivity : + BaseDataBindingActivity() { + + private lateinit var userGiftWallAdapter: UserGiftWallAdapter + lateinit var recyclerTabAdapter: RecyclerTabAdapter + + var page = 1 + + var position = 0; + + override fun startObserve() { + + + viewModel.userData.observe(this) { + mDataBinding.tvNickname.text = it.nick_name + GlideUtil.loadImglogo(this, it.head_pic, mDataBinding.ivHead) + } + + viewModel.userGiftList.observe(this) { + if (recyclerTabAdapter.selectPosition == 0) { + for (i in it.indices) { + it[i].isSelect = true + } + if (page == 1) { + userGiftWallAdapter.setNewData(it) + } else { + userGiftWallAdapter.addData(it) + } + } else { + if (page == 1) { + userGiftWallAdapter.setNewData(it) + + } else { + userGiftWallAdapter.addData(it) + + } + } + } + + viewModel.getFinally().observe(this) { + mDataBinding.smart.finishLoadMore() + mDataBinding.smart.finishRefresh() + } + } + + override fun getLayoutId(): Int { + return R.layout.activity_user_gift_wall + } + + override fun initView() { + + } + + override fun initData() { + + viewModel.loadData(intent.getStringExtra("uid").toString()) + viewModel.get_user_illume_gift_wall( + intent.getStringExtra("uid").toString(), page.toString(), "20" + ) + + mDataBinding.rvContainer.layoutManager = GridLayoutManager(this, 3) + userGiftWallAdapter = UserGiftWallAdapter() + mDataBinding.rvContainer.adapter = userGiftWallAdapter + + + + mDataBinding.rvTabTitle.layoutManager = GridLayoutManager(this, 2) + recyclerTabAdapter = + RecyclerTabAdapter(R.layout.item_tablayout_header3, arrayListOf("已点亮", "未点亮")) + mDataBinding.rvTabTitle.adapter = recyclerTabAdapter + + + recyclerTabAdapter.setOnItemClickListener { adapter, view, position -> + recyclerTabAdapter.setSelectPosition(position) + this.position = position; + if (position == 0) { + viewModel.get_user_illume_gift_wall( + intent.getStringExtra("uid").toString(), page.toString(), "20" + ) + } else { + viewModel.get_user_unillume_gift_wall( + intent.getStringExtra("uid").toString(), page.toString(), "20" + ) + } + } + + } + + override fun initEvent() { + + userGiftWallAdapter.setOnItemChildClickListener { adapter, view, position -> + + if (view.id == R.id.iv_head) { + UserGiftWallDialog(userGiftWallAdapter.data[position]).show( + supportFragmentManager, "用户礼物" + ) + } + + } + + mDataBinding.smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + + page = 1; + if (position == 0) { + viewModel.get_user_illume_gift_wall( + intent.getStringExtra("uid").toString(), page.toString(), "20" + ) + } else { + viewModel.get_user_unillume_gift_wall( + intent.getStringExtra("uid").toString(), page.toString(), "20" + ) + } + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++; + if (position == 0) { + viewModel.get_user_illume_gift_wall( + intent.getStringExtra("uid").toString(), page.toString(), "20" + ) + } else { + viewModel.get_user_unillume_gift_wall( + intent.getStringExtra("uid").toString(), page.toString(), "20" + ) + } + } + }) +// mDataBinding.tvSelectNormal.setOnClickListener { +// selectIndex = 1 +// mDataBinding.tvSelectNormal.background = +// resources.getDrawable(R.drawable.shape_butt_main_24) +// mDataBinding.tvSelectUnnormal.background = null +// mDataBinding.tvSelectNormal.setTextColor(resources.getColor(R.color.white)) +// mDataBinding.tvSelectUnnormal.setTextColor(resources.getColor(R.color.color999999)) +// viewModel.loadGiftData( +// "1", +// selectIndex.toString(), +// intent.getStringExtra("uid").toString() +// ) +// } + +// mDataBinding.tvSelectUnnormal.setOnClickListener { +// selectIndex = 2 +// mDataBinding.tvSelectUnnormal.background = +// resources.getDrawable(R.drawable.shape_butt_main_24) +// mDataBinding.tvSelectNormal.background = null +// mDataBinding.tvSelectUnnormal.setTextColor(resources.getColor(R.color.white)) +// mDataBinding.tvSelectNormal.setTextColor(resources.getColor(R.color.color999999)) +// viewModel.loadGiftData( +// "1", +// selectIndex.toString(), +// intent.getStringExtra("uid").toString() +// ) +// } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/homepage/UserGiftWallDialog.kt b/app/src/main/java/com/yuyin/mier/module_my/homepage/UserGiftWallDialog.kt new file mode 100644 index 0000000..54c778e --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/homepage/UserGiftWallDialog.kt @@ -0,0 +1,31 @@ +package com.yuyin.mier.module_my.homepage + +import android.os.Bundle +import android.view.View +import com.voice.lib_base.base.dialog.BaseFragmentDialog +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.mier.R +import com.yuyin.mier.databinding.DialogUserGiftWallBinding +import com.yuyin.module_live.model.UserGiftList + +class UserGiftWallDialog(var userGiftList: UserGiftList) : + BaseFragmentDialog(R.layout.dialog_room_user_gift_wall) { + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + GlideUtil.loadImglogo( + requireContext(), + userGiftList.max_gift_num_user.head_pic, + mBinding.ivHead + ) + mBinding.tvNickName.text = userGiftList.max_gift_num_user.nick_name + mBinding.tvGiftNum.text = "礼物总数量:${userGiftList.max_gift_num_user.num}" + + mBinding.ivClose.setOnClickListener { + dismiss() + } + mBinding.tvClose.setOnClickListener { + dismiss() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/homepage/UserHomePageActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/homepage/UserHomePageActivity.kt new file mode 100644 index 0000000..f797e9a --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/homepage/UserHomePageActivity.kt @@ -0,0 +1,594 @@ +package com.yuyin.mier.module_my.homepage + +import android.Manifest +import android.annotation.SuppressLint +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.content.Intent +import android.text.TextUtils +import android.view.KeyEvent +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.blankj.utilcode.util.LogUtils +import com.flyco.tablayout.listener.CustomTabEntity +import com.flyco.tablayout.listener.OnTabSelectListener +import com.lzy.imagepicker.ImagePicker +import com.lzy.imagepicker.bean.ImageItem +import com.lzy.imagepicker.ui.ImageGridActivity +import com.tbruyelle.rxpermissions2.RxPermissions +import com.tencent.imsdk.v2.V2TIMManager +import com.tencent.qcloud.tuikit.tuiconversation.bean.ConversationInfo +import com.tencent.qcloud.tuikit.tuiconversation.classicui.util.TUIConversationUtils +import com.yuyin.lib_base.adapter.RecyclerTabAdapter +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_HOME_PAGE +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.BR +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityUserHomepageBinding +import com.yuyin.mier.module_my.adapter.MyPicListAdapter +import com.yuyin.mier.module_my.adapter.UserGiftWallAdapter +import com.yuyin.mier.module_my.gh.deatile.GongHuiDeatileActivity +import com.yuyin.mier.module_my.model.UserAlbumsList +import com.yuyin.mier.view.pic.FullScreenUtil2 + +import kotlinx.android.synthetic.main.activity_user_homepage.* +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import java.io.File +import java.util.* + + +@Route(path = MAIN_MY_HOME_PAGE) +class UserHomePageActivity : + BaseDataBindingActivity() { + private val titleRes = ArrayList() //tab标题集合 + private val dataTab: ArrayList = ArrayList() //CommonTabLayout 所需数据集合 + + lateinit var userGiftWallAdapter: UserGiftWallAdapter + lateinit var myPicListAdapter: MyPicListAdapter + lateinit var userDynamicAdapter: UserDynamicAdapter + private var user_room_rid = "0" + private var user_room_rid2 = "0" + lateinit var rcyGiftTabAdapter: RecyclerTabAdapter + var position = 0 + var page = 1 + + override fun startObserve() { + viewModel.addBlack.observe(this) { + mDataBinding.ivAddBlack.setImageResource(R.mipmap.black_add2) + viewModel.userData.value?.is_black = 1 + V2TIMManager.getFriendshipManager().addToBlackList( + arrayListOf(intent.getStringExtra("from_id")), + null + ) + } + viewModel.removeBlackData.observe(this) { + mDataBinding.ivAddBlack.setImageResource(R.mipmap.black_add) + viewModel.userData.value?.is_black = 2 + V2TIMManager.getFriendshipManager().deleteFromBlackList( + arrayListOf(intent.getStringExtra("from_id")), + null + ) + } + viewModel.cancelFollowData.observe(this) { + for (i in userDynamicAdapter.data.indices) { + if (userDynamicAdapter.data[i].uid.toString() == it) { + userDynamicAdapter.data[i].is_follow = 0 + userDynamicAdapter.notifyItemChanged(i, "follow") + } + } + } + viewModel.followData.observe(this) { + for (i in userDynamicAdapter.data.indices) { + if (userDynamicAdapter.data[i].uid.toString() == it) { + userDynamicAdapter.data[i].is_follow = 1 + userDynamicAdapter.notifyItemChanged(i, "follow") + } + } + } + + viewModel.praiseAZone.observe(this) { + if (viewModel.type.value == 1) { + viewModel.selPos.value?.let { userDynamicAdapter.notifyItemChanged(it, "like") } + } else if (viewModel.type.value == 2) { + viewModel.selPos.value?.let { userDynamicAdapter.notifyItemChanged(it, "unlike") } + } + } + + viewModel.dynamicList.observe(this) { + if (it.isEmpty()) { + userDynamicAdapter.setEmptyView(R.layout.base_empty_view, rv_dt) + rv_dt.visibility = View.GONE + } else { + rv_dt.visibility = View.VISIBLE + userDynamicAdapter.setNewData(it) + } + } + viewModel.userGiftList.observe(this) { + if (position == 0) { + for (i in it.indices) { + it[i].isSelect = true + } + if (page == 1) { + userGiftWallAdapter.setNewData(it) + } else { + userGiftWallAdapter.addData(it) + } + } else { + if (page == 1) { + userGiftWallAdapter.setNewData(it) + + } else { + userGiftWallAdapter.addData(it) + + } + } + } + + viewModel.getFinally().observe(this) { + mDataBinding.smart.finishLoadMore() + mDataBinding.smart.finishRefresh() + } + viewModel.userData.observe(this) { + if(it.is_online=="1"){ + iv_online.setImageResource(R.mipmap.online1) + }else{ + iv_online.setImageResource(R.mipmap.online2) + } + if(it.guild_info!=null&&it.is_join_guild=="1"){ + ll_gh.visibility=View.VISIBLE + loadImage(hz_img, it.guild_info.cover, R.mipmap.ic_launcher_app) + gh_name.text=it.guild_info.guild_name + gh_num.text=it.guild_info.num+"人" + ll_gh.setOnClickListener { its-> + var intent = Intent(this, GongHuiDeatileActivity::class.java) + intent.putExtra("ghID", it.guild_info.id) + startActivity(intent) + } + } + iv_user_room.visibility = if (it.user_room_rid == "0") View.GONE else View.VISIBLE + iv_user_room.setOnClickListener { its-> + if (it.user_room_rid != "0"){ + viewModel.enterRoom(it.user_room_rid, "", this) + }else{ + "房间不存在".showToast() + } + } + mDataBinding.setVariable(BR.data1, it) +// iddddddd.text = if (it.special_uid == "0") it.uid else it.special_uid + iv_follow.isSelected = it.is_follow == "2" +// iv_follow.text = if (it.is_follow == "2") "已关注" else "关注" + + if (it.is_black == 1) { + mDataBinding.ivAddBlack.setImageResource(R.mipmap.black_add2) + } else { + mDataBinding.ivAddBlack.setImageResource(R.mipmap.black_add) + } + loadImage(v_img, it.head_pic, R.mipmap.ic_launcher_app) + if (it.user_albums_list.size > 0) { + loadImage(v_top_bg, it.user_albums_list[0].image, R.mipmap.ic_launcher_app) + } else { + loadImage(v_top_bg, it.head_pic, R.mipmap.ic_launcher_app) + } + + if (it.nobility_image.isNotEmpty()) { + iv_juewei.visibility = View.VISIBLE + } else { + iv_juewei.visibility = View.GONE + } + + loadImage(iv_juewei, it.nobility_image) + if(!TextUtils.isEmpty(it.nobility_image)){ + loadImage(iv_juewei2, it.nobility_image) + } + loadImage(iv_gongxian, it.user_charm_contribution_info.contribution_level_image) + loadImage(iv_meili, it.user_charm_contribution_info.charm_level_image) + loadImage(iv_gongxian2, it.user_charm_contribution_info.contribution_level_image) + loadImage(iv_meili2, it.user_charm_contribution_info.charm_level_image) + + +// iv_room.visibility = if (it.user_room_rid == "0") View.GONE else View.VISIBLE + fl_room2.visibility = if (it.user_room_visitor.rid == "0") View.GONE else View.VISIBLE + user_room_rid = it.user_room_rid + user_room_rid2 = it.user_room_visitor.rid + tv_room_name_2.text = "正在${it.user_room_visitor.room_name}" + + + if (it.sex=="1"){ + mDataBinding.ivSex.setImageResource(R.mipmap.login_reg_nan1) + }else{ + mDataBinding.ivSex.setImageResource(R.mipmap.login_reg_nv1) + } + + if (it.receive_gift_list.size == 0) { +// ll_nodata3.visibility = View.VISIBLE + } + + GlideUtil.loadImglogo(this, it.user_room_visitor.room_cover, mDataBinding.roomCover) + + if (it.user_albums_list.size < 8 && showDel()) { + val myPicBean = UserAlbumsList() + myPicBean.type = 2 + it.user_albums_list.add(myPicBean) + } + + myPicListAdapter.setNewData(it.user_albums_list) + if (it.user_albums_list.size == 0) { + myPicListAdapter.setEmptyView(R.layout.base_empty_view, rv_pic) + } + } + viewModel.cancelFollowData.observe(this) { + iv_follow.isSelected = false +// iv_follow.text = "关注" + } + viewModel.followData.observe(this) { + iv_follow.isSelected = true +// iv_follow.text = "已关注" + } + + + viewModel.imgListData.observe(this) { + var imgs = "" + for (str in it) { + imgs = if (imgs.isEmpty()) + str + else + "$imgs,$str" + } + viewModel.add_user_albums(imgs) + } + viewModel.delImgData.observe(this) { + initData() + } + viewModel.addImgData.observe(this) { + initData() + } + } + + override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { + if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_DOWN) { + if (intent.getStringExtra("tags") == "room") { + backToRoom() + return true + } + } + return super.onKeyDown(keyCode, event) + } + + fun showDel(): Boolean = + intent.getStringExtra("from_id") == UserManager.user.uid.toString() + + override fun getLayoutId(): Int = R.layout.activity_user_homepage + + @SuppressLint("CheckResult") + override fun initView() { + userDynamicAdapter = UserDynamicAdapter(this) + val linearLayoutManager = LinearLayoutManager(this) + rv_dt.layoutManager = linearLayoutManager + rv_dt.adapter = userDynamicAdapter + titleRes.add("资料") + titleRes.add("动态") + titleRes.add("礼物墙") + val icon1 = arrayOf( + R.mipmap.ziliao1, + R.mipmap.dongtai1, + R.mipmap.liwuqiang1 + ) + val icon2 = arrayOf( + R.mipmap.ziliao2, + R.mipmap.dongtai2, + R.mipmap.liwuqiang2 + ) + + + for (i in titleRes.indices) { + dataTab.add(object : CustomTabEntity { + override fun getTabTitle(): String { + return "" + } + + override fun getTabSelectedIcon(): Int { + return icon1[i] + } + + override fun getTabUnselectedIcon(): Int { + return icon2[i] + } + }) + } + + /*tab_layout.itemAnimator = null + tab_layout.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false) + val recyclerTabAdapter = RecyclerTabAdapter(R.layout.item_tablayout_header, titleRes) + tab_layout.adapter = recyclerTabAdapter + recyclerTabAdapter.setOnItemClickListener { adapter, view, position -> + recyclerTabAdapter.setSelectPosition(position) + viewModel.selectTab.postValue(position) + if(position==0){ + tab_layout.setBackgroundResource(R.mipmap.home_tab1) + }else if(position==1){ + tab_layout.setBackgroundResource(R.mipmap.home_tab2) + }else if(position==2){ + tab_layout.setBackgroundResource(R.mipmap.home_tab3) + } + }*/ + tab_layout.setTabData(dataTab) + + mDataBinding.setVariable(BR.vm1, viewModel) + userGiftWallAdapter = UserGiftWallAdapter() + rv_gift.layoutManager = GridLayoutManager(this, 3) + rv_gift.adapter = userGiftWallAdapter + + mDataBinding.rvTabTitle.layoutManager = GridLayoutManager(this, 2) + rcyGiftTabAdapter = + RecyclerTabAdapter(R.layout.item_tablayout_header31, arrayListOf("已点亮", "未点亮")) + mDataBinding.rvTabTitle.adapter = rcyGiftTabAdapter + + + rcyGiftTabAdapter.setOnItemClickListener { adapter, view, position -> + rcyGiftTabAdapter.setSelectPosition(position) + this.position = position; + if (position == 0) { + viewModel.get_user_illume_gift_wall( + intent.getStringExtra("from_id").toString(), page.toString(), "20" + ) + } else { + viewModel.get_user_unillume_gift_wall( + intent.getStringExtra("from_id").toString(), page.toString(), "20" + ) + } + } + + userGiftWallAdapter.setOnItemChildClickListener { adapter, view, position -> + + if (view.id == R.id.iv_head) { + UserGiftWallDialog(userGiftWallAdapter.data[position]).show( + supportFragmentManager, "用户礼物" + ) + } + + } + + + + //相册初始化 + myPicListAdapter = MyPicListAdapter(showDel()) + rv_pic.layoutManager = GridLayoutManager(this, 4) + rv_pic.adapter = myPicListAdapter + myPicListAdapter.setOnItemChildClickListener { adapter, view, position -> + when (view.id) { + R.id.iv_del -> { + viewModel.delImg(myPicListAdapter.data[position].aid) + } + } + } + myPicListAdapter.setOnItemClickListener { adapter, view, position -> + if (position != myPicListAdapter.data.size - 1 || myPicListAdapter.data[myPicListAdapter.data.size - 1].type != 2) { + val imgList: MutableList = + if (myPicListAdapter.data.size == 8 && myPicListAdapter.data[7].type != 2) myPicListAdapter.data.subList( + 0, + myPicListAdapter.data.size + ) else myPicListAdapter.data.subList(0, myPicListAdapter.data.size) + FullScreenUtil2.showFullScreenDialog(this, position, imgList) + } else { + var numss = 8 - (myPicListAdapter.data.size - 1) + if (numss > 3) numss = 3 + val rxPermissions = RxPermissions(this) + val finalNumss = numss + rxPermissions + .request(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + .subscribe { granted: Boolean -> + if (granted) { // Always true pre-M + // 跳转到相册 + ImagePicker.getInstance().selectLimit = finalNumss + ImagePicker.getInstance().isMultiMode = true + ImagePicker.getInstance().isCrop = false + val intent = Intent(this, ImageGridActivity::class.java) + //显示选中的图片 + startActivityForResult(intent, REQUEST_CODE_SELECT) + } + } + } + } + + viewModel.userGiftList.observe(this){ + + if (it.isNotEmpty()){ + + GlideUtil.loadImglogo(this,it[0].base_image,mDataBinding.giftCove1) + } + + if (it.size>1){ + GlideUtil.loadImglogo(this,it[1].base_image,mDataBinding.giftCove2) + } + + if (it.size>2){ + GlideUtil.loadImglogo(this,it[2].base_image,mDataBinding.giftCove3) + } + } + } + + override fun initData() { + intent.getStringExtra("from_id")?.let { + viewModel.loadData(it) + viewModel.get_user_zone_list(getMap(it)) + if (it == UserManager.user.uid.toString()) { + ll_bottom.visibility = View.GONE + } else { + iv_add_black.visibility = View.VISIBLE +// + } + viewModel.get_user_illume_gift_wall( + it, + "1", + "3" + ) + } + + + } + + private fun praise_zone(s: String, position: Int, i: Int) { + viewModel.praise_zone(s, position, i) + } + + override fun initEvent() { + + user_gift_wall.setOnClickListener { + intent.getStringExtra("from_id")?.let { + ARouter.getInstance().build(AroutUtil.GIFT_WALL).withString("uid", it) + .navigation() + } + + } + + iv_copy.setOnClickListener { + copyStr(text_vip.text.toString()) + } + + userDynamicAdapter.setOnItemChildClickListener { adapter, view, position -> + when (view.id) { + R.id.dianzan -> { + val id: Int = userDynamicAdapter.data[position].zid + val is_praise: Int = userDynamicAdapter.data[position].is_praise + if (is_praise == 1) { + praise_zone(id.toString() + "", position, 2) + } else { + praise_zone(id.toString() + "", position, 1) + } + } + R.id.dy_head_image -> { + ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE) + .withString("from_id", userDynamicAdapter.data[position].uid.toString()) + .navigation() + } +// R.id.delete -> { +// val id: Int = userDynamicAdapter.data[position].zid +// viewModel.delete_zone(id.toString()) +// } + } + } + userDynamicAdapter.setOnItemClickListener { adapter, view, position -> + ARouter.getInstance().build(AroutUtil.COMMUNITY_DETAIL) + .withString("zid", userDynamicAdapter.data[position].zid.toString()).navigation() + } + iv_add_black.setOnClickListener { + intent.getStringExtra("from_id")?.let { + if (viewModel.userData.value?.is_black == 1) { + viewModel.remove_blacklist(intent.getStringExtra("from_id").toString()) + } else { + viewModel.add_blacklist(intent.getStringExtra("from_id").toString()) + } + } + } + mDataBinding.ivBaseBack2.setOnClickListener { + if (intent.getStringExtra("tags") == "room") { + backToRoom() + } else { + finish() + } + } + + iv_follow.setOnClickListener { + intent.getStringExtra("from_id")?.let { + if (iv_follow.isSelected) { + viewModel.cancelFollowData(it) + } else { + viewModel.followData(it) + } + } + } + iv_liaotian.setOnClickListener { + viewModel.userData.value?.let { + LogUtils.e(it.uid,it.nick_name,it.head_pic) + val conversationInfo = ConversationInfo(); + conversationInfo.isGroup = false + conversationInfo.id = it.uid + conversationInfo.title = it.nick_name + conversationInfo.iconPath = it.head_pic + TUIConversationUtils.startChatActivity(conversationInfo) + } + } + + fl_room2.setOnClickListener { + viewModel.enterRoom(user_room_rid2, "", this) + } + + tab_layout.setOnTabSelectListener(object : OnTabSelectListener { + override fun onTabSelect(position: Int) { + viewModel.selectTab.postValue(position) + } + override fun onTabReselect(position: Int) { + } + }) + } + + /*------图片选择回调------*/ + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (data == null) { + return + } + if (resultCode == ImagePicker.RESULT_CODE_ITEMS) { + //添加图片返回 + if (requestCode == REQUEST_CODE_SELECT) { + val tempList = + data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS) as ArrayList? + ?: return + val parts = ArrayList() + for (i in tempList.indices) { + val file = File(tempList[i].path) + val requestFile = + RequestBody.create("multipart/form-data".toMediaTypeOrNull(), file) + val body = MultipartBody.Part.createFormData("file[]", file.name, requestFile) + parts.add(body) + } + viewModel.uploadImages(parts) + } + } + } + + companion object { + const val REQUEST_CODE_SELECT = 100 + } + + fun getMap(from_id: String): HashMap { + var map = HashMap() + map["from_id"] = from_id + return map + } + + /** + * 复制内容到剪切板 + * + * @param copyStr + * @return + */ + private fun copyStr(copyStr: String): Boolean { + return try { + //获取剪贴板管理器 + val cm: ClipboardManager = + getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + // 创建普通字符型ClipData + val mClipData: ClipData = ClipData.newPlainText("Label", copyStr) + // 将ClipData内容放到系统剪贴板里。 + cm.setPrimaryClip(mClipData) + + "复制成功".showToast() + + true + } catch (e: Exception) { + false + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/homepage/UserHomePageViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/homepage/UserHomePageViewModel.kt new file mode 100644 index 0000000..e15e38e --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/homepage/UserHomePageViewModel.kt @@ -0,0 +1,136 @@ +package com.yuyin.mier.module_my.homepage + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.util.showToast +import com.yuyin.module_community.model.DynamicBean +import com.yuyin.module_community.repository.CommunityRepository +import com.yuyin.mier.module_my.model.UserHomePageBean +import com.yuyin.mier.repository.CommonRepository +import com.yuyin.module_live.model.UserGiftList +import com.yuyin.module_live.repository.LiveRepository + +class UserHomePageViewModel : BaseViewModel() { + + var repository = CommunityRepository() + var myRepository = CommonRepository() + + var liveRepository = LiveRepository() + var selectTab = MutableLiveData(0) + var sexStr = MutableLiveData("") + + var userData = MutableLiveData() + var selPos = MutableLiveData(0) + var type = MutableLiveData(0) + var praiseAZone = MutableLiveData() + + var followData = MutableLiveData() + var cancelFollowData = MutableLiveData() + + var delImgData = MutableLiveData() + var addImgData = MutableLiveData() + + var dynamicList = MutableLiveData>() + + fun get_user_zone_list(map: MutableMap) { + launchUI { + var result = repository.get_user_zone_list(map) + dynamicList.value = result.data + } + } + + fun praise_zone(zid: String, pos: Int, s: Int) { + launchUI { + val result = repository.praise_zone(zid) + selPos.value = pos + type.value = s + praiseAZone.value = result.data + result.msg.showToast() + } + } + + + fun loadData(from_id: String) { + launchUI { + val result = myRepository.player_home_page(from_id) + userData.value = result.data + sexStr.value = loadSex() + } + } + + private fun loadSex(): String { + return if (userData.value?.sex == "1") + "男" + else + "女" + } + + fun followData(userId: String) { + launchUI { + val result = myRepository.follow(userId) + followData.value = result.data + } + } + + fun cancelFollowData(userId: String) { + launchUI { + val result = myRepository.cancel_follow(userId) + cancelFollowData.value = result.data + } + } + + fun delImg(aid: String) { + launchUI { + val result = myRepository.upload_del(aid) + delImgData.value = result.data + } + } + + fun add_user_albums(imgs: String) { + launchUI { + val result = myRepository.add_user_albums(imgs) + addImgData.value = result.data + } + } + + var addBlack = MutableLiveData() + fun add_blacklist(userId: String) { + launchUI { + val result = myRepository.add_blacklist(userId) + addBlack.value = result.data + } + } + + var removeBlackData = MutableLiveData() + fun remove_blacklist(uid: String) { + launchUI { + val result = myRepository.remove_blacklist(uid) + removeBlackData.value = result.data + } + } + + + val userGiftList = MutableLiveData>() + fun get_user_unillume_gift_wall( + user_id: String, + page: String, + page_limit: String + ) { + launchUI { + val result = liveRepository.get_user_unillume_gift_wall(user_id, page, page_limit) + userGiftList.value = result.data + } + } + + fun get_user_illume_gift_wall( + user_id: String, + page: String, + page_limit: String + ) { + launchUI { + val result = liveRepository.get_user_illume_gift_wall(user_id, page, page_limit) + userGiftList.value = result.data + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/adapter/DuiHuanLogAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/log/adapter/DuiHuanLogAdapter.kt new file mode 100644 index 0000000..679f2aa --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/adapter/DuiHuanLogAdapter.kt @@ -0,0 +1,18 @@ +package com.yuyin.mier.module_my.log.adapter + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.yuyin.lib_base.model.MoneyLogList +import com.yuyin.lib_base.util.TimeUtil +import com.yuyin.mier.R +import java.util.* + +class DuiHuanLogAdapter : + BaseQuickAdapter(R.layout.item_log_duihuan, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: MoneyLogList) { + helper + .setText(R.id.tv_title2, item.change_type_desc) + .setText(R.id.tv_title3, TimeUtil.toDateYmdHan3(item.add_time.toLong())) + .setText(R.id.tv_title4, item.change_value) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/adapter/JiFenLogAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/log/adapter/JiFenLogAdapter.kt new file mode 100644 index 0000000..227d070 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/adapter/JiFenLogAdapter.kt @@ -0,0 +1,21 @@ +package com.yuyin.mier.module_my.log.adapter + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.yuyin.lib_base.model.MoneyLogList +import com.yuyin.lib_base.util.TimeUtil +import com.yuyin.mier.R +import java.util.* + +class JiFenLogAdapter : + BaseQuickAdapter(R.layout.item_log_jifen, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: MoneyLogList) { + try { + helper + .setText(R.id.tv_title2, item.remarks) + .setText(R.id.tv_title3, TimeUtil.toDateYmdHan3(item.add_time.toLong())) + .setText(R.id.tv_title4, item.change_value) + } catch (e: Exception) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/adapter/QianLogAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/log/adapter/QianLogAdapter.kt new file mode 100644 index 0000000..630625b --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/adapter/QianLogAdapter.kt @@ -0,0 +1,21 @@ +package com.yuyin.mier.module_my.log.adapter + +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.yuyin.lib_base.model.MoneyLogList +import com.yuyin.lib_base.util.TimeUtil +import com.yuyin.mier.R +import java.util.* + +class QianLogAdapter : + BaseQuickAdapter(R.layout.item_log_jifen, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: MoneyLogList) { + try { + helper + .setText(R.id.tv_title2, item.remarks) + .setText(R.id.tv_title3, TimeUtil.toDateYmdHan3(item.add_time.toLong())) + .setText(R.id.tv_title4, item.change_value) + } catch (e: Exception) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/adapter/TiXianLogAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/log/adapter/TiXianLogAdapter.kt new file mode 100644 index 0000000..4c6a99e --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/adapter/TiXianLogAdapter.kt @@ -0,0 +1,19 @@ +package com.yuyin.mier.module_my.log.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_my.model.TiXianLogBean +import java.util.* + +class TiXianLogAdapter : + BaseQuickAdapter(R.layout.item_log_tixian, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: TiXianLogBean) { + helper + .setText(R.id.tv_title2, "提现 (" + item.status_desc + ")") + .setText(R.id.tv_title3, TimeUtil.toDateYmdHan3(item.add_time)) + .setText(R.id.tv_title4, "+" + item.money) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/adapter/ZhuanZengLogAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/log/adapter/ZhuanZengLogAdapter.kt new file mode 100644 index 0000000..3111514 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/adapter/ZhuanZengLogAdapter.kt @@ -0,0 +1,21 @@ +package com.yuyin.mier.module_my.log.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.lib_base.util.TimeUtil +import com.yuyin.mier.R +import com.yuyin.mier.module_my.model.ZengSongBean +import java.util.* + +class ZhuanZengLogAdapter : + BaseQuickAdapter(R.layout.item_log_zhuanzeng, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: ZengSongBean) { + helper + .setText(R.id.tv_title, item.from_user_info.nick_name + "(" + item.remarks + ")") + .setText(R.id.tv_title4, TimeUtil.toDateYmdHan3(item.add_time.toLong())) + .setText(R.id.tv_title3, item.change_value) + .setText(R.id.tv_title2, "ID:${item.from_uid}") + GlideUtil.loadImglogo(mContext, item.from_user_info.head_pic, helper.getView(R.id.v_img)) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/duihuan/DuiHuanLogActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/log/duihuan/DuiHuanLogActivity.kt new file mode 100644 index 0000000..b6c7a7b --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/duihuan/DuiHuanLogActivity.kt @@ -0,0 +1,64 @@ +package com.yuyin.mier.module_my.log.duihuan + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.yuyin.mier.module_my.log.adapter.DuiHuanLogAdapter +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_LOG_DUIHUAN +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.mier.R +import com.yuyin.mier.module_my.log.qian.QianLogViewModel +import kotlinx.android.synthetic.main.activity_log_duihuan.* + +@Route(path = MAIN_MY_LOG_DUIHUAN) +class DuiHuanLogActivity : BaseActivity() { + var page: Int = 1 + private var cashHisAdapter: DuiHuanLogAdapter? = null + override fun startObserve() { + viewModel.moneyLogLists.observe(this) { + if (page == 1 && it.isEmpty()) { + ll_nodata.visibility = View.VISIBLE + } + if (page == 1) { + cashHisAdapter?.setNewData(it) + smart.finishRefresh() + } else { + cashHisAdapter?.addData(it) + smart.finishLoadMore() + } + } + viewModel.getFinally().observe(this, { + smart.finishRefresh() + smart.finishLoadMore() + }) + } + + override fun getLayoutId(): Int = R.layout.activity_log_duihuan + + override fun initView() { + } + + override fun initData() { + cashHisAdapter = DuiHuanLogAdapter() + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = cashHisAdapter + viewModel.get_user_money_log_list(page.toString()) + smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.get_user_money_log_list(page.toString()) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.get_user_money_log_list(page.toString()) + } + + }) + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/duihuan/DuiHuanLogViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/log/duihuan/DuiHuanLogViewModel.kt new file mode 100644 index 0000000..08bbe86 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/duihuan/DuiHuanLogViewModel.kt @@ -0,0 +1,20 @@ +package com.yuyin.mier.module_my.log.duihuan + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_my.model.DuiHuanLogBean +import com.yuyin.mier.repository.CommonRepository + +class DuiHuanLogViewModel : BaseViewModel() { + + var myRepository = CommonRepository() + + var duiHuanData = MutableLiveData>() + + fun loadData(page: String) { + launchUI { + val result = myRepository.exchange_log(page) + duiHuanData.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/jifen/JiFenLogActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/log/jifen/JiFenLogActivity.kt new file mode 100644 index 0000000..7656597 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/jifen/JiFenLogActivity.kt @@ -0,0 +1,63 @@ +package com.yuyin.mier.module_my.log.jifen + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_LOG_JIFEN +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.mier.R +import com.yuyin.mier.module_my.log.adapter.JiFenLogAdapter +import kotlinx.android.synthetic.main.activity_log_zhuanzeng.* + +@Route(path = MAIN_MY_LOG_JIFEN) +class JiFenLogActivity : BaseActivity() { + var page: Int = 1 + private var cashHisAdapter: JiFenLogAdapter? = null + override fun startObserve() { + viewModel.moneyLogLists.observe(this, { + if (page == 1 && it.isEmpty()) { + ll_nodata.visibility = View.VISIBLE + } + if (page == 1) { + cashHisAdapter?.setNewData(it) + smart.finishRefresh() + } else { + cashHisAdapter?.addData(it) + smart.finishLoadMore() + } + }) + viewModel.getFinally().observe(this, { + smart.finishRefresh() + smart.finishLoadMore() + }) + } + + override fun getLayoutId(): Int = R.layout.activity_log_jifen + + override fun initView() { + } + + override fun initData() { + cashHisAdapter = JiFenLogAdapter() + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = cashHisAdapter + viewModel.get_user_integral_log_list(page.toString()) + smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.get_user_integral_log_list(page.toString()) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.get_user_integral_log_list(page.toString()) + } + + }) + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/jifen/JiFenLogViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/log/jifen/JiFenLogViewModel.kt new file mode 100644 index 0000000..cbd7efb --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/jifen/JiFenLogViewModel.kt @@ -0,0 +1,21 @@ +package com.yuyin.mier.module_my.log.jifen + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.model.MoneyLogList +import com.yuyin.mier.repository.CommonRepository + +class JiFenLogViewModel : BaseViewModel() { + + var myRepository = CommonRepository() + + var moneyLogLists = MutableLiveData>() + + + fun get_user_integral_log_list(page: String) { + launchUI { + val result = myRepository.get_user_integral_log_list(page) + moneyLogLists.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/qian/QianLogActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/log/qian/QianLogActivity.kt new file mode 100644 index 0000000..4911174 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/qian/QianLogActivity.kt @@ -0,0 +1,60 @@ +package com.yuyin.mier.module_my.log.qian + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.mier.R +import com.yuyin.mier.module_my.log.adapter.QianLogAdapter +import kotlinx.android.synthetic.main.activity_log_zhuanzeng.* + +class QianLogActivity : BaseActivity() { + var page: Int = 1 + private var cashHisAdapter: QianLogAdapter? = null + override fun startObserve() { + viewModel.moneyLogLists.observe(this, { + if (page == 1 && it.isEmpty()) { + ll_nodata.visibility = View.VISIBLE + } + if (page == 1) { + cashHisAdapter?.setNewData(it) + smart.finishRefresh() + } else { + cashHisAdapter?.addData(it) + smart.finishLoadMore() + } + }) + viewModel.getFinally().observe(this, { + smart.finishRefresh() + smart.finishLoadMore() + }) + } + + override fun getLayoutId(): Int = R.layout.activity_log_jifen + + override fun initView() { + } + + override fun initData() { + cashHisAdapter = QianLogAdapter() + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = cashHisAdapter + viewModel.get_user_money_log_list(page.toString()) + smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.get_user_money_log_list(page.toString()) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.get_user_money_log_list(page.toString()) + } + + }) + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/qian/QianLogViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/log/qian/QianLogViewModel.kt new file mode 100644 index 0000000..6518e05 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/qian/QianLogViewModel.kt @@ -0,0 +1,21 @@ +package com.yuyin.mier.module_my.log.qian + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.model.MoneyLogList +import com.yuyin.mier.repository.CommonRepository + +class QianLogViewModel : BaseViewModel() { + + var myRepository = CommonRepository() + + var moneyLogLists = MutableLiveData>() + + + fun get_user_money_log_list(page: String) { + launchUI { + val result = myRepository.get_user_money_log_list(page) + moneyLogLists.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/tixian/TiXianLogActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/log/tixian/TiXianLogActivity.kt new file mode 100644 index 0000000..95e09ea --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/tixian/TiXianLogActivity.kt @@ -0,0 +1,61 @@ +package com.yuyin.mier.module_my.log.tixian + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.yuyin.mier.module_my.log.adapter.TiXianLogAdapter +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.activity_log_tixian.* + +//@Route(path = MAIN_MY_LOG_TIXIAN) +class TiXianLogActivity : BaseActivity() { + var page: Int = 1 + private var cashHisAdapter: TiXianLogAdapter? = null + override fun startObserve() { + viewModel.tiXianData.observe(this, { + if (page == 1 && it.isEmpty()) { + ll_nodata.visibility = View.VISIBLE + } + if (page == 1) { + cashHisAdapter?.setNewData(it) + smart.finishRefresh() + } else { + cashHisAdapter?.addData(it) + smart.finishLoadMore() + } + }) + viewModel.getFinally().observe(this, { + smart.finishRefresh() + smart.finishLoadMore() + }) + } + + override fun getLayoutId(): Int = R.layout.activity_log_tixian + + override fun initView() { + } + + override fun initData() { + cashHisAdapter = TiXianLogAdapter() + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = cashHisAdapter + viewModel.loadData(page.toString()) + smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.loadData(page.toString()) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.loadData(page.toString()) + } + + }) + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/tixian/TiXianLogViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/log/tixian/TiXianLogViewModel.kt new file mode 100644 index 0000000..210f6ca --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/tixian/TiXianLogViewModel.kt @@ -0,0 +1,20 @@ +package com.yuyin.mier.module_my.log.tixian + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_my.model.TiXianLogBean +import com.yuyin.mier.repository.CommonRepository + +class TiXianLogViewModel : BaseViewModel() { + + var myRepository = CommonRepository() + + var tiXianData = MutableLiveData>() + + fun loadData(page: String) { + launchUI { + val result = myRepository.tixian_log(page) + tiXianData.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/zhuanzeng/ZhuanZengLogActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/log/zhuanzeng/ZhuanZengLogActivity.kt new file mode 100644 index 0000000..123a6d0 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/zhuanzeng/ZhuanZengLogActivity.kt @@ -0,0 +1,64 @@ +package com.yuyin.mier.module_my.log.zhuanzeng + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_LOG_ZHUANZENG +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.mier.R +import com.yuyin.mier.module_my.log.adapter.ZhuanZengLogAdapter +import kotlinx.android.synthetic.main.activity_log_zhuanzeng.* + +@Route(path = MAIN_MY_LOG_ZHUANZENG) +class ZhuanZengLogActivity : BaseActivity() { + var page: Int = 1 + private var id = 0 + private var cashHisAdapter: ZhuanZengLogAdapter? = null + override fun startObserve() { + viewModel.zengSongData.observe(this, { + if (page == 1 && it.isEmpty()) { + ll_nodata.visibility = View.VISIBLE + } + if (page == 1) { + cashHisAdapter?.setNewData(it) + smart.finishRefresh() + } else { + cashHisAdapter?.addData(it) + smart.finishLoadMore() + } + }) + viewModel.getFinally().observe(this, { + smart.finishRefresh() + smart.finishLoadMore() + }) + } + + override fun getLayoutId(): Int = R.layout.activity_log_zhuanzeng + + override fun initView() { + } + + override fun initData() { + cashHisAdapter = ZhuanZengLogAdapter() + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = cashHisAdapter + viewModel.loadData(page.toString()) + smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.loadData(page.toString()) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.loadData(page.toString()) + } + + }) + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/log/zhuanzeng/ZhuanZengLogViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/log/zhuanzeng/ZhuanZengLogViewModel.kt new file mode 100644 index 0000000..f8dcf69 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/log/zhuanzeng/ZhuanZengLogViewModel.kt @@ -0,0 +1,20 @@ +package com.yuyin.mier.module_my.log.zhuanzeng + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_my.model.ZengSongBean +import com.yuyin.mier.repository.CommonRepository + +class ZhuanZengLogViewModel : BaseViewModel() { + + var myRepository = CommonRepository() + + var zengSongData = MutableLiveData>() + + fun loadData(page: String) { + launchUI { + val result = myRepository.get_user_give_integral_list(page) + zengSongData.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/model/MyBean.kt b/app/src/main/java/com/yuyin/mier/module_my/model/MyBean.kt new file mode 100644 index 0000000..9dd780d --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/model/MyBean.kt @@ -0,0 +1,351 @@ +package com.yuyin.mier.module_my.model + +import android.widget.ImageView +import androidx.databinding.BindingAdapter +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.google.gson.annotations.SerializedName +import com.yuyin.mier.R +import com.yuyin.module_live.model.UserGiftList + +data class UrlBean( + var url: String = "", + var status: String = "", + var signed_at: String = "", +) + + +data class GoodsListBean( + var crid: String = "", + var money: String = "", + var integral: String = "", + var isSelect: Boolean = false +) + +data class MoneyBean( + var alipay_name: String = "", + var alipay_account: String = "", + var integral: String = "0", + var money: String = "0", + var bank_user_name: String = "", + var bank_card: String = "", + var open_bank: String = "", + var bank_card_number: String = "", + var bank_card_name: String = "", + var bank_cert_id: String = "", + var bank_tel_no: String = "", + var is_bingd_alipay: Int = 0, + var withdraw_rate: Float = 0.0f, + var user_withdraw_rate: Float = 0.0f, +) + +data class UseDecorateList( + val list: List, + val user_info: UserInfo +) + + +data class UserInfo( + val base64_nick_name: String, + val head_pic: String, + val nick_name: String, + val sex: Int, + val special_uid: Int, + val uid: Int +) + +data class ZhungBanBean( + var udid: String = "", + var play_image: String = "", + var base_image: String = "", + var title: String = "", + var type: String = "", + var is_using: Int = 0, + var end_time: String, +) + +data class ZhungBanShangChengBean( + var did: Int = 0, + var title: String = "", + var type: String = "", + @SerializedName(value = "integral", alternate = ["price"]) + var integral: String = "", + var period: Int = 0, + var base_image: String = "", + var is_select: Boolean = false, +) + + +data class ChaMoneyBean( + var money: Int = 0, + var give: Int = 0, +) + +data class ZengSongBean( + var change_type: String = "", + var change_value: String = "", + var remarks: String = "", + var from_uid: String = "", + var add_time: String = "", + var from_user_info: ZengSongUserBean = ZengSongUserBean(), + var change_type_desc: String = "" +) + +data class ZengSongUserBean( + var uid: String = "", + var head_pic: String = "", + var nick_name: String = "" +) + +data class TiXianLogBean( + var order_sn: String = "", + var money: String = "", + var general_money: String = "", + var real_name: String = "", + var alipay_account: String = "", + var remarke: String = "", + var status: Int = 0, + var add_time: Long = 0, + var status_desc: String = "" +) + +data class DuiHuanLogBean( + var eid: String = "", + var uid: String = "", + var money: String = "", + var integral: String = "", + var add_time: String = "", + var update_time: String = "" +) + +data class GiftLogSubBean( + var gid: String = "", + var gift_name: String = "", + var gift_price: String = "", + var gift_num: String = "", + var gift_total_price: String = "", + var add_time: String = "", + var base_image: String = "" +) + +data class GiftLogBean( + var receive_uid: String = "", + var total_send_amount: String = "", + var last_send_time: Long = 0, + var send_user_info: GiftLogUserBean = GiftLogUserBean(), +) + +data class GiftLogUserBean( + var nick_name: String = "", + var head_pic: String = "", + var uid: String = "" +) + +data class CollectRoomListBean( + var id: Int = 0, + var uid: Int = 0, + var rid: Int = 0, + var add_time: Int = 0, + var is_online:String="", + var update_time: Int = 0, + var room_owner_uid: Int = 0, + var room_number: Int = 0, + var room_name: String = "", + var room_cover: String = "", + var hot_value: Int = 0 +) + +data class UserInfoBean( + var uid: Int = 0, + var user_name: String = "", + var base64_nick_name: String = "", + var nick_name: String = "", + var head_pic: String = "", + var login_token: String = "", + var sex: Int = 0, + var birthday: String = "", + var special_uid: Int = 0, + var money: String = "", + var frozen_money: String = "", + var integral: String = "", + var room_profit: String = "", + var is_real: Int = 0, + var follow_num: Int = 0, + var fans_num: Int = 0, + var autograph: String = "", + var country: String = "", + var province: String = "", + var city: String = "", + var constellation: String = "" +) + +data class DengJiBean( + var charm_level_info: CharmLevelInfoBean = CharmLevelInfoBean(), + var contribution_level_info: ContributionLevelInfoBean = ContributionLevelInfoBean() +) + +data class CharmLevelInfoBean( + var now_level: Int = 0, + var now_value: Int = 0, + var now_level_image: String = "", + var next_level: Int = 0, + var next_level_image: String = "", + var next_value: Int = 0 +) { + companion object { + @JvmStatic + @BindingAdapter("imgurl") + fun loadImg1(view: ImageView, url: String?) { + Glide.with(view.context).load(url).apply(RequestOptions().error(R.mipmap.no_tu)) + .into(view) + } + } +} + +data class ContributionLevelInfoBean( + var now_level: Int = 0, + var now_value: Int = 0, + var now_level_image: String = "", + var next_level: Int = 0, + var next_level_image: String = "", + var next_value: Int = 0 +) { + companion object { + @JvmStatic + @BindingAdapter("imgurl") + fun loadImg2(view: ImageView, url: String?) { + Glide.with(view.context).load(url).apply(RequestOptions().error(R.mipmap.no_tu)) + .into(view) + } + } +} + + +data class UserHomePageBean( + var user_charm_contribution_info: UserCharmContributionInfoBean = UserCharmContributionInfoBean(), + var uid: String = "", + var nick_name: String = "", + var is_online: String = "", + var sex: String = "", + var country: String = "", + var head_pic: String = "", + var special_uid: String = "", + var follow_num: String = "", + var fans_num: String = "", + var birthday: String = "", + var room_collect_num: String = "", + var user_room_rid: String = "", + var is_follow: String = "", + var is_befollow: String = "", + var autograph: String = "这个人很懒,还没有个性签名~", + var hobby: String = "", + var is_black: Int = 0, + var receive_gift_list: ArrayList = ArrayList(), + var user_albums_list: ArrayList = ArrayList(), + var user_room_visitor: UserRoomVisitor = UserRoomVisitor(), + var nobility_image: String = "", + var cp_num: String = "", + var is_join_guild:String="", + var guild_info:GuildInfoBean=GuildInfoBean() +) + +data class GuildInfoBean( + var id: String = "", + var guild_special_id: String = "", + var uid: String = "", + var guild_name: String = "", + var cover: String = "", + var num:String="" +) + +data class UserCharmContributionInfoBean( + var charm_level_image: String = "", + var contribution_level_image: String = "" +) + +data class UserRoomVisitor( + var rid: String = "", + var room_name: String = "", + var room_cover: String = "" +) + +data class UserAlbumsList( + var type: Int = 1, + var aid: String = "", + var image: String = "" +) + + + +data class AdornmentInfo( + val base_image: String, + val decorate_price: List, + val did: Int, + val play_image: String, + val title: String, + val type: Int +) + + +data class BuyAdornmentBean( + var price: String, + var day: String, +) + + +data class CPDetailsBean( + val avatar_play_image: String, + val cp_level: Int, + val cp_value: String, + val head_pic: String, + val is_online: String, + val receive_is_online: String, + val is_have_cp: Int, + val next_level: Int, + val next_value: Int, + val nick_name: String, + val now_level: Int, + val now_value: String, + val receive_avatar_play_image: String, + val receive_head_pic: String, + val receive_nick_name: String, + val receive_uid: Int, + val receive_win_base_image: String, + val receive_win_play_image: String, + val uid: String, + val win_base_image: String, + val win_play_image: String +) + + +data class VIPData( + val is_vip: Int, + val update_inviter_price: String, + val user_vid: Int, + val vip_list: List, + var vip_end_time:Int +) + +data class Vip( + val day: Int, + val name: String, + val price: String, + val vid: Int, + var isSelect: Boolean=false +) + + +data class TeenagerBean( + var teenager: String +) + +data class InviteInfoBean( + val invite_uid: Int, + val inviter_nick_name: String, + val update_inviter_price: String +) + +data class RenewalAmountBean( + val money:String, + var id:String +) diff --git a/app/src/main/java/com/yuyin/mier/module_my/model/PayResult.java b/app/src/main/java/com/yuyin/mier/module_my/model/PayResult.java new file mode 100644 index 0000000..55cdf3c --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/model/PayResult.java @@ -0,0 +1 @@ +package com.yuyin.mier.module_my.model; import android.text.TextUtils; import java.util.Map; public class PayResult { private String resultStatus; private String result; private String memo; public PayResult(Map rawResult) { if (rawResult == null) { return; } for (String key : rawResult.keySet()) { if (TextUtils.equals(key, "resultStatus")) { resultStatus = rawResult.get(key); } else if (TextUtils.equals(key, "result")) { result = rawResult.get(key); } else if (TextUtils.equals(key, "memo")) { memo = rawResult.get(key); } } } @Override public String toString() { return "resultStatus={" + resultStatus + "};memo={" + memo + "};result={" + result + "}"; } /** * @return the resultStatus */ public String getResultStatus() { return resultStatus; } /** * @return the memo */ public String getMemo() { return memo; } /** * @return the result */ public String getResult() { return result; } } \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/JiFenLogViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/money/JiFenLogViewModel.kt new file mode 100644 index 0000000..80f7450 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/JiFenLogViewModel.kt @@ -0,0 +1,50 @@ +package com.yuyin.mier.module_my.money + +import androidx.lifecycle.MutableLiveData +import com.yuyin.mier.module_my.model.DuiHuanLogBean +import com.yuyin.mier.module_my.model.TiXianLogBean +import com.yuyin.mier.module_my.model.ZengSongBean +import com.yuyin.mier.repository.CommonRepository +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.model.MoneyLogList + +class JiFenLogViewModel : BaseViewModel() { + + var myRepository = CommonRepository() + + var moneyLogLists = MutableLiveData>() + + + fun get_user_integral_log_list(page: String) { + launchUI { + val result = myRepository.get_user_integral_log_list(page) + moneyLogLists.value = result.data + } + } + + var zengSongData = MutableLiveData>() + + fun get_user_give_integral_list(page: String) { + launchUI { + val result = myRepository.get_user_give_integral_list(page) + zengSongData.value = result.data + } + } + + var tiXianData = MutableLiveData>() + + fun tixian_log(page: String) { + launchUI { + val result = myRepository.tixian_log(page) + tiXianData.value = result.data + } + } + + var duiHuanData = MutableLiveData>() + fun exchange_log(page: String) { + launchUI { + val result = myRepository.exchange_log(page) + duiHuanData.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/MoneyDetailActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/money/MoneyDetailActivity.kt new file mode 100644 index 0000000..aa027a6 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/MoneyDetailActivity.kt @@ -0,0 +1,90 @@ +package com.yuyin.mier.module_my.money + +import androidx.recyclerview.widget.LinearLayoutManager +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.mier.R +import com.yuyin.lib_base.base.BaseActivity +import kotlinx.android.synthetic.main.activity_log_zhuanzeng.recyclerview +import kotlinx.android.synthetic.main.activity_log_zhuanzeng.smart + +class MoneyDetailActivity : BaseActivity() { + var page: Int = 1 + var adapter1 = QianLogAdapter() + + override fun startObserve() { + + + viewModel.moneyLogLists.observe(this) { + if (page == 1) { + if (it.isEmpty()) { + adapter1.setEmptyView(R.layout.qmui_empty_view,recyclerview) + } + adapter1.setNewData(it) + } else { + adapter1.addData(it) + } + + } + +// viewModel.zengSongData.observe(this) { + + +// recyclerview.adapter = adapter1 +// adapter1.setNewData(it) +// } + + + viewModel.getFinally().observe(this) { + smart.finishRefresh() + smart.finishLoadMore() + } + } + + override fun getLayoutId(): Int = R.layout.activity_money_detail + + override fun initView() { + + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = adapter1 + } + + override fun initData() { + viewModel.get_user_integral_log_list(page.toString()) + smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.get_user_integral_log_list(page.toString()) +// if (tab_layout.currentTab == 0) { +// +// } else if (tab_layout.currentTab == 1) { +// page = 1 +// viewModel.tixian_log(page.toString()) +// } else { +// page = 1 +// viewModel.exchange_log(page.toString()) +// } + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + + page++ + viewModel.get_user_integral_log_list(page.toString()) + +// if (tab_layout.currentTab == 0) { +// +// } else if (tab_layout.currentTab == 1) { +// page++ +// viewModel.tixian_log(page.toString()) +// } else { +// page++ +// viewModel.exchange_log(page.toString()) +// } + } + + }) + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/MoneyMainActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/money/MoneyMainActivity.kt new file mode 100644 index 0000000..e00378a --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/MoneyMainActivity.kt @@ -0,0 +1,174 @@ +package com.yuyin.mier.module_my.money + +import android.content.Intent +import android.graphics.Color +import android.text.TextUtils +import android.view.View +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.yuyin.lib_base.adapter.MyPagerAdapter +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_MONEY +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityMoneyMainBinding +import com.yuyin.mier.module_my.money.bi.JinBiFragment +import com.yuyin.mier.module_my.money.bi.JinBiViewModel +import com.yuyin.mier.module_my.money.tixian.TiXianActivity +import com.yuyin.mier.module_my.money.zuan.MoneyContainerActivity +import com.yuyin.mier.module_my.money.zuan.ShouYiFragment +import kotlinx.android.synthetic.main.activity_money_main.* + + +@Route(path = MAIN_MY_MONEY) +class MoneyMainActivity : BaseDataBindingActivity() { + private var titleList = ArrayList() + private var mFragments = ArrayList() + private lateinit var mAdapter: MyPagerAdapter + + override fun startObserve() { + viewModel.moneyBean.observe(this) { + + mDataBinding.tvYuE.setText(it.integral) + + mDataBinding.tvZuan.setText(it.money) + if (it.alipay_account.length>0) { + if(it.alipay_account.length>10){ + var startNum=it.alipay_account.substring(0,3) + var endNum=it.alipay_account.substring(7,it.alipay_account.length) + mDataBinding.tvContent2.text=startNum+"****"+endNum + }else{ + mDataBinding.tvContent2.text=it.alipay_account + } + mDataBinding.tvContent2.setTextColor(Color.parseColor("#FF9249FF")) + } + if(!TextUtils.isEmpty(it.bank_card_number)){ + if (it.bank_card_number.length>0) { + mDataBinding.tvContentYhkBind.text=it.bank_card_number + mDataBinding.tvContentYhkBind.setTextColor(Color.parseColor("#FF9249FF")) + } + } + } + } + + override fun getLayoutId(): Int = R.layout.activity_money_main + + override fun initView() { + mFragments = ArrayList() + titleList = ArrayList() + titleList.add("我的灵石") + mFragments.add(JinBiFragment()) + titleList.add("我的钻石") + mFragments.add(ShouYiFragment()) + + mAdapter = MyPagerAdapter(supportFragmentManager, mFragments, titleList) + view_pager.adapter = mAdapter + + view_pager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() { + override fun onPageSelected(position: Int) { + if (position == 0) { + v_top_bg.setBackgroundResource(R.mipmap.money_bg_jinbi) + ll_tab1.isSelected = true; + ll_tab2.isSelected = false + tv_tab11.visibility = View.GONE + tv_tab22.visibility = View.VISIBLE + tv_tab1.visibility - View.VISIBLE + } else { + v_top_bg.setBackgroundResource(R.mipmap.money_bg_shouyi) + ll_tab1.isSelected = false; + ll_tab2.isSelected = true + tv_tab11.visibility = View.VISIBLE + tv_tab22.visibility = View.GONE + tv_tab2.visibility = View.VISIBLE + } + } + }) + } + + override fun onResume() { + super.onResume() + viewModel.getMoneyData() + } + + override fun initData() { + ll_tab1.isSelected = true; + } + + override fun initEvent() { + tv_zuan_log.setOnClickListener { + ARouter.getInstance().build(AroutUtil.MAIN_MY_LOG_DUIHUAN).withString("type", "1") + .navigation() + } + tv_jinbi_log.setOnClickListener { + + startActivity(Intent(this, MoneyDetailActivity::class.java)) + +// ARouter.getInstance().build(AroutUtil.MAIN_MY_LOG_ZHUANZENG).withString("type", "1") +// .navigation() + + } + tv_jb_mx.setOnClickListener { +// ARouter.getInstance().build(AroutUtil.MAIN_MY_LOG_DUIHUAN).withString("type", "1") +// .navigation() + startActivity(Intent(this, MoneyDetailActivity::class.java)) + } + tv_chongzhi.setOnClickListener { + val intent = Intent(this, MoneyContainerActivity::class.java) + intent.putExtra("type", "1") + startActivity(intent) + } + tv_duihuan.setOnClickListener { + val intent = Intent(this, MoneyContainerActivity::class.java) + intent.putExtra("type", "2") + startActivity(intent) + } + tv_tixian.setOnClickListener { + val intent = Intent(this, TiXianActivity::class.java) + startActivity(intent) + } + ll_bdzfb.setOnClickListener { + ARouter.getInstance().build(AroutUtil.MAIN_MY_BINDALI) + .withString("type","zfb") + .withString("zhanghu", viewModel.moneyBean.value?.alipay_account) + .withString("ali_name", viewModel.moneyBean.value?.alipay_name) + .navigation() + } + ll_bdyhk.setOnClickListener { + ARouter.getInstance().build(AroutUtil.MAIN_MY_BINDALI) + .withString("type","yhk") +// .withString("zhanghu", viewModel.moneyBean.value?.bank_card_number) +// .withString("ali_name", viewModel.moneyBean.value?.bank_user_name) +// .withString("bank_card_name", viewModel.moneyBean.value?.bank_card_name) +// .withString("bank_cert_id", viewModel.moneyBean.value?.bank_cert_id) +// .withString("bank_tel_no", viewModel.moneyBean.value?.bank_tel_no) + + .withString("zhanghu", viewModel.moneyBean.value?.bank_card_number) + .withString("ali_name", viewModel.moneyBean.value?.bank_user_name) + .withString("bank_card_name", viewModel.moneyBean.value?.bank_card) +// .withString("bank_cert_id", viewModel.moneyBean.value?.bank_cert_id) + .withString("bank_tel_no", viewModel.moneyBean.value?.open_bank) + .navigation() + } + ll_tab1.setOnClickListener { + ll_tab1.isSelected = true; + ll_tab2.isSelected = false + view_pager.currentItem = 0 + } + + + ll_tab2.setOnClickListener { + ll_tab1.isSelected = false; + ll_tab2.isSelected = true + view_pager.currentItem = 1 + + } + + + tvMx.setOnClickListener { + + startActivity(Intent(this, MoneyDetailActivity::class.java)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/MoneyMainViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/money/MoneyMainViewModel.kt new file mode 100644 index 0000000..7df9e6b --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/MoneyMainViewModel.kt @@ -0,0 +1,9 @@ +package com.yuyin.mier.module_my.money + +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.repository.CommonRepository + +class MoneyMainViewModel : BaseViewModel() { + var repository = CommonRepository() + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/QianLogAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/money/QianLogAdapter.kt new file mode 100644 index 0000000..b9f803a --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/QianLogAdapter.kt @@ -0,0 +1,28 @@ +package com.yuyin.mier.module_my.money + +import android.graphics.Color +import com.chad.library.adapter.base.BaseQuickAdapter +import com.chad.library.adapter.base.BaseViewHolder +import com.yuyin.mier.R +import com.yuyin.lib_base.model.MoneyLogList +import com.yuyin.lib_base.util.TimeUtil +import java.util.* + +class QianLogAdapter : + BaseQuickAdapter(R.layout.item_log_jifen, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: MoneyLogList) { + try { + helper + .setText(R.id.tv_title2, item.change_type_desc) + .setText(R.id.tv_title3, TimeUtil.toDateYmdHan3(item.add_time.toLong())) + .setText(R.id.tv_title4, item.change_value) + if (item.change_type.contains("-")){ + helper.setTextColor(R.id.tv_title4, Color.parseColor("#FF4F4F")) + }else{ + helper.setTextColor(R.id.tv_title4, Color.parseColor("#333333")) + } + + } catch (e: Exception) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/ZengSongAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/money/ZengSongAdapter.kt new file mode 100644 index 0000000..7549610 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/ZengSongAdapter.kt @@ -0,0 +1,21 @@ +package com.yuyin.mier.module_my.money + +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.ZengSongBean +import com.yuyin.lib_base.util.TimeUtil +import java.util.* + +class ZengSongAdapter : + BaseQuickAdapter(R.layout.item_log_jifen, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: ZengSongBean) { + try { + helper + .setText(R.id.tv_title2, item.remarks) + .setText(R.id.tv_title3, TimeUtil.toDateYmdHan3(item.add_time.toLong())) + .setText(R.id.tv_title4, item.change_value) + } catch (e: Exception) { + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/bi/JinBiFragment.kt b/app/src/main/java/com/yuyin/mier/module_my/money/bi/JinBiFragment.kt new file mode 100644 index 0000000..48a76ca --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/bi/JinBiFragment.kt @@ -0,0 +1,312 @@ +package com.yuyin.mier.module_my.money.bi + +import android.annotation.SuppressLint +import android.content.Intent +import android.net.Uri +import android.os.Handler +import android.os.Message +import android.text.TextUtils +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.launcher.ARouter +import com.alipay.sdk.app.PayTask +import com.tencent.mm.opensdk.modelpay.PayReq +import com.tencent.mm.opensdk.openapi.WXAPIFactory +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.util.showToast +import com.yuyin.mier.BR +import com.yuyin.mier.R +import com.yuyin.mier.databinding.FragmentJinbiBinding +import com.yuyin.mier.module_my.adapter.ChargeAdapter +import com.yuyin.mier.module_my.model.GoodsListBean +import com.yuyin.mier.module_my.model.PayResult +import com.yuyin.mier.module_my.money.MoneyDetailActivity +import com.yuyin.mier.module_my.money.tixian.TiXianActivity +import kotlinx.android.synthetic.main.fragment_jinbi.myGrid +import kotlinx.android.synthetic.main.fragment_jinbi.tvMx +import kotlinx.android.synthetic.main.fragment_jinbi.tv_jb_mx + +class JinBiFragment : BaseDataBindingFragment() { + + private lateinit var chargeAdapter: ChargeAdapter + private var titleList = ArrayList() + private var mFragments = ArrayList() + private lateinit var mAdapter: MyPagerAdapter + var topic = "alipays://platformapi/startapp?saId=10000007&qrcode=" + + override fun startObserve() { + viewModel.goodsListData.observe(this) { + chargeAdapter.getList_adapter().clear() + chargeAdapter.getList_adapter().addAll(it) + chargeAdapter.notifyDataSetChanged() + } + + + viewModel.statusBean.observe(this) { + startActivity(Intent(activity, TiXianActivity::class.java)) + } + + + // 支付宝原生 + viewModel.alipay.observe(this) { + val payRunnable = Runnable { + val alipay = PayTask(activity) + val result: Map = alipay.payV2( + it, + true + ) + val msg = Message() + msg.what = SDK_PAY_FLAG + msg.obj = result + mHandler.sendMessage(msg) + } + // 必须异步调用 + val payThread = Thread(payRunnable) + payThread.start() + } + + + // 支付宝H5 支付 + viewModel.alipayH5.observe(this) { + // 固定前缀 + // 从汇付正扫接口获取的参数(以下值仅为示例) + // 字符串拼接 + var jumpUrl = it.pay_info + + val intent = Intent() + intent.setAction("android.intent.action.VIEW") + // jumpUrl 为先前示例中拼装的 url + val contentUrl = Uri.parse(jumpUrl) + intent.setData(contentUrl) + startActivity(intent) + +// var hubProgress = KProgressHUD +// .create(activity) +// .setStyle(KProgressHUD.Style.SPIN_INDETERMINATE) +// .setLabel("请稍等...") +// .show() +// wbView.loadUrl(jumpUrl) +// wbView.webViewClient = object : WebViewClient() { +// override fun shouldOverrideUrlLoading(webView: WebView, url: String): Boolean { +// if (url.contains("alipays://platformapi")) { +// var intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)); +// startActivity(intent) +// if (hubProgress != null && hubProgress.isShowing) +// hubProgress.dismiss() +// } else { +// wbView.loadUrl(url) +// } +// return true +// } +// +// override fun onLoadResource(p0: WebView?, p1: String?) { +// super.onLoadResource(p0, p1) +// } +// +// override fun onPageFinished(webView: WebView, s: String) { +// +// } +// } + } + + + viewModel.weixin.observe(this) { + val mWxApi = WXAPIFactory.createWXAPI( + requireContext(), null + ) + + // 将该app注册到微信 + mWxApi.registerApp("wx7b5c4e89e726a72c") + // 判断是否安装客户端 + if (!mWxApi.isWXAppInstalled) { + "请您先安装微信客户端!".showToast() + return@observe + } + val req = PayReq() + // 微信开放平台审核通过的应用APPID + req.appId = "wx7b5c4e89e726a72c" + // 微信支付分配的商户号 + req.partnerId = it.partnerid + // 预支付订单号,app服务器调用“统一下单”接口获取 + req.prepayId = it.prepayid + // 随机字符串,不长于32位 + req.nonceStr = it.noncestr + // 时间戳 + req.timeStamp = java.lang.String.valueOf(it.timestamp) + // 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值 + req.packageValue = it.packageX + // 签名, + req.sign = it.sign + // 调用微信SDK,发起支付,回调WxPayEntryActivity + mWxApi.sendReq(req) + } + } + + override fun getLayoutId(): Int = R.layout.fragment_jinbi + + override fun initView() { + + } + + override fun initData() { + mDataBinding.setVariable(BR.vm, viewModel) + chargeAdapter = ChargeAdapter(activity) + myGrid.adapter = chargeAdapter + viewModel.loadData(UserManager.user.uid.toString()) + + } + + override fun onResume() { + super.onResume() + viewModel.getMoneyData() + } + + override fun initEvent() { + + tvMx.setOnClickListener { + startActivity(Intent(activity, MoneyDetailActivity::class.java)) + } + tv_jb_mx.setOnClickListener { + ARouter.getInstance().build(AroutUtil.MAIN_MY_LOG_ZHUANZENG).withString("type", "1") + .navigation() + } + mDataBinding.ivBack.setOnClickListener { + requireActivity().finish() + } + mDataBinding.checkbox.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + mDataBinding.checkbox2.isChecked = false + mDataBinding.checkbox3.isChecked = false + } + } + + mDataBinding.checkbox2.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + mDataBinding.checkbox.isChecked = false + mDataBinding.checkbox3.isChecked = false + } + } + + + mDataBinding.checkbox3.setOnCheckedChangeListener { buttonView, isChecked -> + if (isChecked) { + mDataBinding.checkbox.isChecked = false + mDataBinding.checkbox2.isChecked = false + } + } + + mDataBinding.btnOk.setOnClickListener { + val listNew: MutableList = ArrayList() + viewModel.goodsListData.value?.let { + try { + for (list in it) { + if (list.isSelect) { + listNew.add(list) + } + } + } catch (e: Exception) { + e.printStackTrace() + } + } +// if (mDataBinding.checkbox.isChecked) { +// if (listNew.size > 0) { +// viewModel.rechargePay(UserManager.user.uid.toString(), listNew[0].crid, "1") +// } +// } else if (mDataBinding.checkbox2.isChecked) { +// if (listNew.size > 0) { +// viewModel.rechargeWxPay(UserManager.user.uid.toString(), listNew[0].crid, "2") +// } +// +// } else if (mDataBinding.checkbox3.isChecked) { +// if (listNew.size > 0) { + viewModel.rechargePay(UserManager.user.uid.toString(), listNew[0].crid, "1") +// viewModel.rechargePayH5(UserManager.user.uid.toString(), listNew[0].crid, "21") +// } +// +// } else { +// "请选择充值方式".showToast() +// } + + + } + mDataBinding.btnOk1.setOnClickListener { + val listNew: MutableList = ArrayList() + viewModel.goodsListData.value?.let { + try { + for (list in it) { + if (list.isSelect) { + listNew.add(list) + } + } + } catch (e: Exception) { + e.printStackTrace() + } + } +// if (mDataBinding.checkbox.isChecked) { +// if (listNew.size > 0) { +// viewModel.rechargePay(UserManager.user.uid.toString(), listNew[0].crid, "1") +// } +// } else if (mDataBinding.checkbox2.isChecked) { +// if (listNew.size > 0) { + viewModel.rechargeWxPay(UserManager.user.uid.toString(), listNew[0].crid, "2") +// } +// +// } else if (mDataBinding.checkbox3.isChecked) { +// if (listNew.size > 0) { +// viewModel.rechargePay(UserManager.user.uid.toString(), listNew[0].crid, "1") +//// viewModel.rechargePayH5(UserManager.user.uid.toString(), listNew[0].crid, "21") +// } +// +// } else { +// "请选择充值方式".showToast() +// } + + + } + myGrid.setOnItemClickListener { adapterView, view, position, l -> + val list_adapter: List = chargeAdapter.getList_adapter() + if (list_adapter[position].isSelect) { + } else { + for (list in list_adapter) { + list.isSelect = false + } + list_adapter[position].isSelect = true + chargeAdapter.notifyDataSetChanged() + } + } + + } + + private val SDK_PAY_FLAG = 1 + + @SuppressLint("HandlerLeak") + private val mHandler: Handler = object : Handler() { + override fun handleMessage(msg: Message) { + val payResult2 = PayResult(msg.obj as Map) + when (msg.what) { + SDK_PAY_FLAG -> { + val payResult = PayResult(msg.obj as Map) + + /** + * 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 + */ + val resultInfo: String = payResult.getResult() // 同步返回需要验证的信息 + val resultStatus: String = payResult.getResultStatus() + // 判断resultStatus 为9000则代表支付成功 + if (TextUtils.equals(resultStatus, "9000")) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + "支付成功".showToast() + } else { + // 失败。 + "支付失败,请重试".showToast() + } + } + + else -> { + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/bi/JinBiViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/money/bi/JinBiViewModel.kt new file mode 100644 index 0000000..a23a977 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/bi/JinBiViewModel.kt @@ -0,0 +1,77 @@ +package com.yuyin.mier.module_my.money.bi + +import androidx.lifecycle.MutableLiveData +import com.alibaba.android.arouter.launcher.ARouter +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.model.AliH5model +import com.yuyin.lib_base.model.Wxmodel +import com.yuyin.mier.module_my.model.GoodsListBean +import com.yuyin.mier.module_my.model.MoneyBean +import com.yuyin.mier.module_my.model.UrlBean +import com.yuyin.mier.repository.CommonRepository + +class JinBiViewModel : BaseViewModel() { + var repository = CommonRepository() + var moneyBean = MutableLiveData() + var money = MutableLiveData("0") + var zuanshi = MutableLiveData("0") + var statusBean: MutableLiveData = MutableLiveData() + var goodsListData = MutableLiveData>() + + var weixin = MutableLiveData() + var alipay = MutableLiveData() + var alipayH5 = MutableLiveData() + fun rechargePay(user_id: String, goods_id: String, type: String) { + launchUI { + val result = repository.rechargePay(user_id, goods_id, type) + alipay.value = result.data + } + } + + fun rechargePayH5(user_id: String, goods_id: String, type: String) { + launchUI { + val result = repository.rechargePayH5(user_id, goods_id, type) + alipayH5.value = result.data + } + } + + fun loadData(uid: String) { + launchUI { + val result = repository.goodsList(uid) + goodsListData.value = result.data + } + } + + fun getMoneyData() { + launchUI { + val result = repository.get_user_withdrawal_info() + money.value = result.data.integral + zuanshi.value = result.data.money + moneyBean.value = result.data + } + } + + fun get_sign_status() { + launchUI { + val result = repository.get_sign_status() + statusBean.value = result.data + } + } + + fun zengSongLog() { + ARouter.getInstance().build(AroutUtil.MAIN_MY_LOG_ZHUANZENG).navigation() + } + + fun toBindALi() { + ARouter.getInstance().build(AroutUtil.MAIN_MY_BINDALI).navigation() + } + + fun rechargeWxPay(user_id: String, goods_id: String, type: String) { + launchUI { + val result = repository.rechargeWxPay(user_id, goods_id, type) + weixin.value = result.data + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/bindali/BindAliActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/money/bindali/BindAliActivity.kt new file mode 100644 index 0000000..d33b54d --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/bindali/BindAliActivity.kt @@ -0,0 +1,105 @@ +package com.yuyin.mier.module_my.money.bindali + +import android.text.TextUtils +import android.view.View +import androidx.databinding.ViewDataBinding +import com.alibaba.android.arouter.facade.annotation.Route +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_BINDALI +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.mier.BR +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.activity_bind_alipay.* + +@Route(path = MAIN_MY_BINDALI) +class BindAliActivity : BaseDataBindingActivity() { + + override fun startObserve() { + mDataBinding.setVariable(BR.vm, viewModel) + + viewModel.bindAliData.observe(this, { + finish() + }) + + } + + override fun getLayoutId(): Int = R.layout.activity_bind_alipay + + override fun initView() { + } + + override fun initData() { +// viewModel.getMoneyData() + if (intent.getStringExtra("type").toString() == "zfb") { + tv_title.text = "绑定支付宝" + et_name.setHint("请输入姓名") + et_card.setHint("请输入支付宝账号") + tv_account.text = "支付宝账号" + ll_bank_phone.visibility = View.GONE + ll_bank_name.visibility = View.GONE +// et_bank_idcard.visibility = View.GONE + btn_ok.visibility = View.VISIBLE + btn_ok2.visibility = View.GONE + if (!TextUtils.isEmpty(intent.getStringExtra("ali_name"))) { + viewModel.pName.value = intent.getStringExtra("ali_name") + } + if (!TextUtils.isEmpty(intent.getStringExtra("zhanghu"))) { + viewModel.cardID.value = intent.getStringExtra("zhanghu") + } + } else { + //汇付银行卡绑定 +// tv_title.text="绑定银行卡" +// et_name.setHint("请输入您的银行卡真实姓名") +// et_card.setHint("请输入您的银行卡卡号") +// et_bank_name.visibility=View.VISIBLE +// et_bank_idcard.visibility=View.VISIBLE +// et_bank_phone.visibility=View.VISIBLE +// btn_ok.visibility=View.GONE +// btn_ok2.visibility=View.VISIBLE +// if (!TextUtils.isEmpty(intent.getStringExtra("ali_name"))) { +// viewModel.pName.value = intent.getStringExtra("ali_name") +// } +// if (!TextUtils.isEmpty(intent.getStringExtra("zhanghu"))) { +// viewModel.cardID.value = intent.getStringExtra("zhanghu") +// } +// if (!TextUtils.isEmpty(intent.getStringExtra("bank_card_name"))) { +// viewModel.bankName.value = intent.getStringExtra("bank_card_name") +// } +// if (!TextUtils.isEmpty(intent.getStringExtra("bank_cert_id"))) { +// viewModel.bankIDcard.value = intent.getStringExtra("bank_cert_id") +// } +// if (!TextUtils.isEmpty(intent.getStringExtra("bank_tel_no"))) { +// viewModel.bankIDPhone.value = intent.getStringExtra("bank_tel_no") +// } + + //云账户 + tv_title.text = "绑定银行卡" + et_name.setHint("请输入姓名") + et_card.setHint("请输入银行卡号") + tv_account.text = "银行卡号" + ll_bank_name.visibility = View.VISIBLE +// et_bank_idcard.visibility = View.VISIBLE + ll_bank_phone.visibility = View.VISIBLE + btn_ok.visibility = View.GONE + btn_ok2.visibility = View.VISIBLE + if (!TextUtils.isEmpty(intent.getStringExtra("ali_name"))) { + viewModel.pName.value = intent.getStringExtra("ali_name") + } + if (!TextUtils.isEmpty(intent.getStringExtra("zhanghu"))) { + viewModel.cardID.value = intent.getStringExtra("zhanghu") + } + if (!TextUtils.isEmpty(intent.getStringExtra("bank_card_name"))) { + viewModel.bankName.value = intent.getStringExtra("bank_card_name") + } +// if (!TextUtils.isEmpty(intent.getStringExtra("bank_cert_id"))) { +// viewModel.bankIDcard.value = intent.getStringExtra("bank_cert_id") +// } + if (!TextUtils.isEmpty(intent.getStringExtra("bank_tel_no"))) { + viewModel.bankIDPhone.value = intent.getStringExtra("bank_tel_no") + } + } + + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/bindali/BindAliViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/money/bindali/BindAliViewModel.kt new file mode 100644 index 0000000..b3aa0ad --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/bindali/BindAliViewModel.kt @@ -0,0 +1,113 @@ +package com.yuyin.mier.module_my.money.bindali + +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 BindAliViewModel : BaseViewModel() { + var repository = CommonRepository() + var pName: MutableLiveData = MutableLiveData() + var cardID: MutableLiveData = MutableLiveData() + var bankName: MutableLiveData = MutableLiveData() + var bankIDcard: MutableLiveData = MutableLiveData() //身份证号码 + var bankIDPhone: MutableLiveData = MutableLiveData() //银行卡手机号 + var bindAliData = MutableLiveData() + + fun getMoneyData() { + launchUI { + val result = repository.get_user_withdrawal_info() + pName.value = result.data.alipay_name + cardID.value = result.data.alipay_account + bankName.value = result.data.bank_card +// bankKai.value = result.data.open_bank + + } + } + + //汇付 +// fun bindIdentity() { +// if (pName.value.isNullOrEmpty()) { +// "请将信息填写完整".showToast() +// return +// } +// if (cardID.value.isNullOrEmpty()) { +// "请将信息填写完整".showToast() +// return +// } +// if (bankIDPhone.value.isNullOrEmpty()) { +// "请将信息填写完整".showToast() +// return +// } +// if (bankIDcard.value.isNullOrEmpty()) { +// "请将信息填写完整".showToast() +// return +// } +// if (bankName.value.isNullOrEmpty()) { +// "请将信息填写完整".showToast() +// return +// } +// launchUI { +// val result = repository.binding_bank_card( +// cardID.value.toString(), +// pName.value.toString(), +// bankIDcard.value.toString(), +// bankIDPhone.value.toString(), +// bankName.value.toString(), +// ) +// bindAliData.value = result.data; +// if (result.msg.isNotEmpty()) +// result.msg.showToast() +// } +// } + + fun bindIdentityYzh() { + if (pName.value.isNullOrEmpty()) { + "请将信息填写完整".showToast() + return + } + if (cardID.value.isNullOrEmpty()) { + "请将信息填写完整".showToast() + return + } + if (bankName.value.isNullOrEmpty()) { + "请将信息填写完整".showToast() + return + } + if (bankIDPhone.value.isNullOrEmpty()) { + "请将信息填写完整".showToast() + return + } + launchUI { + val result = repository.binding_bank_card_yzh( + pName.value.toString(), + bankName.value.toString(), + bankIDPhone.value.toString(), + cardID.value.toString(), + ) + bindAliData.value = result.data; + if (result.msg.isNotEmpty()) + result.msg.showToast() + } + } + + fun bindIdentityAli() { + if (pName.value.isNullOrEmpty()) { + "请将信息填写完整".showToast() + return + } + if (cardID.value.isNullOrEmpty()) { + "请将信息填写完整".showToast() + return + } + launchUI { + val result = repository.upalipay( + pName.value.toString(), + cardID.value.toString(), + ) + bindAliData.value = result.data; + if (result.msg.isNotEmpty()) + result.msg.showToast() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/bindali2/BindAliActivity2.kt b/app/src/main/java/com/yuyin/mier/module_my/money/bindali2/BindAliActivity2.kt new file mode 100644 index 0000000..11223af --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/bindali2/BindAliActivity2.kt @@ -0,0 +1,29 @@ +package com.yuyin.mier.module_my.money.bindali2 + +import androidx.databinding.ViewDataBinding +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.mier.BR +import com.yuyin.mier.R + +class BindAliActivity2 : BaseDataBindingActivity() { + + override fun startObserve() { +// viewModel.bindAliData.observe(this, { +// finish() +// }) + } + + override fun getLayoutId(): Int = R.layout.activity_bind_alipay2 + + override fun initView() { + } + + override fun initData() { + mDataBinding.setVariable(BR.vm, viewModel) + viewModel.getMoneyData() + } + + override fun initEvent() { + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/bindali2/BindAliViewModel2.kt b/app/src/main/java/com/yuyin/mier/module_my/money/bindali2/BindAliViewModel2.kt new file mode 100644 index 0000000..1453c00 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/bindali2/BindAliViewModel2.kt @@ -0,0 +1,24 @@ +package com.yuyin.mier.module_my.money.bindali2 + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.repository.CommonRepository + +class BindAliViewModel2 : BaseViewModel() { + var repository = CommonRepository() + var pName: MutableLiveData = MutableLiveData() + var cardID: MutableLiveData = MutableLiveData() + var bankName: MutableLiveData = MutableLiveData() + var bankKai: MutableLiveData = MutableLiveData() + var bindAliData = MutableLiveData() + fun getMoneyData() { + launchUI { + val result = repository.get_user_withdrawal_info() + pName.value = result.data.bank_user_name + cardID.value = result.data.bank_card_number + bankName.value = result.data.bank_card + bankKai.value = result.data.open_bank + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/gutou/GuTouFragment.kt b/app/src/main/java/com/yuyin/mier/module_my/money/gutou/GuTouFragment.kt new file mode 100644 index 0000000..87ed501 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/gutou/GuTouFragment.kt @@ -0,0 +1,25 @@ +package com.yuyin.mier.module_my.money.gutou + +import com.yuyin.lib_base.base.BaseDataBindingFragment +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.R +import com.yuyin.mier.databinding.FragmentGutouBinding + +class GuTouFragment : BaseDataBindingFragment() { + override fun startObserve() { + + } + + override fun getLayoutId(): Int = R.layout.fragment_gutou + + override fun initView() { + } + + override fun initData() { + } + + override fun initEvent() { + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TiXianActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TiXianActivity.kt new file mode 100644 index 0000000..0881f16 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TiXianActivity.kt @@ -0,0 +1,259 @@ +package com.yuyin.mier.module_my.money.tixian + +import android.os.Build +import android.os.CountDownTimer +import android.text.TextUtils +import android.view.View +import android.webkit.WebSettings +import com.alibaba.android.arouter.facade.annotation.Route +import com.yuyin.lib_base.App +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_TIXIAN +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.lib_base.util.showToast +import com.yuyin.mixin.module_login.ui.GraphicCodeDialog +import com.yuyin.mier.BR +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityMoneyTixianBinding +import com.yuyin.mier.module_my.model.MoneyBean +import kotlinx.android.synthetic.main.activity_money_tixian.* + + +@Route(path = MAIN_MY_TIXIAN) +class TiXianActivity : BaseDataBindingActivity() { + + private var mMoneyBean: MoneyBean? = null + override fun startObserve() { + viewModel.urlBean.observe(this) { + mDataBinding.wvView.loadUrl(it.url) + } + viewModel.sendCode.observe(this) { + showCode() + } + viewModel.moneyData.observe(this) { + mMoneyBean = it + viewModel.aliName.value = it.alipay_name + + mDataBinding.tvPremium.text = + "提现扣除服务费:${((it.user_withdraw_rate) * 100).toInt()}%" + + + + if (it.is_bingd_alipay == 1) { + mDataBinding.llBindAlipay.visibility = View.GONE + mDataBinding.llSelectManner.visibility = View.VISIBLE + } else { + mDataBinding.llBindAlipay.visibility = View.VISIBLE + mDataBinding.llSelectManner.visibility = View.GONE + } + + if (!TextUtils.isEmpty(it.alipay_name)) { + viewModel.aliZhanghu.value = "姓名:${it.alipay_name} 支付宝:${it.alipay_account}" + } + viewModel.yue.value = it.money + } + viewModel.submitBean.observe(this) { + if (mDataBinding.checkbox.isChecked) { + viewModel.tiXianYzh("1") + } else { + viewModel.tiXianYzh("2") + } + } + viewModel.statusBean.observe(this, { + viewModel.statusBean.value?.let { + if (it.status == "1") { + if (mDataBinding.checkbox.isChecked) { + viewModel.tiXianYzh("1") + } else { + viewModel.tiXianYzh("2") + } + } else { +// viewModel.submit_sign() + mDataBinding.flXY.visibility = View.VISIBLE + viewModel.get_sign_contract_url() + } + } + }) + } + + override fun getLayoutId(): Int = R.layout.activity_money_tixian + + override fun initView() { + val rate = 1 - App.configBean.withdraw_rate + wvView.getSettings().setJavaScriptEnabled(true) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + wvView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW) + } + + val webSettings: WebSettings = wvView.getSettings() + webSettings.blockNetworkImage = false + webSettings.loadWithOverviewMode = true + webSettings.setGeolocationEnabled(true) + webSettings.useWideViewPort = true // 关键点 + webSettings.pluginState = WebSettings.PluginState.ON + + //支持js脚本 + webSettings.javaScriptEnabled = true + + //支持缩放 + webSettings.setSupportZoom(true) + + //支持内容重新布局 + webSettings.layoutAlgorithm = WebSettings.LayoutAlgorithm.SINGLE_COLUMN + + //多窗口 + webSettings.supportMultipleWindows() + + //当webview调用requestFocus时为webview设置节点 + webSettings.setNeedInitialFocus(true) + + //设置支持缩放 + webSettings.builtInZoomControls = true + + //支持通过JS打开新窗口 + webSettings.javaScriptCanOpenWindowsAutomatically = true + + //支持自动加载图片 + webSettings.loadsImagesAutomatically = true + + //优先使用缓存: + webSettings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK + + //提高渲染的优先级 + webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH) + + + // 开启H5(APPCache)缓存功能 +// webSettings.setAppCacheEnabled(true); +// 开启 DOM storage 功能 + webSettings.domStorageEnabled = true + + // 应用可以有数据库 + webSettings.databaseEnabled = true + + // 可以读取文件缓存(manifest生效) + webSettings.allowFileAccess = true + + /*允许跨域访问*/ + webSettings.allowUniversalAccessFromFileURLs = true + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + webSettings.mixedContentMode = WebSettings.MIXED_CONTENT_ALWAYS_ALLOW + } + } + + override fun initData() { + mDataBinding.setVariable(BR.vm, viewModel) + viewModel.loadMoneyData() +// viewModel.get_sign_status() + viewModel.loadUserInfo() + } + + override fun initEvent() { + mDataBinding.xieyi.setOnClickListener { + mDataBinding.flXY.visibility = View.VISIBLE + viewModel.get_sign_contract_url() + } + + mDataBinding.btnQueren.setOnClickListener { + mDataBinding.flXY.visibility = View.GONE + viewModel.submit_sign() + } + +// mDataBinding.ivCoinLog.setOnClickListener { +// +// startActivity(Intent(this, TiXianLogActivity::class.java)) +// } + + mDataBinding.llCheck.setOnClickListener { + checkbox.isChecked = true + checkbox_yhk.isChecked = false + } + mDataBinding.llCheckYhk.setOnClickListener { + checkbox.isChecked = false + checkbox_yhk.isChecked = true + } + + mDataBinding.btnOk.setOnClickListener { + //云账户 + if (!mDataBinding.ivCheck.isChecked) { + "请先阅读并同意《灵活就业合作伙伴协议》".showToast() + return@setOnClickListener + } else { + if (!mDataBinding.checkbox.isChecked && !mDataBinding.checkboxYhk.isChecked) { + "请选择提现方式".showToast() + return@setOnClickListener + } + viewModel.get_sign_status() + } + //云账户 +// //普通提现 +// if (!mDataBinding.checkbox.isChecked&&!mDataBinding.checkboxYhk.isChecked) { +// "请选择提现方式".showToast() +// return@setOnClickListener +// } +// if(mDataBinding.checkbox.isChecked){ +// viewModel.tiXian() +// }else{ +// viewModel.tiXianYhk() +// } + //普通提现 + } + + mDataBinding.vBGG.setOnClickListener { + mDataBinding.flXY.visibility = View.GONE + } + + // 调用代码,记得把xml 里面的点击时间去掉 + mDataBinding.sendCode.setOnClickListener { + + val graphicCodeDialog = GraphicCodeDialog(this) + viewModel.create_captcha() + viewModel.captchaBean.observe(this) { + GlideUtil.loadImglogo(this, + it.image, + graphicCodeDialog.getBinding().graphicCode + ) + } + graphicCodeDialog.getBinding().graphicCode.setOnClickListener { + viewModel.create_captcha() + } + + graphicCodeDialog.getBinding().btnConfirm.setOnClickListener { + viewModel.sendCode( + graphicCodeDialog.getBinding().etCode.text.toString(), + viewModel.captchaBean.value!!.key + ) + graphicCodeDialog.dismiss() + + } + + graphicCodeDialog.show() + + } + } + + private var timer: CountDownTimer? = null + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + + override fun onStop() { + super.onStop() + if (timer != null) + timer!!.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TiXianNewActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TiXianNewActivity.kt new file mode 100644 index 0000000..59db828 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TiXianNewActivity.kt @@ -0,0 +1,165 @@ +package com.yuyin.mier.module_my.money.tixian + +import android.content.Intent +import com.alibaba.android.arouter.facade.annotation.Route +import com.bigkoo.pickerview.builder.TimePickerBuilder +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_LOG_TIXIAN_NEW +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityLogTixianNewBinding +import com.yuyin.mier.module_my.adapter.TxLogDeatileAdapter +import kotlinx.android.synthetic.main.activity_log_tixian_new.* +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Date +import java.util.HashMap +import java.util.Locale +import java.util.TimeZone + +@Route(path = MAIN_MY_LOG_TIXIAN_NEW) +class TiXianNewActivity: BaseDataBindingActivity() { + + private var startDate: Calendar = Calendar.getInstance() + private var endDate: Calendar = Calendar.getInstance() + private var seleteDate: Calendar = Calendar.getInstance() + private var nowDate: String = "" + private var page=1 + lateinit var txLogDeatileAdapter: TxLogDeatileAdapter + + override fun startObserve() { + viewModel.getFinally().observe(this, { + mDataBinding.smart.finishLoadMore() + mDataBinding.smart.finishRefresh() + }) + viewModel.WithdrawalList.observe(this){ + tv_tx_sum.text=""+it.all + if(page==1){ + txLogDeatileAdapter.setNewData(it.detail) + }else{ + txLogDeatileAdapter.addData(it.detail) + } + } + } + + override fun getLayoutId(): Int= R.layout.activity_log_tixian_new + + override fun initView() { + tv_end.text=getTimeYmd() + txLogDeatileAdapter=TxLogDeatileAdapter() + recyclerview.adapter=txLogDeatileAdapter + txLogDeatileAdapter.setOnItemClickListener { adapter, view, position -> + var intent=Intent(this,TxDeatileAt::class.java) + intent.putExtra("wid",txLogDeatileAdapter.getItem(position)!!.wid) + startActivity(intent) + } + } + + override fun initData() { + viewModel.getWithdrawal(getMap()) + } + + override fun initEvent() { + mDataBinding.smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.getWithdrawal(getMap()) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.getWithdrawal(getMap()) + } + + }) + tv_search.setOnClickListener { + page = 1 + viewModel.getWithdrawal(getMap()) + } + tv_start.setOnClickListener { + val string = tv_start.text.toString() + val timeYmd: String = getTimeYmd() + val split1 = string.split("-".toRegex()).toTypedArray() + val split = timeYmd.split("-".toRegex()).toTypedArray() + startDate.set(1900, 0, 1) + try { + endDate.set(split[0].toInt(), split[1].toInt() - 1, split[2].toInt()) + } catch (e: NumberFormatException) { + e.printStackTrace() + } + try { + seleteDate.set(split1[0].toInt(), split1[1].toInt() - 1, split1[2].toInt()) + } catch (e: NumberFormatException) { + e.printStackTrace() + } + val pvTime = TimePickerBuilder( + this@TiXianNewActivity + ) { date, _ -> + if (date != null) { + nowDate = getNowDate(date) + tv_start.text = nowDate + } + } + .setRangDate(startDate, endDate) + .setDate(seleteDate) + .build() + pvTime.show() + } + tv_end.setOnClickListener { + val string = tv_end.text.toString() + val timeYmd: String = getTimeYmd() + val split1 = string.split("-".toRegex()).toTypedArray() + val split = timeYmd.split("-".toRegex()).toTypedArray() + startDate.set(1900, 0, 1) + try { + endDate.set(split[0].toInt(), split[1].toInt() - 1, split[2].toInt()) + } catch (e: NumberFormatException) { + e.printStackTrace() + } + try { + seleteDate.set(split1[0].toInt(), split1[1].toInt() - 1, split1[2].toInt()) + } catch (e: NumberFormatException) { + e.printStackTrace() + } + val pvTime = TimePickerBuilder( + this@TiXianNewActivity + ) { date, _ -> + if (date != null) { + nowDate = getNowDate(date) + tv_end.text = nowDate + } + } + .setRangDate(startDate, endDate) + .setDate(seleteDate) + .build() + pvTime.show() + } + } + + /** + * 获取当前时间 + * + * @return + */ + private fun getTimeYmd(): String { + val date = Date() // 创建一个时间对象,获取到当前的时间 + val sdf = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA) // 设置时间显示格式 + sdf.timeZone = TimeZone.getTimeZone("GMT+8") + return sdf.format(date) + } + + private fun getNowDate(date: Date): String { + val formatter = SimpleDateFormat("yyyy-MM-dd") + return formatter.format(date) + } + + private fun getMap(): MutableMap { + val map: MutableMap = HashMap() + map["start"] = tv_start.text.toString() + map["end"] = tv_end.text.toString() + map["page"] = page.toString() + map["page_limit"] = "50" + return map + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TiXianViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TiXianViewModel.kt new file mode 100644 index 0000000..08d60cf --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TiXianViewModel.kt @@ -0,0 +1,185 @@ +package com.yuyin.mier.module_my.money.tixian + +import androidx.lifecycle.MutableLiveData +import com.alibaba.android.arouter.launcher.ARouter +import com.blankj.utilcode.util.RegexUtils +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.module_home.model.userWithdrawalBean +import com.yuyin.mier.module_home.model.userWithdrawalListBean +import com.yuyin.mier.module_my.model.MoneyBean +import com.yuyin.mier.module_my.model.UrlBean +import com.yuyin.mier.repository.CommonRepository + +class TiXianViewModel : BaseViewModel() { + var repository = CommonRepository() + var moneyData = MutableLiveData() + + //支付宝姓名 + var aliName = MutableLiveData("") + + //支付宝账户手机号 + var aliZhanghu = MutableLiveData("立即绑定") + + //可以提现余额 + var yue = MutableLiveData("0.00") + + //输入提现金额 + var tixianjine = MutableLiveData("") + + //输入验证码 + var code = MutableLiveData("") + + var urlBean: MutableLiveData = MutableLiveData() + + var statusBean: MutableLiveData = MutableLiveData() + + var submitBean: MutableLiveData = MutableLiveData() + + //点击发送验证码事件监听 + var sendCodeClick: MutableLiveData = MutableLiveData(true) + + var sendCode: MutableLiveData = MutableLiveData() + + fun allTi() { + tixianjine.value = yue.value; + } + + fun get_sign_contract_url() { + launchUI { + val result = repository.get_sign_contract_url() + urlBean.value = result.data + } + } + + fun get_sign_status() { + launchUI { + val result = repository.get_sign_status() + statusBean.value = result.data + } + } + + + fun submit_sign() { + launchUI { + val result = repository.submit_sign() + submitBean.value = result.data + } + } + + fun sendCode(captcha_code: String, captcha_key: String) { + if (aliZhanghu.value.isNullOrEmpty()) { + "账户异常请重新登录".showToast() + return + } + if (sendCodeClick.value == false) return + sendCodeClick.value = false + launchUI { + val result = +// if (UserManager.user.user_name.isNotEmpty() && RegexUtils.isMobileExact(UserManager.user.user_name)) { +// repository.verification(UserManager.user.user_name, "1",captcha_code,captcha_key) +// } else { + repository.verification(userInfoData.value!!.user_name, "1",captcha_code,captcha_key) +// } + sendCode.value = "发送" + result.msg.showToast() + } + + } + + + fun tiXianYzh(type:String) { + if (tixianjine.value.isNullOrEmpty()) { + "请输入提现金额".showToast() + return + } + if (code.value.isNullOrEmpty()) { + "请输入验证码".showToast() + return + } + launchUI { + val result = + repository.tixianYzh( + tixianjine.value.toString(), + code.value.toString(),type + ) + if (result.msg.isNotEmpty()) + result.msg.showToast() + loadMoneyData() + } + } + + fun tiXian() { + if (tixianjine.value.isNullOrEmpty()) { + "请输入提现金额".showToast() + return + } + if (code.value.isNullOrEmpty()) { + "请输入验证码".showToast() + return + } + launchUI { + val result = + repository.tixian( + tixianjine.value.toString(), + code.value.toString() + ) + if (result.msg.isNotEmpty()) + result.msg.showToast() + loadMoneyData() + } + } + + var WithdrawalList = MutableLiveData() + fun getWithdrawal(map: MutableMap) { + launchUI { + val result = repository.getWithdrawal(map) + WithdrawalList.value = result.data; + } + } + var WithdrawalBean = MutableLiveData() + fun get_one_withdrawal_detail(wid:String) { + launchUI { + val result = repository.get_one_withdrawal_detail(wid) + WithdrawalBean.value=result.data + } + } + + fun tiXianYhk() { + if (tixianjine.value.isNullOrEmpty()) { + "请输入提现金额".showToast() + return + } + if (code.value.isNullOrEmpty()) { + "请输入验证码".showToast() + return + } + launchUI { + val result = + repository.tixianYhk( + tixianjine.value.toString(), + code.value.toString() + ) + if (result.msg.isNotEmpty()) + result.msg.showToast() + loadMoneyData() + } + } + + fun tiXianLog() { + ARouter.getInstance().build(AroutUtil.MAIN_MY_LOG_TIXIAN_NEW).navigation() + } + + fun toBindALi() { + ARouter.getInstance().build(AroutUtil.MAIN_MY_BINDALI).navigation() + } + + fun loadMoneyData() { + launchUI { + val result = repository.get_user_withdrawal_info() + moneyData.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TxDeatileAt.kt b/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TxDeatileAt.kt new file mode 100644 index 0000000..baf9ce6 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/tixian/TxDeatileAt.kt @@ -0,0 +1,48 @@ +package com.yuyin.mier.module_my.money.tixian + +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.util.TimeUtil +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityTxDeatileBinding +import kotlinx.android.synthetic.main.activity_tx_deatile.* + +class TxDeatileAt : BaseDataBindingActivity() { + override fun startObserve() { + viewModel.WithdrawalBean.observe(this){ + if(it.type=="1"){ // '提现类型 1支付宝 2银行卡', + iv_tx_icon.setImageResource(R.mipmap.tx_mx_icon2) + tv_title1.text="支付宝" + }else{ + iv_tx_icon.setImageResource(R.mipmap.tx_mx_ico3) + tv_title1.text="银行卡" + } + tv_title2.text=it.general_money + if(it.status=="1"){ // 1待审核 2已到账 3打款失败 + tv_title3.text="待审核" + }else if(it.status=="2"){ // 1待审核 2已到账 3打款失败 + tv_title3.text="已到账" + }else if(it.status=="3"){ // 1待审核 2已到账 3打款失败 + tv_title3.text="打款失败" + } + tv_title5.text="申请提现"+it.money+",扣除手续费"+it.server_money+",应到账"+it.general_money + tv_title6.text= TimeUtil.toDateYmd5(it.add_time) + tv_title7.text="¥"+it.money + tv_title8.text="¥"+it.server_money + tv_title9.text=it.remarke + tv_title10.text=TimeUtil.toDateYmd5(it.add_time) + tv_title11.text=it.account + } + } + + override fun getLayoutId(): Int= R.layout.activity_tx_deatile + + override fun initView() { + viewModel.get_one_withdrawal_detail(intent.getStringExtra("wid").toString()) + } + + override fun initData() { + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/zuan/DuiHuanActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/money/zuan/DuiHuanActivity.kt new file mode 100644 index 0000000..0b35225 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/zuan/DuiHuanActivity.kt @@ -0,0 +1,45 @@ +package com.yuyin.mier.module_my.money.zuan + +import android.view.View +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.mier.R +import com.yuyin.mier.BR +import com.yuyin.mier.databinding.ActivityDuihuanBinding +import kotlinx.android.synthetic.main.activity_duihuan.* + +class DuiHuanActivity : BaseDataBindingActivity() { + override fun startObserve() { + + viewModel.moneyData.observe(this, { + viewModel.yue.value = it.money.toDouble().toInt().toString() + }) + viewModel.duiHuanJine.observe(this, { + viewModel.cha(it) + }) + } + + override fun getLayoutId(): Int = R.layout.activity_duihuan + + override fun initView() { + } + + override fun initData() { + + mDataBinding.setVariable(BR.vm, viewModel) + viewModel.loadMoneyData() + } + + override fun initEvent() { + flPass.setOnClickListener { + flPass.visibility = View.GONE + } + tvDU.setOnClickListener { + flPass.visibility = View.VISIBLE + } + tvOK.setOnClickListener { + if (etPass.text.toString()!="") + viewModel.duiHuan2(etPass.text.toString()) + flPass.visibility = View.GONE + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/zuan/MoneyContainerActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/money/zuan/MoneyContainerActivity.kt new file mode 100644 index 0000000..78345ef --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/zuan/MoneyContainerActivity.kt @@ -0,0 +1,45 @@ +package com.yuyin.mier.module_my.money.zuan +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentTransaction +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityMoneyContainerBinding +import com.yuyin.mier.module_my.money.bi.JinBiFragment + +class MoneyContainerActivity : + BaseDataBindingActivity() { + + + override fun startObserve() { + } + + override fun getLayoutId(): Int { + return R.layout.activity_money_container + } + + override fun initView() { + } + + override fun initData() { + + if (intent.getStringExtra("type") == "1") { + val fragmentManager: FragmentManager = supportFragmentManager + val fragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction() + val firstFragment = JinBiFragment() + fragmentTransaction.add(R.id.fl_container, firstFragment) + fragmentTransaction.commit() + + } else { + val fragmentManager: FragmentManager = supportFragmentManager + val fragmentTransaction: FragmentTransaction = fragmentManager.beginTransaction() + val firstFragment = ShouYiFragment() + fragmentTransaction.add(R.id.fl_container, firstFragment) + fragmentTransaction.commit() + + } + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/zuan/ShouYiFragment.kt b/app/src/main/java/com/yuyin/mier/module_my/money/zuan/ShouYiFragment.kt new file mode 100644 index 0000000..9f190ea --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/zuan/ShouYiFragment.kt @@ -0,0 +1,144 @@ +package com.yuyin.mier.module_my.money.zuan + +import android.content.Intent +import android.os.CountDownTimer +import android.text.TextUtils +import android.view.View +import com.alibaba.android.arouter.launcher.ARouter +import com.yuyin.lib_base.App +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.BaseDataBindingFragment +import com.yuyin.mier.R +import com.yuyin.mier.BR +import com.yuyin.mier.databinding.FragmentShouyiBinding +import com.yuyin.mier.module_my.money.bindali.BindAliActivity +import com.yuyin.mier.module_my.money.tixian.TiXianActivity +import kotlinx.android.synthetic.main.fragment_jinbi.tvMx +import kotlinx.android.synthetic.main.fragment_shouyi.send_code +import kotlinx.android.synthetic.main.fragment_shouyi.tv_tixian + +class ShouYiFragment : BaseDataBindingFragment() { + override fun startObserve() { + viewModel.urlBean.observe(this, { + mDataBinding.wvView.loadUrl(it.url) + }) + viewModel.submitBean.observe(this, { + viewModel.tiXian() + }) + viewModel.moneyData.observe(this) { + viewModel.yue.value = it.money + if (TextUtils.isEmpty(it.alipay_account) ) { + mDataBinding.tvBind.text = "绑定支付宝" + mDataBinding.tvBindAlipay.text = "绑定支付宝" + } else { + mDataBinding.tvBind.text = "已绑定" + mDataBinding.tvBindAlipay.text = "已绑定" + } + } + + viewModel.moneyData.observe(this) { + if (TextUtils.isEmpty(it.alipay_account) ) { + mDataBinding.tvBindAlipay.text = "去绑定" + } else { + mDataBinding.tvBindAlipay.text = "已绑定" + } + } + + viewModel.duiHuanJine.observe(this) { + viewModel.cha(it) + } + + viewModel.sendCode.observe(this) { + showCode() + } + + viewModel.statusBean.observe(this, { + +// viewModel.statusBean.value?.let { +// if (it.status == "1") { +// } else { +// viewModel.submit_sign() +// } +// } + }) + + + } + + override fun getLayoutId(): Int = R.layout.fragment_shouyi + + override fun initView() { + if(App.isShangJia){ + tv_tixian.visibility=View.GONE + } + } + + override fun initData() { + mDataBinding.setVariable(BR.vm, viewModel) + + viewModel.loadUserInfo() + } + + override fun onResume() { + super.onResume() + viewModel.loadMoneyData() + } + + override fun initEvent() { + tvMx.setOnClickListener { + ARouter.getInstance().build(AroutUtil.MAIN_MY_LOG_DUIHUAN).withString("type", "1") + .navigation() + } + mDataBinding.ivBack.setOnClickListener { + requireActivity().finish() + } +// mDataBinding.ivCoinLog.setOnClickListener { +// +// startActivity(Intent(requireContext(), QianLogActivity::class.java)) +// } + + mDataBinding.ivTixian.setOnClickListener { + + startActivity(Intent(activity, TiXianActivity::class.java)) + } + + tv_tixian.setOnClickListener { + val intent = Intent(activity, TiXianActivity::class.java) + startActivity(intent) + } + mDataBinding.btnOk.setOnClickListener { + viewModel.duiHuan() + } + mDataBinding.llBindAlipay.setOnClickListener { + + startActivity(Intent(requireActivity(), BindAliActivity::class.java)) + + } + + } + + private var timer: CountDownTimer? = null + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + + override fun onStop() { + if (timer != null) + timer!!.cancel() + super.onStop() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/money/zuan/ShouYiViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/money/zuan/ShouYiViewModel.kt new file mode 100644 index 0000000..42c30e5 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/money/zuan/ShouYiViewModel.kt @@ -0,0 +1,170 @@ +package com.yuyin.mier.module_my.money.zuan + +import android.text.TextUtils +import androidx.lifecycle.MutableLiveData +import com.alibaba.android.arouter.launcher.ARouter +import com.yuyin.lib_base.Const.HTTP_CODE_SUCC +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.module_my.model.MoneyBean +import com.yuyin.mier.module_my.model.UrlBean +import com.yuyin.mier.repository.CommonRepository + +class ShouYiViewModel : BaseViewModel() { + var repository = CommonRepository() + var moneyData = MutableLiveData() + + //可以兑换金额 + var yue = MutableLiveData("") + + //输入兑换金额 + var duiHuanJine = MutableLiveData("") + + //到账金额 + var daoJine = MutableLiveData("") + + + var urlBean: MutableLiveData = MutableLiveData() + + var statusBean: MutableLiveData = MutableLiveData() + + var submitBean: MutableLiveData = MutableLiveData() + + fun get_sign_contract_url() { + launchUI { + val result = repository.get_sign_contract_url() + urlBean.value = result.data + } + } + + fun get_sign_status() { + launchUI { + val result = repository.get_sign_status() + statusBean.value = result.data + } + } + + + fun submit_sign() { + launchUI { + val result = repository.submit_sign() + submitBean.value = result.data + } + } + + + fun loadMoneyData() { + launchUI { + val result = repository.get_user_withdrawal_info() + moneyData.value = result.data + } + } + + fun cha(money: String) { + launchUI { + val result = repository.exchangeCheck(money) + daoJine.value = result.data.money.toString() + } + } + + fun duiHuanAll() { + try { + duiHuanJine.value = yue.value.toString().split(".")[0] + } catch (e: Exception) { + } + } + + fun duiHuan() { + if (TextUtils.isEmpty(duiHuanJine.value)) return + launchUI { + val result = repository.exchange(duiHuanJine.value.toString(), "") + if (result.code == HTTP_CODE_SUCC) { + if (!TextUtils.isEmpty(result.msg)) result.msg.showToast() + loadMoneyData() + } + } + } + + fun duiHuan2(trade_password: String) { + if (TextUtils.isEmpty(duiHuanJine.value)) return + launchUI { + val result = repository.exchange(duiHuanJine.value.toString(), trade_password) + if (result.code == HTTP_CODE_SUCC) { + if (!TextUtils.isEmpty(result.msg)) result.msg.showToast() + loadMoneyData() + } + } + } + + fun duiHuanLog() { + ARouter.getInstance().build(AroutUtil.MAIN_MY_LOG_DUIHUAN).navigation() + } + + + fun toTiXian() { + ARouter.getInstance().build(AroutUtil.MAIN_MY_TIXIAN).navigation() + } + + fun toBindALi() { + ARouter.getInstance().build(AroutUtil.MAIN_MY_BINDALI).navigation() + } + + fun allTi() { + tixianjine.value = yue.value; + + } + + //输入提现金额 + var tixianjine = MutableLiveData("") + + //输入验证码 + var code = MutableLiveData("") + + + //点击发送验证码事件监听 + var sendCodeClick: MutableLiveData = MutableLiveData(true) + + var sendCode: MutableLiveData = MutableLiveData() + + + /*fun sendCode(captcha_code: String, captcha_key: String) { + if (sendCodeClick.value == false) return + sendCodeClick.value = false + launchUI { + val result = + if (UserManager.user.user_name.isNotEmpty() && RegexUtils.isMobileExact(UserManager.user.user_name)) { + repository.verification(UserManager.user.user_name, "1",captcha_code,captcha_key) + + } else { + repository.verification(userInfoData.value!!.user_name, "1",captcha_code,captcha_key) + + } + sendCode.value = "发送" + result.msg.showToast() + } + + }*/ + + fun tiXian() { + if (tixianjine.value.isNullOrEmpty()) { + "请输入提现金额".showToast() + return + } +// if (code.value.isNullOrEmpty()) { +// "请输入验证码".showToast() +// return +// } + launchUI { + val result = + repository.tixian( + tixianjine.value.toString(), + code.value.toString() + ) + if (result.msg.isNotEmpty()) + result.msg.showToast() + loadMoneyData() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/pass/PassActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/pass/PassActivity.kt new file mode 100644 index 0000000..c0343b7 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/pass/PassActivity.kt @@ -0,0 +1,91 @@ +package com.yuyin.mier.module_my.pass + +import android.os.CountDownTimer +import androidx.databinding.ViewDataBinding +import androidx.navigation.Navigation +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.mixin.module_login.ui.GraphicCodeDialog +import com.yuyin.mier.BR +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.login_forgot_fragment.* + +class PassActivity : BaseDataBindingActivity() { + + + + private var timer: CountDownTimer? = null + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + + override fun onStop() { + super.onStop() + if (timer != null) + timer!!.cancel() + } + + override fun startObserve() { + mDataBinding.setVariable(BR.layout, viewModel) + mDataBinding.executePendingBindings() + viewModel.getError().observe(this, { + viewModel.sendCodeClick.postValue(true) + }) + viewModel.sendCode.observe(this, { + showCode() + }) + viewModel.forgetPwdResult.observe(this, { + Navigation.findNavController(btn_ok).navigateUp() + }) + } + + override fun getLayoutId(): Int = R.layout.activity_pass + + override fun initView() { + } + + override fun initData() { + } + + override fun initEvent() { + // 调用代码,记得把xml 里面的点击时间去掉 + send_code.setOnClickListener { + + val graphicCodeDialog = GraphicCodeDialog(this) + viewModel.create_captcha() + viewModel.captchaBean.observe(this) { + GlideUtil.loadImglogo(this, + it.image, + graphicCodeDialog.getBinding().graphicCode + ) + } + graphicCodeDialog.getBinding().graphicCode.setOnClickListener { + viewModel.create_captcha() + } + + graphicCodeDialog.getBinding().btnConfirm.setOnClickListener { + viewModel.verification( + graphicCodeDialog.getBinding().etCode.text.toString(), + viewModel.captchaBean.value!!.key + ) + graphicCodeDialog.dismiss() + } + graphicCodeDialog.show() + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/pass/PassViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/pass/PassViewModel.kt new file mode 100644 index 0000000..f268865 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/pass/PassViewModel.kt @@ -0,0 +1,64 @@ +package com.yuyin.mier.module_my.pass + +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 PassViewModel : BaseViewModel() { + + private val repository = CommonRepository() + + var phone: MutableLiveData = MutableLiveData() + + var code: MutableLiveData = MutableLiveData() + + var passWord: MutableLiveData = MutableLiveData() + + var sendCodeClick: MutableLiveData = MutableLiveData(true) + + var sendCode: MutableLiveData = MutableLiveData() + + var forgetPwdResult: 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(), "1",captcha_code,captcha_key) + result.msg.showToast() + } + + + } + + fun forgetPwd() { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (code.value.isNullOrEmpty()) { + "请输入验证码".showToast() + return + } + if (passWord.value.isNullOrEmpty()) { + "请输入密码".showToast() + return + } + launchUI { + val resultPwd = repository.forgetPwd( + phone.value.toString(), + code.value.toString(), + passWord.value.toString() + ) + resultPwd.msg.showToast() + forgetPwdResult.value = "成功" + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/payps/PayPsActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/payps/PayPsActivity.kt new file mode 100644 index 0000000..bf89d66 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/payps/PayPsActivity.kt @@ -0,0 +1,95 @@ +package com.yuyin.mier.module_my.payps + +import android.os.CountDownTimer +import androidx.databinding.ViewDataBinding +import com.alibaba.android.arouter.facade.annotation.Route +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_PAY_PS +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.lib_base.util.showToast +import com.yuyin.mixin.module_login.ui.GraphicCodeDialog +import com.yuyin.mier.BR +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.activity_pay_ps.* + +@Route(path = MAIN_MY_PAY_PS) +class PayPsActivity : BaseDataBindingActivity() { + private var timer: CountDownTimer? = null + + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + coadsend.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + coadsend.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + + override fun onStop() { + super.onStop() + if (timer != null) + timer!!.cancel() + } + + override fun startObserve() { + viewModel.sendCode.observe(this, { + showCode() + }) + viewModel.payPwdResult.observe(this, { + "设置成功".showToast() + finish() + }) + } + + override fun initView() { + + } + + override fun initData() { + phoneText.text = UserManager.user.user_name + mDataBinding.setVariable(BR.layout, viewModel) + mDataBinding.executePendingBindings() + viewModel.phone.postValue(UserManager.user.user_name) + } + + override fun initEvent() { + coadsend.setOnClickListener { + + val graphicCodeDialog = GraphicCodeDialog(this) + viewModel.create_captcha() + viewModel.captchaBean.observe(this) { + GlideUtil.loadImglogo(this, + it.image, + graphicCodeDialog.getBinding().graphicCode + ) + } + graphicCodeDialog.getBinding().graphicCode.setOnClickListener { + viewModel.create_captcha() + } + + graphicCodeDialog.getBinding().btnConfirm.setOnClickListener { + viewModel.verification( + graphicCodeDialog.getBinding().etCode.text.toString(), + viewModel.captchaBean.value!!.key + ) + graphicCodeDialog.dismiss() + + } + + graphicCodeDialog.show() + + } + } + + override fun getLayoutId(): Int = R.layout.activity_pay_ps +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/payps/PayPsViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/payps/PayPsViewModel.kt new file mode 100644 index 0000000..8b98ec9 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/payps/PayPsViewModel.kt @@ -0,0 +1,76 @@ +package com.yuyin.mier.module_my.payps + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.repository.CommonRepository + +class PayPsViewModel : BaseViewModel() { + + private val repository = CommonRepository() + + var phone: MutableLiveData = MutableLiveData(UserManager.user.user_name) + + var code: MutableLiveData = MutableLiveData() + + var passWord: MutableLiveData = MutableLiveData() + var passWord2: MutableLiveData = MutableLiveData() + + var sendCodeClick: MutableLiveData = MutableLiveData(true) + + var sendCode: MutableLiveData = MutableLiveData() + + var payPwdResult: 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(), "1",captcha_code,captcha_key) + result.msg.showToast() + } + + } + + fun setPayPwd() { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (code.value.isNullOrEmpty()) { + "请输入验证码".showToast() + return + } + if (passWord.value.isNullOrEmpty()) { + "请输入密码".showToast() + return + } + if (passWord2.value.isNullOrEmpty()) { + "请输入确认密码".showToast() + return + } + + if (!passWord.value.equals(passWord2.value.toString())) { + "确认密码不匹配,请重新输入".showToast() + return + } + + launchUI { + val resultPwd = repository.modify_trade_password( + phone.value.toString(), + code.value.toString(), + passWord.value.toString() + ) + resultPwd.msg.showToast() + payPwdResult.value = "成功" + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/peerage/PeerageActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/peerage/PeerageActivity.kt new file mode 100644 index 0000000..8b95920 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/peerage/PeerageActivity.kt @@ -0,0 +1,147 @@ +package com.yuyin.mier.module_my.peerage + +import androidx.fragment.app.Fragment +import androidx.viewpager.widget.ViewPager +import com.yuyin.lib_base.Const +import com.yuyin.lib_base.adapter.MyPagerAdapter +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.ui.X5WebViewActivity +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityPeerageBinding +import com.yuyin.nini.module_my.peerage.PeerageViewModel +import kotlinx.android.synthetic.main.activity_peerage.* + + +class PeerageActivity : BaseDataBindingActivity() { + private var lid = "" + private var price = "" + override fun startObserve() { + + viewModel.nobilityList.observe(this) { + + val tabs = ArrayList() + val fragments = ArrayList() + + for (i in it.indices) { + tabs.add(it[i].name) + fragments.add(PeerageFragment.newInstance(it[i])) + } + + val pagerAdapter = MyPagerAdapter(supportFragmentManager, fragments, tabs) + mDataBinding.viewPager.adapter = pagerAdapter + view_pager.offscreenPageLimit = fragments.size +// tab_layout.setupWithViewPager(view_pager) +// //设置自定义tab +// setCustomViews(tabs) + mDataBinding.tabLayout.setViewPager(mDataBinding.viewPager) + mDataBinding.tabLayout.currentTab = 0 + mDataBinding.tabLayout.setSnapOnTabClick(true) + lid=it[0].lid.toString() +// viewModel.get_nobility_info(it[0].lid.toString()) + + mDataBinding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + } + + override fun onPageSelected(position: Int) { + lid=it[position].lid.toString() +// viewModel.get_nobility_info(lid) + } + + override fun onPageScrollStateChanged(state: Int) { + } + }) + + } + + + } + + override fun getLayoutId(): Int { + return R.layout.activity_peerage + } + + override fun initView() { + + mDataBinding.ivNote.setOnClickListener { + + X5WebViewActivity.forward(this, Const.PAGE_JUE_WEI, "爵位说明") + + } + + } + + override fun initData() { + } + + override fun onResume() { + super.onResume() + viewModel.get_nobility_list() + } + + override fun initEvent() { + /*tab_layout.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("#ffffff")) + text?.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) +// text?.typeface = Typeface.DEFAULT_BOLD + v_view?.visibility = View.VISIBLE + } + + 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("#80ffffff")) + v_view?.visibility = View.GONE + } + + 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("#ffffff")) + } + + })*/ + + + } + /*private fun setCustomViews(titleRes:ArrayList) { + val mSelectedTabPosition = tab_layout.selectedTabPosition + for (i in titleRes.indices) { + tab_layout.getTabAt(i)!!.customView = getTabView(i, mSelectedTabPosition,titleRes) + } + } + private fun getTabView(index: Int, mSelectedTabPosition: Int,titleRes:ArrayList): View { + //自定义View布局 + val view: View = LayoutInflater.from(this).inflate(R.layout.item_tablayout_header6, 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("#ffffff")) + title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) +// title.typeface = Typeface.DEFAULT_BOLD + v_view.visibility = View.VISIBLE + } else { + title.setTextColor(Color.parseColor("#80ffffff")) + title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14f) +// title.typeface = Typeface.DEFAULT + v_view?.visibility = View.GONE + } + + return view + }*/ + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/peerage/PeerageFragment.kt b/app/src/main/java/com/yuyin/mier/module_my/peerage/PeerageFragment.kt new file mode 100644 index 0000000..177c93c --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/peerage/PeerageFragment.kt @@ -0,0 +1,264 @@ +package com.yuyin.mier.module_my.peerage + +import android.annotation.SuppressLint +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.os.Handler +import android.os.Message +import android.text.TextUtils +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import com.alipay.sdk.app.PayTask +import com.baoyz.actionsheet.ActionSheet +import com.tencent.mm.opensdk.modelpay.PayReq +import com.tencent.mm.opensdk.openapi.WXAPIFactory +import com.yuyin.lib_base.base.BaseDataBindingFragment +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.lib_base.util.TimeUtil +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.R +import com.yuyin.mier.databinding.FragmentPeerageBinding +import com.yuyin.mier.module_home.model.NobilityListBean +import com.yuyin.mier.module_my.adapter.PeerageAdapter +import com.yuyin.nini.module_my.peerage.PeerageViewModel +import com.yuyin.mier.module_my.model.PayResult + + +private const val ARG_PARAM = "param" + +class PeerageFragment : BaseDataBindingFragment() { + + private lateinit var peerageAdapter: PeerageAdapter + + companion object { + @JvmStatic + fun newInstance(param: NobilityListBean) = + PeerageFragment().apply { + arguments = Bundle().apply { + putSerializable(ARG_PARAM, param) + } + } + } + + override fun startObserve() { + + viewModel.nobilityInfo.observe(this) { + peerageAdapter.setNewData(it.nobility_power_list) + + GlideUtil.loadImglogo(requireContext(), it.nobility_info.image, mDataBinding.ivCover) + + } + + viewModel.nobilityInfo.observe(this) { + mDataBinding.tvNextValue2.text = "${it.nobility_info.pay_price}" + mDataBinding.tvTime.text ="元/"+it.nobility_info.day_num+"天" + mDataBinding.tvZsjb.text="赠送"+it.nobility_info.pay_coin+"金币" + +/* when (it.nobility_info.lid) { + 1->{ + mDataBinding.ivCover1.setImageResource(R.mipmap.peerage0) + } + 2->{ + mDataBinding.ivCover1.setImageResource(R.mipmap.peerage1) + } + 3->{ + mDataBinding.ivCover1.setImageResource(R.mipmap.peerage2) + } + 4->{ + mDataBinding.ivCover1.setImageResource(R.mipmap.peerage3) + } + 5->{ + mDataBinding.ivCover1.setImageResource(R.mipmap.peerage4) + } + 6->{ + mDataBinding.ivCover1.setImageResource(R.mipmap.peerage5) + } + }*/ + + + if (it.user_nobility_end_time.toInt()==0){ + mDataBinding.tvOpen.setImageResource(R.mipmap.peer_kt) + mDataBinding.tvXfContent.visibility= View.GONE + mDataBinding.tvDqContent.visibility= View.GONE + mDataBinding.tvDqContent.text = "当前爵位未开通" +// mDataBinding.llcontent1.visibility= View.VISIBLE + }else{ +// mDataBinding.llcontent1.visibility= View.GONE + mDataBinding.tvXfContent.visibility= View.VISIBLE + mDataBinding.tvDqContent.visibility= View.VISIBLE + + mDataBinding.tvXfContent.text="续费"+it.nobility_info.renew_price+"元/"+it.nobility_info.day_num+"天 赠送"+it.nobility_info.renew_coin+"金币" + mDataBinding.tvOpen.setImageResource(R.mipmap.peer_xf) + mDataBinding.tvDqContent.text= TimeUtil.toDateYmdHan(it.user_nobility_end_time.toLong()) + "到期" + } + } + + viewModel.weixin.observe(this) { + val mWxApi = WXAPIFactory.createWXAPI( + requireContext(), null + ) + + // 将该app注册到微信 + mWxApi.registerApp(it.appid) + // 判断是否安装客户端 + if (!mWxApi.isWXAppInstalled) { + "请您先安装微信客户端!".showToast() + return@observe + } + val req = PayReq() + // 微信开放平台审核通过的应用APPID + req.appId = it.appid + // 微信支付分配的商户号 + req.partnerId = it.partnerid + // 预支付订单号,app服务器调用“统一下单”接口获取 + req.prepayId = it.prepayid + // 随机字符串,不长于32位 + req.nonceStr = it.noncestr + // 时间戳 + req.timeStamp = java.lang.String.valueOf(it.timestamp) + // 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值 + req.packageValue = it.packageX + // 签名, + req.sign = it.sign + // 调用微信SDK,发起支付,回调WxPayEntryActivity + mWxApi.sendReq(req) + } + + // 支付宝原生 + viewModel.alipay.observe(this) { + val payRunnable = Runnable { + val alipay = PayTask(requireActivity()) + val result: Map = alipay.payV2( + it, + true + ) + val msg = Message() + msg.what = SDK_PAY_FLAG + msg.obj = result + mHandler.sendMessage(msg) + } + // 必须异步调用 + val payThread = Thread(payRunnable) + payThread.start() + } + + // 支付宝H5 支付 + viewModel.alipayH5.observe(this) { + // 固定前缀 + // 从汇付正扫接口获取的参数(以下值仅为示例) + // 字符串拼接 + var jumpUrl = it.pay_info + + val intent = Intent() + intent.setAction("android.intent.action.VIEW") + // jumpUrl 为先前示例中拼装的 url + val contentUrl = Uri.parse(jumpUrl) + intent.setData(contentUrl) + startActivity(intent) +// var hubProgress = KProgressHUD +// .create(this) +// .setStyle(KProgressHUD.Style.SPIN_INDETERMINATE) +// .setLabel("请稍等...") +// .show() +// wbView.loadUrl(jumpUrl) +// wbView.webViewClient = object : WebViewClient() { +// override fun shouldOverrideUrlLoading(webView: WebView, url: String): Boolean { +// if (url.contains("alipays://platformapi")) { +// var intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)); +// startActivity(intent) +// if (hubProgress != null && hubProgress.isShowing) +// hubProgress.dismiss() +// } else { +// wbView.loadUrl(url) +// } +// return true +// } +// +// override fun onLoadResource(p0: WebView?, p1: String?) { +// super.onLoadResource(p0, p1) +// } +// +// override fun onPageFinished(webView: WebView, s: String) { +// +// } +// } + } + + } + + override fun getLayoutId(): Int { + return R.layout.fragment_peerage + } + + override fun initView() { + } + + override fun initData() { + viewModel.nobilityListBean.value = arguments?.getSerializable(ARG_PARAM) as NobilityListBean? + + + viewModel.get_nobility_info(viewModel.nobilityListBean.value?.lid.toString()) + + mDataBinding.rvContainer.layoutManager = GridLayoutManager(requireContext(), 3) + peerageAdapter = PeerageAdapter() + mDataBinding.rvContainer.adapter = peerageAdapter + + + } + + override fun initEvent() { + mDataBinding.tvOpen.setOnClickListener { + ActionSheet.createBuilder(requireContext(), childFragmentManager).setCancelButtonTitle("取消") + .setOtherButtonTitles("微信", "支付宝").setCancelableOnTouchOutside(true) + .setListener(object : ActionSheet.ActionSheetListener { + override fun onDismiss(actionSheet: ActionSheet, isCancel: Boolean) {} + override fun onOtherButtonClick(actionSheet: ActionSheet, index: Int) { + val bundle = + actionSheet.requireArguments()["other_button_titles"] as Array + when (bundle[index]) { + "微信" -> { + viewModel.pay_nobility_wx(viewModel.nobilityListBean.value?.lid.toString(),"2") + } + "支付宝" -> { +// viewModel.pay_nobility_aliH5(lid,"21") + viewModel.pay_nobility_ali(viewModel.nobilityListBean.value?.lid.toString(),"1") + } + } + } + }).show() + } + + } + + + private val SDK_PAY_FLAG = 1 + + @SuppressLint("HandlerLeak") + private val mHandler: Handler = object : Handler() { + override fun handleMessage(msg: Message) { + val payResult2 = PayResult(msg.obj as Map) + when (msg.what) { + SDK_PAY_FLAG -> { + val payResult = PayResult(msg.obj as Map) + + /** + * 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 + */ + val resultInfo: String = payResult.getResult() // 同步返回需要验证的信息 + val resultStatus: String = payResult.getResultStatus() + // 判断resultStatus 为9000则代表支付成功 + if (TextUtils.equals(resultStatus, "9000")) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + "支付成功".showToast() + } else { + // 失败。 + "支付失败,请重试".showToast() + } + } + else -> { + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/peerage/PeerageViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/peerage/PeerageViewModel.kt new file mode 100644 index 0000000..cb8e08d --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/peerage/PeerageViewModel.kt @@ -0,0 +1,105 @@ +package com.yuyin.nini.module_my.peerage + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.model.AliH5model +import com.yuyin.lib_base.model.Wxmodel +import com.yuyin.mier.module_home.model.NobilityInfoBean +import com.yuyin.mier.module_home.model.NobilityListBean +import com.yuyin.mier.module_home.model.NobilityPayBean +import com.yuyin.mier.repository.CommonRepository + + + +class PeerageViewModel : BaseViewModel() { + private var repository = CommonRepository() + + + val nobilityList = MutableLiveData>() + fun get_nobility_list() { + launchUI { + val result = repository.get_nobility_list() + nobilityList.value = result.data + } + } + + + val nobilityListBean = MutableLiveData() + + + val nobilityInfo = MutableLiveData() + fun get_nobility_info(lid: String) { + launchUI { + val result = repository.get_nobility_info(lid) + nobilityInfo.value = result.data + } + } + + + val alipaySuccess = MutableLiveData() + val wxSuccess = MutableLiveData() + + val nobilityPay = MutableLiveData() + val selectType = MutableLiveData() + fun create_pay_nobility(lid: String) { + launchUI { +// val result = repository.create_pay_nobility_ali(lid) +// nobilityPay.value = result.data +// if (nobilityInfo.value!!.user_nobility.is_nobility == 1) { +// nobilityWxPay(result.data.order_id, nobilityInfo.value?.nobility_info!!.renew_price) +// } else { +// nobilityWxPay(result.data.order_id, nobilityInfo.value?.nobility_info!!.pay_price) +// } + + + } + } + + + + + var weixin = MutableLiveData() + fun pay_nobility_wx(lid: String, pay_type: String) { + launchUI { + val result = repository.pay_nobility_wx(lid, pay_type) + weixin.value = result.data + } + } +// +// +// fun rechargeWxPay(user_id: String, goods_id: String, type: String) { +// launchUI { +// val result = repository.rechargeWxPay(user_id, goods_id, type) +// weixin.value = result.data +// } +// } + + fun nobilityWxPay( + order_id: String, + pay_amount: String, + ) { + launchUI { +// val result = repository.nobilityWxPay(order_id, pay_amount) +// result.msg.showToast() + + } + } + + var alipayH5 = MutableLiveData() + fun pay_nobility_aliH5(lid: String, pay_type: String) { + launchUI { + val result = repository.pay_nobility_aliH5(lid, pay_type) + alipayH5.value = result.data + + } + } + + var alipay = MutableLiveData() + fun pay_nobility_ali(lid: String, pay_type: String) { + launchUI { + val result = repository.pay_nobility_ali(lid, pay_type) + alipay.value = result.data + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/room/MyRoomActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/room/MyRoomActivity.kt new file mode 100644 index 0000000..40d7c1b --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/room/MyRoomActivity.kt @@ -0,0 +1,60 @@ +package com.yuyin.mier.module_my.room + +import androidx.recyclerview.widget.LinearLayoutManager +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityMyRoomBinding +import com.yuyin.mier.module_home.tab.center.MainCenterViewModel +import com.yuyin.mier.module_my.adapter.MyRoomListAdapter + +class MyRoomActivity : BaseDataBindingActivity() { + + lateinit var myRoomListAdapter: MyRoomListAdapter + + override fun startObserve() { + + viewModel.myRoomList.observe(this) { + myRoomListAdapter.setNewData(it) + } + } + + override fun getLayoutId(): Int { + return R.layout.activity_my_room + } + + override fun initView() { + + + mDataBinding.rvContainer.layoutManager = LinearLayoutManager(this) + myRoomListAdapter = MyRoomListAdapter() + mDataBinding.rvContainer.adapter = myRoomListAdapter + + + } + + override fun initData() { + viewModel.get_user_room_power_list() + } + + + override fun initEvent() { + + mDataBinding.toolbar.setNavigationOnClickListener { + finish() + } + + myRoomListAdapter.setOnItemChildClickListener { adapter, view, position -> + if (view.id == R.id.iv_enter_room) { + viewModel.enterRoom(myRoomListAdapter.data[position].rid.toString(), "", this) + } else if (view.id == R.id.iv_quite_room) { + viewModel.user_retire_room_power( + myRoomListAdapter.data[position].rid.toString(), + myRoomListAdapter.data[position].user_type.toString() + ) + } + } + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/set/AboutActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/set/AboutActivity.kt new file mode 100644 index 0000000..180bd6a --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/set/AboutActivity.kt @@ -0,0 +1,32 @@ +package com.yuyin.mier.module_my.set + +import com.blankj.utilcode.util.AppUtils +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityAboutUsBinding +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.BaseViewModel + +class AboutActivity : BaseDataBindingActivity() { + override fun startObserve() { + } + + override fun getLayoutId(): Int { + return R.layout.activity_about_us + } + + override fun initView() { + } + + override fun initData() { + } + + override fun initEvent() { +// v_set_about1.setOnClickListener { +// X5WebViewActivity.forward(this, Const.PAGE_ABOUT, "关于我们") +// } +// v_set_about2.setOnClickListener { +// X5WebViewActivity.forward(this, Const.PAGE_USER_XIEYI, "隐私协议") +// } + mDataBinding.tvVersion.text = AppUtils.getAppVersionName() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/set/BindPhoneActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/set/BindPhoneActivity.kt new file mode 100644 index 0000000..f15ae1a --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/set/BindPhoneActivity.kt @@ -0,0 +1,82 @@ +package com.yuyin.mier.module_my.set + +import android.os.CountDownTimer +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.mixin.module_login.ui.GraphicCodeDialog +import com.yuyin.mier.BR +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityBindPhoneBinding +import kotlinx.android.synthetic.main.activity_bind_phone.* + +class BindPhoneActivity : BaseDataBindingActivity() { + + private var timer: CountDownTimer? = null + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + override fun startObserve() { + mDataBinding.setVariable(BR.layout, viewModel) + viewModel.sendCode.observe(this, { + showCode() + }) + } + + override fun getLayoutId(): Int { + return R.layout.activity_bind_phone + } + + override fun initView() { + + } + + override fun initData() { + + } + + + override fun initEvent() { +// 调用代码,记得把xml 里面的点击时间去掉 + mDataBinding.sendCode.setOnClickListener { + + val graphicCodeDialog = GraphicCodeDialog(this) + viewModel.create_captcha() + viewModel.captchaBean.observe(this) { + GlideUtil.loadImglogo( + this, + it.image, + graphicCodeDialog.getBinding().graphicCode + ) + } + graphicCodeDialog.getBinding().graphicCode.setOnClickListener { + viewModel.create_captcha() + } + + graphicCodeDialog.getBinding().btnConfirm.setOnClickListener { + viewModel.verification( + graphicCodeDialog.getBinding().etCode.text.toString(), + viewModel.captchaBean.value!!.key + ) + graphicCodeDialog.dismiss() + + } + + graphicCodeDialog.show() + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/set/BindPhoneViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/set/BindPhoneViewModel.kt new file mode 100644 index 0000000..72fe0c3 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/set/BindPhoneViewModel.kt @@ -0,0 +1,84 @@ +package com.yuyin.mier.module_my.set + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.model.Login +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.repository.CommonRepository +import org.litepal.LitePal + +class BindPhoneViewModel : BaseViewModel() { + private val repository = CommonRepository() + + 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() + } + + } + + fun bind_phone() { + if (phone.value.isNullOrEmpty()) { + "请输入手机号".showToast() + return + } + if (code.value.isNullOrEmpty()) { + "请输入验证码".showToast() + return + } + + launchUI { + val result = repository.bind_phone(phone.value.toString(), code.value.toString()) + result.msg.showToast() + var login = LitePal.findFirst(Login::class.java) + login.user_name = phone.value.toString() + login.save() + UserManager.initData() + + } + + } + + + val setHidenEnterRoom = MutableLiveData() + fun set_is_hide_enter_room(is_room_hiding: String) { + launchUI { + + var result = repository.set_is_hide_enter_room(is_room_hiding) + setHidenEnterRoom.value = result.data + result.msg.showToast() + } + } + + + fun user_is_room_hiding(is_room_hiding: String) { + launchUI { + val result = repository.user_is_room_hiding(is_room_hiding) + loadUserInfo() + } + } + + fun options_is_open_address(is_open_address:String){ + launchUI { + repository.options_is_open_address(is_open_address) + loadUserInfo() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/set/LogoutActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/set/LogoutActivity.kt new file mode 100644 index 0000000..d60fcae --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/set/LogoutActivity.kt @@ -0,0 +1,49 @@ +package com.yuyin.mier.module_my.set + +import com.alibaba.android.arouter.launcher.ARouter +import com.yuyin.lib_base.App +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityLogoutBinding + +class LogoutActivity : BaseDataBindingActivity() { + + override fun startObserve() { + viewModel.userCancel.observe(this) { + UserManager.layout() + try { + App.roomActivity?.finish() + } catch (e: Exception) { + } + ARouter.getInstance().build(AroutUtil.LOGIN_MAIN).navigation() + } + } + + override fun getLayoutId(): Int { + return R.layout.activity_logout + } + + override fun initView() { + } + + override fun initData() { + + } + + + override fun initEvent() { + + mDataBinding.vLogOut.setOnClickListener { + val logoutDialog = LogoutDialog(this) + logoutDialog.getBinding().btnConfirm.setOnClickListener { + viewModel.user_cancel(logoutDialog.binding.tvSmsCode.text.toString()) + + logoutDialog.dismiss() + } + logoutDialog.show() + + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/set/LogoutDialog.kt b/app/src/main/java/com/yuyin/mier/module_my/set/LogoutDialog.kt new file mode 100644 index 0000000..afaeea8 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/set/LogoutDialog.kt @@ -0,0 +1,113 @@ +package com.yuyin.mier.module_my.set + +import android.app.Dialog +import android.os.CountDownTimer +import android.view.Gravity +import android.view.LayoutInflater +import android.view.WindowManager +import androidx.databinding.DataBindingUtil +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.mixin.module_login.ui.GraphicCodeDialog +import com.yuyin.mier.R +import com.yuyin.mier.databinding.DialogLogoutBinding +import kotlinx.android.synthetic.main.login_fragment.* + +class LogoutDialog(val context: LogoutActivity) : Dialog(context) { + + lateinit var binding: DialogLogoutBinding + private var timer: CountDownTimer? = null + + init { + initDialog() + } + + private fun initDialog() { + val inflater = LayoutInflater.from(context) + binding = DataBindingUtil.inflate(inflater, R.layout.dialog_logout, null, false) + setContentView(binding.root) + val params = window?.attributes as WindowManager.LayoutParams + params.gravity = Gravity.CENTER + params.width = WindowManager.LayoutParams.MATCH_PARENT + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + window?.setBackgroundDrawableResource(android.R.color.transparent) + + val phoneNumber = UserManager.user.user_name + val maskedPhoneNumber = phoneNumber.replaceRange(3, 7, "****") + binding.tvPhoto.text = "绑定手机号:" + maskedPhoneNumber + + binding.sendCode.setOnClickListener { + val graphicCodeDialog = GraphicCodeDialog(context) + context.viewModel.create_captcha() + context.viewModel.captchaBean.observe(context) { + GlideUtil.loadImglogo( + context, + it.image, + graphicCodeDialog.getBinding().graphicCode + ) + } + graphicCodeDialog.getBinding().graphicCode.setOnClickListener { + context.viewModel.create_captcha() + } + + graphicCodeDialog.getBinding().btnConfirm.setOnClickListener { + + context.viewModel.phone.value = UserManager.user.user_name + + context.viewModel.verification( + graphicCodeDialog.getBinding().etCode.text.toString(), + context.viewModel.captchaBean.value!!.key + ) + graphicCodeDialog.dismiss() + + } + + graphicCodeDialog.show() + + } + + context.viewModel.sendCode.observe(context) { + showCode() + } + + binding.btnCancel.setOnClickListener { + dismiss() + } + + } + + + @JvmName("getBinding1") + fun getBinding(): DialogLogoutBinding { + + return binding; + } + + override fun dismiss() { + super.dismiss() + if (timer != null) + timer!!.cancel() + } + + + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + context.viewModel.sendCodeClick.postValue(true) + } + }.start() + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/set/SetActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/set/SetActivity.kt new file mode 100644 index 0000000..7aa2556 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/set/SetActivity.kt @@ -0,0 +1,229 @@ +package com.yuyin.mier.module_my.set + +import android.content.Context +import android.content.Intent +import android.content.pm.PackageInfo +import android.content.pm.PackageManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.blankj.utilcode.util.LogUtils +import com.blankj.utilcode.util.RegexUtils +import com.kongzue.dialog.v3.MessageDialog +import com.tencent.qcloud.tuicore.TUILogin +import com.tencent.qcloud.tuicore.interfaces.TUICallback +import com.yuyin.lib_base.Const +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.arouter.AroutUtil.MY_COMM_SET +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.model.FirstEvent +import com.yuyin.lib_base.model.UserBean +import com.yuyin.lib_base.ui.X5WebViewActivity +import com.yuyin.lib_base.util.CacheDataManager +import com.yuyin.lib_base.util.SharedPreferencesUtils +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.R +import com.yuyin.mier.module_home.tab.home.teen.TeenModeActivity +import com.yuyin.mier.module_home.tab.xiaoxi.black.BlackListActivity +import com.yuyin.mier.module_login.ui.ForgetActivity +import com.yuyin.mier.module_my.feedback.FeedBackActivity +import kotlinx.android.synthetic.main.activity_my_set.* +import org.greenrobot.eventbus.EventBus + +@Route(path = MY_COMM_SET) +class SetActivity : BaseActivity() { + private var mUserBean: UserBean? = null + override fun startObserve() { + viewModel.userCancel.observe(this) { + UserManager.layout() + ARouter.getInstance().build(AroutUtil.LOGIN_MAIN).navigation() + EventBus.getDefault().post(FirstEvent("指定发送", Const.LOGOUT)) + finish() + } + + viewModel.userInfoData.observe(this) { + mUserBean = it + room_stealth.isSelected = it.is_room_hiding == 1 + location_stealth.isSelected = it.is_open_address == 1 + } + + + } + + override fun getLayoutId(): Int = R.layout.activity_my_set + + override fun initView() { + + } + + override fun initData() { + getTotalCacheSize() + banben.text = getVersionName(this) + + viewModel.loadUserInfo() + if (RegexUtils.isMobileExact(UserManager.user.user_name)) { + tv_bind_phone.text = "已绑定" + UserManager.user.user_name + v_set_safe_pass.isEnabled = false + } else { + v_set_safe_pass.isEnabled = true + } + if (SharedPreferencesUtils.getParam(this, "isTJ", "1").equals("2")) { + tuijian_stealth.isSelected=true + }else{ + tuijian_stealth.isSelected=false + } + } + + //获取自己应用内部的版本名 + + //获取自己应用内部的版本名 + fun getVersionName(context: Context): String? { + val manager: PackageManager = context.packageManager + var name: String? = null + try { + val info: PackageInfo = manager.getPackageInfo(context.packageName, 0) + name = info.versionName + } catch (e: PackageManager.NameNotFoundException) { + e.printStackTrace() + } + return name + } + + override fun initEvent() { + v_set_ysxy.setOnClickListener { + X5WebViewActivity.forward(this, Const.PAGE_USER_XIEYI2, "隐私政策") + } + v_set_tj.setOnClickListener { + if (SharedPreferencesUtils.getParam(this, "isTJ", "1").equals("2")) { + SharedPreferencesUtils.setParam(this, "isTJ", "1") + tuijian_stealth.isSelected=false + }else{ + SharedPreferencesUtils.setParam(this, "isTJ", "2") + tuijian_stealth.isSelected=true + } + } + v_set_blacks.setOnClickListener { + + startActivity(Intent(this, BlackListActivity::class.java)) + } + + + v_set_zx.setOnClickListener { + startActivity(Intent(this, LogoutActivity::class.java)) + } + + v_set_safe_pass.setOnClickListener { + startActivity(Intent(this, BindPhoneActivity::class.java)) + } + + +// v_set_pay_pass.setOnClickListener { +// startActivity(Intent(this, PayPsActivity::class.java)) +// } + v_set_clear.setOnClickListener { + + val setTipsDialog = SetTipsDialog(this); + setTipsDialog.getBinding().tvContent.text = "是否清除缓存" + setTipsDialog.getBinding().btnConfirm.setOnClickListener { + //在子线程执行删除缓存 + Thread { + CacheDataManager.clearAllCache(this) + //在主线程执行更新UI操作 + runOnUiThread { + "清除成功".showToast() + getTotalCacheSize() + } + }.start() + setTipsDialog.dismiss() + } + setTipsDialog.show() + } + + v_set_about.setOnClickListener { + + X5WebViewActivity.forward(this, Const.PAGE_ABOUT, "关于我们") + + } + v_set_out.setOnClickListener { + MessageDialog.show( + this, "提示", "确定要退出吗", "确定", "取消" + ).setOnOkButtonClickListener { baseDialog, v -> + viewModel.user_log_out() + baseDialog?.doDismiss() + UserManager.layout() + TUILogin.logout(object : TUICallback() { + override fun onSuccess() { + LogUtils.e("退出登录") + } + + override fun onError(errorCode: Int, errorMessage: String?) { + } + }) + ARouter.getInstance().build(AroutUtil.LOGIN_MAIN).navigation() + EventBus.getDefault().post(FirstEvent("指定发送", Const.LOGOUT)) + true + } + } + + iv_switch.setOnClickListener { + iv_switch.isSelected = !iv_switch.isSelected + } + + + + v_set_juvenile.setOnClickListener { + startActivity(Intent(this, TeenModeActivity::class.java)) + } + + v_set_real.setOnClickListener { + + if (mUserBean == null) return@setOnClickListener + when (mUserBean!!.is_real) { + "2" -> ARouter.getInstance().build(AroutUtil.PLAY_REAL_NAME).navigation() + "1" -> "已认证...".showToast() + "3" -> "实名认证审核中...".showToast() + } + + } + v_set_account.setOnClickListener { + + startActivity(Intent(this, ForgetActivity::class.java)) + + + } + + v_set_help.setOnClickListener { + + startActivity(Intent(this, FeedBackActivity::class.java)) + } + + room_stealth.setOnClickListener { + + if (viewModel.userInfoData.value?.is_room_hiding == 1) { + viewModel.user_is_room_hiding("2") + + } else { + viewModel.user_is_room_hiding("1") + } + } + location_stealth.setOnClickListener { + + if (viewModel.userInfoData.value?.is_open_address == 1) { + viewModel.options_is_open_address("2") + + } else { + viewModel.options_is_open_address("1") + } + } + } + + private fun getTotalCacheSize() { + try { + //这个操作要放在try-catch当中 + var cacheSize = CacheDataManager.getTotalCacheSize(this) + clear_huancun.text = cacheSize + } catch (e: Exception) { + e.printStackTrace() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/set/SetTipsDialog.kt b/app/src/main/java/com/yuyin/mier/module_my/set/SetTipsDialog.kt new file mode 100644 index 0000000..1af2324 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/set/SetTipsDialog.kt @@ -0,0 +1,44 @@ +package com.yuyin.mier.module_my.set + +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.DialogSetTipsBinding + +class SetTipsDialog(context: Context) : Dialog(context) { + + lateinit var binding: DialogSetTipsBinding + + init { + initDialog() + } + + private fun initDialog() { + val inflater = LayoutInflater.from(context) + binding = DataBindingUtil.inflate(inflater, R.layout.dialog_set_tips, null, false) + setContentView(binding.root) + val params = window?.attributes as WindowManager.LayoutParams + params.gravity = Gravity.CENTER + params.width = WindowManager.LayoutParams.MATCH_PARENT + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + window?.setBackgroundDrawableResource(android.R.color.transparent) + binding.btnCancel.setOnClickListener { dismiss() } + + + } + + + + @JvmName("getBinding1") + fun getBinding(): DialogSetTipsBinding { + + return binding; + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/set/WxKeFuAt.kt b/app/src/main/java/com/yuyin/mier/module_my/set/WxKeFuAt.kt new file mode 100644 index 0000000..7ce7d31 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/set/WxKeFuAt.kt @@ -0,0 +1,43 @@ +package com.yuyin.mier.module_my.set + +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityWxKefuBinding +import kotlinx.android.synthetic.main.activity_wx_kefu.* + +class WxKeFuAt :BaseDataBindingActivity() { + override fun startObserve() { + viewModel.kfMessageBean.observe(this){ + if(it.size>0){ + GlideUtil.loadImglogo(this,it[0].image,iv_kf1) + tv_name1.text=it[0].contents + tv_time1.text=it[0].content + } + if(it.size>1){ + GlideUtil.loadImglogo(this,it[1].image,iv_kf2) + tv_name2.text=it[1].contents + tv_time2.text=it[1].content + } + if(it.size>2){ + GlideUtil.loadImglogo(this,it[2].image,iv_kf3) + tv_name3.text=it[2].contents + tv_time3.text=it[2].content + } + + } + } + + override fun getLayoutId(): Int= R.layout.activity_wx_kefu + + override fun initView() { + viewModel.get_kf_message() + } + + override fun initData() { + } + + override fun initEvent() { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/shoucang/ShouCangRoomActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/shoucang/ShouCangRoomActivity.kt new file mode 100644 index 0000000..183175d --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/shoucang/ShouCangRoomActivity.kt @@ -0,0 +1,71 @@ +package com.yuyin.mier.module_my.shoucang + +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_MY_SHOUCANG +import com.yuyin.lib_base.base.BaseActivity +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.mier.R +import com.yuyin.mier.module_my.adapter.ShouCangRoomAdapter +import kotlinx.android.synthetic.main.activity_log_tixian.* + +@Route(path = MAIN_MY_SHOUCANG) +class ShouCangRoomActivity : BaseActivity() { + var page: Int = 1 + private lateinit var cashHisAdapter: ShouCangRoomAdapter + override fun startObserve() { + viewModel.roomData.observe(this) { + if (page == 1) { + cashHisAdapter.setNewData(it) + smart.finishRefresh() + } else { + cashHisAdapter.addData(it) + smart.finishLoadMore() + } + } + viewModel.getFinally().observe(this, { + smart.finishRefresh() + smart.finishLoadMore() + }) + + viewModel.keepNoData.observe(this){ + + page = 1 + viewModel.loadData(page.toString()) + + } + } + + override fun getLayoutId(): Int = R.layout.activity_shoucang_room + + override fun initView() { + } + + override fun initData() { + cashHisAdapter = ShouCangRoomAdapter() + recyclerview.layoutManager = LinearLayoutManager(this) + recyclerview.adapter = cashHisAdapter + viewModel.loadData(page.toString()) + smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.loadData(page.toString()) + } + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.loadData(page.toString()) + } + }) + } + override fun initEvent() { + cashHisAdapter.setOnItemChildClickListener { adapter, view, position -> + if (view.id == R.id.tv_enter){ + viewModel.remove_mykeep(cashHisAdapter.data[position].rid.toString()) + } + } + cashHisAdapter.setOnItemClickListener { adapter, view, position -> + viewModel.enterRoom(cashHisAdapter.data[position].rid.toString(), "",this) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/shoucang/ShouCangViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/shoucang/ShouCangViewModel.kt new file mode 100644 index 0000000..319132b --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/shoucang/ShouCangViewModel.kt @@ -0,0 +1,31 @@ +package com.yuyin.mier.module_my.shoucang + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_my.model.CollectRoomListBean +import com.yuyin.mier.repository.CommonRepository +import com.yuyin.module_live.repository.LiveRepository + +class ShouCangViewModel : BaseViewModel() { + + var myRepository = CommonRepository() + var liveRepository = LiveRepository() + + var roomData = MutableLiveData>() + + fun loadData(page: String) { + launchUI { + val result = myRepository.get_user_collect_list(page) + roomData.value = result.data + } + } + + //取消收藏 + var keepNoData = MutableLiveData() + fun remove_mykeep(rid: String) { + launchUI { + val data = liveRepository.remove_mykeep(rid) + keepNoData.value = data.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/tequan/TeQuanActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/tequan/TeQuanActivity.kt new file mode 100644 index 0000000..b97a6b2 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/tequan/TeQuanActivity.kt @@ -0,0 +1,38 @@ +package com.yuyin.mier.module_my.tequan + +import androidx.recyclerview.widget.LinearLayoutManager +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.module_live.model.TeQuanBean +import com.yuyin.mier.R +import com.yuyin.mier.adapter.TeQuanAdapter +import com.yuyin.mier.databinding.ActivityTequanListBinding +import java.util.* + +class TeQuanActivity : BaseDataBindingActivity() { + + lateinit var adapter: TeQuanAdapter + var teQuanBeans = ArrayList() + + override fun startObserve() { + viewModel.musicDataList.observe(this, { + adapter.setNewData(it) + }) + } + + override fun getLayoutId(): Int = R.layout.activity_tequan_list + + override fun initView() { + adapter = TeQuanAdapter(teQuanBeans) + mDataBinding.rvView.layoutManager = LinearLayoutManager(this) + mDataBinding.rvView.adapter = adapter + + } + + override fun initData() { + viewModel.get_decorate_list() + } + + override fun initEvent() { + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/tequan/TeQuanViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/tequan/TeQuanViewModel.kt new file mode 100644 index 0000000..19d9f7e --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/tequan/TeQuanViewModel.kt @@ -0,0 +1,18 @@ +package com.yuyin.mier.module_my.tequan + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.module_live.model.TeQuanBean +import com.yuyin.module_live.repository.LiveRepository + +class TeQuanViewModel : BaseViewModel() { + var repository = LiveRepository() + var musicDataList = MutableLiveData>() + + fun get_decorate_list() { + launchUI { + val result = repository.get_decorate_list() + musicDataList.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/vip/ChangeInviterActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/vip/ChangeInviterActivity.kt new file mode 100644 index 0000000..8032c87 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/vip/ChangeInviterActivity.kt @@ -0,0 +1,233 @@ +package com.yuyin.mier.module_my.vip + +import android.annotation.SuppressLint +import android.os.CountDownTimer +import android.os.Handler +import android.os.Message +import android.text.TextUtils +import com.alipay.sdk.app.PayTask +import com.tencent.mm.opensdk.modelpay.PayReq +import com.tencent.mm.opensdk.openapi.WXAPIFactory +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.base.UserManager +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.lib_base.util.showToast +import com.yuyin.mixin.module_login.ui.GraphicCodeDialog +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ActivityChangeInviterBinding +import com.yuyin.mier.module_home.tab.center.MainCenterViewModel +import com.yuyin.mier.module_my.model.PayResult +import com.yuyin.mier.module_my.set.SetTipsDialog +import kotlinx.android.synthetic.main.login_fragment.* + +class ChangeInviterActivity : + BaseDataBindingActivity() { + private var timer: CountDownTimer? = null + + override fun startObserve() { + viewModel.sendCode.observe(this) { + showCode() + } + + viewModel.inviteInfoBean.observe(this) { + + mDataBinding.updateInviterPrice.text = it.update_inviter_price + "金币" + if (it.inviter_nick_name.isNotEmpty()) { + mDataBinding.inviterNickName.text = it.inviter_nick_name + } else { + mDataBinding.inviterNickName.text = "无" + } + + } + + + // 支付宝原生 + viewModel.alipay.observe(this) { + val payRunnable = Runnable { + val alipay = PayTask(this) + val result: Map = alipay.payV2(it, true) + val msg = Message() + msg.what = SDK_PAY_FLAG + msg.obj = result + mHandler.sendMessage(msg) + } + // 必须异步调用 + val payThread = Thread(payRunnable) + payThread.start() + } + + + viewModel.weixin.observe(this) { + val mWxApi = WXAPIFactory.createWXAPI( + this, null + ) + + // 将该app注册到微信 + mWxApi.registerApp("wx7b5c4e89e726a72c") + // 判断是否安装客户端 + if (!mWxApi.isWXAppInstalled) { + "请您先安装微信客户端!".showToast() + return@observe + } + val req = PayReq() + // 微信开放平台审核通过的应用APPID + req.appId = "wx7b5c4e89e726a72c" + // 微信支付分配的商户号 + req.partnerId = it.partnerid + // 预支付订单号,app服务器调用“统一下单”接口获取 + req.prepayId = it.prepayid + // 随机字符串,不长于32位 + req.nonceStr = it.noncestr + // 时间戳 + req.timeStamp = java.lang.String.valueOf(it.timestamp) + // 固定值Sign=WXPay,可以直接写死,服务器返回的也是这个固定值 + req.packageValue = it.packageX + // 签名, + req.sign = it.sign + // 调用微信SDK,发起支付,回调WxPayEntryActivity + mWxApi.sendReq(req) + } + + } + + override fun getLayoutId(): Int { + return R.layout.activity_change_inviter + } + + override fun initView() { + } + + override fun initData() { + + viewModel.get_update_invite_info() + + mDataBinding.tvPhoto.text = UserManager.user.user_name + } + + override fun onDestroy() { + super.onDestroy() + if (timer != null) timer!!.cancel() + } + + override fun initEvent() { + + mDataBinding.sendCode.setOnClickListener { + + val graphicCodeDialog = GraphicCodeDialog(this) + viewModel.create_captcha() + viewModel.captchaBean.observe(this) { + GlideUtil.loadImglogo( + this, + it.image, + graphicCodeDialog.getBinding().graphicCode + ) + } + graphicCodeDialog.getBinding().graphicCode.setOnClickListener { + viewModel.create_captcha() + } + + graphicCodeDialog.getBinding().btnConfirm.setOnClickListener { + + viewModel.phone.value = mDataBinding.tvPhoto.text.toString() + + viewModel.verification( + graphicCodeDialog.getBinding().etCode.text.toString(), + viewModel.captchaBean.value!!.key + ) + graphicCodeDialog.dismiss() + } + graphicCodeDialog.show() + + } + + + mDataBinding.btnConfirm.setOnClickListener { + + val setTipsDialog = SetTipsDialog(this); + setTipsDialog.getBinding().tvTitle.text = "更换邀请人" + setTipsDialog.getBinding().tvContent.text = "更换邀请人需要支付${ + viewModel.inviteInfoBean.value!!.update_inviter_price + }金币的费用\n" + "您确定要更换吗?" + setTipsDialog.getBinding().btnConfirm.setOnClickListener { + viewModel.update_user_inviter( + mDataBinding.inviterUid.text.toString(), + mDataBinding.tvSmsCode.text.toString(), + "" + ) +// val strs: Array = arrayOf("微信", "支付宝") +// ActionSheet.createBuilder(this, supportFragmentManager).setCancelButtonTitle("取消") +// .setOtherButtonTitles(*strs).setCancelableOnTouchOutside(true) +// .setListener(object : ActionSheet.ActionSheetListener { +// override fun onDismiss(actionSheet: ActionSheet, isCancel: Boolean) {} +// override fun onOtherButtonClick(actionSheet: ActionSheet, index: Int) { +// when (strs[index]) { +// "微信" -> { +// +// } +// "支付宝" -> { +// viewModel.update_user_inviter( +// mDataBinding.inviterUid.text.toString(), +// mDataBinding.tvSmsCode.text.toString(), +// "2" +// ) +// } +// +// } +// } +// }).show() + setTipsDialog.dismiss() + } + setTipsDialog.show() + } + } + + + private fun showCode() { + timer = object : CountDownTimer(60 * 1000, 1000) { + override fun onTick(millisUntilFinished: Long) { + try { + val i = (millisUntilFinished / 1000).toInt() + send_code.text = i.toString() + "s" + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun onFinish() { + send_code.text = "重新发送" + viewModel.sendCodeClick.postValue(true) + } + }.start() + } + + + private val SDK_PAY_FLAG = 1 + + @SuppressLint("HandlerLeak") + private val mHandler: Handler = object : Handler() { + override fun handleMessage(msg: Message) { + val payResult2 = PayResult(msg.obj as Map) + when (msg.what) { + SDK_PAY_FLAG -> { + val payResult = PayResult(msg.obj as Map) + + /** + * 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。 + */ + val resultInfo: String = payResult.getResult() // 同步返回需要验证的信息 + val resultStatus: String = payResult.getResultStatus() + // 判断resultStatus 为9000则代表支付成功 + if (TextUtils.equals(resultStatus, "9000")) { + // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。 + "支付成功".showToast() + } else { + // 失败。 + "支付失败,请重试".showToast() + } + } + else -> { + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/vip/ChangePayDialog.kt b/app/src/main/java/com/yuyin/mier/module_my/vip/ChangePayDialog.kt new file mode 100644 index 0000000..e7f9a32 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/vip/ChangePayDialog.kt @@ -0,0 +1,44 @@ +package com.yuyin.mier.module_my.vip + +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.DialogChangePayBinding + +class ChangePayDialog (context: Context) : Dialog(context) { + + lateinit var binding: DialogChangePayBinding + + init { + initDialog() + } + + private fun initDialog() { + val inflater = LayoutInflater.from(context) + binding = DataBindingUtil.inflate(inflater, R.layout.dialog_change_pay, null, false) + setContentView(binding.root) + val params = window?.attributes as WindowManager.LayoutParams + params.gravity = Gravity.CENTER + params.width = WindowManager.LayoutParams.MATCH_PARENT + params.height = WindowManager.LayoutParams.WRAP_CONTENT + window?.attributes = params + window?.setBackgroundDrawableResource(android.R.color.transparent) + binding.btnConfirm.setOnClickListener { dismiss() } + + + } + + + + @JvmName("getBinding1") + fun getBinding(): DialogChangePayBinding { + + return binding; + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/vip/VipActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/vip/VipActivity.kt new file mode 100644 index 0000000..9f78db7 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/vip/VipActivity.kt @@ -0,0 +1,164 @@ +package com.yuyin.mier.module_my.vip + +import android.content.Intent +import android.widget.TextView +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.util.TimeUtil +import com.yuyin.mier.R +import com.yuyin.mier.adapter.VipPriceAdapter +import com.yuyin.mier.databinding.ActivityVipBinding +import com.yuyin.mier.module_home.tab.center.MainCenterViewModel +import kotlinx.android.synthetic.main.activity_vip.rcy_vip + +class VipActivity : BaseDataBindingActivity() { + + private var vid = 0 + lateinit var vipPriceAdapter: VipPriceAdapter + + override fun startObserve() { + + viewModel.vipData.observe(this) { + + vipPriceAdapter.setNewData(it.vip_list) +// if (it.vip_list.isNotEmpty()) { +// mDataBinding.tvSelect1.text = it.vip_list[0].name +// mDataBinding.tvSelect11.text = it.vip_list[0].price+"金币" +// } +// +// if (it.vip_list.size > 1) { +// mDataBinding.tvSelect2.text = it.vip_list[1].name +// mDataBinding.tvSelect22.text = it.vip_list[1].price+"金币" +// } +// +// if (it.vip_list.size > 2) { +// mDataBinding.tvSelect3.text = it.vip_list[2].name +// mDataBinding.tvSelect33.text = it.vip_list[2].price+"金币" +// } + + if (it.is_vip == 1) { + mDataBinding.openVip.text = "续费会员" + } else { + mDataBinding.openVip.text = "立即开通" + } + + mDataBinding.tvEndTime.text = + "会员到期时间:" + TimeUtil.toDateYmdHan3(it.vip_end_time.toLong()) + } + } + + override fun getLayoutId(): Int { + + return R.layout.activity_vip + } + + override fun initView() { + } + + override fun initData() { + + viewModel.get_vip_list() + vipPriceAdapter=VipPriceAdapter() + rcy_vip.adapter=vipPriceAdapter + vipPriceAdapter.setOnItemClickListener { adapter, view, position -> + viewModel.vipData.value.let { + vid = it!!.vip_list[position].vid + } + for(i in vipPriceAdapter.data.indices){ + vipPriceAdapter.data[i].isSelect=false + } + vipPriceAdapter.data[position].isSelect=true + vipPriceAdapter.notifyDataSetChanged() + } + } + + override fun initEvent() { + + mDataBinding.openVip.setOnClickListener { + if (vid == 0) { + return@setOnClickListener + } + + viewModel.pay_vip_order(vid.toString(), "") + +// +// ActionSheet.createBuilder(this, supportFragmentManager) +// .setCancelButtonTitle("取消") +// .setOtherButtonTitles("支付宝", "微信") +// .setCancelableOnTouchOutside(true) +// .setListener(object : ActionSheet.ActionSheetListener { +// override fun onDismiss(actionSheet: ActionSheet, isCancel: Boolean) {} +// override fun onOtherButtonClick(actionSheet: ActionSheet, index: Int) { +// if (index == 0) { +// viewModel.pay_vip_order(vid.toString(), "1") +// } else { +// } +// } +// }).show() + + } + + mDataBinding.changeInviter.setOnClickListener { + + + startActivity(Intent(this, ChangeInviterActivity::class.java)) + } + +// +// mDataBinding.llSelect1.setOnClickListener { +// +// mDataBinding.llSelect1.isSelected = true +// mDataBinding.llSelect2.isSelected = false +// mDataBinding.llSelect3.isSelected = false +// setSelected(mDataBinding.tvSelect1, mDataBinding.tvSelect11) +// unSelected(mDataBinding.tvSelect2, mDataBinding.tvSelect22) +// unSelected(mDataBinding.tvSelect3, mDataBinding.tvSelect33) +// +// viewModel.vipData.value.let { +// vid = it!!.vip_list[0].vid +// } +// +// } +// +// mDataBinding.llSelect2.setOnClickListener { +// +// mDataBinding.llSelect1.isSelected = false +// mDataBinding.llSelect2.isSelected = true +// mDataBinding.llSelect3.isSelected = false +// +// unSelected(mDataBinding.tvSelect1, mDataBinding.tvSelect11) +// setSelected(mDataBinding.tvSelect2, mDataBinding.tvSelect22) +// unSelected(mDataBinding.tvSelect3, mDataBinding.tvSelect33) +// +// +// +// } +// +// mDataBinding.llSelect3.setOnClickListener { +// +// mDataBinding.llSelect1.isSelected = false +// mDataBinding.llSelect2.isSelected = false +// mDataBinding.llSelect3.isSelected = true +// unSelected(mDataBinding.tvSelect1, mDataBinding.tvSelect11) +// setSelected(mDataBinding.tvSelect2, mDataBinding.tvSelect22) +// unSelected(mDataBinding.tvSelect3, mDataBinding.tvSelect33) +// +// viewModel.vipData.value.let { +// vid = it!!.vip_list[2].vid +// } +// +// } + + } + + + private fun setSelected(textView: TextView, textView2: TextView) { +// textView.setTextColor(Color.parseColor("#512A12")) +// textView2.setTextColor(Color.parseColor("#785139")) + } + + private fun unSelected(textView: TextView, textView2: TextView) { +// textView.setTextColor(Color.parseColor("#66FFFFFF")) +// textView2.setTextColor(Color.parseColor("#66ffffff")) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/zhuangban/BuyAdornmentDialog.kt b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/BuyAdornmentDialog.kt new file mode 100644 index 0000000..4d1585c --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/BuyAdornmentDialog.kt @@ -0,0 +1,164 @@ +package com.yuyin.mier.module_my.zhuangban + +import android.app.Dialog +import android.graphics.Color +import android.view.Gravity.BOTTOM +import android.view.ViewGroup +import android.widget.LinearLayout +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.GridLayoutManager +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.ImageLoaderUtils + +import com.yuyin.mier.R +import com.yuyin.mier.databinding.DialogBuyAdornmeBinding +import com.yuyin.mier.module_my.model.AdornmentInfo +import com.yuyin.mier.module_my.model.BuyAdornmentBean + +class BuyAdornmentDialog( + val context: ZhuangBanShangChengFragment, + val adornmentInfo: AdornmentInfo, + val money:String +) : + Dialog(context.requireContext(), R.style.myChooseDialog) { + + private lateinit var buyAdornmentAdapter: BuyAdornmentAdapter + private lateinit var binding: DialogBuyAdornmeBinding + + private var did = 0 + private var day = "" + + init { + + initDialog() + + } + + + private fun initDialog() { + + binding = DataBindingUtil.inflate(layoutInflater, R.layout.dialog_buy_adornme, null, false) + setContentView(binding.root) + val win = this.window + val params = win?.attributes + params?.height = ViewGroup.LayoutParams.WRAP_CONTENT + params?.width = ViewGroup.LayoutParams.MATCH_PARENT + params?.gravity = BOTTOM + win?.attributes = params + win?.setBackgroundDrawableResource(R.color.translant) + + initView() + initEvent() + } + + private fun initView() { + /*if (adornmentInfo.play_image.isNotEmpty()) { + try { + if (adornmentInfo.play_image.contains(".svga")) { + val parser = SVGAParser(context.requireContext()) + parser.decodeFromURL( + URL(adornmentInfo.play_image), + object : SVGAParser.ParseCompletion { + override fun onComplete(svgaVideoEntity: SVGAVideoEntity) { + val drawable = SVGADrawable(svgaVideoEntity) + binding.svgaImage.setImageDrawable(drawable) + binding.svgaImage.startAnimation() + } + + override fun onError() {} + }) + } else if (adornmentInfo.play_image.contains(".mp4")) { + OkHttpUtils.get().url(adornmentInfo.play_image).build() + .execute(object : FileCallBack( + context.requireContext().cacheDir.absolutePath, + adornmentInfo.play_image.substring(adornmentInfo.play_image.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 { + binding.animView.startPlay(response) + } + } + }) + } + + } catch (e: Exception) { + e.printStackTrace() + } + + } else {*/ + GlideUtil.loadImglogo( + context.requireContext(), + ImageLoaderUtils.isHttp(adornmentInfo.base_image), + binding.ivImg + ) +// } + + binding.tvTitle.text = adornmentInfo.title + binding.rvContainer.layoutManager = GridLayoutManager(context.requireContext(), 3) + buyAdornmentAdapter = BuyAdornmentAdapter() + binding.rvContainer.adapter = buyAdornmentAdapter + buyAdornmentAdapter.setNewData(adornmentInfo.decorate_price) + binding.tvDay.text = "金币/${buyAdornmentAdapter.data[0].day}天" + binding.tvPrice.text = buyAdornmentAdapter.data[0].price + day = buyAdornmentAdapter.data[0].day + + binding.tvMoney.text = money + } + + private fun initEvent() { + + buyAdornmentAdapter.setOnItemClickListener { adapter, view, position -> + buyAdornmentAdapter.selectPosition(position) + binding.tvDay.text = "金币/${buyAdornmentAdapter.data[position].day}天" + binding.tvPrice.text = buyAdornmentAdapter.data[position].price + day = buyAdornmentAdapter.data[position].day + + } + binding.ivBack.setOnClickListener { + dismiss() + } + +// binding.toolbar.setOnclick { +// dismiss() +// } + + binding.btnBuy.setOnClickListener { + + context.viewModel.BuyMallDecorate(adornmentInfo.did.toString(), day) + + } + } + + + class BuyAdornmentAdapter : + BaseQuickAdapter(R.layout.item_buy_adornment) { + var selectPosition = 0 + override fun convert(helper: BaseViewHolder, item: BuyAdornmentBean) { + helper.setText(R.id.tv_price, item.price.toDouble().toInt().toString()) + .setText(R.id.tv_day, item.day + "天") + val select = helper.layoutPosition == selectPosition + helper.getView(R.id.buy_select_frame).isSelected = select + + if (select) { + helper.setTextColor(R.id.tv_price, Color.parseColor("#333333")) + helper.setTextColor(R.id.tv_day, Color.parseColor("#333333")) + } else { + helper.setTextColor(R.id.tv_price, Color.parseColor("#333333")) + helper.setTextColor(R.id.tv_day, Color.parseColor("#333333")) + } + } + + fun selectPosition(position: Int) { + notifyItemChanged(selectPosition) + notifyItemChanged(position) + selectPosition = position + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/zhuangban/FriendListActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/FriendListActivity.kt new file mode 100644 index 0000000..6f4f0ee --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/FriendListActivity.kt @@ -0,0 +1,61 @@ +package com.yuyin.mier.module_my.zhuangban + +import com.scwang.smartrefresh.layout.api.RefreshLayout +import com.scwang.smartrefresh.layout.listener.OnRefreshLoadMoreListener +import com.yuyin.mier.R +import com.yuyin.mier.databinding.FriendListBinding +import com.yuyin.mier.module_my.YaoQingViewModel +import com.yuyin.mier.module_my.adapter.FriendAdapter +import com.yuyin.lib_base.base.BaseDataBindingActivity + +class FriendListActivity : BaseDataBindingActivity() { + var page = 1 + override fun startObserve() { + viewModel.friendBean.observe(this) { + if (page == 1) { + adapter.setNewData(it.list) + } else { + adapter.addData(it.list) + } + + mDataBinding.tvAllJiazhi.setText("总收益:${it.user_total_earnings}钻石") + } + viewModel.getFinally().observe(this) { + mDataBinding.smart.finishRefresh() + mDataBinding.smart.finishLoadMore() + } + + } + + override fun getLayoutId(): Int { + return R.layout.friend_list + } + + override fun initView() { + } + + var adapter = FriendAdapter() + override fun initData() { + mDataBinding.rv.adapter = adapter + viewModel.get_my_reg_friend_list(page) + + + } + + override fun initEvent() { + + mDataBinding.smart.setOnRefreshLoadMoreListener(object : OnRefreshLoadMoreListener { + override fun onRefresh(refreshLayout: RefreshLayout) { + page = 1 + viewModel.get_my_reg_friend_list(page) + } + + override fun onLoadMore(refreshLayout: RefreshLayout) { + page++ + viewModel.get_my_reg_friend_list(page) + } + }) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/zhuangban/MyZhuangBanActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/MyZhuangBanActivity.kt new file mode 100644 index 0000000..f28c9c7 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/MyZhuangBanActivity.kt @@ -0,0 +1,150 @@ +package com.yuyin.mier.module_my.zhuangban + + +import android.graphics.Color +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.annotation.Route +import com.bumptech.glide.Glide +import com.flyco.tablayout.listener.CustomTabEntity +import com.google.android.material.tabs.TabLayout +import com.yuyin.mier.R +import com.yuyin.lib_base.adapter.MyPagerAdapter +import com.yuyin.lib_base.arouter.AroutUtil.MY_COMM_ZHUANGBAN +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.Login +import kotlinx.android.synthetic.main.activity_my_zhuangban.* +import java.util.* + +@Route(path = MY_COMM_ZHUANGBAN) +class MyZhuangBanActivity : BaseActivity() { + private val titleList: ArrayList = ArrayList() + private val mFragments: ArrayList = ArrayList() + private var mAdapter: MyPagerAdapter? = null + private val dataTab: MutableList = + ArrayList() //CommonTabLayout 所需数据集合 + + override fun startObserve() { + } + + override fun getLayoutId(): Int = R.layout.activity_my_zhuangban + + override fun initView() { + + } + + override fun initData() { + + titleList.add("头像框") + titleList.add("座驾") + titleList.add("资料展示") + titleList.add("气泡框") + titleList.add("个人靓号") + titleList.add("房间靓号") +// titleList.add("光圈") + + mFragments.add(ZhuangBanFragment.getInstance(1)) + mFragments.add(ZhuangBanFragment.getInstance(2)) + mFragments.add(ZhuangBanFragment.getInstance(3)) + mFragments.add(ZhuangBanFragment.getInstance(5)) + mFragments.add(ZhuangBanFragment.getInstance(6)) + mFragments.add(ZhuangBanFragment.getInstance(7)) +// mFragments.add(ZhuangBanFragment.getInstance(4)) + for (i in titleList.indices) { + dataTab.add(object : CustomTabEntity { + override fun getTabTitle(): String { + return titleList[i] + } + + override fun getTabSelectedIcon(): Int { + return 0 + } + + override fun getTabUnselectedIcon(): Int { + return 0 + } + }) + } + mAdapter = MyPagerAdapter(supportFragmentManager, mFragments, titleList) + view_pager.adapter = mAdapter + view_pager.offscreenPageLimit = mFragments.size + tab_layout.setupWithViewPager(view_pager) + setCustomViews() + tab_layout.addOnTabSelectedListener(object : + TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val text = tab?.customView?.findViewById(R.id.tv_zbtab) + val v_view = tab?.customView?.findViewById(R.id.v_view) + text?.setTextColor(Color.parseColor("#333333")) +// text?.setTextSize(TypedValue.COMPLEX_UNIT_SP, 17f) +// text?.typeface = Typeface.DEFAULT_BOLD + v_view?.isSelected = true + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + val text = tab?.customView?.findViewById(R.id.tv_zbtab) + val v_view = tab?.customView?.findViewById(R.id.v_view) +// text?.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15f) +// text?.typeface = Typeface.DEFAULT + text?.setTextColor(Color.parseColor("#FFFFFF")) + v_view?.isSelected = false + } + + override fun onTabReselected(tab: TabLayout.Tab?) { +// val text = tab?.customView?.findViewById(R.id.tv_zbtab) +// val v_view = tab?.customView?.findViewById(R.id.v_view) +// v_view?.isSelected = false +// text?.setTextColor(Color.parseColor("#60111111")) + } + + }) + try { + val userBean: Login = UserManager.user + if (userBean != null) { + tv_name.text = userBean.nick_name + tv_id.text = "" + userBean.uid + Glide.with(this).load(userBean.head_pic).into(iv_user) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun initEvent() { + + } + + private fun setCustomViews() { + val mSelectedTabPosition = tab_layout.selectedTabPosition + for (i in titleList.indices) { + tab_layout.getTabAt(i)!!.customView = getTabView(i, mSelectedTabPosition) + } + } + + + private fun getTabView(index: Int, mSelectedTabPosition: Int): View { + //自定义View布局 + val view: View = LayoutInflater.from(this).inflate(R.layout.item_tablayout_headerzb, null) + val title = view.findViewById(R.id.tv_zbtab) + val v_view = view.findViewById(R.id.v_view) + title.text = titleList[index] + title.isSelected = index == mSelectedTabPosition + v_view.isSelected = index == mSelectedTabPosition + if (index == mSelectedTabPosition) { + title.setTextColor(Color.parseColor("#333333")) +// title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 17f) +// title.typeface = Typeface.DEFAULT_BOLD + } else { + title.setTextColor(Color.parseColor("#FFFFFF")) +// title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15f) +// title.typeface = Typeface.DEFAULT + } + + return view + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/zhuangban/MyZhuangBanShangChengActivity.kt b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/MyZhuangBanShangChengActivity.kt new file mode 100644 index 0000000..7863beb --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/MyZhuangBanShangChengActivity.kt @@ -0,0 +1,167 @@ +package com.yuyin.mier.module_my.zhuangban + +import android.graphics.Color +import android.view.LayoutInflater +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.blankj.utilcode.util.ClipboardUtils +import com.bumptech.glide.Glide +import com.google.android.material.tabs.TabLayout +import com.yuyin.lib_base.adapter.MyPagerAdapter +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.arouter.AroutUtil.MY_COMM_ZHUANGBAN_SHANGCHENG +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.Login +import com.yuyin.lib_base.util.GlideUtil +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.activity_my_zhuangbanshangcheng.* +import java.util.* + +@Route(path = MY_COMM_ZHUANGBAN_SHANGCHENG) +class MyZhuangBanShangChengActivity : BaseActivity() { + private val titleList: ArrayList = ArrayList() + private val mFragments: ArrayList = ArrayList() + private var mAdapter: MyPagerAdapter? = null + var colors = intArrayOf( + R.color.black, + R.color.green, + ) + + + override fun startObserve() { + + viewModel.userInfoData.observe(this) { + + GlideUtil.loadImglogo(this, it.contribution_level_image, iv_dengji) + + GlideUtil.loadImglogo(this, it.charm_level_image, iv_meili) + + } + } + + override fun getLayoutId(): Int = R.layout.activity_my_zhuangbanshangcheng + + override fun initView() { + } + + override fun initData() { + + titleList.add("头像框") + titleList.add("座驾") + titleList.add("资料展示") + titleList.add("气泡框") + titleList.add("个人靓号") + titleList.add("房间靓号") +// titleList.add("光圈") + + +// rv_tab_title.layoutManager = LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false) +// val recyclerTabAdapter = RecyclerTabAdapter(R.layout.item_tablayout_header4,titleList) +// rv_tab_title.adapter =recyclerTabAdapter +// recyclerTabAdapter.setOnItemClickListener(object :BaseQuickAdapter.OnItemClickListener{ +// override fun onItemClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) { +// recyclerTabAdapter.setSelectPosition(position) +// view_pager.currentItem = position +// } +// }) +// + mFragments.add(ZhuangBanShangChengFragment.getInstance(1)) + mFragments.add(ZhuangBanShangChengFragment.getInstance(2)) + mFragments.add(ZhuangBanShangChengFragment.getInstance(3)) + mFragments.add(ZhuangBanShangChengFragment.getInstance(5)) + mFragments.add(ZhuangBanShangChengFragment.getInstance(6)) + mFragments.add(ZhuangBanShangChengFragment.getInstance(7)) + mAdapter = MyPagerAdapter(supportFragmentManager, mFragments, titleList) + view_pager.adapter = mAdapter + view_pager.offscreenPageLimit = mFragments.size + tab_layout.setupWithViewPager(view_pager) + setCustomViews() + tab_layout.addOnTabSelectedListener(object : + TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + val text = tab?.customView?.findViewById(R.id.tv_zbtab) + val v_view = tab?.customView?.findViewById(R.id.v_view) + text?.setTextColor(Color.parseColor("#333333")) +// text?.setTextSize(TypedValue.COMPLEX_UNIT_SP, 17f) +// text?.typeface = Typeface.DEFAULT_BOLD + text?.isSelected = true + } + + override fun onTabUnselected(tab: TabLayout.Tab?) { + val text = tab?.customView?.findViewById(R.id.tv_zbtab) + val v_view = tab?.customView?.findViewById(R.id.v_view) +// text?.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15f) +// text?.typeface = Typeface.DEFAULT + text?.setTextColor(Color.parseColor("#FFFFFF")) + text?.isSelected = false + } + + override fun onTabReselected(tab: TabLayout.Tab?) { +// val text = tab?.customView?.findViewById(R.id.tv_zbtab) +// val v_view = tab?.customView?.findViewById(R.id.v_view) +// v_view?.isSelected = false +// text?.setTextColor(Color.parseColor("#60111111")) + } + }) + + viewModel.loadUserInfo() + try { + val userBean: Login = UserManager.user + if (userBean != null) { + tv_name.text = userBean.nick_name + tv_id.text = "" + userBean.uid + Glide.with(this).load(userBean.head_pic).error(R.mipmap.ic_launcher_app) + .into(iv_user) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun initEvent() { + + tv_id.setOnClickListener { + ClipboardUtils.copyText(viewModel.userInfoData.value!!.uid.toString()) + "复制成功".showToast() + } + to_myzb.setOnClickListener { + ARouter.getInstance().build(AroutUtil.MY_COMM_ZHUANGBAN).navigation() + } + } + + private fun setCustomViews() { + val mSelectedTabPosition = tab_layout.selectedTabPosition + for (i in titleList.indices) { + tab_layout.getTabAt(i)!!.customView = getTabView(i, mSelectedTabPosition) + } + } + + + private fun getTabView(index: Int, mSelectedTabPosition: Int): View { + //自定义View布局 + val view: View = LayoutInflater.from(this).inflate(R.layout.item_tablayout_headerzb, null) + val title = view.findViewById(R.id.tv_zbtab) + val v_view = view.findViewById(R.id.v_view) + title.text = titleList[index] + title.isSelected = index == mSelectedTabPosition + v_view.isSelected = index == mSelectedTabPosition + if (index == mSelectedTabPosition) { + title.setTextColor(Color.parseColor("#333333")) +// title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 17f) +// title.typeface = Typeface.DEFAULT_BOLD + } else { + title.setTextColor(Color.parseColor("#FFFFFF")) +// title.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15f) +// title.typeface = Typeface.DEFAULT + } + + return view + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBan1Adapter.kt b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBan1Adapter.kt new file mode 100644 index 0000000..9601b24 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBan1Adapter.kt @@ -0,0 +1,60 @@ +package com.yuyin.mier.module_my.zhuangban + +import android.view.View +import android.widget.ImageView +import android.widget.TextView +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_my.model.ZhungBanBean +import com.yuyin.lib_base.util.TimeUtil +import java.util.* + +class ZhuangBan1Adapter : + BaseQuickAdapter(R.layout.item_zhuangban_list, ArrayList()) { + override fun convert(helper: BaseViewHolder, item: ZhungBanBean) { + helper.addOnClickListener(R.id.tv_use) + Glide.with(mContext).load(item.base_image).into(helper.getView(R.id.iv_img)) + val textView = helper.getView(R.id.tv_use) + + if (item.is_using == 2) { + textView.text = "使用" + textView.setBackgroundResource(R.drawable.shape_use_cancel) + helper.setTextColor(R.id.tv_use, mContext.resources.getColor(R.color.color333333)) + +// helper.getView(R.id.tv_use).setImageResource(R.mipmap.zhuangban_use_no) + helper.getView(R.id.zb_bg).setBackgroundResource(R.mipmap.zhuangban_bg11) +// helper.setTextColor(R.id.tv_time, mContext.resources.getColor(R.color.color666666)) +// helper.setTextColor( +// R.id.tv_name_period, +// mContext.resources.getColor(R.color.color333333) +// ) + } else { + textView.text = "取消" + textView.setBackgroundResource(R.drawable.shape_use_confirm) + helper.setTextColor(R.id.tv_use, mContext.resources.getColor(R.color.white)) + +// helper.getView(R.id.tv_use).setImageResource(R.mipmap.zhuangban_use) + helper.getView(R.id.zb_bg).setBackgroundResource(R.mipmap.zhuangban_bg22) +// helper.setTextColor(R.id.tv_time, mContext.resources.getColor(R.color.white)) +// helper.setTextColor(R.id.tv_name_period, mContext.resources.getColor(R.color.white)) + + } + +/* + if (item.is_using == 1) { + + } else { + + }*/ + helper.setText( + R.id.tv_time, + TimeUtil.toDateYmdHanNew(item.end_time.toLong() * 1000, "yyyy-MM-dd").replace(" ", "\n") + .toString() + "到期" +// item.end_time + "到期" + ).setText( + R.id.tv_name_period, item.title + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanFragment.kt b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanFragment.kt new file mode 100644 index 0000000..d9edc5b --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanFragment.kt @@ -0,0 +1,109 @@ +package com.yuyin.mier.module_my.zhuangban + +import android.os.Bundle +import android.text.TextUtils +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import com.opensource.svgaplayer.SVGAImageView +import com.opensource.svgaplayer.SVGAParser +import com.opensource.svgaplayer.SVGAVideoEntity +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ZhuangbanRecyclerviewNorefBinding +import com.yuyin.mier.module_my.model.ZhungBanBean +import com.yuyin.lib_base.base.BaseDataBindingFragment +import java.net.URL + +class ZhuangBanFragment : + BaseDataBindingFragment() { + private lateinit var adapter: ZhuangBan1Adapter + + + override fun startObserve() { + viewModel.zhungBanBean.observe(this) { + if (it == null || it.list.isEmpty()) { + mDataBinding.llNodata.visibility = View.VISIBLE + } else { + val image_bg = activity?.findViewById(R.id.image_headPortrait) + var is_svga = -1; + val parser = SVGAParser(requireContext()) + it.list.forEach { zb -> + if (zb.type == "1") { + is_svga = 0 + if (zb.is_using == 1 && image_bg != null) { + if (!TextUtils.isEmpty(zb.play_image)) { + is_svga += 1 + try { + parser.decodeFromURL( + URL(zb.play_image), + object : SVGAParser.ParseCompletion { + override fun onComplete(svgaVideoEntity: SVGAVideoEntity) { + image_bg.setVideoItem(svgaVideoEntity) +// image_bg.loops = 1 + image_bg.stepToFrame(1, true) + } + + override fun onError() {} + }) + } catch (e: Exception) { + e.printStackTrace() + } + } else { + loadImage(image_bg, zb.base_image, 0) + } + + } + } + } + if (is_svga == 0) { + if (image_bg?.isAnimating == true) { + image_bg?.stopAnimation() + } + } + } + adapter.setNewData(it.list) + } + viewModel.setDecorateDate.observe(this) { + arguments?.getString("type")?.let { + viewModel.getUserDecorateList(it) + } + } + } + + override fun getLayoutId(): Int = R.layout.zhuangban_recyclerview_noref + + override fun initView() { + } + + override fun initData() { + adapter = ZhuangBan1Adapter() + val gridLayoutManager = GridLayoutManager(this.context, 4) + mDataBinding.recyclerView.layoutManager = gridLayoutManager + mDataBinding.recyclerView.adapter = adapter + adapter.setOnItemChildClickListener { adapter, view, position -> + val dataBean: ZhungBanBean = adapter.data[position] as ZhungBanBean + if (dataBean.is_using == 1) { + viewModel.cancel_user_decorate(dataBean.udid) + } else { + viewModel.set_user_decorate(dataBean.udid) + } + } + arguments?.getString("type")?.let { + viewModel.getUserDecorateList(it) + } + mDataBinding.ll.visibility = View.GONE + } + + override fun initEvent() { + } + + companion object { + fun getInstance(tag: Int): ZhuangBanFragment { + val fragment = ZhuangBanFragment() + val bundle = Bundle() + bundle.putString("type", tag.toString() + "") + fragment.arguments = bundle + return fragment + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanShangChengAdapter.kt b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanShangChengAdapter.kt new file mode 100644 index 0000000..46689e3 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanShangChengAdapter.kt @@ -0,0 +1,58 @@ +package com.yuyin.mier.module_my.zhuangban + +import android.view.View +import android.widget.TextView +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_my.model.ZhungBanShangChengBean +import java.util.* + +class ZhuangBanShangChengAdapter : + BaseQuickAdapter( + R.layout.item_zhuangbanschangcheng_list, + ArrayList() + ) { + override fun convert(helper: BaseViewHolder, item: ZhungBanShangChengBean) { + helper.addOnClickListener(R.id.zb_bg_ll) + Glide.with(mContext).load(item.base_image).into(helper.getView(R.id.iv_img)) + + helper.setText(R.id.integral, item.integral) + .setText(R.id.tv_name_period, "${item.title}") +// .setText(R.id.tv_time, "(有效期${item.period}天)") + if (item.is_select) { + helper.getView(R.id.zb_bg).setBackgroundResource(R.mipmap.zhuangban_bg22) + helper.getView(R.id.tv_name_period).isSelected = true + helper.getView(R.id.integral).isSelected = true + + } else { + helper.getView(R.id.zb_bg).setBackgroundResource(R.mipmap.zhuangban_bg11) + helper.getView(R.id.tv_name_period).isSelected = false + helper.getView(R.id.integral).isSelected = false +// val textView = helper.getView(R.id.tv_use) + /* if (item.is_using == 1) { + helper.getView(R.id.zb_bg).setBackgroundResource(R.drawable.shape_zhuangban1_1) + helper.setText(R.id.tv_use, "取消装扮") + helper.getView(R.id.tv_use).setBackgroundResource(R.drawable.shape_zhuangban2) + textView.setTextColor(Color.parseColor("#FF65B9")) + } else { + helper.setText(R.id.tv_use, "使用装扮") + helper.getView(R.id.zb_bg).setBackgroundResource(R.drawable.shape_zhuangban1) + helper.getView(R.id.tv_use).setBackgroundResource(R.drawable.shape_zhuangban3) + textView.setTextColor(Color.parseColor("#ffffff")) + } + helper.setText( + R.id.tv_time, + + TimeUtil.toDateYmdHan2(item.end_time.toLong()).replace(" ", "\n").toString() + "到期" + // item.end_time + "到期" + ).setText( + R.id.tv_name, item.title + )*/ + } + } + /* fun uncheck() { + + }*/ +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanShangChengFragment.kt b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanShangChengFragment.kt new file mode 100644 index 0000000..58c76c3 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanShangChengFragment.kt @@ -0,0 +1,123 @@ +package com.yuyin.mier.module_my.zhuangban + +import android.os.Bundle +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import com.opensource.svgaplayer.SVGAImageView +import com.yuyin.mier.R +import com.yuyin.mier.databinding.ZhuangbanRecyclerviewNorefBinding +import com.yuyin.mier.module_my.model.ZhungBanShangChengBean +import com.yuyin.lib_base.base.BaseDataBindingFragment + +class ZhuangBanShangChengFragment : + BaseDataBindingFragment() { + private lateinit var adapter: ZhuangBanShangChengAdapter + private var did: Int? = null + private var type = "1" + + override fun startObserve() { + viewModel.zhungBanMallBean.observe(this) { + if (it == null || it.size == 0) { + mDataBinding.llNodata.visibility = View.VISIBLE + } /*else { + val image_bg = activity?.findViewById(R.id.image_headPortrait) + var is_svga = 0; + val parser = SVGAParser(requireContext()) + + }*/ + adapter.setNewData(it) + } + viewModel.zhungBanBuyBean.observe(this) { + arguments?.getString("type")?.let { + viewModel.getMallDecorateList(it) + type = it + } + } + + viewModel.adornmentInfo.observe(this){ + + BuyAdornmentDialog(this,it,viewModel.money.value.toString()).show() + + } + } + + override fun getLayoutId(): Int = R.layout.zhuangban_recyclerview_noref + + override fun initView() { + } + + override fun initData() { + + val image_bg = activity?.findViewById(R.id.image_headPortrait) +// var is_svga = 0; +// val parser = SVGAParser(requireContext()) + + adapter = ZhuangBanShangChengAdapter() + val gridLayoutManager = GridLayoutManager(this.context, 4) + mDataBinding.recyclerView.layoutManager = gridLayoutManager + mDataBinding.recyclerView.adapter = adapter + var p_select = -1 + adapter.setOnItemChildClickListener { adapter, view, position -> + val list: List = adapter.data as List + if (p_select != -1 && p_select != position) { + list[p_select].is_select = false + list[position].is_select = true + p_select = position + did = list[position].did + mDataBinding.ll.visibility =View.VISIBLE + + if(type.equals("1")){ + loadImage(image_bg!!, list[position].base_image, 0) + } + + } else if (p_select != -1 && p_select == position) { + list[position].is_select = false + p_select = -1 +// mDataBinding.tvMoney.text = "0" + mDataBinding.ll.visibility =View.GONE + + image_bg?.setImageResource(0) + + } else { + list[position].is_select = true + did = list[position].did + p_select = position + mDataBinding.ll.visibility =View.VISIBLE + + if(type.equals("1")){ + loadImage(image_bg!!, list[position].base_image, 0) + } + } + adapter.setNewData(list) + adapter.notifyDataSetChanged() + + } + arguments?.getString("type")?.let { + viewModel.getMallDecorateList(it) + } + + viewModel.getMoneyData() + } + + override fun initEvent() { + mDataBinding.zhuangbanBuy.setOnClickListener { + //购买接口 + + if (did != null) { + viewModel.get_decorate_info(did.toString()) + } + + } + } + + companion object { + fun getInstance(tag: Int): ZhuangBanShangChengFragment { + val fragment = ZhuangBanShangChengFragment() + val bundle = Bundle() + bundle.putString("type", tag.toString() + "") + fragment.arguments = bundle + return fragment + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanShangChengViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanShangChengViewModel.kt new file mode 100644 index 0000000..41e0c65 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanShangChengViewModel.kt @@ -0,0 +1,73 @@ +package com.yuyin.mier.module_my.zhuangban + +import androidx.lifecycle.MutableLiveData +import com.yuyin.mier.module_my.model.ZhungBanShangChengBean +import com.yuyin.mier.repository.CommonRepository +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.module_my.model.AdornmentInfo + +class ZhuangBanShangChengViewModel : BaseViewModel() { + var repository = CommonRepository() + var zhungBanMallBean = MutableLiveData>() + + // var setDecorateDate = MutableLiveData() + var zhungBanBuyBean = MutableLiveData() + + fun getMallDecorateList(type: String) { + launchUI { + val result = repository.get_mall_decorate_list(type) + zhungBanMallBean.value = result.data + } + + } + + val adornmentInfo = MutableLiveData() + fun get_decorate_info(did: String) { + launchUI { + val result = repository.get_decorate_info(did) + adornmentInfo.value = result.data + } + } + + fun BuyMallDecorate(did: String,day: String) { + launchUI { + val result = repository.buy_mall_decorate(did,day) + result.msg.showToast() + +// zhungBanBuyBean.value = result.data + } + + } + + var money = MutableLiveData("0") + fun getMoneyData() { + launchUI { + val result = repository.get_user_withdrawal_info() + money.value = result.data.integral + } + } + + /* fun getUserDecorateList(type: String) { + launchUI { + val result = repository.get_user_decorate_list(type) + zhungBanBean.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_my/zhuangban/ZhuangBanViewModel.kt b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanViewModel.kt new file mode 100644 index 0000000..1739d45 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/module_my/zhuangban/ZhuangBanViewModel.kt @@ -0,0 +1,36 @@ +package com.yuyin.mier.module_my.zhuangban + +import androidx.lifecycle.MutableLiveData +import com.yuyin.mier.repository.CommonRepository +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.module_my.model.UseDecorateList + +class ZhuangBanViewModel : BaseViewModel() { + var repository = CommonRepository() + var zhungBanBean = MutableLiveData() + var setDecorateDate = MutableLiveData() + + fun getUserDecorateList(type: String) { + launchUI { + val result = repository.get_user_decorate_list(type) + zhungBanBean.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/network/CommonApiService.kt b/app/src/main/java/com/yuyin/mier/network/CommonApiService.kt new file mode 100644 index 0000000..d6b6c44 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/network/CommonApiService.kt @@ -0,0 +1,742 @@ +package com.yuyin.mier.network + +import com.yuyin.lib_base.http.ResponseData +import com.yuyin.lib_base.model.AliH5model +import com.yuyin.lib_base.model.Login +import com.yuyin.lib_base.model.Wxmodel +import com.yuyin.mier.module_home.model.* +import com.yuyin.mier.module_my.model.* +import com.yuyin.module_live.model.InvitationList +import retrofit2.http.* + +interface CommonApiService { + + /** + * 登录 + */ + @POST("login/user_login") + @FormUrlEncoded + suspend fun loginLogin( + @Field("user_login") phone: String, + @Field("password") code: String, + @Field("last_login_device") last_login_device: String + ): ResponseData + + /** + * 微信登录 + */ + @GET("login/wx_reg_log") + suspend fun wx_reg_log(@QueryMap map: MutableMap): ResponseData + + /** + * 首页推荐及在线 + */ + @GET("user_zone/get_room_zone_list") + suspend fun get_room_zone_list(@QueryMap map: MutableMap): ResponseData> + + /** + * 公会列表 + */ + @GET("guild/get_guild_list") + suspend fun get_guild_list(@QueryMap map: MutableMap): ResponseData + + + @POST("user/bind_phone") + @FormUrlEncoded + suspend fun bind_phone( + @Field("phone") phone: String, @Field("sms_code") sms_code: String + ): ResponseData + + /** + * 申请公会列表 + */ + @GET("guild/user_is_deacon") + suspend fun user_is_deacon( + @Query("guild_id") guild_id: String + ): ResponseData + + /** + * 申请公会列表 + */ + @GET("guild/join_guild") + suspend fun join_guild( + @Query("guild_id") guild_id: String + ): ResponseData + + /** + * 申请公会列表 + */ + @GET("guild/quit_guild") + suspend fun quit_guild( + @Query("guild_id") guild_id: String + ): ResponseData + + /** + * 获取公会详情 + */ + @GET("guild/get_the_guild_info") + suspend fun get_the_guild_info( + @Query("guild_id") guild_id: String + ): ResponseData + + /** + * 解散公会 + */ + @GET("guild/diss_guild") + suspend fun diss_guild( + @Query("guild_id") guild_id: String + ): ResponseData + + + /** + * 公会列表 + */ + @GET("guild/get_guild_money_log_list") + suspend fun get_guild_money_log_list1(@QueryMap map: MutableMap): ResponseData + + + /** + * 公会列表 + */ + @GET("guild/get_guild_money_log_list") + suspend fun get_guild_money_log_list2(@QueryMap map: MutableMap): ResponseData + + + /** + * 公会列表 + */ + @GET("guild/get_apply_guild_list") + suspend fun get_apply_guild_list(@QueryMap map: MutableMap): ResponseData + + /** + */ + @GET("guild/operate_guild") + suspend fun operate_guild( + @Query("id") id: String, @Query("type") type: String + ): ResponseData + + + /** + * 绑定邀请码 + */ + @GET("user/bind_reg_code") + suspend fun bind_reg_code( + @Query("reg_code") reg_code: String + ): ResponseData + + /** + * 绑定邀请码 + */ + @GET("user/get_user_child_list") + suspend fun get_my_reg_friend_list( + @Query("page") page: String, + @Query("page_limit") page_limit: String, + ): ResponseData + + /** + * 支付宝 + */ + @POST("pay/create_pay_order") //1支付宝2微信 + @FormUrlEncoded + suspend fun rechargePay( + @Field("uid") user_id: String, + @Field("crid") goods_id: String, + @Field("pay_type") type: String + ): ResponseData + + /** + * 支付宝 + */ + @POST("pay/create_pay_order") //1支付宝2微信 + @FormUrlEncoded + suspend fun rechargePayH5( + @Field("uid") user_id: String, + @Field("crid") goods_id: String, + @Field("pay_type") type: String, + ): ResponseData + + /** + * 微信 + */ + @POST("pay/create_pay_order") //1支付宝2微信 + @FormUrlEncoded + suspend fun rechargeWxPay( + @Field("uid") user_id: String, + @Field("crid") goods_id: String, + @Field("pay_type") type: String + ): ResponseData + + + @POST("pay/pay_nobility") + @FormUrlEncoded + suspend fun pay_nobilityALIH5( + @Field("lid") goods_id: String, + @Field("pay_type") type: String + ): ResponseData + + + @POST("pay/pay_nobility") + @FormUrlEncoded + suspend fun pay_nobilityALI( + @Field("lid") goods_id: String, + @Field("pay_type") type: String + ): ResponseData + + @POST("pay/pay_nobility") + @FormUrlEncoded + suspend fun pay_nobilityWX( + @Field("lid") goods_id: String, + @Field("pay_type") type: String + ): ResponseData + + /** + * 充值列表 + */ + @POST("pay/get_can_recharge_list") + @FormUrlEncoded + suspend fun goodsList( + @Field("uid") user_id: String + ): ResponseData> + + + /** + * 登录 + */ + @POST("login/phone_reg_log") + @FormUrlEncoded + suspend fun phone_reg_log( + @Field("phone_token") phone_token: String, + @Field("type") type: String, + @Field("last_login_device") last_login_device: String, + @Field("channel_code") channel_code: String + + ): ResponseData + + /** + * 银行卡绑定汇付 + */ + @POST("user/binding_bank_card") + @FormUrlEncoded + suspend fun binding_bank_card( + @Field("bank_card_number") bank_card_number: String, + @Field("bank_user_name") bank_user_name: String, + @Field("bank_cert_id") bank_cert_id: String, + @Field("bank_tel_no") bank_tel_no: String, + @Field("bank_card_name") bank_card_name: String, + ): ResponseData + + /** + * 银行卡绑定-云账户 + */ + @POST("user/binding_bank_card") + @FormUrlEncoded + suspend fun binding_bank_card_yzh( + @Field("bank_user_name") bank_user_name:String, + @Field("bank_card") bank_card: String, + @Field("open_bank") open_bank: String, + @Field("bank_card_number") bank_card_name: String, + ): ResponseData + + /** + * 获取用户可用装扮 + */ + @GET("decorate/user_decorate_list") + suspend fun get_user_decorate_list( + @Query("type") type: String, + @Query("page_limit") page_limit: String, + ): ResponseData + + /** + * 用户设置可用装扮 + */ + @GET("decorate/user_use_decorate") + suspend fun set_user_decorate(@Query("udid") udid: String): ResponseData + + /** + * 用户取消装扮 + */ + @GET("decorate/user_use_decorate") + suspend fun cancel_user_decorate(@Query("udid") udid: String): ResponseData + + + //装扮商城相关 + + //获取商城装扮数据 + @GET("Decorate/get_decorate_list") + suspend fun get_mall_decorate_list( + @Query("type") type: String, + @Query("page_limit") page_limit: String, + ): ResponseData> + + + @GET("Decorate/get_decorate_info") + suspend fun get_decorate_info(@Query("did") type: String): ResponseData + + //用户购买装扮 + @GET("Decorate/pay_decorate") + suspend fun buy_mall_decorate( + @Query("did") type: String, + @Query("day") day: String, + ): ResponseData + + /* + * 忘记密码 + * phone 手机号 + * code 验证码 + * pass 密码 + */ + @POST("api/modify_password") + @FormUrlEncoded + suspend fun ForGetPWD( + @Field("mobile") phone: String, + @Field("sms_code") code: String, + @Field("password") pass: String + ): ResponseData + + /** + * 注册 + */ + @POST("login/user_reg") + @FormUrlEncoded + suspend fun register( + @Field("user_login") phone: String?, + @Field("password") pass: String?, + @Field("sms_code") code: String?, + @Field("reg_code") reg_code: String?, +// @Field("sex") sex: String? + ): ResponseData + + + /** + * 注册 + */ + @POST("login/phone_verification_code_log") + @FormUrlEncoded + suspend fun phone_verification_code_log( + @Field("user_login") phone: String?, + @Field("sms_code") pass: String?, + @Field("channel_code") channel_code: String, + @Field("last_login_device") last_login_device: String + + ): ResponseData + + + /** + * + * 根据房间类型获取房间 + * @param categories 房间类型 + * @param page 分页参数 + */ + @POST("room/get_room_list") + @FormUrlEncoded + suspend fun get_room_list( + @FieldMap map: MutableMap + ): ResponseData> + + @POST("user/get_user_withdrawal_detail") + @FormUrlEncoded + suspend fun get_user_withdrawal_detail( + @FieldMap map: MutableMap + ): ResponseData + + @POST("user/get_one_withdrawal_detail") + @FormUrlEncoded + suspend fun get_one_withdrawal_detail( + @Field("wid") wid: String, + ): ResponseData + + /* + * 支付密码修改 + * phone 手机号 + * code 验证码 + * pass 密码 + */ + @POST("user/modify_trade_password") + @FormUrlEncoded + suspend fun modify_trade_password( + @Field("phone") phone: String, + @Field("sms_code") code: String, + @Field("trade_password") pass: String + ): ResponseData + + + /** + * 获取提现详情 + */ + @GET("user/get_user_withdrawal_info") + suspend fun get_user_withdrawal_info(): ResponseData + + + /** + * 查看签约状态 + * 0 未申请 1 已签约 2 已解约 + */ + @GET("yun/get_sign_status") + suspend fun get_sign_status(): ResponseData + + /** + * 获取签约协议 + */ + @GET("yun/get_sign_contract_url") + suspend fun get_sign_contract_url(): ResponseData + + /** + * 签约 + */ + @GET("yun/submit_sign") + suspend fun submit_sign(): ResponseData + + /** + * 获取黑名单信息 + */ + @GET("user_tencent/get_blacklist_list") + suspend fun get_blacklist(): ResponseData + + /** + * 兑换查询 + */ + @POST("user/exchange_check") + @FormUrlEncoded + suspend fun exchangeCheck(@Field("money") money: String): ResponseData + + + /** + * 兑换主题 + */ + @POST("user/exchange") + @FormUrlEncoded + suspend fun exchange( + @Field("money") money: String, @Field("trade_password") trade_password: String + ): ResponseData + + + /** + * 提现记录 + */ + @GET("user/get_user_withdrawal_list") + suspend fun tixian_log( + @Query("page") page: String + ): ResponseData> + + + /** + * 我的积分转赠记录 + */ + @GET("user/get_user_give_integral_list") + suspend fun get_user_give_integral_list( + @Query("page") page: String + ): ResponseData> + + + /** + * 兑换记录 + */ + @GET("user/exchange_log") + suspend fun exchange_log( + @Query("page") page: String + ): ResponseData> + + /** + * 支付宝绑定 + */ + @POST("user/binding_zfb") + @FormUrlEncoded + suspend fun upalipay( + @Field("alipay_name") name: String, @Field("alipay_account") idno: String + ): ResponseData + + + /** + * 提现 + */ + @POST("user/user_withdrawal") + @FormUrlEncoded + suspend fun tixian( + @Field("money") money: String, @Field("code") sms_code: String, @Field("type") type: String + ): ResponseData + + /** + * 提现银行卡 + */ + @POST("user/user_withdrawal_bank") + @FormUrlEncoded + suspend fun tixianYhk( + @Field("money") money: String, @Field("code") sms_code: String + ): ResponseData + + + /** + * 我的礼物打赏礼物列表 + */ + @GET("user/get_send_gift_list") + suspend fun get_send_gift_list( + @Query("page") page: String, + @Query("gift_from_type") gift_from_type: String, + @Query("uid") uid: String + ): ResponseData> + + + /** + * 我的礼物接收礼物列表 + */ + @GET("user/get_receive_gift_list") + suspend fun get_receive_gift_list( + @Query("page") page: String, + @Query("gift_from_type") gift_from_type: String, + @Query("uid") uid: String + ): ResponseData> + + /** + * 我的礼物打赏用户列表 + */ + @GET("user/get_send_gift_user_list") + suspend fun get_send_gift_user_list( + @Query("page") page: String, @Query("gift_from_type") gift_from_type: String + ): ResponseData> + + + /** + * 我的礼物接收用户列表 + */ + @GET("user/get_receive_gift_user_list") + suspend fun get_receive_gift_user_list( + @Query("page") page: String, @Query("gift_from_type") gift_from_type: String + ): ResponseData> + + + /** + * 用户反馈 + */ + @POST("suggest/create_suggest") + @FormUrlEncoded + suspend fun feedBack( + @Field("user_id") user_id: String, @Field("content") content: String + ): ResponseData + + /** + * 修改用户信息 + * img 头像 + * nickname 昵称 + * sex 性别 + * birthday 生日 + * constellation 星座 + * city 城市 + */ + @POST("user/modify_user_info") + @FormUrlEncoded + suspend fun setUserInfo( + @Field("head_pic") img: String, + @Field("nick_name") nickname: String, + @Field("sex") sex: String, + @Field("birthday") birthday: String, + @Field("city") city: String, + @Field("autograph") autograph: String, + @Field("hobby") hobby: String + ): ResponseData + + + /** + *获取收藏的房间 + */ + @GET("room/get_user_collect_list") + suspend fun get_user_collect_list( + @Query("page") page: String + ): ResponseData> + + + /** + * 获取陪玩个人主页 + */ + @GET("player/player_home_page") + suspend fun player_home_page( + @Query("from_id") page: String + ): ResponseData + + + /** + * 删除个人照片* + */ + @GET("user/delete_user_albums") + suspend fun upload_del(@Query("aid") id: String): ResponseData + + /** + * 移除用户黑名单* + */ + @GET("user_tencent/remove_blacklist") + suspend fun remove_blacklist(@Query("user_id") user_id: String): ResponseData + + /** + * 上传用户相册* + */ + @GET("user/add_user_albums") + suspend fun add_user_albums(@Query("image") image: String): ResponseData + + /** + * 等级中心 + */ + @GET("user/get_user_level_info") + suspend fun get_user_level_info(): ResponseData + + + /** + * 搜索 + */ + @POST("player/search") + @FormUrlEncoded + suspend fun mergeSearch( + @Field("keywords") keywords: String + ): ResponseData + + /** + * 轮播图 + */ + @GET("banner/get_banner_list") + suspend fun get_banner_list(): ResponseData> + + /** + * 身份认证 + */ + @GET("player/real_name_authentication") + suspend fun bindIdentity(@QueryMap map: MutableMap): ResponseData + + /** + * 官方消息 + */ + @POST("user_message/get_user_message_list") + @FormUrlEncoded + suspend fun official_message( + @Field("type") type: String, @Field("page") page: String + ): ResponseData> + + /** + * 将用户踢出公会 + * + * @param userId 用户ID + * @param guildId 公会ID + * @return + */ + @GET("guild/kick_out_guild") + suspend fun kick_out_guild( + @Query("user_id") userId: String, @Query("guild_id") guildId: String + ): ResponseData + + + @POST("user_tencent/add_blacklist") + @FormUrlEncoded + suspend fun add_blacklist(@Field("user_id") uid: String): ResponseData + + @GET("user/get_level_list") + suspend fun get_level_list(@Query("type") type: String): ResponseData + + + //判断是否可以发送消息 + @GET("user_message/is_private_chat") + suspend fun is_private_chat(): ResponseData + + //签到记录 + @GET("user/user_day_sign_log") + suspend fun user_day_sign_log(): ResponseData + + //日常签到 + @GET("user/user_day_sign") + suspend fun user_day_sign(): ResponseData + + @GET("Nobility/get_nobility_list") + suspend fun get_nobility_list(): ResponseData> + + + @GET("Nobility/get_nobility_info") + suspend fun get_nobility_info(@Query("lid") nobility_id: String): ResponseData + + + @GET("user/user_room_is_hiding") + suspend fun set_is_hide_enter_room(@Query("is_room_hiding") is_room_hiding: String): ResponseData + + + @GET("Vip/get_vip_list") + suspend fun get_vip_list(): ResponseData + + @GET("pay/pay_vip_order") + suspend fun pay_vip_order( + @Query("vid") vid: String, @Query("pay_type") pay_type: String + ): ResponseData + + + @GET("user/is_teenager") + suspend fun is_teenager(): ResponseData + + @POST("mode/open_teen_mode") + @FormUrlEncoded + suspend fun open_teen_mode( + @Field("type") type: String, + @Field("password") password: String, + @Field("again_password") again_password: String + ): ResponseData + + + @POST("mode/close_teen_mode ") + @FormUrlEncoded + suspend fun close_teen_mode( + @Field("type") type: String, + @Field("password") password: String, + ): ResponseData + + + @POST("mode/edit_teen_mode") + @FormUrlEncoded + suspend fun edit_teen_mode( + @Field("card_id") card_id: String, + @Field("real_name") real_name: String, + ): ResponseData + + + @POST("coupling/user_coupling_info") + @FormUrlEncoded + suspend fun user_coupling_info(@Field("uid") uid: String): ResponseData + + + @POST("vip/get_update_invite_info") + suspend fun get_update_invite_info(): ResponseData + + @GET("pay/update_user_inviter") + suspend fun update_user_inviter( + @Query("user_id") user_id: String, + @Query("sms_code") sms_code: String, + @Query("pay_type") pay_type: String + ): ResponseData + + @GET("user/user_is_room_hiding") + suspend fun user_is_room_hiding(@Query("is_room_hiding") is_room_hiding: String): ResponseData + + @GET("room/now_room_category") + suspend fun now_room_category(@Query("cate_id") cate_id: String): ResponseData + + + @GET("Contract/user_renewal_contract_status") + suspend fun user_renewal_contract_status(@Query("id") id: String): ResponseData + + @GET("Contract/user_renewal_contract") + suspend fun user_renewal_contract(@Query("id") id: String): ResponseData + + @GET("user/options_is_open_address") + suspend fun options_is_open_address(@Query("is_open_address") is_open_address: String): ResponseData + + @GET("contract/user_cancel_contract") + suspend fun user_cancel_contract(@Query("id") id: String): ResponseData + + + @GET("room/get_user_room_power_list") + suspend fun get_user_room_power_list(): ResponseData> + + @GET("room/user_retire_room_power") + suspend fun user_retire_room_power( + @Query("rid") rid: String, @Query("user_type") user_type: String + ): ResponseData + + @GET("gift/now_week_rank_four") + suspend fun now_week_rank_four(): ResponseData> + + @GET("gift/top_cp") + suspend fun top_cp(): ResponseData + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/network/CommonServer.kt b/app/src/main/java/com/yuyin/mier/network/CommonServer.kt new file mode 100644 index 0000000..dac193f --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/network/CommonServer.kt @@ -0,0 +1,11 @@ +package com.yuyin.mier.network + +import com.yuyin.lib_base.http.RequestService + +/** + * @author jhb + * @date 2020/10/23 + */ +object CommonServer { + val api by lazy { RequestService.create() } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/real_name/RealNameActivity.kt b/app/src/main/java/com/yuyin/mier/real_name/RealNameActivity.kt new file mode 100644 index 0000000..7c770b8 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/real_name/RealNameActivity.kt @@ -0,0 +1,166 @@ +package com.yuyin.mier.real_name + +import android.Manifest +import android.annotation.SuppressLint +import android.content.Intent +import android.text.TextUtils +import androidx.databinding.ViewDataBinding +import com.alibaba.android.arouter.facade.annotation.Route +import com.bumptech.glide.Glide +import com.lzy.imagepicker.ImagePicker +import com.lzy.imagepicker.bean.ImageItem +import com.lzy.imagepicker.ui.ImageGridActivity +import com.tbruyelle.rxpermissions2.RxPermissions +import com.yuyin.lib_base.arouter.AroutUtil.PLAY_REAL_NAME +import com.yuyin.lib_base.base.BaseDataBindingActivity +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.R +import kotlinx.android.synthetic.main.activity_real_name.* +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import top.zibin.luban.Luban +import java.util.* +import kotlin.collections.ArrayList + + +@Route(path = PLAY_REAL_NAME) +class RealNameActivity : BaseDataBindingActivity() { + override fun startObserve() { + viewModel.imgListData.observe(this, { + disMiss() + if (it == null) return@observe + if (it.size != 2) return@observe + val map: MutableMap = HashMap() + map["real_name"] = editName.text.toString() + map["card_id"] = editNumber.text.toString() + map["identity1"] = it[0] + map["identity2"] = it[1] + viewModel.bindIdentity(map) + }) + viewModel.bindIdentity.observe(this, { + finish() + }) + } + + override fun getLayoutId(): Int = R.layout.activity_real_name + + override fun initView() { + } + + override fun initData() { + } + + override fun initEvent() { + iv_xuanzhe1.setOnClickListener { + showSelectPic(1) + } + iv_xuanzhe2.setOnClickListener { + showSelectPic(2) + } + btn_ok.setOnClickListener { + val name = editName.text.toString() + val number = editNumber.text.toString() + if (TextUtils.isEmpty(name)) { + "请输入姓名!".showToast() + return@setOnClickListener + } else if (TextUtils.isEmpty(number)) { + "请输入身份证号!".showToast() + return@setOnClickListener + } +// else if (!IDCard.IDCardValidate(number)) { +// "身份证格式不正确!".showToast() +// return@setOnClickListener +// } + val map: MutableMap = HashMap() + map["real_name"] = editName.text.toString() + map["card_id"] = editNumber.text.toString() + +// if (TextUtils.isEmpty(pic1) || TextUtils.isEmpty(pic2)) { +// "请上传身份证正反面!".showToast() +// } else { +// uploadFile() +// } + + viewModel.bindIdentity(map) + + } + } + + @SuppressLint("CheckResult") + private fun showSelectPic(type: Int) { + val rxPermissions = RxPermissions(this) + rxPermissions + .request( + Manifest.permission.CAMERA, + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE + ) + .subscribe { granted: Boolean -> + if (granted) { // Always true pre-M + // 跳转到相册 + ImagePicker.getInstance().selectLimit = 1 + ImagePicker.getInstance().isMultiMode = false + ImagePicker.getInstance().isCrop = false + val intent = Intent(this@RealNameActivity, ImageGridActivity::class.java) + //显示选中的图片 + startActivityForResult(intent, if (type == 1) 10011 else 10012) + } + } + } + + var pic1: String = "" + var pic2: String = "" + private val listPos: MutableList = ArrayList() + + private fun uploadFile() { + listPos.clear() + showLoading() + val parts = ArrayList() + if (!TextUtils.isEmpty(pic1)) { + val file = Luban.with(this).load(pic1).get()[0] + val requestFile = RequestBody.create("multipart/form-data".toMediaTypeOrNull(), file) + val body = MultipartBody.Part.createFormData("file[]", file.name, requestFile) + parts.add(body) + listPos.add(0) + } + if (!TextUtils.isEmpty(pic2)) { + val file2 = Luban.with(this).load(pic2).get()[0] + val requestFile2 = RequestBody.create("multipart/form-data".toMediaTypeOrNull(), file2) + val body2 = MultipartBody.Part.createFormData("file[]", file2.name, requestFile2) + parts.add(body2) + listPos.add(1) + } + viewModel.uploadImages(parts) + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (data == null) { + return + } + var tempList: ArrayList + if (resultCode == ImagePicker.RESULT_CODE_ITEMS) { + //添加图片返回 + if (requestCode == 10011) { + tempList = + data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS) as ArrayList + if (tempList == null) { + return + } + pic1 = tempList[0].path + Glide.with(this@RealNameActivity).load(tempList[0].path).into(iv_xuanzhe1) + } + if (requestCode == 10012) { + tempList = + data.getSerializableExtra(ImagePicker.EXTRA_RESULT_ITEMS) as ArrayList + if (tempList == null) { + return + } + pic2 = tempList[0].path + Glide.with(this@RealNameActivity).load(tempList[0].path).into(iv_xuanzhe2) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/real_name/RealNameViewModel.kt b/app/src/main/java/com/yuyin/mier/real_name/RealNameViewModel.kt new file mode 100644 index 0000000..16c458a --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/real_name/RealNameViewModel.kt @@ -0,0 +1,20 @@ +package com.yuyin.mier.real_name + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.repository.CommonRepository + +class RealNameViewModel : BaseViewModel() { + + private val repository = CommonRepository() + + var bindIdentity:MutableLiveData = MutableLiveData() + + + fun bindIdentity(map:MutableMap){ + launchUI { + val result = repository.bindIdentity(map) + bindIdentity.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/repository/CommonRepository.kt b/app/src/main/java/com/yuyin/mier/repository/CommonRepository.kt new file mode 100644 index 0000000..085c723 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/repository/CommonRepository.kt @@ -0,0 +1,532 @@ +package com.yuyin.mier.repository + +import com.yuyin.lib_base.http.BaseRepository +import com.yuyin.lib_base.http.ResponseData +import com.yuyin.lib_base.model.AliH5model +import com.yuyin.lib_base.model.Login +import com.yuyin.lib_base.model.Wxmodel +import com.yuyin.mier.module_home.model.* +import com.yuyin.mier.module_my.model.* +import com.yuyin.mier.network.CommonServer +import com.yuyin.module_live.model.InvitationList +import retrofit2.http.Field +import retrofit2.http.Query + +class CommonRepository : BaseRepository() { + + suspend fun loginLogin(phone: String, pass: String, uuid: String): ResponseData = + request { + CommonServer.api.loginLogin(phone, pass, uuid) + } + + suspend fun phone_reg_log( + phone_token: String, type: String, last_login_device: String + ): ResponseData = request { + CommonServer.api.phone_reg_log(phone_token, type, last_login_device, "") + } + + suspend fun bind_reg_code(reg_code: String): ResponseData = request { + CommonServer.api.bind_reg_code(reg_code) + } + + suspend fun get_my_reg_friend_list( + page: String, + page_limit: String, + ): ResponseData = request { + CommonServer.api.get_my_reg_friend_list(page, page_limit) + } + + suspend fun join_guild(guild_id: String): ResponseData = request { + CommonServer.api.join_guild(guild_id) + } + + suspend fun user_is_deacon(guild_id: String): ResponseData = request { + CommonServer.api.user_is_deacon(guild_id) + } + + suspend fun quit_guild(guild_id: String): ResponseData = request { + CommonServer.api.quit_guild(guild_id) + } + + suspend fun get_the_guild_info(guild_id: String): ResponseData = request { + CommonServer.api.get_the_guild_info(guild_id) + } + + suspend fun diss_guild(guild_id: String): ResponseData = request { + CommonServer.api.diss_guild(guild_id) + } + + suspend fun goodsList(uid: String): ResponseData> = request { + CommonServer.api.goodsList(uid) + } + + suspend fun rechargePay( + user_id: String, goods_id: String, type: String + ): ResponseData = request { + CommonServer.api.rechargePay(user_id, goods_id, type) + } + + suspend fun rechargePayH5( + user_id: String, goods_id: String, type: String + ): ResponseData = request { + CommonServer.api.rechargePayH5(user_id, goods_id, type) + } + + suspend fun pay_nobility_aliH5( + lid: String, pay_type: String + ): ResponseData = request { + CommonServer.api.pay_nobilityALIH5(lid, pay_type) + } + + suspend fun pay_nobility_ali( + lid: String, pay_type: String + ): ResponseData = request { + CommonServer.api.pay_nobilityALI(lid, pay_type) + } + + suspend fun pay_nobility_wx( + lid: String, pay_type: String + ): ResponseData = request { + CommonServer.api.pay_nobilityWX(lid, pay_type) + } + + suspend fun rechargeWxPay( + user_id: String, goods_id: String, type: String + ): ResponseData = request { + CommonServer.api.rechargeWxPay(user_id, goods_id, type) + } + + + suspend fun binding_bank_card( + bank_card_number: String, + bank_user_name: String, + bank_cert_id: String, + bank_tel_no: String, + bank_card_name: String, + ): ResponseData = request { + CommonServer.api.binding_bank_card(bank_card_number, bank_user_name, bank_cert_id, bank_tel_no,bank_card_name) + } + + suspend fun binding_bank_card_yzh( + bank_user_name: String, + bank_card: String, + open_bank: String, + bank_card_number: String, + ): ResponseData = request { + CommonServer.api.binding_bank_card_yzh(bank_user_name, bank_card,open_bank,bank_card_number) + } + + suspend fun get_user_decorate_list(type: String): ResponseData = request { + CommonServer.api.get_user_decorate_list(type, "100") + } + + suspend fun set_user_decorate(udid: String): ResponseData = request { + CommonServer.api.set_user_decorate(udid) + } + + suspend fun cancel_user_decorate(udid: String): ResponseData = request { + CommonServer.api.cancel_user_decorate(udid) + } + + + suspend fun forgetPwd(phone: String, code: String, pass: String): ResponseData = request { + CommonServer.api.ForGetPWD(phone, code, pass) + } + + suspend fun register( + phone: String, pass: String, code: String, yaoqing: String, sex: String + ): ResponseData = request { + CommonServer.api.register( + phone, pass, code, yaoqing + ) + } + + suspend fun phone_verification_code_log( + @Field("user_login") phone: String?, + @Field("sms_code") sms_code: String?, + @Field("last_login_device") last_login_device: String + ): ResponseData = request { + CommonServer.api.phone_verification_code_log( + phone, sms_code, "", last_login_device + ) + } + + suspend fun modify_trade_password( + phone: String, code: String, pass: String + ): ResponseData = request { + CommonServer.api.modify_trade_password(phone, code, pass) + } + + suspend fun wx_reg_log(map: MutableMap): ResponseData = request { + CommonServer.api.wx_reg_log(map) + } + + suspend fun get_room_zone_list(map: MutableMap): ResponseData> = + request { + CommonServer.api.get_room_zone_list(map) + } + + suspend fun get_guild_list(map: MutableMap): ResponseData = request { + CommonServer.api.get_guild_list(map) + } + + suspend fun get_guild_money_log_list1(map: MutableMap): ResponseData = + request { + CommonServer.api.get_guild_money_log_list1(map) + } + + suspend fun bind_phone(phone: String, sms_code: String): ResponseData = request { + + CommonServer.api.bind_phone(phone, sms_code) + + } + + suspend fun get_decorate_info(did: String): ResponseData = request { + CommonServer.api.get_decorate_info(did) + } + + suspend fun get_mall_decorate_list(type: String): ResponseData> = + request { + CommonServer.api.get_mall_decorate_list(type, "100") + } + + suspend fun buy_mall_decorate(did: String, day: String): ResponseData = request { + CommonServer.api.buy_mall_decorate(did, day) + } + + suspend fun get_guild_money_log_list2(map: MutableMap): ResponseData = + request { + CommonServer.api.get_guild_money_log_list2(map) + } + + suspend fun get_apply_guild_list(map: MutableMap): ResponseData = + request { + CommonServer.api.get_apply_guild_list(map) + } + + + + suspend fun operate_guild( + @Query("id") id: String, @Query("type") type: String + ): ResponseData = request { + CommonServer.api.operate_guild(id, type) + } + + + suspend fun getRoomList(map: MutableMap): ResponseData> = + request { + CommonServer.api.get_room_list(map) + } + + suspend fun getWithdrawal(map: MutableMap): ResponseData = + request { + CommonServer.api.get_user_withdrawal_detail(map) + } + + suspend fun get_one_withdrawal_detail(wid:String): ResponseData = + request { + CommonServer.api.get_one_withdrawal_detail(wid) + } + + suspend fun get_sign_status(): ResponseData = request { + CommonServer.api.get_sign_status() + } + + suspend fun get_sign_contract_url(): ResponseData = request { + CommonServer.api.get_sign_contract_url() + } + + suspend fun submit_sign(): ResponseData = request { + CommonServer.api.submit_sign() + } + + suspend fun get_user_withdrawal_info(): ResponseData = request { + CommonServer.api.get_user_withdrawal_info() + } + + suspend fun get_blacklist(): ResponseData = request { + CommonServer.api.get_blacklist() + } + + suspend fun exchangeCheck(money: String): ResponseData = request { + CommonServer.api.exchangeCheck(money) + } + + suspend fun exchange(money: String, trade_password: String): ResponseData = request { + CommonServer.api.exchange(money, trade_password) + } + + suspend fun tixian_log(page: String): ResponseData> = request { + CommonServer.api.tixian_log(page) + } + + suspend fun get_user_give_integral_list(page: String): ResponseData> = + request { + CommonServer.api.get_user_give_integral_list(page) + } + + suspend fun exchange_log(page: String): ResponseData> = request { + CommonServer.api.exchange_log(page) + } + + suspend fun upalipay( + ali_nick_name: String, ali_user_id: String + ): ResponseData = request { + CommonServer.api.upalipay(ali_nick_name, ali_user_id) + } + + suspend fun tixian( + money: String, sms_code: String + ): ResponseData = request { + CommonServer.api.tixian(money, sms_code, "1") + } + + suspend fun tixianYzh( + money: String, sms_code: String,type: String + ): ResponseData = request { + CommonServer.api.tixian(money, sms_code, type) + } + + suspend fun tixianYhk( + money: String, sms_code: String + ): ResponseData = request { + CommonServer.api.tixianYhk(money, sms_code) + } + + suspend fun get_send_gift_user_list( + page: String, gift_from_type: String + ): ResponseData> = request { + CommonServer.api.get_send_gift_user_list(page, gift_from_type) + } + + suspend fun get_receive_gift_user_list( + page: String, gift_from_type: String + ): ResponseData> = request { + CommonServer.api.get_receive_gift_user_list(page, gift_from_type) + } + + suspend fun get_send_gift_list( + page: String, gift_from_type: String, uid: String + ): ResponseData> = request { + CommonServer.api.get_send_gift_list(page, gift_from_type, uid) + } + + suspend fun get_receive_gift_list( + page: String, gift_from_type: String, uid: String + ): ResponseData> = request { + CommonServer.api.get_receive_gift_list(page, gift_from_type, uid) + } + + suspend fun setUserInfo( + img: String, + nickname: String, + sex: String, + birthday: String, + city: String, + autograph: String, + hobby: String + ): ResponseData = request { + CommonServer.api.setUserInfo(img, nickname, sex, birthday, city, autograph, hobby) + } + + suspend fun feedBack(user_id: String, content: String): ResponseData = request { + CommonServer.api.feedBack(user_id, content) + } + + suspend fun get_user_collect_list(page: String): ResponseData> = + request { + CommonServer.api.get_user_collect_list(page) + } + + suspend fun player_home_page(from_id: String): ResponseData = request { + CommonServer.api.player_home_page(from_id) + } + + suspend fun upload_del(aid: String): ResponseData = request { + CommonServer.api.upload_del(aid) + } + + suspend fun remove_blacklist(user_id: String): ResponseData = request { + CommonServer.api.remove_blacklist(user_id) + } + + suspend fun add_user_albums(img: String): ResponseData = request { + CommonServer.api.add_user_albums(img) + } + + suspend fun get_user_level_info(): ResponseData = request { + CommonServer.api.get_user_level_info() + } + + suspend fun mergeSearch( + keywords: String + ): ResponseData = request { + CommonServer.api.mergeSearch(keywords) + } + + suspend fun get_banner_list(): ResponseData> = request { + CommonServer.api.get_banner_list() + } + + suspend fun bindIdentity(map: MutableMap): ResponseData = request { + CommonServer.api.bindIdentity(map) + } + + + suspend fun official_message( + @Field("type") type: String, @Field("page") page: String + ): ResponseData> = request { + CommonServer.api.official_message(type, page) + } + + suspend fun kick_out_guild( + @Query("user_id") userId: String, @Query("guild_id") guildId: String + ): ResponseData = request { + CommonServer.api.kick_out_guild(userId, guildId) + } + + suspend fun add_blacklist(uid: String): ResponseData = request { + + CommonServer.api.add_blacklist(uid) + } + + suspend fun get_level_list(type: String): ResponseData = request { + + CommonServer.api.get_level_list(type) + } + + + suspend fun is_private_chat(): ResponseData = request { + CommonServer.api.is_private_chat() + } + + suspend fun user_day_sign_log(): ResponseData = request { + CommonServer.api.user_day_sign_log() + } + + suspend fun user_day_sign(): ResponseData = request { + CommonServer.api.user_day_sign() + } + + + suspend fun get_nobility_list(): ResponseData> = request { + + request { + CommonServer.api.get_nobility_list() + } + } + + suspend fun get_nobility_info(nobility_id: String): ResponseData = request { + + CommonServer.api.get_nobility_info(nobility_id) + + } + + + suspend fun set_is_hide_enter_room(is_room_hiding: String): ResponseData = request { + + CommonServer.api.set_is_hide_enter_room(is_room_hiding) + } + + + suspend fun get_vip_list(): ResponseData = request { + CommonServer.api.get_vip_list() + } + + + suspend fun pay_vip_order( + vid: String, pay_type: String + ): ResponseData = request { + CommonServer.api.pay_vip_order(vid, pay_type) + } + + suspend fun is_teenager(): ResponseData = request { + CommonServer.api.is_teenager() + } + + suspend fun open_teen_mode( + type: String, password: String, again_password: String + ): ResponseData = request { + CommonServer.api.open_teen_mode(type, password, again_password) + } + + suspend fun close_teen_mode( + type: String, + password: String, + ): ResponseData = request { + CommonServer.api.close_teen_mode(type, password) + } + + suspend fun edit_teen_mode( + card_id: String, + real_name: String, + ): ResponseData = request { + CommonServer.api.edit_teen_mode(card_id, real_name) + } + + suspend fun user_coupling_info(uid: String): ResponseData = request { + CommonServer.api.user_coupling_info(uid) + } + + suspend fun get_update_invite_info(): ResponseData = request { + + CommonServer.api.get_update_invite_info() + + } + + suspend fun update_user_inviter( + user_id: String, sms_code: String, pay_type: String + ): ResponseData = request { + + CommonServer.api.update_user_inviter(user_id, sms_code, pay_type) + + } + + suspend fun user_is_room_hiding(is_room_hiding: String): ResponseData = request { + + CommonServer.api.user_is_room_hiding(is_room_hiding) + } + + suspend fun now_room_category(cate_id: String): ResponseData = request { + + CommonServer.api.now_room_category(cate_id) + } + + suspend fun user_renewal_contract_status(id: String): ResponseData = + request { + CommonServer.api.user_renewal_contract_status(id) + } + + suspend fun user_renewal_contract(id: String): ResponseData = request { + CommonServer.api.user_renewal_contract(id) + } + + suspend fun options_is_open_address(is_open_address: String): ResponseData = request { + CommonServer.api.options_is_open_address(is_open_address) + } + + suspend fun user_cancel_contract(id: String): ResponseData = request { + CommonServer.api.user_cancel_contract(id) + } + + suspend fun get_user_room_power_list(): ResponseData> = request { + + CommonServer.api.get_user_room_power_list() + } + + suspend fun user_retire_room_power( + rid: String, user_type: String + ): ResponseData = request { + CommonServer.api.user_retire_room_power(rid, user_type) + } + + suspend fun now_week_rank_four(): ResponseData> = request { + + CommonServer.api.now_week_rank_four() + } + + suspend fun top_cp(): ResponseData = request { + + CommonServer.api.top_cp() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/search/SearchHisActivity.kt b/app/src/main/java/com/yuyin/mier/search/SearchHisActivity.kt new file mode 100644 index 0000000..797aa44 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/search/SearchHisActivity.kt @@ -0,0 +1,103 @@ +package com.yuyin.mier.search + +import android.content.Intent +import android.text.TextUtils +import android.view.KeyEvent +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.alibaba.android.arouter.facade.annotation.Route +import com.yuyin.lib_base.arouter.AroutUtil.MAIN_SEARCH_MAIN +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.lib_base.model.SearchHis +import com.yuyin.lib_base.util.showToast +import com.yuyin.mier.R +import com.zhy.view.flowlayout.FlowLayout +import com.zhy.view.flowlayout.TagAdapter +import kotlinx.android.synthetic.main.activity_search_his.* +import org.litepal.LitePal + +/** + * 搜索历史 + */ +@Route(path = MAIN_SEARCH_MAIN) +class SearchHisActivity : BaseActivity() { + override fun startObserve() {} + override fun getLayoutId(): Int { + return R.layout.activity_search_his + } + + override fun initView() {} + override fun initData() { + + } + + override fun onResume() { + super.onResume() + val list = LitePal.findAll(SearchHis::class.java) + if (list != null) + flowlayoutTop.adapter = object : TagAdapter(list) { + override fun getView( + parent: FlowLayout, + position: Int, + historBean: SearchHis + ): View { + val tv = LayoutInflater.from(this@SearchHisActivity) + .inflate(R.layout.text_search, flowlayoutTop, false) as TextView + tv.setText(historBean.text) + return tv + } + } + flowlayoutTop.setOnTagClickListener { view, position, parent -> + editName.setText(list[position].text) + val intent = Intent(this, SearchResultActivity::class.java) + intent.putExtra("name", list[position].text) + startActivity(intent) + return@setOnTagClickListener true + } + } + + override fun initEvent() { + imgDelete.setOnClickListener { + LitePal.deleteAll(SearchHis::class.java) + flowlayoutTop.removeAllViews() + } + textCancel.setOnClickListener { + finish() + } + + editName.setOnKeyListener(View.OnKeyListener { v: View?, keyCode: Int, event: KeyEvent -> + if (keyCode == KeyEvent.KEYCODE_ENTER && event.action == KeyEvent.ACTION_DOWN) { + val trim = editName.text.toString().trim() + if (TextUtils.isEmpty(trim)) { + "请填写搜索内容!".showToast() + } else { + var textData = SearchHis() + textData.id = System.currentTimeMillis() + textData.text = trim + textData.save() + val intent = Intent(this, SearchResultActivity::class.java) + intent.putExtra("name", trim) + startActivity(intent) + } + } + false + }) + + tv_search.setOnClickListener { + val trim = editName.text.toString().trim() + if (TextUtils.isEmpty(trim)) { + "请填写搜索内容!".showToast() + } else { + var textData = SearchHis() + textData.id = System.currentTimeMillis() + textData.text = trim + textData.save() + val intent = Intent(this, SearchResultActivity::class.java) + intent.putExtra("name", trim) + startActivity(intent) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/search/SearchResultActivity.kt b/app/src/main/java/com/yuyin/mier/search/SearchResultActivity.kt new file mode 100644 index 0000000..b03bac8 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/search/SearchResultActivity.kt @@ -0,0 +1,84 @@ +package com.yuyin.mier.search + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.launcher.ARouter +import com.yuyin.lib_base.arouter.AroutUtil +import com.yuyin.lib_base.base.BaseActivity +import com.yuyin.mier.R +import com.yuyin.mier.module_home.model.SearchRoomBean +import com.yuyin.mier.module_home.model.SearchUserBean +import com.yuyin.mier.search.adapter.SearchRoomAdapter +import com.yuyin.mier.search.adapter.SearchUserAdapter +import kotlinx.android.synthetic.main.activity_search_result.* + +class SearchResultActivity : BaseActivity() { + private var name = "" + + private var searchUserAdapter: SearchUserAdapter? = null + private var searchRoomAdapter: SearchRoomAdapter? = null + override fun startObserve() { + viewModel.searchData.observe(this) { + val user: List = it.user + val rooms: List = it.room + if (user.isEmpty()) { + ll1.visibility = View.GONE + myList1.visibility = View.GONE + } else { + searchUserAdapter!!.setNewData(user) + } + if (rooms.isEmpty()) { + ll2.visibility = View.GONE + myList2.visibility = View.GONE + } else { + searchRoomAdapter!!.getList_adapter().clear() + searchRoomAdapter!!.getList_adapter().addAll(rooms) + searchRoomAdapter!!.notifyDataSetChanged() + } + if (user.isEmpty() && rooms.isEmpty()) { + scrollView.visibility = View.GONE + no_data.visibility = View.VISIBLE + } + } + } + + override fun getLayoutId(): Int = R.layout.activity_search_result + + override fun initView() { + + } + + override fun initData() { + if (intent.getStringExtra("name") != null) { + name = intent.getStringExtra("name")!! + tv_text.text = name + } + + searchUserAdapter = SearchUserAdapter() + myList1.layoutManager = LinearLayoutManager(this) + myList1.adapter = searchUserAdapter + + searchRoomAdapter = SearchRoomAdapter(this) + myList2.adapter = searchRoomAdapter + + viewModel.searchData(name) + } + + override fun initEvent() { + llSearch.setOnClickListener { + finish() + } + textCancel.setOnClickListener { + finish() + } + myList2.setOnItemClickListener { parent, view, position, id -> + if (searchRoomAdapter == null) return@setOnItemClickListener + viewModel.enterRoom(searchRoomAdapter!!.getList_adapter()[position].rid, "", this) + } + searchUserAdapter!!.setOnItemClickListener { adapter, view, position -> + ARouter.getInstance().build(AroutUtil.MAIN_MY_HOME_PAGE) + .withString("from_id", searchUserAdapter!!.data[position].uid) + .navigation() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/search/SearchResultViewModel.kt b/app/src/main/java/com/yuyin/mier/search/SearchResultViewModel.kt new file mode 100644 index 0000000..870c953 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/search/SearchResultViewModel.kt @@ -0,0 +1,18 @@ +package com.yuyin.mier.search + +import androidx.lifecycle.MutableLiveData +import com.yuyin.lib_base.base.BaseViewModel +import com.yuyin.mier.module_home.model.SearchBean +import com.yuyin.mier.repository.CommonRepository + +class SearchResultViewModel : BaseViewModel() { + var mainRepository = CommonRepository() + var searchData = MutableLiveData() + + fun searchData(keywords: String) { + launchUI { + val result = mainRepository.mergeSearch(keywords) + searchData.value = result.data + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/search/adapter/SearchRoomAdapter.java b/app/src/main/java/com/yuyin/mier/search/adapter/SearchRoomAdapter.java new file mode 100644 index 0000000..ec73b2b --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/search/adapter/SearchRoomAdapter.java @@ -0,0 +1,62 @@ +package com.yuyin.mier.search.adapter; + +import android.content.Context; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.yuyin.mier.R; +import com.yuyin.mier.module_home.model.SearchRoomBean; +import com.yuyin.module_live.ui.send_gift.adapter.MyBaseAdapter; + +/** + * 首页推荐 + */ +public class SearchRoomAdapter extends MyBaseAdapter { + + private Context context; + + public SearchRoomAdapter(Context context) { + this.context = context; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final ViewHolder VH; + if (convertView == null) { + convertView = LayoutInflater.from(context).inflate(R.layout.item_search_room, null); + VH = new ViewHolder(convertView); + convertView.setTag(VH); + } else { + VH = (ViewHolder) convertView.getTag(); + } + VH.tv_title.setText(list_adapter.get(position).getRoom_name()); + VH.tv_userid.setText(list_adapter.get(position).getRoom_number()); + if (!TextUtils.isEmpty(list_adapter.get(position).getRoom_cover())) { + Glide.with(context) + .load(list_adapter.get(position).getRoom_cover()) + .placeholder(R.mipmap.ic_launcher_app) + .error(R.mipmap.ic_launcher_app) + .circleCrop() + .into(VH.ci_head); + } + return convertView; + } + + + public static class ViewHolder { + TextView tv_title, tv_userid; + ImageView ci_head; + + public ViewHolder(View convertView) { + tv_title = (TextView) convertView.findViewById(R.id.tv_title); + tv_userid = (TextView) convertView.findViewById(R.id.tv_userid); + ci_head = convertView.findViewById(R.id.ci_head); + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/search/adapter/SearchUserAdapter.java b/app/src/main/java/com/yuyin/mier/search/adapter/SearchUserAdapter.java new file mode 100644 index 0000000..cce00b8 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/search/adapter/SearchUserAdapter.java @@ -0,0 +1,37 @@ +package com.yuyin.mier.search.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.mier.R; +import com.yuyin.mier.module_home.model.SearchUserBean; + +import java.util.ArrayList; + +/** + * + */ +public class SearchUserAdapter extends BaseQuickAdapter { + + public SearchUserAdapter() { + super(R.layout.item_search_user, new ArrayList<>()); + } + + @Override + protected void convert(BaseViewHolder helper, SearchUserBean item) { + ImageView imageView = helper.getView(R.id.ci_head); + Glide.with(mContext) + .load(item.getHead_pic()) + .placeholder(R.mipmap.ic_launcher_app) + .error(R.mipmap.ic_launcher_app) + .circleCrop() + .into(imageView); + helper + .setText(R.id.tv_title, item.getNick_name()) + .setText(R.id.tv_user_id, "ID:" + (TextUtils.equals(item.getSpecial_uid(),"0") ? item.getUid() : item.getSpecial_uid())); + helper.addOnClickListener(R.id.ci_head); + } +} diff --git a/app/src/main/java/com/yuyin/mier/view/AppBarLayoutBehavior.java b/app/src/main/java/com/yuyin/mier/view/AppBarLayoutBehavior.java new file mode 100644 index 0000000..5ab4875 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/view/AppBarLayoutBehavior.java @@ -0,0 +1,159 @@ +package com.yuyin.mier.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.widget.OverScroller; + +import androidx.coordinatorlayout.widget.CoordinatorLayout; + +import com.blankj.utilcode.util.LogUtils; +import com.google.android.material.appbar.AppBarLayout; + +import java.lang.reflect.Field; + +/** + *
+ *     @author yangchong
+ *     blog  : https://github.com/yangchong211
+ *     time  : 2019/03/13
+ *     desc  : 自定义Behavior
+ *     revise: 解决appbarLayout若干问题
+ *              1)快速滑动appbarLayout会出现回弹
+ *              2)快速滑动appbarLayout到折叠状态下,立马下滑,会出现抖动的问题
+ *              3)滑动appbarLayout,无法通过手指按下让其停止滑动
+ * 
+ */ +public class AppBarLayoutBehavior extends AppBarLayout.Behavior { + + private static final String TAG = "CustomAppbarLayoutBehavior"; + + private static final int TYPE_FLING = 1; + + private boolean isFlinging; + private boolean shouldBlockNestedScroll; + + public AppBarLayoutBehavior(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) { + LogUtils.d(TAG, "onInterceptTouchEvent:" + child.getTotalScrollRange()); + shouldBlockNestedScroll = false; + if (isFlinging) { + shouldBlockNestedScroll = true; + } + + switch (ev.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + stopAppbarLayoutFling(child); //手指触摸屏幕的时候停止fling事件 + break; + } + + return super.onInterceptTouchEvent(parent, child, ev); + } + + /** + * 反射获取私有的flingRunnable 属性,考虑support 28以后变量名修改的问题 + * @return Field + */ + private Field getFlingRunnableField() throws NoSuchFieldException { + try { + // support design 27及以下版本 + Class headerBehaviorType = this.getClass().getSuperclass().getSuperclass(); + return headerBehaviorType.getDeclaredField("mFlingRunnable"); + } catch (NoSuchFieldException e) { + // 可能是28及以上版本 + Class headerBehaviorType = this.getClass().getSuperclass().getSuperclass().getSuperclass(); + return headerBehaviorType.getDeclaredField("flingRunnable"); + } + } + + /** + * 反射获取私有的scroller 属性,考虑support 28以后变量名修改的问题 + * @return Field + */ + private Field getScrollerField() throws NoSuchFieldException { + try { + // support design 27及以下版本 + Class headerBehaviorType = this.getClass().getSuperclass().getSuperclass(); + return headerBehaviorType.getDeclaredField("mScroller"); + } catch (NoSuchFieldException e) { + // 可能是28及以上版本 + Class headerBehaviorType = this.getClass().getSuperclass().getSuperclass().getSuperclass(); + return headerBehaviorType.getDeclaredField("scroller"); + } + } + + /** + * 停止appbarLayout的fling事件 + * @param appBarLayout + */ + private void stopAppbarLayoutFling(AppBarLayout appBarLayout) { + //通过反射拿到HeaderBehavior中的flingRunnable变量 + try { + Field flingRunnableField = getFlingRunnableField(); + Field scrollerField = getScrollerField(); + flingRunnableField.setAccessible(true); + scrollerField.setAccessible(true); + + Runnable flingRunnable = (Runnable) flingRunnableField.get(this); + OverScroller overScroller = (OverScroller) scrollerField.get(this); + if (flingRunnable != null) { + LogUtils.d(TAG, "存在flingRunnable"); + appBarLayout.removeCallbacks(flingRunnable); + flingRunnableField.set(this, null); + } + if (overScroller != null && !overScroller.isFinished()) { + overScroller.abortAnimation(); + } + } catch (NoSuchFieldException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + + @Override + public boolean onStartNestedScroll(CoordinatorLayout parent, AppBarLayout child, View directTargetChild, View target, int nestedScrollAxes, int type) { + LogUtils.d(TAG, "onStartNestedScroll"); + stopAppbarLayoutFling(child); + return super.onStartNestedScroll(parent, child, directTargetChild, target, nestedScrollAxes, type); + } + + @Override + public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed, int type) { + LogUtils.d(TAG, "onNestedPreScroll:" + child.getTotalScrollRange() + " ,dx:" + dx + " ,dy:" + dy + " ,type:" + type); + + //type返回1时,表示当前target处于非touch的滑动, + //该bug的引起是因为appbar在滑动时,CoordinatorLayout内的实现NestedScrollingChild2接口的滑动子类还未结束其自身的fling + //所以这里监听子类的非touch时的滑动,然后block掉滑动事件传递给AppBarLayout + if (type == TYPE_FLING) { + isFlinging = true; + } + if (!shouldBlockNestedScroll) { + super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type); + } + } + + @Override + public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dxConsumed, int dyConsumed, int + dxUnconsumed, int dyUnconsumed, int type) { + LogUtils.d(TAG, "onNestedScroll: target:" + target.getClass() + " ," + child.getTotalScrollRange() + " ,dxConsumed:" + + dxConsumed + " ,dyConsumed:" + dyConsumed + " " + ",type:" + type); + if (!shouldBlockNestedScroll) { + super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, type); + } + } + + @Override + public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout abl, View target, int type) { + LogUtils.d(TAG, "onStopNestedScroll"); + super.onStopNestedScroll(coordinatorLayout, abl, target, type); + isFlinging = false; + shouldBlockNestedScroll = false; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/view/PhoneMemoryView.java b/app/src/main/java/com/yuyin/mier/view/PhoneMemoryView.java new file mode 100644 index 0000000..844701d --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/view/PhoneMemoryView.java @@ -0,0 +1,82 @@ +package com.yuyin.mier.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.LinearLayout; + +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.yuyin.lib_base.model.PhotoMemory; +import com.yuyin.mier.R; +import com.yuyin.mier.adapter.PhoneMemoryAdapter; + +import org.litepal.LitePal; + +import java.util.List; + +public class PhoneMemoryView extends LinearLayout { + + private OnSelectNumberListener onSelectNumberListener; + private PhoneMemoryAdapter phoneMemoryAdapter; + + + public PhoneMemoryView(Context context) { + super(context); + initView(context); + } + + public PhoneMemoryView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initView(context); + } + + public PhoneMemoryView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initView(context); + } + + + public void initView(Context context) { + + View view = LayoutInflater.from(context).inflate(R.layout.phone_memory_view, this); + RecyclerView rvContainer = view.findViewById(R.id.rv_container); + rvContainer.setLayoutManager(new LinearLayoutManager(context)); + + phoneMemoryAdapter = new PhoneMemoryAdapter(); + rvContainer.setAdapter(phoneMemoryAdapter); + + phoneMemoryAdapter.setOnItemClickListener((adapter, view12, position) -> { + if (onSelectNumberListener != null) { + onSelectNumberListener.selectNumber(phoneMemoryAdapter.getData().get(position)); + setVisibility(View.GONE); + } + }); + + phoneMemoryAdapter.setOnItemChildClickListener((adapter, view1, position) -> { + if (view1.getId() == R.id.iv_delete) { + LitePal.deleteAll(PhotoMemory.class, "photo = ?", phoneMemoryAdapter.getData().get(position).getPhoto()); + phoneMemoryAdapter.remove(position); + } + }); + } + + public void setAdapterList(List phoneMemories) { + phoneMemoryAdapter.setNewData(phoneMemories); + } + + + public interface OnSelectNumberListener { + void selectNumber(PhotoMemory photoMemory); + } + + public void setOnSelectNumberListener(OnSelectNumberListener onSelectNumberListener) { + this.onSelectNumberListener = onSelectNumberListener; + } + + + +} diff --git a/app/src/main/java/com/yuyin/mier/view/SceneDialog.kt b/app/src/main/java/com/yuyin/mier/view/SceneDialog.kt new file mode 100644 index 0000000..39aed0d --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/view/SceneDialog.kt @@ -0,0 +1,106 @@ +package com.yuyin.mier.view + +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.beloo.widget.chipslayoutmanager.ChipsLayoutManager +import com.yuyin.mier.R +import com.yuyin.mier.adapter.SceneFlowAdapter +import com.yuyin.mier.databinding.DialogSceneBinding + + +class SceneDialog(context: Context) : Dialog(context) { + + public lateinit var binding: DialogSceneBinding + + lateinit var sceneFlowAdapter1: SceneFlowAdapter + lateinit var sceneFlowAdapter2: SceneFlowAdapter + + private var onReturnSectListener: OnReturnSectListener? = null + + private var sex_type = "0" + private var age_type = "0" + + init { + + initDialog() + } + + + private fun initDialog() { + val inflater = LayoutInflater.from(context); + binding = DataBindingUtil.inflate(inflater, R.layout.dialog_scene, null, false) + setContentView(binding.root) + val params = window?.attributes as WindowManager.LayoutParams + params.gravity = Gravity.BOTTOM + params.height = WindowManager.LayoutParams.WRAP_CONTENT + params.width = WindowManager.LayoutParams.MATCH_PARENT + window!!.attributes = params + window!!.setBackgroundDrawableResource(android.R.color.transparent) + initView() + } + + private fun initView() { + + val chipsLayoutManager1 = + ChipsLayoutManager.newBuilder(context) + .setChildGravity(Gravity.CENTER) + .setMaxViewsInRow(3) + .setGravityResolver { Gravity.LEFT } + .setOrientation(ChipsLayoutManager.HORIZONTAL) + .setRowStrategy(ChipsLayoutManager.STRATEGY_DEFAULT) + .withLastRow(true) + .build() + + binding.rvGender.layoutManager = chipsLayoutManager1 + sceneFlowAdapter1 = SceneFlowAdapter() + binding.rvGender.adapter = sceneFlowAdapter1 + sceneFlowAdapter1.setNewData(arrayListOf("不限", "只看男生", "只看女生")) + sceneFlowAdapter1.setOnItemClickListener { adapter, view, position -> + sceneFlowAdapter1.setSelectPosition(position) + + sex_type = position.toString() + } + + val chipsLayoutManager2 = + ChipsLayoutManager.newBuilder(context) + .setChildGravity(Gravity.CENTER) + .setMaxViewsInRow(3) + .setGravityResolver { Gravity.LEFT } + .setOrientation(ChipsLayoutManager.HORIZONTAL) + .setRowStrategy(ChipsLayoutManager.STRATEGY_DEFAULT) + .withLastRow(true) + .build() + + binding.rvAge.layoutManager = chipsLayoutManager2 + sceneFlowAdapter2 = SceneFlowAdapter() + binding.rvAge.adapter = sceneFlowAdapter2 + sceneFlowAdapter2.setNewData(arrayListOf("不限", "18-22岁", "23-26岁", "27-36岁", "35岁以上")) + sceneFlowAdapter2.setOnItemClickListener { adapter, view, position -> + sceneFlowAdapter2.setSelectPosition(position) + age_type = position.toString() + + } + + binding.btnConfirm.setOnClickListener { + + onReturnSectListener?.getType(sex_type, age_type) + dismiss() + } + + } + + interface OnReturnSectListener { + + fun getType(sex_type: String, age_type: String) + } + + fun setOnReturnSectListener(onReturnSectListener: OnReturnSectListener) { + + this.onReturnSectListener = onReturnSectListener; + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/view/ZXingUtils.java b/app/src/main/java/com/yuyin/mier/view/ZXingUtils.java new file mode 100644 index 0000000..4f7a98d --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/view/ZXingUtils.java @@ -0,0 +1,203 @@ +package com.yuyin.mier.view; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.PointF; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.QRCodeWriter; + +import java.util.Hashtable; + +/** + * 生成条形码和二维码的工具 + */ +public class ZXingUtils { + /** + * 生成二维码 要转换的地址或字符串,可以是中文 + * + * @param url + * @param width + * @param height + * @return + */ + public static Bitmap createQRImage(String url, final int width, final int height) { + try { + // 判断URL合法性 + if (url == null || "".equals(url) || url.length() < 1) { + return null; + } + Hashtable hints = new Hashtable(); + hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); + // 图像数据转换,使用了矩阵转换 + BitMatrix bitMatrix = new QRCodeWriter().encode(url, + BarcodeFormat.QR_CODE, width, height, hints); + int[] pixels = new int[width * height]; + // 下面这里按照二维码的算法,逐个生成二维码的图片, + // 两个for循环是图片横列扫描的结果 + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + if (bitMatrix.get(x, y)) { + pixels[y * width + x] = 0xff000000; + } else { + pixels[y * width + x] = 0xffffffff; + } + } + } + // 生成二维码图片的格式,使用ARGB_8888 + Bitmap bitmap = Bitmap.createBitmap(width, height, + Bitmap.Config.ARGB_8888); + bitmap.setPixels(pixels, 0, width, 0, 0, width, height); + return bitmap; + } catch (WriterException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 生成条形码 + * + * @param context + * @param contents 需要生成的内容 + * @param desiredWidth 生成条形码的宽带 + * @param desiredHeight 生成条形码的高度 + * @param displayCode 是否在条形码下方显示内容 + * @return + */ + public static Bitmap creatBarcode(Context context, String contents, + int desiredWidth, int desiredHeight, boolean displayCode) { + Bitmap ruseltBitmap = null; + /** + * 图片两端所保留的空白的宽度 + */ + int marginW = 20; + /** + * 条形码的编码类型 + */ + BarcodeFormat barcodeFormat = BarcodeFormat.CODE_128; + + if (displayCode) { + Bitmap barcodeBitmap = encodeAsBitmap(contents, barcodeFormat, + desiredWidth, desiredHeight); + Bitmap codeBitmap = creatCodeBitmap(contents, desiredWidth + 2 + * marginW, desiredHeight, context); + ruseltBitmap = mixtureBitmap(barcodeBitmap, codeBitmap, new PointF( + 0, desiredHeight)); + } else { + ruseltBitmap = encodeAsBitmap(contents, barcodeFormat, + desiredWidth, desiredHeight); + } + + return ruseltBitmap; + } + + /** + * 生成条形码的Bitmap + * + * @param contents 需要生成的内容 + * @param format 编码格式 + * @param desiredWidth + * @param desiredHeight + * @return + * @throws WriterException + */ + protected static Bitmap encodeAsBitmap(String contents, + BarcodeFormat format, int desiredWidth, int desiredHeight) { + final int WHITE = 0xFFFFFFFF; + final int BLACK = 0xFF000000; + + MultiFormatWriter writer = new MultiFormatWriter(); + BitMatrix result = null; + try { + result = writer.encode(contents, format, desiredWidth, + desiredHeight, null); + } catch (WriterException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + int width = result.getWidth(); + int height = result.getHeight(); + int[] pixels = new int[width * height]; + // All are 0, or black, by default + for (int y = 0; y < height; y++) { + int offset = y * width; + for (int x = 0; x < width; x++) { + pixels[offset + x] = result.get(x, y) ? BLACK : WHITE; + } + } + + Bitmap bitmap = Bitmap.createBitmap(width, height, + Bitmap.Config.ARGB_8888); + bitmap.setPixels(pixels, 0, width, 0, 0, width, height); + return bitmap; + } + + /** + * 生成显示编码的Bitmap + * + * @param contents + * @param width + * @param height + * @param context + * @return + */ + protected static Bitmap creatCodeBitmap(String contents, int width, + int height, Context context) { + TextView tv = new TextView(context); + ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + tv.setLayoutParams(layoutParams); + tv.setText(contents); + tv.setHeight(height); + tv.setGravity(Gravity.CENTER_HORIZONTAL); + tv.setWidth(width); + tv.setDrawingCacheEnabled(true); + tv.setTextColor(Color.BLACK); + tv.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); + tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight()); + + tv.buildDrawingCache(); + Bitmap bitmapCode = tv.getDrawingCache(); + return bitmapCode; + } + + /** + * 将两个Bitmap合并成一个 + * + * @param first + * @param second + * @param fromPoint 第二个Bitmap开始绘制的起始位置(相对于第一个Bitmap) + * @return + */ + protected static Bitmap mixtureBitmap(Bitmap first, Bitmap second, + PointF fromPoint) { + if (first == null || second == null || fromPoint == null) { + return null; + } + int marginW = 20; + Bitmap newBitmap = Bitmap.createBitmap( + first.getWidth() + second.getWidth() + marginW, + first.getHeight() + second.getHeight(), Bitmap.Config.ARGB_4444); + Canvas cv = new Canvas(newBitmap); + cv.drawBitmap(first, marginW, 0, null); + cv.drawBitmap(second, fromPoint.x, fromPoint.y, null); + cv.save(); + cv.restore(); + + return newBitmap; + } + +} diff --git a/app/src/main/java/com/yuyin/mier/view/pic/FullScreenUtil2.kt b/app/src/main/java/com/yuyin/mier/view/pic/FullScreenUtil2.kt new file mode 100644 index 0000000..d2ad279 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/view/pic/FullScreenUtil2.kt @@ -0,0 +1,85 @@ +package com.yuyin.mier.view.pic + +import android.app.Dialog +import android.content.Context +import android.graphics.Point +import android.view.* +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.viewpager.widget.ViewPager +import androidx.viewpager.widget.ViewPager.OnPageChangeListener +import com.yuyin.module_my.utils.pic.ImgVPAdapter2 +import com.yuyin.mier.R +import com.yuyin.mier.module_my.model.UserAlbumsList + +/** + * 看大图 + */ +object FullScreenUtil2 { + fun showFullScreenDialog(context: Context, pos: Int, imgList: MutableList) { + val dialog = Dialog(context, R.style.big_pic_dialog) + //设置是否允许Dialog可以被点击取消,也会阻止Back键 + dialog.setCancelable(true) + dialog.setCanceledOnTouchOutside(true) + val window = dialog.window + window!!.setGravity(Gravity.CENTER) + //获取Dialog窗体的根容器 + val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater + val root = dialog.window!!.decorView.findViewById(android.R.id.content) as ViewGroup + //设置窗口大小为屏幕大小 + val wm = + context.applicationContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager + val screenSize = Point() + wm.defaultDisplay.getSize(screenSize) + root.layoutParams = LinearLayout.LayoutParams(screenSize.x, screenSize.y) + // 获取自定义布局,并设置给Dialog + val view = inflater.inflate(R.layout.pop_photo_vp2, root, false) + val img_vp: ViewPager = view.findViewById(R.id.img_vp) + val img_num_iv = view.findViewById(R.id.img_num_iv) + val img_down_iv = view.findViewById(R.id.img_down_iv) + view.setOnClickListener { dialog.dismiss() } + val vpAdapter = ImgVPAdapter2(context, imgList) + img_vp.adapter = vpAdapter + img_vp.currentItem = pos + img_num_iv.text = (pos + 1).toString() + "/" + imgList.size + img_down_iv.setOnClickListener { //保存 + /* if (imgList.get(pos) != null) { + ImageSaveUtils.saveImg(XQDetailActivity.this, imgList.get(pos)); + }*/ + imgList.removeAt(pos) + val vpAdapter = + ImgVPAdapter2(context, imgList) + img_vp.adapter = vpAdapter + img_vp.currentItem = pos + img_num_iv.text = (pos + 1).toString() + "/" + imgList.size + } + img_vp.addOnPageChangeListener(object : OnPageChangeListener { + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + } + + override fun onPageSelected(position: Int) { + img_num_iv.text = (position + 1).toString() + "/" + imgList.size + img_down_iv.setOnClickListener { /* if(imgList.get(position)!=null){ + ImageSaveUtils.saveImg(XQDetailActivity.this, imgList.get(position)); + } +*/ + } + } + + override fun onPageScrollStateChanged(state: Int) {} + }) + vpAdapter.setAllClickListener(object : + ImgVPAdapter2.AllClickListener { + override fun allclick(pos: Int) { + dialog.dismiss() + } + }) + dialog.setContentView(view) + dialog.show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/view/pic/ImgVPAdapter2.kt b/app/src/main/java/com/yuyin/mier/view/pic/ImgVPAdapter2.kt new file mode 100644 index 0000000..a9bc7c2 --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/view/pic/ImgVPAdapter2.kt @@ -0,0 +1,49 @@ +package com.yuyin.module_my.utils.pic + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import androidx.viewpager.widget.PagerAdapter +import com.bumptech.glide.Glide +import com.yuyin.mier.R +import com.yuyin.mier.module_my.model.UserAlbumsList + +class ImgVPAdapter2(private val context: Context, private val paths: List) : + PagerAdapter() { + override fun getCount(): Int { + return paths.size + } + + override fun isViewFromObject(view: View, `object`: Any): Boolean { + return view === `object` + } + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val iv_img = LayoutInflater.from(context).inflate(R.layout.item_img_pv, null) as ImageView + // iv_img.setScaleType(ImageView.ScaleType.CENTER); + Glide.with(context).load(paths[position].image).error(R.mipmap.no_tu).into(iv_img) + iv_img.scaleType = ImageView.ScaleType.CENTER + iv_img.setOnClickListener { + if (allClickListener != null) { + allClickListener!!.allclick(position) + } + } + container.addView(iv_img) + return iv_img + } + + override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { + container.removeView(`object` as View) + } + + interface AllClickListener { + fun allclick(pos: Int) + } + + private var allClickListener: AllClickListener? = null + fun setAllClickListener(allClickListener: AllClickListener?) { + this.allClickListener = allClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/yuyin/mier/wxapi/WXPayEntryActivity.java b/app/src/main/java/com/yuyin/mier/wxapi/WXPayEntryActivity.java new file mode 100644 index 0000000..fc9dcdf --- /dev/null +++ b/app/src/main/java/com/yuyin/mier/wxapi/WXPayEntryActivity.java @@ -0,0 +1,44 @@ +package com.yuyin.mier.wxapi; + + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; + +import com.alibaba.fastjson.JSON; +import com.tencent.mm.opensdk.modelbase.BaseReq; +import com.tencent.mm.opensdk.modelbase.BaseResp; +import com.tencent.mm.opensdk.openapi.IWXAPI; +import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler; +import com.tencent.mm.opensdk.openapi.WXAPIFactory; + +public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { + + + private IWXAPI api; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + api = WXAPIFactory.createWXAPI(this, "wx7b5c4e89e726a72c", true); + api.handleIntent(getIntent(), this); + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + setIntent(intent); + api.handleIntent(intent, this); + } + + @Override + public void onReq(BaseReq req) { + } + + @Override + public void onResp(BaseResp resp) { + String str = JSON.toJSONString(resp); + finish(); + } + +} \ No newline at end of file diff --git a/app/src/main/res/anim/anim_bottom_to_top.xml b/app/src/main/res/anim/anim_bottom_to_top.xml new file mode 100644 index 0000000..22957e3 --- /dev/null +++ b/app/src/main/res/anim/anim_bottom_to_top.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/la_bottom_to_top.xml b/app/src/main/res/anim/la_bottom_to_top.xml new file mode 100644 index 0000000..49ccb0f --- /dev/null +++ b/app/src/main/res/anim/la_bottom_to_top.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_left_in.xml b/app/src/main/res/anim/slide_left_in.xml new file mode 100644 index 0000000..0827094 --- /dev/null +++ b/app/src/main/res/anim/slide_left_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_left_out.xml b/app/src/main/res/anim/slide_left_out.xml new file mode 100644 index 0000000..d66e74c --- /dev/null +++ b/app/src/main/res/anim/slide_left_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_right_in.xml b/app/src/main/res/anim/slide_right_in.xml new file mode 100644 index 0000000..7e556b3 --- /dev/null +++ b/app/src/main/res/anim/slide_right_in.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_right_out.xml b/app/src/main/res/anim/slide_right_out.xml new file mode 100644 index 0000000..d1246bb --- /dev/null +++ b/app/src/main/res/anim/slide_right_out.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_indicator_text_color.xml b/app/src/main/res/color/selector_indicator_text_color.xml new file mode 100644 index 0000000..62094a8 --- /dev/null +++ b/app/src/main/res/color/selector_indicator_text_color.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/boder_333333_15.xml b/app/src/main/res/drawable/boder_333333_15.xml new file mode 100644 index 0000000..c94ad36 --- /dev/null +++ b/app/src/main/res/drawable/boder_333333_15.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/boder_dedede_10.xml b/app/src/main/res/drawable/boder_dedede_10.xml new file mode 100644 index 0000000..8257cd3 --- /dev/null +++ b/app/src/main/res/drawable/boder_dedede_10.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/boder_main_home_bg1.xml b/app/src/main/res/drawable/boder_main_home_bg1.xml new file mode 100644 index 0000000..42ea241 --- /dev/null +++ b/app/src/main/res/drawable/boder_main_home_bg1.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/boder_main_my_bg1.xml b/app/src/main/res/drawable/boder_main_my_bg1.xml new file mode 100644 index 0000000..a05de23 --- /dev/null +++ b/app/src/main/res/drawable/boder_main_my_bg1.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/boder_my_paidui.xml b/app/src/main/res/drawable/boder_my_paidui.xml new file mode 100644 index 0000000..67c9df7 --- /dev/null +++ b/app/src/main/res/drawable/boder_my_paidui.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/lianghao_new.png b/app/src/main/res/drawable/lianghao_new.png new file mode 100644 index 0000000..e855ab2 Binary files /dev/null and b/app/src/main/res/drawable/lianghao_new.png differ diff --git a/app/src/main/res/drawable/photo_memory_bg.xml b/app/src/main/res/drawable/photo_memory_bg.xml new file mode 100644 index 0000000..4a45565 --- /dev/null +++ b/app/src/main/res/drawable/photo_memory_bg.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/select_check_box.xml b/app/src/main/res/drawable/select_check_box.xml new file mode 100644 index 0000000..3964778 --- /dev/null +++ b/app/src/main/res/drawable/select_check_box.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/select_vip.xml b/app/src/main/res/drawable/select_vip.xml new file mode 100644 index 0000000..12b9afe --- /dev/null +++ b/app/src/main/res/drawable/select_vip.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_charge.xml b/app/src/main/res/drawable/selector_charge.xml new file mode 100644 index 0000000..9cb1db7 --- /dev/null +++ b/app/src/main/res/drawable/selector_charge.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_charge2.xml b/app/src/main/res/drawable/selector_charge2.xml new file mode 100644 index 0000000..c65cd82 --- /dev/null +++ b/app/src/main/res/drawable/selector_charge2.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_charge_text1.xml b/app/src/main/res/drawable/selector_charge_text1.xml new file mode 100644 index 0000000..0571ab0 --- /dev/null +++ b/app/src/main/res/drawable/selector_charge_text1.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_charge_text2.xml b/app/src/main/res/drawable/selector_charge_text2.xml new file mode 100644 index 0000000..35f7e79 --- /dev/null +++ b/app/src/main/res/drawable/selector_charge_text2.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_charge_text3.xml b/app/src/main/res/drawable/selector_charge_text3.xml new file mode 100644 index 0000000..cc40701 --- /dev/null +++ b/app/src/main/res/drawable/selector_charge_text3.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_charge_text4.xml b/app/src/main/res/drawable/selector_charge_text4.xml new file mode 100644 index 0000000..0fb06f3 --- /dev/null +++ b/app/src/main/res/drawable/selector_charge_text4.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_charge_text5.xml b/app/src/main/res/drawable/selector_charge_text5.xml new file mode 100644 index 0000000..83af6d2 --- /dev/null +++ b/app/src/main/res/drawable/selector_charge_text5.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_cp_tab.xml b/app/src/main/res/drawable/selector_cp_tab.xml new file mode 100644 index 0000000..df8b49e --- /dev/null +++ b/app/src/main/res/drawable/selector_cp_tab.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_dress_up.xml b/app/src/main/res/drawable/selector_dress_up.xml new file mode 100644 index 0000000..6de3801 --- /dev/null +++ b/app/src/main/res/drawable/selector_dress_up.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_homepage_follow.xml b/app/src/main/res/drawable/selector_homepage_follow.xml new file mode 100644 index 0000000..324b04f --- /dev/null +++ b/app/src/main/res/drawable/selector_homepage_follow.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_main_radiobuttion_center.xml b/app/src/main/res/drawable/selector_main_radiobuttion_center.xml new file mode 100644 index 0000000..47f085c --- /dev/null +++ b/app/src/main/res/drawable/selector_main_radiobuttion_center.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_main_radiobuttion_home.xml b/app/src/main/res/drawable/selector_main_radiobuttion_home.xml new file mode 100644 index 0000000..aae75fb --- /dev/null +++ b/app/src/main/res/drawable/selector_main_radiobuttion_home.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_main_radiobuttion_message.xml b/app/src/main/res/drawable/selector_main_radiobuttion_message.xml new file mode 100644 index 0000000..a2ab79a --- /dev/null +++ b/app/src/main/res/drawable/selector_main_radiobuttion_message.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_main_radiobuttion_my.xml b/app/src/main/res/drawable/selector_main_radiobuttion_my.xml new file mode 100644 index 0000000..f293ca7 --- /dev/null +++ b/app/src/main/res/drawable/selector_main_radiobuttion_my.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_main_radiobuttion_rank.xml b/app/src/main/res/drawable/selector_main_radiobuttion_rank.xml new file mode 100644 index 0000000..ea6ede0 --- /dev/null +++ b/app/src/main/res/drawable/selector_main_radiobuttion_rank.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_main_radiobutton_text.xml b/app/src/main/res/drawable/selector_main_radiobutton_text.xml new file mode 100644 index 0000000..56556ce --- /dev/null +++ b/app/src/main/res/drawable/selector_main_radiobutton_text.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_sign_bg.xml b/app/src/main/res/drawable/selector_sign_bg.xml new file mode 100644 index 0000000..7519154 --- /dev/null +++ b/app/src/main/res/drawable/selector_sign_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_sign_bg1.xml b/app/src/main/res/drawable/selector_sign_bg1.xml new file mode 100644 index 0000000..f4a218f --- /dev/null +++ b/app/src/main/res/drawable/selector_sign_bg1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_switch.xml b/app/src/main/res/drawable/selector_switch.xml new file mode 100644 index 0000000..a72b2dc --- /dev/null +++ b/app/src/main/res/drawable/selector_switch.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_tab_layout2.xml b/app/src/main/res/drawable/selector_tab_layout2.xml new file mode 100644 index 0000000..d708e6e --- /dev/null +++ b/app/src/main/res/drawable/selector_tab_layout2.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_tab_layout5.xml b/app/src/main/res/drawable/selector_tab_layout5.xml new file mode 100644 index 0000000..7ea0890 --- /dev/null +++ b/app/src/main/res/drawable/selector_tab_layout5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_tab_layout6.xml b/app/src/main/res/drawable/selector_tab_layout6.xml new file mode 100644 index 0000000..1cf84b0 --- /dev/null +++ b/app/src/main/res/drawable/selector_tab_layout6.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_tab_layout_text2.xml b/app/src/main/res/drawable/selector_tab_layout_text2.xml new file mode 100644 index 0000000..27bdd53 --- /dev/null +++ b/app/src/main/res/drawable/selector_tab_layout_text2.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_7c47d7_15_alph20.xml b/app/src/main/res/drawable/shape_7c47d7_15_alph20.xml new file mode 100644 index 0000000..984cd9b --- /dev/null +++ b/app/src/main/res/drawable/shape_7c47d7_15_alph20.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_ab8ff4_5.xml b/app/src/main/res/drawable/shape_ab8ff4_5.xml new file mode 100644 index 0000000..2bc01df --- /dev/null +++ b/app/src/main/res/drawable/shape_ab8ff4_5.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_ab8ff4_50.xml b/app/src/main/res/drawable/shape_ab8ff4_50.xml new file mode 100644 index 0000000..5df7119 --- /dev/null +++ b/app/src/main/res/drawable/shape_ab8ff4_50.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_bg_f5_13.xml b/app/src/main/res/drawable/shape_bg_f5_13.xml new file mode 100644 index 0000000..24d3fe7 --- /dev/null +++ b/app/src/main/res/drawable/shape_bg_f5_13.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_butt_fabu.xml b/app/src/main/res/drawable/shape_butt_fabu.xml new file mode 100644 index 0000000..5115b71 --- /dev/null +++ b/app/src/main/res/drawable/shape_butt_fabu.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_ccc.xml b/app/src/main/res/drawable/shape_ccc.xml new file mode 100644 index 0000000..7a15b7e --- /dev/null +++ b/app/src/main/res/drawable/shape_ccc.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_gray.xml b/app/src/main/res/drawable/shape_gray.xml new file mode 100644 index 0000000..7c159a9 --- /dev/null +++ b/app/src/main/res/drawable/shape_gray.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_home_header_bg.xml b/app/src/main/res/drawable/shape_home_header_bg.xml new file mode 100644 index 0000000..d00e561 --- /dev/null +++ b/app/src/main/res/drawable/shape_home_header_bg.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_ind_userpage_bg.xml b/app/src/main/res/drawable/shape_ind_userpage_bg.xml new file mode 100644 index 0000000..677113e --- /dev/null +++ b/app/src/main/res/drawable/shape_ind_userpage_bg.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_item_home_bg.xml b/app/src/main/res/drawable/shape_item_home_bg.xml new file mode 100644 index 0000000..eedf2f4 --- /dev/null +++ b/app/src/main/res/drawable/shape_item_home_bg.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_item_home_bg2.xml b/app/src/main/res/drawable/shape_item_home_bg2.xml new file mode 100644 index 0000000..667736d --- /dev/null +++ b/app/src/main/res/drawable/shape_item_home_bg2.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_login_bg1.xml b/app/src/main/res/drawable/shape_login_bg1.xml new file mode 100644 index 0000000..980c5f0 --- /dev/null +++ b/app/src/main/res/drawable/shape_login_bg1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_login_bg2.xml b/app/src/main/res/drawable/shape_login_bg2.xml new file mode 100644 index 0000000..8730489 --- /dev/null +++ b/app/src/main/res/drawable/shape_login_bg2.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_login_bg3.xml b/app/src/main/res/drawable/shape_login_bg3.xml new file mode 100644 index 0000000..2c0c512 --- /dev/null +++ b/app/src/main/res/drawable/shape_login_bg3.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_login_bg4.xml b/app/src/main/res/drawable/shape_login_bg4.xml new file mode 100644 index 0000000..e80caae --- /dev/null +++ b/app/src/main/res/drawable/shape_login_bg4.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_login_bg5.xml b/app/src/main/res/drawable/shape_login_bg5.xml new file mode 100644 index 0000000..235e24d --- /dev/null +++ b/app/src/main/res/drawable/shape_login_bg5.xml @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_login_bg6.xml b/app/src/main/res/drawable/shape_login_bg6.xml new file mode 100644 index 0000000..caad20b --- /dev/null +++ b/app/src/main/res/drawable/shape_login_bg6.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_loginout_bg.xml b/app/src/main/res/drawable/shape_loginout_bg.xml new file mode 100644 index 0000000..54a9b2f --- /dev/null +++ b/app/src/main/res/drawable/shape_loginout_bg.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_my_bg.xml b/app/src/main/res/drawable/shape_my_bg.xml new file mode 100644 index 0000000..6d8407c --- /dev/null +++ b/app/src/main/res/drawable/shape_my_bg.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_my_bg1.xml b/app/src/main/res/drawable/shape_my_bg1.xml new file mode 100644 index 0000000..2fdcd27 --- /dev/null +++ b/app/src/main/res/drawable/shape_my_bg1.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_my_bg2.xml b/app/src/main/res/drawable/shape_my_bg2.xml new file mode 100644 index 0000000..ec69892 --- /dev/null +++ b/app/src/main/res/drawable/shape_my_bg2.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_peer_btm_bg.xml b/app/src/main/res/drawable/shape_peer_btm_bg.xml new file mode 100644 index 0000000..d427153 --- /dev/null +++ b/app/src/main/res/drawable/shape_peer_btm_bg.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_peer_btm_bg1.xml b/app/src/main/res/drawable/shape_peer_btm_bg1.xml new file mode 100644 index 0000000..5fb96aa --- /dev/null +++ b/app/src/main/res/drawable/shape_peer_btm_bg1.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_renzheng_bg1.xml b/app/src/main/res/drawable/shape_renzheng_bg1.xml new file mode 100644 index 0000000..18d5053 --- /dev/null +++ b/app/src/main/res/drawable/shape_renzheng_bg1.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_room_list_bg1.xml b/app/src/main/res/drawable/shape_room_list_bg1.xml new file mode 100644 index 0000000..f449db2 --- /dev/null +++ b/app/src/main/res/drawable/shape_room_list_bg1.xml @@ -0,0 +1,15 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_round_bg.xml b/app/src/main/res/drawable/shape_round_bg.xml new file mode 100644 index 0000000..f470c3d --- /dev/null +++ b/app/src/main/res/drawable/shape_round_bg.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_scene_tag.xml b/app/src/main/res/drawable/shape_scene_tag.xml new file mode 100644 index 0000000..8d93005 --- /dev/null +++ b/app/src/main/res/drawable/shape_scene_tag.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_scene_tag_text.xml b/app/src/main/res/drawable/shape_scene_tag_text.xml new file mode 100644 index 0000000..4c27c0e --- /dev/null +++ b/app/src/main/res/drawable/shape_scene_tag_text.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_sign_bg.xml b/app/src/main/res/drawable/shape_sign_bg.xml new file mode 100644 index 0000000..fbc7bb8 --- /dev/null +++ b/app/src/main/res/drawable/shape_sign_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_tab_trans.xml b/app/src/main/res/drawable/shape_tab_trans.xml new file mode 100644 index 0000000..69fb8cb --- /dev/null +++ b/app/src/main/res/drawable/shape_tab_trans.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_tx_bg2.xml b/app/src/main/res/drawable/shape_tx_bg2.xml new file mode 100644 index 0000000..a601e85 --- /dev/null +++ b/app/src/main/res/drawable/shape_tx_bg2.xml @@ -0,0 +1,13 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_tx_mxbg1.xml b/app/src/main/res/drawable/shape_tx_mxbg1.xml new file mode 100644 index 0000000..062f8e4 --- /dev/null +++ b/app/src/main/res/drawable/shape_tx_mxbg1.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_tx_mxbg2.xml b/app/src/main/res/drawable/shape_tx_mxbg2.xml new file mode 100644 index 0000000..2665eff --- /dev/null +++ b/app/src/main/res/drawable/shape_tx_mxbg2.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_use_cancel.xml b/app/src/main/res/drawable/shape_use_cancel.xml new file mode 100644 index 0000000..2942452 --- /dev/null +++ b/app/src/main/res/drawable/shape_use_cancel.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_use_confirm.xml b/app/src/main/res/drawable/shape_use_confirm.xml new file mode 100644 index 0000000..62e3033 --- /dev/null +++ b/app/src/main/res/drawable/shape_use_confirm.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_user_home_liwu1.xml b/app/src/main/res/drawable/shape_user_home_liwu1.xml new file mode 100644 index 0000000..9c7c4b8 --- /dev/null +++ b/app/src/main/res/drawable/shape_user_home_liwu1.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_white_bg10_6.xml b/app/src/main/res/drawable/shape_white_bg10_6.xml new file mode 100644 index 0000000..cfcdadd --- /dev/null +++ b/app/src/main/res/drawable/shape_white_bg10_6.xml @@ -0,0 +1,15 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_withe_bg_alpha60.xml b/app/src/main/res/drawable/shape_withe_bg_alpha60.xml new file mode 100644 index 0000000..0a5474b --- /dev/null +++ b/app/src/main/res/drawable/shape_withe_bg_alpha60.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_zhuangban1.xml b/app/src/main/res/drawable/shape_zhuangban1.xml new file mode 100644 index 0000000..ea13b1a --- /dev/null +++ b/app/src/main/res/drawable/shape_zhuangban1.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_zhuangban1_1.xml b/app/src/main/res/drawable/shape_zhuangban1_1.xml new file mode 100644 index 0000000..e21bac9 --- /dev/null +++ b/app/src/main/res/drawable/shape_zhuangban1_1.xml @@ -0,0 +1,16 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_zhuangban2.xml b/app/src/main/res/drawable/shape_zhuangban2.xml new file mode 100644 index 0000000..9b92a7c --- /dev/null +++ b/app/src/main/res/drawable/shape_zhuangban2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_zhuangban3.xml b/app/src/main/res/drawable/shape_zhuangban3.xml new file mode 100644 index 0000000..93ae97b --- /dev/null +++ b/app/src/main/res/drawable/shape_zhuangban3.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_zhuangban_bg.xml b/app/src/main/res/drawable/shape_zhuangban_bg.xml new file mode 100644 index 0000000..af90425 --- /dev/null +++ b/app/src/main/res/drawable/shape_zhuangban_bg.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_common_track_selected.xml b/app/src/main/res/drawable/switch_common_track_selected.xml new file mode 100644 index 0000000..4fa4362 --- /dev/null +++ b/app/src/main/res/drawable/switch_common_track_selected.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_select_bg.xml b/app/src/main/res/drawable/tab_select_bg.xml new file mode 100644 index 0000000..f22cf3a --- /dev/null +++ b/app/src/main/res/drawable/tab_select_bg.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_unselect_bg.xml b/app/src/main/res/drawable/tab_unselect_bg.xml new file mode 100644 index 0000000..96601f4 --- /dev/null +++ b/app/src/main/res/drawable/tab_unselect_bg.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/user_home_page_btmbg.xml b/app/src/main/res/drawable/user_home_page_btmbg.xml new file mode 100644 index 0000000..0e7e346 --- /dev/null +++ b/app/src/main/res/drawable/user_home_page_btmbg.xml @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/user_home_page_img1.xml b/app/src/main/res/drawable/user_home_page_img1.xml new file mode 100644 index 0000000..ceaff56 --- /dev/null +++ b/app/src/main/res/drawable/user_home_page_img1.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/user_home_page_img11.xml b/app/src/main/res/drawable/user_home_page_img11.xml new file mode 100644 index 0000000..ceaff56 --- /dev/null +++ b/app/src/main/res/drawable/user_home_page_img11.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/user_home_page_line1.xml b/app/src/main/res/drawable/user_home_page_line1.xml new file mode 100644 index 0000000..e438c15 --- /dev/null +++ b/app/src/main/res/drawable/user_home_page_line1.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/user_page_btm_btnbg.xml b/app/src/main/res/drawable/user_page_btm_btnbg.xml new file mode 100644 index 0000000..d0f7abe --- /dev/null +++ b/app/src/main/res/drawable/user_page_btm_btnbg.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000..cc44d12 --- /dev/null +++ b/app/src/main/res/layout/activity_about.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..188d297 --- /dev/null +++ b/app/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_bind_alipay.xml b/app/src/main/res/layout/activity_bind_alipay.xml new file mode 100644 index 0000000..0642376 --- /dev/null +++ b/app/src/main/res/layout/activity_bind_alipay.xml @@ -0,0 +1,231 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +