diff --git a/.idea/compiler.xml b/.idea/compiler.xml index b86273d9..b589d56e 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index edd08c0c..52e72e37 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,7 +4,7 @@ \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 70661ab8..90454a68 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -6,7 +6,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 3326ee1b..bf5d2168 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,6 +16,11 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + ndk { + //设置支持的so库框架 + abiFilters 'armeabi-v7a', 'arm64-v8a' + } + } signingConfigs { @@ -79,8 +84,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } buildFeatures { dataBinding true @@ -95,8 +100,9 @@ android { } kotlinOptions { - jvmTarget = '11' + jvmTarget = '17' } + } dependencies { @@ -118,5 +124,9 @@ dependencies { implementation files('libs/logger-2.2.2-release.aar') implementation files('libs/main-2.2.3-release.aar') - +//aar的名称,例如:WbCloudFaceLiveSdk-v6.0.0-1234567.aar,填入'WbCloudFaceLiveSdk-v6.0.0-1234567' +// implementation(name: 'WbCloudFaceLiveSdk-face-v6.6.2-8e4718fc', ext: 'aar') +////2. 云normal SDK, +////aar的名称,例如:WbCloudNormal-v5.1.10-123456789.aar,填入 'WbCloudNormal-v5.1.10-123456789.aar' +// implementation(name: 'WbCloudNormal-v5.1.10-4e3e198', ext: 'aar') } \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 10bc2b54..ac49b06f 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -786,4 +786,93 @@ public static java.lang.String TABLENAME; *; -} \ No newline at end of file +} + +# 避免删除代码逻辑 +-dontshrink +-dontoptimize +# 避免混淆 TUIKit +-keep class com.tencent.qcloud.** { *; } +-keep class com.tencent.imsdk.** { *; } +-keep class * implements com.tencent.qcloud.tuicore.interfaces.TUIInitializer {} + +######################云刷脸混淆规则 faceverify-BEGIN####################### +#### +#不混淆内部类 +-keepattributes InnerClasses + +#不混淆jni调用类 +-keepclasseswithmembers class *{ + native ; +} + +###################### faceverify-BEGIN ########################### +-ignorewarnings +-keep public class com.tencent.ytcommon.**{*;} +-keep class com.tencent.turingfd.sdk.mfa.TNative$aa { public *; } +-keep class com.tencent.turingfd.sdk.mfa.TNative$aa$bb { public *;} +-keep class com.tencent.turingcam.** {*;} +-keep class com.tencent.turingfd.** {*;} + +-keep public class com.tencent.youtu.ytagreflectlivecheck.jni.**{*;} +-keep public class com.tencent.youtu.ytagreflectlivecheck.YTAGReflectLiveCheckInterface{ + public ; +} +-keep public class com.tencent.youtu.ytposedetect.jni.**{*;} +-keep public class com.tencent.youtu.ytposedetect.data.**{*;} +-keep public class com.tencent.youtu.liveness.YTFaceTracker{*;} +-keep public class com.tencent.youtu.liveness.YTFaceTracker$*{*;} + +-keep public class com.tencent.cloud.huiyansdkface.facelight.net.*$*{ + *; +} +-keep public class com.tencent.cloud.huiyansdkface.facelight.net.**{ + *; +} +-keep public class com.tencent.cloud.huiyansdkface.facelight.config.cdn.WbUiTips{ + *; +} + +#================数据上报混淆规则 start=========================== +#实体类 +-keep class com.tencent.cloud.huiyansdkface.analytics.EventSender{ + *; +} +-keep class com.tencent.cloud.huiyansdkface.analytics.EventSender$*{ + *; +} +-keep class com.tencent.cloud.huiyansdkface.analytics.WBSAEvent{ + *; +} +-keep class com.tencent.cloud.huiyansdkface.analytics.WBSAParam{ + *; +} +#================数据上报混淆规则 end=========================== + +#######################faceverify-END############################# + +####################### normal混淆规则-BEGIN############################# +#不混淆内部类 +-keepattributes InnerClasses +-keepattributes *Annotation* +-keepattributes Signature +-keepattributes Exceptions + +-keep public class com.tencent.cloud.huiyansdkface.normal.net.*$*{ + *; +} +-keep public class com.tencent.cloud.huiyansdkface.normal.net.*{ + *; +} +#bugly +-keep class com.tencent.bugly.idasc.**{ + *; +} +#wehttp混淆规则 +-dontwarn com.tencent.cloud.huiyansdkface.okio.** +-keep class com.tencent.cloud.huiyansdkface.okio.**{ + *; +} +-dontwarn com.tencent.cloud.huiyansdkface.okhttp3.OkHttpClient$Builder + +####################### normal混淆规则-END############################# \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0b019e2a..351db878 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -106,11 +106,12 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme" - tools:replace="android:theme" android:networkSecurityConfig="@xml/network_security_config" android:usesCleartextTraffic="true" tools:targetApi="31" - tools:ignore="SelectedPhotoAccess"> + tools:ignore="SelectedPhotoAccess" + tools:replace="android:theme,android:allowBackup" + > implements LaunchContacter.View { private Handler handler; @@ -165,6 +169,16 @@ public class LaunchPageActivity extends BaseMvpActivity { - void success(UserFillResp s); void upLoadSuccess(String url, int type); @@ -30,7 +29,6 @@ public final class ImproveInfoContacts { } public interface IImproveInfoPre extends IPresenter { - void fill(String user_no, String nickname, String sex); void uploadFile(File file, int type); diff --git a/moduleLogin/src/main/java/com/qxcm/modulelogin/present/ImproveInfoPresenter.java b/moduleLogin/src/main/java/com/qxcm/modulelogin/present/ImproveInfoPresenter.java index 4cc8bda3..e72fd3fd 100644 --- a/moduleLogin/src/main/java/com/qxcm/modulelogin/present/ImproveInfoPresenter.java +++ b/moduleLogin/src/main/java/com/qxcm/modulelogin/present/ImproveInfoPresenter.java @@ -33,26 +33,6 @@ public class ImproveInfoPresenter extends BasePresenter() { -// @Override -// public void onSubscribe(Disposable d) { -// addDisposable(d); -// } -// -// @Override -// public void onNext(UserFillResp s) { - MvpRef.get().success(null); -// } -// -// @Override -// public void onComplete() { -// MvpRef.get().disLoadings(); -// } -// }); - } @Override public void uploadFile(File file, int type) { diff --git a/moduleLogin/src/main/java/com/qxcm/modulelogin/present/LoginPresenter.java b/moduleLogin/src/main/java/com/qxcm/modulelogin/present/LoginPresenter.java index 129e3012..bc03553a 100644 --- a/moduleLogin/src/main/java/com/qxcm/modulelogin/present/LoginPresenter.java +++ b/moduleLogin/src/main/java/com/qxcm/modulelogin/present/LoginPresenter.java @@ -164,6 +164,7 @@ public class LoginPresenter extends BasePresenter implement e.printStackTrace(); } } else { + EventBus.getDefault().post(userBean.get(0)); com.blankj.utilcode.util.ActivityUtils.startActivity(MainActivity.class); } }else { diff --git a/moduleUtil/build.gradle b/moduleUtil/build.gradle index ec728f42..19371bcb 100644 --- a/moduleUtil/build.gradle +++ b/moduleUtil/build.gradle @@ -24,14 +24,14 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } dataBinding { enabled = true } kotlinOptions { - jvmTarget = '11' + jvmTarget = '17' } } @@ -86,7 +86,7 @@ dependencies { // api(libs.glide.compiler) api(libs.svgaplayer.android) - //banner-viewpager,无限循环滚动 + //banner-viewpager,无限循环滚动 https://gitcode.com/gh_mirrors/ba/BannerViewPager?source_module=search_project api(libs.com.github.zhpanvip.bannerviewpager) api(libs.android.flexbox) @@ -118,4 +118,16 @@ dependencies { api(libs.lombok) annotationProcessor 'org.projectlombok:lombok:1.18.32' + //下拉框 https://gitcode.com/gh_mirrors/ni/nice-spinner?utm_source=csdn_blog_hover&isLogin=1 + api(libs.com.github.arcadefire.nice.spinner) + + //腾讯im +// api project(':tuiconversation') +// api project(':tuichat') + api project(':tuichat') + annotationProcessor 'com.google.auto.service:auto-service:1.1.1' + api files('libs/WbCloudFaceLiveSdk-face-v6.6.2-8e4718fc.aar') + api files('libs/WbCloudNormal-v5.1.10-4e3e198.aar') +//2. 云normal SDK, +//aar的名称,例如:WbCloudNormal-v5.1.10-123456789.aar,填入 'WbCloudNormal-v5.1.10-123456789.aar' } \ No newline at end of file diff --git a/moduleUtil/libs/WbCloudFaceLiveSdk-face-v6.6.2-8e4718fc.aar b/moduleUtil/libs/WbCloudFaceLiveSdk-face-v6.6.2-8e4718fc.aar new file mode 100644 index 00000000..58458a2e Binary files /dev/null and b/moduleUtil/libs/WbCloudFaceLiveSdk-face-v6.6.2-8e4718fc.aar differ diff --git a/moduleUtil/libs/WbCloudNormal-v5.1.10-4e3e198.aar b/moduleUtil/libs/WbCloudNormal-v5.1.10-4e3e198.aar new file mode 100644 index 00000000..60589b0f Binary files /dev/null and b/moduleUtil/libs/WbCloudNormal-v5.1.10-4e3e198.aar differ diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseAppCompatActivity.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseAppCompatActivity.java index 339e0aba..d1db0c2c 100644 --- a/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseAppCompatActivity.java +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseAppCompatActivity.java @@ -1,8 +1,12 @@ package com.qxcm.moduleutil.activity; import android.content.Context; +import android.content.Intent; import android.content.res.Resources; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.provider.Settings; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; @@ -38,6 +42,18 @@ public abstract class BaseAppCompatActivity extends initView(); initData(); initCompleted(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (!Settings.canDrawOverlays(this)) { + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + getPackageName())); + startActivityForResult(intent, 100); + } + } else { + // 对于低于 Android 6.0 的设备,无需请求悬浮窗权限 + // 可在此处添加针对旧版本的处理逻辑(如果需要) + } + } @Override diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseMvpActivity.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseMvpActivity.java index 62226f8b..3c7e71bf 100644 --- a/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseMvpActivity.java +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/activity/BaseMvpActivity.java @@ -1,11 +1,32 @@ package com.qxcm.moduleutil.activity; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ObjectAnimator; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; +import android.graphics.PixelFormat; +import android.os.Build; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.WindowManager; +import android.widget.TextView; import androidx.databinding.ViewDataBinding; +import com.blankj.utilcode.util.LogUtils; +import com.qxcm.moduleutil.R; +import com.qxcm.moduleutil.base.CommonAppContext; +import com.qxcm.moduleutil.bean.UserBean; import com.qxcm.moduleutil.utils.LanguageUtil; +import com.tencent.qcloud.tuicore.TUILogin; +import com.tencent.qcloud.tuicore.interfaces.TUICallback; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; public abstract class BaseMvpActivity

extends BaseAppCompatActivity implements IView { @@ -50,4 +71,106 @@ public abstract class BaseMvpActivity

= Build.VERSION_CODES.O ? + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : + WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | + WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, + PixelFormat.TRANSLUCENT); + + // 设置 Gravity 为左上角 + layoutParams.gravity = Gravity.TOP | Gravity.START; + + // Y 轴随机位置 + layoutParams.y = (int) ((Math.random() * (screenHeight - 200))); + + // 初始 X 设为负值,确保 View 在屏幕左侧外 + layoutParams.x = -200; + + View piaoPingView = LayoutInflater.from(this).inflate(R.layout.item_piaoping, null); + TextView textView = piaoPingView.findViewById(R.id.tv_content); + textView.setText(message); + + windowManager.addView(piaoPingView, layoutParams); + + piaoPingView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + piaoPingView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + + int viewWidth = piaoPingView.getWidth(); + + // 设置锚点为左上角,避免偏移干扰 + piaoPingView.setPivotX(0); + piaoPingView.setPivotY(0); + + // 更新 x 坐标为 -screenWidth,确保 View 完全在屏幕左侧外 + layoutParams.x = -screenWidth; + windowManager.updateViewLayout(piaoPingView, layoutParams); + + // 启动动画:从左外滑入 -> 右外滑出 + ObjectAnimator animator = ObjectAnimator.ofFloat( + piaoPingView, + "translationX", + 0f, // 初始偏移为 0(此时 View 在左侧外) + screenWidth + viewWidth // 向右移动整个屏幕宽度 + View 宽度 + ); + animator.setDuration(duration); + animator.addUpdateListener(animation -> { + float value = (float) animation.getAnimatedValue(); + LogUtils.d("PiaoPing", "translationX = " + value); + }); + animator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + windowManager.removeView(piaoPingView); + } + }); + + // 强制 GPU 渲染 + piaoPingView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + + animator.start(); + } + }); + } + + + + + + } diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/adapter/UserPhotoWallAdapter.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/adapter/UserPhotoWallAdapter.java new file mode 100644 index 00000000..cc8db03f --- /dev/null +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/adapter/UserPhotoWallAdapter.java @@ -0,0 +1,55 @@ +package com.qxcm.moduleutil.adapter; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.qxcm.moduleutil.R; +import com.qxcm.moduleutil.bean.UserImgList; +import com.qxcm.moduleutil.utils.ImageUtils; + +public class UserPhotoWallAdapter extends BaseQuickAdapter { + private boolean b = false; + private int longClickPos = -1; + + public UserPhotoWallAdapter() { + super(R.layout.me_item_user_photo_wall); + } + + @Override + protected void convert(BaseViewHolder helper, UserImgList item) { + if (helper.getAdapterPosition() == 5) { + helper.setVisible(R.id.riv_user_head, false); + helper.setVisible(R.id.iv_close, false); + } else { + helper.setVisible(R.id.riv_user_head, true); + if (!"0".equals(item.getId())) { + ImageUtils.loadCenterCrop(item.getUrl(), helper.getView(R.id.riv_user_head)); + if (longClickPos == helper.getAdapterPosition()) { + helper.setVisible(R.id.iv_close, true); + } else { + helper.setVisible(R.id.iv_close, false); + } + } else { + helper.setImageResource(R.id.riv_user_head, com.qxcm.moduleutil.R.mipmap.add_img); + helper.setGone(R.id.iv_close, false); + } + } + helper.addOnClickListener(R.id.iv_close); + helper.addOnClickListener(R.id.riv_user_head); + helper.addOnLongClickListener(R.id.riv_user_head); + } + + + public void setDelete(boolean b) { + this.b = b; + notifyDataSetChanged(); + } + + public void setLongClickPos(int pos) { + this.longClickPos = pos; + notifyDataSetChanged(); + } + + public boolean getDelete() { + return b; + } +} diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/BannerModel.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/BannerModel.java new file mode 100644 index 00000000..3817842a --- /dev/null +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/BannerModel.java @@ -0,0 +1,88 @@ +package com.qxcm.moduleutil.bean; + +import com.stx.xhb.xbanner.entity.SimpleBannerInfo; + +import java.util.ArrayList; + +public class BannerModel extends SimpleBannerInfo { + + + /** + * ad_id : 11 + * type : 2 + * title : 鱼糖语音·开服送好礼 + * item_id : 9 + * link_url : null + * content : https://gudao-prod.oss-cn-hangzhou.aliyuncs.com/user-dir/YZrsGTJR5F.jpg + * detail_pictures : null + */ + + private String ad_id; + private String type; + private String title; + private String item_id; + private String link_url; + private String content; + private ArrayList detail_pictures; + + public String getAd_id() { + return ad_id; + } + + public void setAd_id(String ad_id) { + this.ad_id = ad_id; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getItem_id() { + return item_id; + } + + public void setItem_id(String item_id) { + this.item_id = item_id; + } + + public String getLink_url() { + return link_url; + } + + public void setLink_url(String link_url) { + this.link_url = link_url; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public ArrayList getDetail_pictures() { + return detail_pictures; + } + + public void setDetail_pictures(ArrayList detail_pictures) { + this.detail_pictures = detail_pictures; + } + + @Override + public Object getXBannerUrl() { + return content; + } +} diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/GiftBoxBean.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/GiftBoxBean.java new file mode 100644 index 00000000..53b8b49c --- /dev/null +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/GiftBoxBean.java @@ -0,0 +1,23 @@ +package com.qxcm.moduleutil.bean; + +import java.util.List; + +import lombok.Data; +/** + *@author qx + *@data 2025/5/27 + *@description: 礼盒数据 + */ +@Data +public class GiftBoxBean { + private String newDataJinbi; + private List giftList; + @Data + public static class GiftBean { + private String giftName; //初级礼盒、高级礼盒 + private String giftTitle; //最高可以获得的金币数 + private String getGiftTypeName; //满多少个金币 + private String giftTypeNumber; //当前的百分比 + private String giftTypeStatus; //是否已经可以 + } +} diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RealNameBean.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RealNameBean.java new file mode 100644 index 00000000..b14fbeaa --- /dev/null +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RealNameBean.java @@ -0,0 +1,19 @@ +package com.qxcm.moduleutil.bean; + +import lombok.Data; +/** + *@author qx + *@data 2025/5/27 + *@description: 实名认证点击获取返回的参数 + */ +@Data +public class RealNameBean { + private String userid; + private String nonce; + private String sign; + private String appid; + private String orderNo; + private String apiVersion; + private String licence; + private String faceId; +} diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RevenueBean.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RevenueBean.java new file mode 100644 index 00000000..8c33f685 --- /dev/null +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/RevenueBean.java @@ -0,0 +1,11 @@ +package com.qxcm.moduleutil.bean; + +import lombok.Data; + +@Data +public class RevenueBean { + private String title; + private String time; + private String money; + private String type; +} diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/TaskDataBean.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/TaskDataBean.java new file mode 100644 index 00000000..2674c3d1 --- /dev/null +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/bean/TaskDataBean.java @@ -0,0 +1,12 @@ +package com.qxcm.moduleutil.bean; + +import lombok.Data; + +@Data +public class TaskDataBean { + private String taskName;//任务名称 + private String taskNumber;//对应的数量 + private String taskType;//类型,展示不同的按钮:1.观看,2.完成,3.送礼,4.邀请,5.充值,6.任务 + private String taskPictureUrl;//任务不同的图片地址 + private String taskReward;//奖励 +} diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/http/ApiServer.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/http/ApiServer.java index 55c2656a..ee24bc07 100644 --- a/moduleUtil/src/main/java/com/qxcm/moduleutil/http/ApiServer.java +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/http/ApiServer.java @@ -1,6 +1,7 @@ package com.qxcm.moduleutil.http; +import com.qxcm.moduleutil.bean.RealNameBean; import com.qxcm.moduleutil.bean.UserBean; import com.qxcm.moduleutil.widget.Constants; @@ -53,6 +54,9 @@ public interface ApiServer { @POST(Constants.CHANGE_PASSWORD) Call> getPostData(@Field("new_password") String new_password,@Field("mobile") String mobile,@Field("sms_code") String code,@Field("user_id") String userId); + @FormUrlEncoded + @POST(Constants.REAL_NAME_RESULT) + Call> getRealNameResult(@Field("orderNo") String order_no); @FormUrlEncoded @POST(Constants.URL_LOGIN) Observable>> oauthLogin(@Field("login_token") String login_token); @@ -64,6 +68,10 @@ public interface ApiServer { @POST(Constants.URL_WX_CODE) Observable>> authCode1(@Field("code") String login_token); + @FormUrlEncoded + @POST(Constants.REAL_NAME) + Observable> realName(@Field("real_name") String real_name, @Field("card_number") String card_number); + // @FormUrlEncoded // @POST(Constant.URL.ADDBANK) diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/http/RetrofitClient.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/http/RetrofitClient.java index 4834fe15..2758adf8 100644 --- a/moduleUtil/src/main/java/com/qxcm/moduleutil/http/RetrofitClient.java +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/http/RetrofitClient.java @@ -11,6 +11,7 @@ import com.franmontiel.persistentcookiejar.PersistentCookieJar; import com.franmontiel.persistentcookiejar.cache.SetCookieCache; import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor; import com.qxcm.moduleutil.base.CommonAppContext; +import com.qxcm.moduleutil.bean.RealNameBean; import com.qxcm.moduleutil.bean.UserBean; import com.qxcm.moduleutil.presenter.BasePresenter; import com.qxcm.moduleutil.utils.SystemUtils; @@ -195,4 +196,8 @@ public class RetrofitClient { sApiServer.authCode(netease_token).compose(new DefaultTransformer<>()).subscribe(observer); } } + + public void realName(String real_name, String card_number,BaseObserver observer){ + sApiServer.realName(real_name,card_number).compose(new DefaultTransformer<>()).subscribe(observer); + } } diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/utils/config/EnvironmentEnum.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/utils/config/EnvironmentEnum.java index 6a9f155a..5c221582 100644 --- a/moduleUtil/src/main/java/com/qxcm/moduleutil/utils/config/EnvironmentEnum.java +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/utils/config/EnvironmentEnum.java @@ -8,7 +8,8 @@ public enum EnvironmentEnum { "DhpCS82gaigZljYqsWsUWUAZ20dREz", "qx-yusheng", "https://qx-yusheng.oss-cn-hangzhou.aliyuncs.com/", - "wx9b6db036ca1073a2"), + "wx9b6db036ca1073a2", + 1600086675), TEST( "http://chat.qxmier.com/", "6rdWuz058oq5OahdbFiGEybUcdahd12J83L34Uc7MrPIrxtFG+rXiwDvRcqNvjwbClbbmvMrmxKVkIysFByBsl0Qe9kqd2w8T/nhK5G6eXXlk2V9AjYCieIU+jRnjZBB+Cfechr6rCGJ2aeBARIsXcRPW7wm9WFK9euh5T+v6Pyte68yNaNdcYCll3+U4/uCEog7HygCnMIbAU+kqoPdmn2H+51YOHW+VsnsHd4w1+I3f8Tt0xLIXGM4GWnQueZ5GR46GTWiSYMy8dCIh9SPIMRyC91GosVcfGPMJSdcXqc=", @@ -17,7 +18,8 @@ public enum EnvironmentEnum { "DhpCS82gaigZljYqsWsUWUAZ20dREz", "qx-yusheng", "https://qx-yusheng.oss-cn-hangzhou.aliyuncs.com/", - "wx9b6db036ca1073a2"); + "wx9b6db036ca1073a2", + 1600086675); private final String serverUrl; private final String ALI_AUTH_KEY;//阿里云授权key @@ -30,7 +32,11 @@ public enum EnvironmentEnum { private final String wxAppId; - EnvironmentEnum(String serverUrl, String ALI_AUTH_KEY, String ossEndPoint, String ossaAcessKeyId, String ossAccessKeySecret, String ossBucketName, String ossBaseUrl,String wxAppId) { + private final int sdkAppId;//腾讯云sdkAppId im + + EnvironmentEnum(String serverUrl, String ALI_AUTH_KEY, String ossEndPoint, String ossaAcessKeyId, + String ossAccessKeySecret, String ossBucketName, String ossBaseUrl,String wxAppId, + int sdkAppId) { this.serverUrl = serverUrl; this.ALI_AUTH_KEY = ALI_AUTH_KEY; this.ossEndPoint = ossEndPoint; @@ -39,6 +45,11 @@ public enum EnvironmentEnum { this.ossBucketName = ossBucketName; this.ossBaseUrl = ossBaseUrl; this.wxAppId=wxAppId; + this.sdkAppId=sdkAppId; + } + + public int getSdkAppId() { + return sdkAppId; } public String getWxAppId() { diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/Constants.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/Constants.java index bf4f1364..f3c8b10f 100644 --- a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/Constants.java +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/Constants.java @@ -361,4 +361,7 @@ public class Constants { public static final String AUTHORIZATION = "/api/Login/AlipayUserInfo"; + public static final String REAL_NAME = "/api/UserData/real_name";//调用实名认证接口 + public static final String REAL_NAME_RESULT = "/api/UserData/real_name_result";//调用实名认证接口 + } diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/CustomBottomSheetDialog.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/CustomBottomSheetDialog.java new file mode 100644 index 00000000..48c2d8f3 --- /dev/null +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/CustomBottomSheetDialog.java @@ -0,0 +1,22 @@ +package com.qxcm.moduleutil.widget; + +import android.content.Context; +import android.os.Bundle; +import android.view.WindowManager; + +import androidx.annotation.NonNull; + +import com.google.android.material.bottomsheet.BottomSheetDialog; + +public class CustomBottomSheetDialog extends BottomSheetDialog { + public CustomBottomSheetDialog(@NonNull Context context) { + super(context); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + } +} + diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/DoubleTimePickerBottomSheet.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/DoubleTimePickerBottomSheet.java new file mode 100644 index 00000000..9e490154 --- /dev/null +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/DoubleTimePickerBottomSheet.java @@ -0,0 +1,98 @@ +package com.qxcm.moduleutil.widget; + +import android.app.Dialog; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TabHost; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.qxcm.moduleutil.R; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +public class DoubleTimePickerBottomSheet extends BottomSheetDialogFragment { + + private OnTimeRangeSelectedListener listener; + + public interface OnTimeRangeSelectedListener { + void onTimeRangeSelected(Date startDate, Date endDate); + } + + public void setOnTimeRangeSelectedListener(OnTimeRangeSelectedListener listener) { + this.listener = listener; + } + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { + return new CustomBottomSheetDialog(requireContext()); + } + + @NonNull + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.dialog_double_time_picker, container, false); + + // 初始化 TabHost + TabHost tabHost = view.findViewById(R.id.tabHost); + tabHost.setup(); + + tabHost.addTab(tabHost.newTabSpec("start").setIndicator("开始时间").setContent(R.id.start_time_tab)); + tabHost.addTab(tabHost.newTabSpec("end").setIndicator("结束时间").setContent(R.id.end_time_tab)); + + // 初始化 Wheel Views + WheelDatePicker wheelStartDate = view.findViewById(R.id.wheel_start_date); + WheelTimePicker wheelStartTime = view.findViewById(R.id.wheel_start_time); + WheelDatePicker wheelEndDate = view.findViewById(R.id.wheel_end_date); + WheelTimePicker wheelEndTime = view.findViewById(R.id.wheel_end_time); + + // 默认设置当前时间 + Calendar startCal = Calendar.getInstance(); + wheelStartDate.init(startCal.get(Calendar.YEAR), startCal.get(Calendar.MONTH), startCal.get(Calendar.DAY_OF_MONTH)); + wheelStartTime.init(startCal.get(Calendar.HOUR_OF_DAY), startCal.get(Calendar.MINUTE),startCal.get(Calendar.SECOND)); + + // 设置默认结束时间略晚于开始时间 + Calendar endCal = (Calendar) startCal.clone(); + endCal.add(Calendar.HOUR, 1); + wheelEndDate.init(endCal.get(Calendar.YEAR), endCal.get(Calendar.MONTH), endCal.get(Calendar.DAY_OF_MONTH)); + wheelEndTime.init(endCal.get(Calendar.HOUR_OF_DAY), endCal.get(Calendar.MINUTE),endCal.get(Calendar.SECOND)); + + // 取消按钮 + view.findViewById(R.id.btn_cancel).setOnClickListener(v -> dismiss()); + + // 确定按钮 + view.findViewById(R.id.btn_sure).setOnClickListener(v -> { + Calendar start = Calendar.getInstance(); + start.set(wheelStartDate.getYear(), wheelStartDate.getMonth(), wheelStartDate.getDay(), + wheelStartTime.getHour(), wheelStartTime.getMinute(), wheelStartTime.getSecond()); + + Calendar end = Calendar.getInstance(); + end.set(wheelEndDate.getYear(), wheelEndDate.getMonth(), wheelEndDate.getDay(), + wheelEndTime.getHour(), wheelEndTime.getMinute(), wheelEndTime.getSecond()); + + if (end.getTime().before(start.getTime())) { + Toast.makeText(requireContext(), "结束时间不能早于开始时间", Toast.LENGTH_SHORT).show(); + return; + } + + if (listener != null) { + listener.onTimeRangeSelected(start.getTime(), end.getTime()); + } + dismiss(); + }); + + return view; + } +} + diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/ScrollViewPager.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/ScrollViewPager.java index 85847194..cff123d4 100644 --- a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/ScrollViewPager.java +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/ScrollViewPager.java @@ -56,4 +56,5 @@ public class ScrollViewPager extends ViewPager { public void setCurrentItem(int item) { super.setCurrentItem(item); } + } diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelDatePicker.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelDatePicker.java new file mode 100644 index 00000000..ba10b3ac --- /dev/null +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelDatePicker.java @@ -0,0 +1,97 @@ +package com.qxcm.moduleutil.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.LinearLayout; +import android.widget.NumberPicker; + +import java.util.Calendar; + +public class WheelDatePicker extends LinearLayout { + + private NumberPicker yearPicker, monthPicker, dayPicker; + private int maxDay = 31; + + public WheelDatePicker(Context context) { + this(context, null); + } + + public WheelDatePicker(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + private void init(Context context) { + setOrientation(HORIZONTAL); + + yearPicker = new NumberPicker(context); + monthPicker = new NumberPicker(context); + dayPicker = new NumberPicker(context); + + LayoutParams params = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1); + yearPicker.setLayoutParams(params); + monthPicker.setLayoutParams(params); + dayPicker.setLayoutParams(params); + + addView(yearPicker); + addView(monthPicker); + addView(dayPicker); + + // 初始化年份范围 + int currentYear = Calendar.getInstance().get(Calendar.YEAR); + yearPicker.setMinValue(currentYear - 50); + yearPicker.setMaxValue(currentYear + 50); + + // 月份从 1 到 12 + monthPicker.setMinValue(1); + monthPicker.setMaxValue(12); + monthPicker.setOnValueChangedListener((picker, oldVal, newVal) -> updateDays()); + + // 默认天数范围 + dayPicker.setMinValue(1); + dayPicker.setMaxValue(maxDay); + } + + private void updateDays() { + int year = yearPicker.getValue(); + int month = monthPicker.getValue(); + + int daysInMonth; + if (month == 4 || month == 6 || month == 9 || month == 11) { + daysInMonth = 30; + } else if (month == 2) { + daysInMonth = isLeapYear(year) ? 29 : 28; + } else { + daysInMonth = 31; + } + + int currentDay = dayPicker.getValue(); + dayPicker.setMaxValue(daysInMonth); + if (currentDay > daysInMonth) { + dayPicker.setValue(daysInMonth); + } + } + + private boolean isLeapYear(int year) { + return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); + } + + public void init(int year, int month, int day) { + yearPicker.setValue(year); + monthPicker.setValue(month + 1); // Calendar 是 0-based + dayPicker.setValue(day); + updateDays(); + } + + public int getYear() { + return yearPicker.getValue(); + } + + public int getMonth() { + return monthPicker.getValue() - 1; // 转回 Calendar 的 0-based + } + + public int getDay() { + return dayPicker.getValue(); + } +} \ No newline at end of file diff --git a/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelTimePicker.java b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelTimePicker.java new file mode 100644 index 00000000..0cd5a283 --- /dev/null +++ b/moduleUtil/src/main/java/com/qxcm/moduleutil/widget/WheelTimePicker.java @@ -0,0 +1,67 @@ +package com.qxcm.moduleutil.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.LinearLayout; +import android.widget.NumberPicker; + +public class WheelTimePicker extends LinearLayout { + + private NumberPicker hourPicker, minutePicker, secondPicker; + + public WheelTimePicker(Context context) { + this(context, null); + } + + public WheelTimePicker(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + private void init(Context context) { + setOrientation(HORIZONTAL); + + hourPicker = new NumberPicker(context); + minutePicker = new NumberPicker(context); + secondPicker= new NumberPicker(context); + + LayoutParams params = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1); + hourPicker.setLayoutParams(params); + minutePicker.setLayoutParams(params); + secondPicker.setLayoutParams(params); + + addView(hourPicker); + addView(minutePicker); + addView(secondPicker); + + // 设置小时范围 + hourPicker.setMinValue(0); + hourPicker.setMaxValue(23); + + // 设置分钟范围 + minutePicker.setMinValue(0); + minutePicker.setMaxValue(59); + + // 秒范围 + secondPicker.setMinValue(0); + secondPicker.setMaxValue(59); + } + + public void init(int hour, int minute, int second) { + hourPicker.setValue(hour); + minutePicker.setValue(minute); + secondPicker.setValue(second); + } + + public int getHour() { + return hourPicker.getValue(); + } + + public int getMinute() { + return minutePicker.getValue(); + } + + public int getSecond() { + return secondPicker.getValue(); + } +} diff --git a/moduleUtil/src/main/res/drawable/bg_r16_f6f6f6.xml b/moduleUtil/src/main/res/drawable/bg_r16_f6f6f6.xml new file mode 100644 index 00000000..da885844 --- /dev/null +++ b/moduleUtil/src/main/res/drawable/bg_r16_f6f6f6.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/moduleUtil/src/main/res/drawable/rounded_background.xml b/moduleUtil/src/main/res/drawable/rounded_background.xml new file mode 100644 index 00000000..6f364b25 --- /dev/null +++ b/moduleUtil/src/main/res/drawable/rounded_background.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/moduleUtil/src/main/res/layout/date_picker_dialog.xml b/moduleUtil/src/main/res/layout/date_picker_dialog.xml index 4416eb5d..bbfec287 100644 --- a/moduleUtil/src/main/res/layout/date_picker_dialog.xml +++ b/moduleUtil/src/main/res/layout/date_picker_dialog.xml @@ -26,6 +26,10 @@ android:calendarViewShown="false" android:datePickerMode="spinner" android:spinnersShown="true" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +