From a92e174eeb5d7949ed43d6627438bed85a953f6a Mon Sep 17 00:00:00 2001 From: huangjian Date: Tue, 22 Jun 2021 17:31:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9C=8D=E5=8A=A1=E7=AB=AF?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=20code=201415=20=E5=85=A8=E5=B1=80=E6=8B=A6?= =?UTF-8?q?=E6=88=AA=E8=B7=B3=E8=BD=AC=E8=87=B3=E5=AE=8C=E5=96=84=E8=B5=84?= =?UTF-8?q?=E6=96=99=E9=A1=B5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit c09c07bb01dff140dfebb079fb9b8f6b18468872) --- .../erban/application/XChatApplication.java | 146 +++----------- core/build.gradle | 1 - .../bean/response/ServiceResult.java | 1 + .../interceptor/DomainInterceptor.java | 64 ------ .../utils/net/ServerException.java | 2 +- .../xchat_android_core/domain/TEMP.java | 7 - .../domain/model/DomainModel.java | 186 ------------------ .../domain/model/IDomainModel.java | 19 -- library/build.gradle | 4 +- .../net/ErBanAllHostnameVerifier.java | 19 -- .../rxnet/converter/GsonConverterFactory.java | 79 ++++++++ .../rxnet/converter/GsonConverterPlugins.java | 30 +++ .../converter/GsonRequestBodyConverter.java | 55 ++++++ .../converter/GsonResponseBodyConverter.java | 54 +++++ .../net/rxnet/manager/RxNetManager.java | 2 +- 15 files changed, 253 insertions(+), 416 deletions(-) delete mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/interceptor/DomainInterceptor.java delete mode 100644 core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/TEMP.java delete mode 100644 core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/model/DomainModel.java delete mode 100644 core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/model/IDomainModel.java delete mode 100644 library/src/main/java/com/yizhuan/xchat_android_library/net/ErBanAllHostnameVerifier.java create mode 100644 library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonConverterFactory.java create mode 100644 library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonConverterPlugins.java create mode 100644 library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonRequestBodyConverter.java create mode 100644 library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonResponseBodyConverter.java diff --git a/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java b/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java index b2a36fe11..ea9947a70 100644 --- a/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java +++ b/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java @@ -11,7 +11,6 @@ import android.graphics.Color; import android.net.http.HttpResponseCache; import android.os.Build; import android.os.Environment; -import android.os.StrictMode; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; @@ -20,7 +19,6 @@ import androidx.multidex.MultiDex; import com.alibaba.security.biometrics.activity.ALBiometricsActivity; import com.alibaba.security.biometrics.activity.ALBiometricsDialogActivity; -import com.alibaba.security.realidentity.RPVerify; import com.alibaba.security.realidentity.activity.RPTakePhotoActivity; import com.alibaba.security.realidentity.activity.RPWebViewActivity; import com.bumptech.glide.request.target.ViewTarget; @@ -60,6 +58,7 @@ import com.yizhuan.erban.R; import com.yizhuan.erban.flutter.XplanFlutterBoostCallback; import com.yizhuan.erban.flutter.XplanFlutterBoostDelegate; import com.yizhuan.erban.module_hall.HallDataManager; +import com.yizhuan.erban.quick_pass.QuickPassLoginAct; import com.yizhuan.erban.radish.wallet.RadishWalletManager; import com.yizhuan.erban.reciever.ConnectiveChangedReceiver; import com.yizhuan.erban.utils.PushMessageHandler; @@ -69,17 +68,15 @@ import com.yizhuan.xchat_android_core.DemoCache; import com.yizhuan.xchat_android_core.Env; import com.yizhuan.xchat_android_core.UriProvider; import com.yizhuan.xchat_android_core.auth.AuthModel; +import com.yizhuan.xchat_android_core.bean.response.ServiceResult; import com.yizhuan.xchat_android_core.channel.ChannelModel; import com.yizhuan.xchat_android_core.family.model.FamilyModel; import com.yizhuan.xchat_android_core.gift.GiftModel; import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment; import com.yizhuan.xchat_android_core.im.custom.bean.OpenSignInAttachment; -import com.yizhuan.xchat_android_core.im.custom.bean.RoomInviteFansAttachment; -import com.yizhuan.xchat_android_core.im.custom.bean.RoomInviteFansInfo; import com.yizhuan.xchat_android_core.initial.InitialModel; import com.yizhuan.xchat_android_core.interceptor.NoParamsInterceptor; import com.yizhuan.xchat_android_core.interceptor.ParamsInterceptor; -import com.yizhuan.xchat_android_core.manager.AudioEngineManager; import com.yizhuan.xchat_android_core.manager.IMMessageManager; import com.yizhuan.xchat_android_core.manager.IMSystemMsgManager; import com.yizhuan.xchat_android_core.market_verify.MarketVerifyModel; @@ -92,22 +89,25 @@ import com.yizhuan.xchat_android_core.room.face.DynamicFaceModel; import com.yizhuan.xchat_android_core.statistic.StatisticManager; import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol; import com.yizhuan.xchat_android_core.user.UserModel; +import com.yizhuan.xchat_android_core.user.event.NeedCompleteInfoEvent; import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils; -import com.yizhuan.xchat_android_library.net.ErBanAllHostnameVerifier; +import com.yizhuan.xchat_android_core.utils.net.ServerException; import com.yizhuan.xchat_android_library.net.rxnet.RxNet; +import com.yizhuan.xchat_android_library.net.rxnet.converter.GsonConverterPlugins; import com.yizhuan.xchat_android_library.utils.AppMetaDataUtil; import com.yizhuan.xchat_android_library.utils.AppUtils; import com.yizhuan.xchat_android_library.utils.DeviceUuidFactory; -import com.yizhuan.xchat_android_library.utils.ProcessUtil; +import com.yizhuan.xchat_android_library.utils.SingleToastUtil; import com.yizhuan.xchat_android_library.utils.SystemUtils; import com.yizhuan.xchat_android_library.utils.VersionUtil; import com.yizhuan.xchat_android_library.utils.config.BasicConfig; import com.zhihu.matisse.ui.MatisseActivity; +import org.greenrobot.eventbus.EventBus; + import java.io.File; import java.io.IOException; import java.util.Map; -import java.util.Objects; import io.reactivex.plugins.RxJavaPlugins; import io.realm.Realm; @@ -138,20 +138,6 @@ public class XChatApplication extends Application { public static final String TAG = "XChatApplication"; private static XChatApplication instance; - private static boolean isSupportOaid = false; - - public static boolean isSupportOaid() { - return isSupportOaid; - } - - public static void setIsSupportOaid(boolean isSupportOaid) { - XChatApplication.isSupportOaid = isSupportOaid; - } - - public static void setIsSupportOaid(boolean isSupportOaid, int ErrorCode) { - XChatApplication.isSupportOaid = isSupportOaid; - } - public static XChatApplication instance() { return instance; } @@ -163,7 +149,6 @@ public class XChatApplication extends Application { static { SmartRefreshLayout.setDefaultRefreshHeaderCreater( (context, layout) -> { -// layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);//全局设置主题颜色 layout.setEnableHeaderTranslationContent(false); MaterialHeader materialHeader = new MaterialHeader(context); materialHeader.setShowBezierWave(false); @@ -191,7 +176,6 @@ public class XChatApplication extends Application { LogUtils.d(channel + ""); initEnv(channel); - //延迟初始化云信 NIMClient.init(this, null, options()); @@ -204,14 +188,29 @@ public class XChatApplication extends Application { }); if (inMainProcess(this)) { - -// 注册自定义推送消息处理,这个是可选项 + // 注册自定义推送消息处理,这个是可选项 NIMPushClient.registerMixPushMessageHandler(new PushMessageHandler()); + RxJavaPlugins.setErrorHandler(throwable -> { - throwable.printStackTrace(); - // print it - Log.e(TAG, "the subscribe() method default error handler", throwable); + if (BuildConfig.DEBUG) { + Log.e(TAG, "the subscribe() method default error handler", throwable); + } }); + + //需要完善资料错误码全局处理 + GsonConverterPlugins.setResultHandler(result -> { + if (result instanceof ServiceResult) { + ServiceResult serviceResult = (ServiceResult) result; + if (serviceResult.getCode() == ServiceResult.CODE_NEED_COMPLETE_USER_INFO) { + SingleToastUtil.showToast(serviceResult.getMessage()); + EventBus.getDefault().post(new NeedCompleteInfoEvent()); + throw new ServerException(serviceResult.getMessage(), serviceResult.getCode()); + } + } + return null; + }); + GsonConverterPlugins.lockdown(); + //fixed: Glide Exception:"You must not call setTag() on a view Glide is targeting" ViewTarget.setTagId(R.id.tag_glide); @@ -226,14 +225,12 @@ public class XChatApplication extends Application { CrashReport.setAppChannel(this, channel); } - initBuglyUpdate(); Bugly.init(this, BuildConfig.DEBUG ? XChatConstants.BUGLY_KEY_DEBUG : XChatConstants.BUGLY_KEY_RELEASE, BuildConfig.DEBUG); if (!TextUtils.isEmpty(channel)) { Bugly.setAppChannel(this, channel); } - //生命周期监听 if (lifeManager == null) { lifeManager = new ActivityLifeManager(); @@ -409,7 +406,7 @@ public class XChatApplication extends Application { return options; } - private MessageNotifierCustomization messageNotifierCustomization = new MessageNotifierCustomization() { + private final MessageNotifierCustomization messageNotifierCustomization = new MessageNotifierCustomization() { @Override public String makeNotifyContent(String nick, IMMessage message) { if (message.getMsgType() == MsgTypeEnum.custom) { @@ -419,9 +416,6 @@ public class XChatApplication extends Application { } else if (customAttachment instanceof OpenSignInAttachment) { return getContentFromOpenSignIn(customAttachment); } -// else if (customAttachment.getFirst() == CUSTOM_MSG_PUSH_NOTIFIFICATION){ -// return getContentRoomInvite(customAttachment); -// } } // 采用SDK默认文案 return "收到一条消息"; @@ -437,9 +431,6 @@ public class XChatApplication extends Application { } else if (customAttachment instanceof OpenSignInAttachment) { return getContentFromOpenSignIn(customAttachment); } -// else if (customAttachment instanceof RoomInviteFansAttachment){ -// return getContentRoomInvite(customAttachment); -// } } } // 采用SDK默认文案 @@ -460,20 +451,6 @@ public class XChatApplication extends Application { return result; } - private String getContentRoomInvite(CustomAttachment attachment) { - String result = null; - if (attachment instanceof RoomInviteFansAttachment) { - RoomInviteFansInfo roomInviteFansInfo = ((RoomInviteFansAttachment) attachment).getRoomInviteFansInfo(); - if (roomInviteFansInfo != null) { - result = roomInviteFansInfo.getData().getData().getContent(); - } - } - if (TextUtils.isEmpty(result)) { - result = "收到一条消息"; - } - return result; - } - @Override public String makeRevokeMsgTip(String s, IMMessage imMessage) { return null; @@ -533,72 +510,15 @@ public class XChatApplication extends Application { /** * 只允许在MainActivity上显示更新弹窗,其他activity上不显示弹窗; * 不设置会默认所有activity都可以显示弹窗; + * 2021/6/22 增加登录页面也可以弹出,万一域名挂了还可以用bugly更新!! */ Beta.canShowUpgradeActs.add(MainActivity.class); - + Beta.canShowUpgradeActs.add(QuickPassLoginAct.class); /** * 自定义布局 */ Beta.upgradeDialogLayoutId = R.layout.upgrade_dialog;//关键代码写这个布局添加自己想要的 - /** - * 设置自定义tip弹窗UI布局 - * 注意:因为要保持接口统一,需要用户在指定控件按照以下方式设置tag,否则会影响您的正常使用: - * 标题:beta_title,如:android:tag="beta_title" - * 提示信息:beta_tip_message 如: android:tag="beta_tip_message" - * 取消按钮:beta_cancel_button 如:android:tag="beta_cancel_button" - * 确定按钮:beta_confirm_button 如:android:tag="beta_confirm_button" - * 详见layout/tips_dialog.xml - */ - //Beta.tipsDialogLayoutId = R.layout.tips_dialog; - -// Beta.upgradeDialogLifecycleListener = new UILifecycleListener() { -// @Override -// public void onCreate(Context context, View view, UpgradeInfo upgradeInfo) { -// -// // 通过tag方式获取控件,并更改布局内容 -// TextView textView = (TextView) view.findViewWithTag("beta_upgrade_feature"); -// // 更多的操作:比如设置控件的点击事件 -// textView.setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View v) { -// -// } -// }); -// } -// -// @Override -// public void onStart(Context context, View view, UpgradeInfo upgradeInfo) { -// -// } -// -// @Override -// public void onResume(Context context, View view, UpgradeInfo upgradeInfo) { -// -// // 注:可通过这个回调方式获取布局的控件,如果设置了id,可通过findViewById方式获取,如果设置了tag,可以通过findViewWithTag,具体参考下面例子: -// -// -// } -// -// @Override -// public void onPause(Context context, View view, UpgradeInfo upgradeInfo) { -// -// } -// -// @Override -// public void onStop(Context context, View view, UpgradeInfo upgradeInfo) { -// -// } -// -// @Override -// public void onDestroy(Context context, View view, UpgradeInfo upgradeInfo) { -// -//// ToastUtils.showGravityToast(MyApplication.this,"更新后注意通知栏下载进度..."); -// } -// -// }; - - } /** @@ -659,9 +579,7 @@ public class XChatApplication extends Application { .setBaseUrl(url) .addInterceptors(new ParamsInterceptor(httpParams)) .addInterceptors(new NoParamsInterceptor())//注意:拦截器的添加顺序,请求的拦截顺序 - //.addInterceptors(new DomainInterceptor()) .certificates() - .hostnameVerifier(new ErBanAllHostnameVerifier()) .build(); //单例的model 初始化 initModel(); @@ -705,7 +623,6 @@ public class XChatApplication extends Application { */ private void initModel() { DynamicFaceModel.get().init(); -// RedPacketModel.get(); PayModel.get(); UserModel.get(); //ui层的萝卜钱包 @@ -725,7 +642,6 @@ public class XChatApplication extends Application { PublicChatHallModel.get(); // 模厅 HallDataManager.get().application(); -// HallModel.get(); // 师徒 MentoringRelationshipModel.get(); //全局处理 diff --git a/core/build.gradle b/core/build.gradle index 1d45e7cda..95c5d8d16 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -42,7 +42,6 @@ android { 'src/model_music/java', 'src/model_database_room/java', 'src/model_mini_world/java', - 'src/model_multi_domain/java', 'src/model_bank_card/java', 'src/model_super_admin/java', 'src/model_treasure_box/java', diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/bean/response/ServiceResult.java b/core/src/main/java/com/yizhuan/xchat_android_core/bean/response/ServiceResult.java index 38588b3f9..702c5dce2 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/bean/response/ServiceResult.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/bean/response/ServiceResult.java @@ -83,6 +83,7 @@ public class ServiceResult implements Serializable { public static final int DIAMONDNUMNOTENOUGH = 2104;//钻石数量不够 public static final int SMSCODEERROR = 4003;//短信验证码错误 public static final int WEEKNOTWITHCASHTOWNUMS = 1600;//每周提现俩次 + public static final int CODE_NEED_COMPLETE_USER_INFO = 1415;//每周提现俩次 /** 没有网络 */ public static final int NOT_NET = 50010; diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/interceptor/DomainInterceptor.java b/core/src/main/java/com/yizhuan/xchat_android_core/interceptor/DomainInterceptor.java deleted file mode 100644 index 5931a2650..000000000 --- a/core/src/main/java/com/yizhuan/xchat_android_core/interceptor/DomainInterceptor.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.yizhuan.xchat_android_core.interceptor; - -import android.text.TextUtils; - -import com.netease.nim.uikit.common.util.log.LogUtil; -import com.yizhuan.xchat_android_core.Env; -import com.yizhuan.xchat_android_core.domain.model.DomainModel; -import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils; - -import java.io.IOException; -import java.util.Objects; - -import okhttp3.HttpUrl; -import okhttp3.Interceptor; -import okhttp3.Request; -import okhttp3.Response; - -/** - * Created by MadisonRong on 2019-07-28 - */ -public class DomainInterceptor implements Interceptor { - - private static final String TAG = "DomainInterceptor"; - - @Override - public Response intercept(Chain chain) throws IOException { - if (Env.getCurrentEnv() == Env.EnvType.Staging) { - // 预发布环境下不走动态域名的逻辑 - return chain.proceed(chain.request()); - } - // 从缓存里获得可用域名 - String domain = (String) SharedPreferenceUtils.get(DomainModel.KEY_AVAILABLE_HOST, ""); - // 原请求里的域名 - Request oldRequest = chain.request(); - String host = oldRequest.url().host(); - LogUtil.e(TAG, String.format("intercept: host: %s, domain: %s", host, domain)); - String updateUrl = oldRequest.header("need_update_url"); - if (!TextUtils.isEmpty(updateUrl) && !Boolean.getBoolean(updateUrl)) { - return chain.proceed(oldRequest); - } - // 缓存域名为空,则认为是第一次启动,此时默认放行 - if (!TextUtils.isEmpty(domain)) { - String scheme = DomainModel.getInstance().getScheme(domain); - int port = DomainModel.getInstance().getPort(domain); - // 域名不同,表示需要更换域名进行访问 - domain = DomainModel.getInstance().getHostString(domain, false); - String tempHost = DomainModel.getInstance().getHostString(host, false); - LogUtil.e(TAG, String.format("intercept: scheme: %s, port: %s, domain: %s, tempHost: %s, host: %s", - scheme, port, domain, tempHost, host)); - if (!Objects.equals(domain, tempHost)) { - LogUtil.e(TAG, String.format("intercept: change domain, previous: %s, now: %s", host, domain)); - HttpUrl.Builder builder = oldRequest.url().newBuilder() - .scheme(scheme) - .port(port) - .host(domain); - Request newRequest = oldRequest.newBuilder() - .url(builder.build()) - .build(); - return chain.proceed(newRequest); - } - } - return chain.proceed(oldRequest); - } -} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/utils/net/ServerException.java b/core/src/main/java/com/yizhuan/xchat_android_core/utils/net/ServerException.java index 374c91989..2244ebb6d 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/utils/net/ServerException.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/utils/net/ServerException.java @@ -4,7 +4,7 @@ package com.yizhuan.xchat_android_core.utils.net; * Created by fwhm on 2017/7/27. */ -public class ServerException extends Exception { +public class ServerException extends RuntimeException { public int code; public ServerException(String message, int code) { diff --git a/core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/TEMP.java b/core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/TEMP.java deleted file mode 100644 index 03ff7540e..000000000 --- a/core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/TEMP.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.yizhuan.xchat_android_core.domain; - -/** - * Created by MadisonRong on 2019-07-27 - */ -public class TEMP { -} diff --git a/core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/model/DomainModel.java b/core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/model/DomainModel.java deleted file mode 100644 index 826a5f6aa..000000000 --- a/core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/model/DomainModel.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.yizhuan.xchat_android_core.domain.model; - -import androidx.annotation.NonNull; -import android.text.TextUtils; -import android.util.Log; - -import com.netease.nim.uikit.common.util.log.LogUtil; -import com.yizhuan.xchat_android_core.Env; -import com.yizhuan.xchat_android_core.UriProvider; -import com.yizhuan.xchat_android_core.base.BaseModel; -import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils; -import com.yizhuan.xchat_android_core.utils.net.RxHelper; -import com.yizhuan.xchat_android_library.utils.JavaUtil; - -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicReference; - -import io.reactivex.Single; -import io.reactivex.SingleOnSubscribe; -import io.reactivex.disposables.CompositeDisposable; -import io.reactivex.disposables.Disposable; - -/** - * Created by MadisonRong on 2019-07-27 - */ -public class DomainModel extends BaseModel implements IDomainModel { - - /** - * 目前可用的域名,用于整个 APP 进行业务接口调用 - */ - public static final String KEY_AVAILABLE_HOST = "AvailableHost"; - public static final String SCHEME_HTTP = "http"; - public static final String SCHEME_HTTPS = "https"; - public static final String HTTP = "http://"; - public static final String HTTPS = "https://"; - public static final int PORT_DEFAULT = 80; - private static final String TAG = "DomainModel"; - private String lb = Env.isDebug() ? "http://115.28.86.139/" : "http://118.190.129.218:10003/"; - // 记录域名检测列表 - private volatile List disposableList = new ArrayList<>(); - // 异步请求管理 - private volatile CompositeDisposable compositeDisposable = new CompositeDisposable(); - - private List domainList = new ArrayList<>(); - - private DomainModel() { - if (Env.isDebug()) { - domainList.add("http://apibeta.qxjiaoyou.com/"); - } else { - domainList.add("http://api.woaicv.com:10003/"); - domainList.add("http://api.woaiww.com:10003/"); - } - } - - public static DomainModel getInstance() { - return SingletonHolder.INSTANCE; - } - - @Override - public Single analyseDomain(String host) { - AtomicReference analyDisposable = new AtomicReference<>(); - return Single.create((SingleOnSubscribe) e -> { - LogUtil.e(TAG, "analyseDomain: " + host); - e.onSuccess(isAvailableHost(host)); - }) - .doOnSubscribe(disposable -> { - analyDisposable.set(disposable); - compositeDisposable.add(disposable); - disposableList.add(disposable); - }) - .doOnSuccess(result -> { - LogUtil.e(TAG, String.format("analyseDomain: %s result: %s", host, result)); - if (result) { - // 域名可用,先缓存起来 - SharedPreferenceUtils.put(KEY_AVAILABLE_HOST, host); - UriProvider.initUri(getBaseUrl(host), getBaseUrl(host), getBaseUrl(host)); - LogUtil.e(TAG, "analyseDomain: 往后请求都用此可用域名进行请求: " + host); - // 然后把其他的请求都停掉,避免泄露 - compositeDisposable.dispose(); - } - // 列表手动管理请求个数 - disposableList.remove(analyDisposable.get()); - Log.e(TAG, "analyseDomain: size of disposableList: " + disposableList.size()); - // 当列表个数为零时,则认为所有的域名都不可用了 - if (disposableList.size() == 0) { - // 所有域名都不行,尝试 LB - LogUtil.e(TAG, "analyseDomain: 所有域名都不行,尝试 LB "); - analyseDomain(lb).subscribe(); - } - }) - .compose(RxHelper.handleSchedulers()); - } - - public boolean isAvailableHost(String host) { - boolean result; - String ipAddress = ""; - String domain = getHostString(host, false); - InetAddress returnStr; - try { - returnStr = InetAddress.getByName(domain); - ipAddress = returnStr.getHostAddress(); - LogUtil.e(TAG, String.format("analyseDomain: %s ipAddress: %s", host, ipAddress)); - } catch (UnknownHostException exception) { - LogUtil.e(TAG, String.format("analyseDomain: %s exception: %s", host, exception.getMessage(), exception)); - //未知主机,域名解析失败 - result = false; - } - // 域名解析成功 - result = !TextUtils.isEmpty(ipAddress); - return result; - } - - @NonNull - /** - * 获取 host - * @param needPort 是否需要端口号 - */ - public String getHostString(String host, boolean needPort) { - String domain = host; - domain = domain.startsWith(HTTP) ? domain.substring(HTTP.length()) : domain; - domain = domain.startsWith(HTTPS) ? domain.substring(HTTPS.length()) : domain; - domain = domain.replaceAll("/", "").trim(); - if (!needPort && domain.contains(":")) { - domain = domain.split(":")[0]; - } - return domain; - } - - /** - * 基本都是 H5 要用到 - * - * @param host - * @return - */ - public String getBaseUrl(String host) { - if (TextUtils.isEmpty(host)) return host; - return host.endsWith("/") ? host : host + "/"; - } - - /** - * 获取域名中的协议头,http 还是 https - * - * @param host - * @return - */ - public String getScheme(String host) { - if (TextUtils.isEmpty(host)) return SCHEME_HTTP; - if (host.startsWith(HTTPS)) return SCHEME_HTTPS; - if (host.startsWith(HTTP)) return SCHEME_HTTP; - return SCHEME_HTTP; - } - - /** - * 获取端口号 - * - * @param host - * @return - */ - public int getPort(String host) { - if (TextUtils.isEmpty(host)) return PORT_DEFAULT; - if (host.contains(":")) { - String[] strings = host.split(":"); - if (strings.length <= 1) return PORT_DEFAULT; - String string = strings[strings.length - 1]; - string = string.replaceAll("/", "").trim(); - int result = JavaUtil.str2int(string); - return result > 0 ? result : PORT_DEFAULT; - } - return PORT_DEFAULT; - } - - public List getDomainList() { - return domainList; - } - - public void appendDomainList(List urls) { - this.domainList.addAll(urls); - } - - private static class SingletonHolder { - private static final DomainModel INSTANCE = new DomainModel(); - } -} diff --git a/core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/model/IDomainModel.java b/core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/model/IDomainModel.java deleted file mode 100644 index c2555d7c4..000000000 --- a/core/src/model_multi_domain/java/com/yizhuan/xchat_android_core/domain/model/IDomainModel.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.yizhuan.xchat_android_core.domain.model; - -import com.yizhuan.xchat_android_core.base.IModel; - -import io.reactivex.Single; - -/** - * Created by MadisonRong on 2019-07-27 - */ -public interface IDomainModel extends IModel { - - /** - * 域名是否可用 - * @param host - * @return - */ - Single analyseDomain(String host); - -} diff --git a/library/build.gradle b/library/build.gradle index b38f62e76..f0c7d3a7a 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -40,7 +40,6 @@ dependencies { def okhttp3 = "3.14.9" def okio = "2.2.2" def rxjava_adapter = "2.3.0" - def gson_converter = "2.9.0" def rxjava = "2.1.7" def rxjava_android = "2.0.1" def rxlifecycle = "3.1.0" @@ -73,8 +72,7 @@ dependencies { api "com.squareup.okhttp3:okhttp:${okhttp3}" api "com.squareup.okhttp3:logging-interceptor:${okhttp3}" api "com.squareup.retrofit2:adapter-rxjava2:${rxjava_adapter}" - api "com.squareup.retrofit2:converter-gson:${gson_converter}" - + api 'com.google.code.gson:gson:2.8.7' api "com.squareup.okio:okio:${okio}" api "com.scwang.smartrefresh:SmartRefreshLayout:${SmartRefreshLayoutVersion}" diff --git a/library/src/main/java/com/yizhuan/xchat_android_library/net/ErBanAllHostnameVerifier.java b/library/src/main/java/com/yizhuan/xchat_android_library/net/ErBanAllHostnameVerifier.java deleted file mode 100644 index 9e6fdc8b0..000000000 --- a/library/src/main/java/com/yizhuan/xchat_android_library/net/ErBanAllHostnameVerifier.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.yizhuan.xchat_android_library.net; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.SSLSession; - -/** - *

- * - * @author jiahui - * @date 2017/12/16 - */ -public final class ErBanAllHostnameVerifier implements HostnameVerifier { - - @Override - public boolean verify(String hostname, SSLSession session) { - //信任所有的证书 - return true; - } -} diff --git a/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonConverterFactory.java b/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonConverterFactory.java new file mode 100644 index 000000000..4d2a191b7 --- /dev/null +++ b/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonConverterFactory.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2015 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yizhuan.xchat_android_library.net.rxnet.converter; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.reflect.TypeToken; + +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.Converter; +import retrofit2.Retrofit; + +/** + * A {@linkplain Converter.Factory converter} which uses Gson for JSON. + * + *

Because Gson is so flexible in the types it supports, this converter assumes that it can + * handle all types. If you are mixing JSON serialization with something else (such as protocol + * buffers), you must {@linkplain Retrofit.Builder#addConverterFactory(Converter.Factory) add this + * instance} last to allow the other converters a chance to see their types. + */ +public final class GsonConverterFactory extends Converter.Factory { + /** + * Create an instance using a default {@link Gson} instance for conversion. Encoding to JSON and + * decoding from JSON (when no charset is specified by a header) will use UTF-8. + */ + public static GsonConverterFactory create() { + return create(new Gson()); + } + + /** + * Create an instance using {@code gson} for conversion. Encoding to JSON and decoding from JSON + * (when no charset is specified by a header) will use UTF-8. + */ + @SuppressWarnings("ConstantConditions") // Guarding public API nullability. + public static GsonConverterFactory create(Gson gson) { + if (gson == null) throw new NullPointerException("gson == null"); + return new GsonConverterFactory(gson); + } + + private final Gson gson; + + private GsonConverterFactory(Gson gson) { + this.gson = gson; + } + + @Override + public Converter responseBodyConverter( + Type type, Annotation[] annotations, Retrofit retrofit) { + TypeAdapter adapter = gson.getAdapter(TypeToken.get(type)); + return new GsonResponseBodyConverter<>(gson, adapter); + } + + @Override + public Converter requestBodyConverter( + Type type, + Annotation[] parameterAnnotations, + Annotation[] methodAnnotations, + Retrofit retrofit) { + TypeAdapter adapter = gson.getAdapter(TypeToken.get(type)); + return new GsonRequestBodyConverter<>(gson, adapter); + } +} diff --git a/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonConverterPlugins.java b/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonConverterPlugins.java new file mode 100644 index 000000000..0e017dc54 --- /dev/null +++ b/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonConverterPlugins.java @@ -0,0 +1,30 @@ +package com.yizhuan.xchat_android_library.net.rxnet.converter; + + +import androidx.annotation.Nullable; + + +import kotlin.jvm.functions.Function1; + +public class GsonConverterPlugins { + + private static Function1 resultHandler; + static volatile boolean lockdown; + + public static void onConvertResult(@Nullable Object object) { + if (resultHandler != null && object != null) { + resultHandler.invoke(object); + } + } + + public static void setResultHandler(Function1 handler) { + if (lockdown) { + throw new IllegalStateException("GsonConverterPlugins can't be changed anymore"); + } + resultHandler = handler; + } + + public static void lockdown() { + lockdown = true; + } +} diff --git a/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonRequestBodyConverter.java b/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonRequestBodyConverter.java new file mode 100644 index 000000000..bba0398fa --- /dev/null +++ b/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonRequestBodyConverter.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2015 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yizhuan.xchat_android_library.net.rxnet.converter; + +import com.google.gson.Gson; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonWriter; + +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.nio.charset.Charset; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okio.Buffer; +import retrofit2.Converter; + +final class GsonRequestBodyConverter implements Converter { + private static final MediaType MEDIA_TYPE = MediaType.get("application/json; charset=UTF-8"); + private static final Charset UTF_8 = Charset.forName("UTF-8"); + + private final Gson gson; + private final TypeAdapter adapter; + + GsonRequestBodyConverter(Gson gson, TypeAdapter adapter) { + this.gson = gson; + this.adapter = adapter; + } + + @Override + public RequestBody convert(@NotNull T value) throws IOException { + Buffer buffer = new Buffer(); + Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8); + JsonWriter jsonWriter = gson.newJsonWriter(writer); + adapter.write(jsonWriter, value); + jsonWriter.close(); + return RequestBody.create(MEDIA_TYPE, buffer.readByteString()); + } +} diff --git a/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonResponseBodyConverter.java b/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonResponseBodyConverter.java new file mode 100644 index 000000000..6e7eb118f --- /dev/null +++ b/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/converter/GsonResponseBodyConverter.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2015 Square, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yizhuan.xchat_android_library.net.rxnet.converter; + +import com.google.gson.Gson; +import com.google.gson.JsonIOException; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; + +import java.io.IOException; + +import okhttp3.ResponseBody; +import retrofit2.Converter; + +final class GsonResponseBodyConverter implements Converter { + private final Gson gson; + private final TypeAdapter adapter; + + GsonResponseBodyConverter(Gson gson, TypeAdapter adapter) { + this.gson = gson; + this.adapter = adapter; + } + + @Override + public T convert(ResponseBody value) throws IOException { + JsonReader jsonReader = gson.newJsonReader(value.charStream()); + try { + T result = adapter.read(jsonReader); + if (jsonReader.peek() != JsonToken.END_DOCUMENT) { + throw new JsonIOException("JSON document was not fully consumed."); + } + //hook + GsonConverterPlugins.onConvertResult(result); + + return result; + } finally { + value.close(); + } + } +} diff --git a/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/manager/RxNetManager.java b/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/manager/RxNetManager.java index 6b92cf7fa..8c39ddcae 100644 --- a/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/manager/RxNetManager.java +++ b/library/src/main/java/com/yizhuan/xchat_android_library/net/rxnet/manager/RxNetManager.java @@ -5,6 +5,7 @@ import android.content.Context; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.yizhuan.xchat_android_library.BuildConfig; +import com.yizhuan.xchat_android_library.net.rxnet.converter.GsonConverterFactory; import com.yizhuan.xchat_android_library.net.rxnet.https.HttpsUtils; import com.yizhuan.xchat_android_library.net.rxnet.interceptor.HttpLoggingInterceptor; import com.yizhuan.xchat_android_library.net.rxnet.utils.RxNetLog; @@ -29,7 +30,6 @@ import okhttp3.Interceptor; import okhttp3.OkHttpClient; import retrofit2.Retrofit; import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; -import retrofit2.converter.gson.GsonConverterFactory; /** *

RxNet 管理类