From 055e6376818d6ff3ca5c2dc9e54c963a6af23a93 Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Sat, 11 Mar 2023 23:15:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=97=A0=E7=BD=91=E7=BB=9C=E6=A3=80?= =?UTF-8?q?=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tieba/post/api/HttpConstant.kt | 2 +- .../post/api/retrofit/RetrofitTiebaApi.kt | 3 + .../exception/NoConnectivityException.kt | 7 ++ .../interceptors/ConnectivityInterceptor.kt | 32 +++++++ .../tieba/post/utils/NetworkUtil.kt | 91 +++++++++---------- app/src/main/res/values/strings.xml | 8 ++ 6 files changed, 93 insertions(+), 50 deletions(-) create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/exception/NoConnectivityException.kt create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interceptors/ConnectivityInterceptor.kt diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/HttpConstant.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/HttpConstant.kt index 98cebac4..fe3f34c2 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/HttpConstant.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/HttpConstant.kt @@ -11,7 +11,7 @@ object Method { } object Error { - const val ERROR_NET = 10 + const val ERROR_NETWORK = 10 const val ERROR_UNKNOWN = -1 const val ERROR_PARSE = -2 const val ERROR_NOT_LOGGED_IN = 11 diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt index 22a298bd..a61605cf 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt @@ -13,6 +13,7 @@ import com.huanchengfly.tieba.post.api.retrofit.converter.gson.GsonConverterFact import com.huanchengfly.tieba.post.api.retrofit.interceptors.AddWebCookieInterceptor import com.huanchengfly.tieba.post.api.retrofit.interceptors.CommonHeaderInterceptor import com.huanchengfly.tieba.post.api.retrofit.interceptors.CommonParamInterceptor +import com.huanchengfly.tieba.post.api.retrofit.interceptors.ConnectivityInterceptor import com.huanchengfly.tieba.post.api.retrofit.interceptors.CookieInterceptor import com.huanchengfly.tieba.post.api.retrofit.interceptors.DropInterceptor import com.huanchengfly.tieba.post.api.retrofit.interceptors.FailureResponseInterceptor @@ -224,6 +225,7 @@ object RetrofitTiebaApi { addInterceptor(FailureResponseInterceptor) addInterceptor(ForceLoginInterceptor) addInterceptor(sortAndSignInterceptor) + addInterceptor(ConnectivityInterceptor) connectionPool(connectionPool) }.build()) .build() @@ -250,6 +252,7 @@ object RetrofitTiebaApi { addInterceptor(ForceLoginInterceptor) addInterceptor(CookieInterceptor) addInterceptor(sortAndSignInterceptor) + addInterceptor(ConnectivityInterceptor) connectionPool(connectionPool) }.build()) .build() diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/exception/NoConnectivityException.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/exception/NoConnectivityException.kt new file mode 100644 index 00000000..aff19ef9 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/exception/NoConnectivityException.kt @@ -0,0 +1,7 @@ +package com.huanchengfly.tieba.post.api.retrofit.exception + +import com.huanchengfly.tieba.post.api.Error.ERROR_NETWORK + +class NoConnectivityException( + msg: String = "No internet!" +) : TiebaLocalException(ERROR_NETWORK, msg) \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interceptors/ConnectivityInterceptor.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interceptors/ConnectivityInterceptor.kt new file mode 100644 index 00000000..d22e8c4f --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/interceptors/ConnectivityInterceptor.kt @@ -0,0 +1,32 @@ +package com.huanchengfly.tieba.post.api.retrofit.interceptors + +import com.huanchengfly.tieba.post.App +import com.huanchengfly.tieba.post.R +import com.huanchengfly.tieba.post.api.retrofit.exception.NoConnectivityException +import com.huanchengfly.tieba.post.utils.isNetworkConnected +import okhttp3.Interceptor +import okhttp3.Response +import java.io.IOException +import java.net.SocketTimeoutException + +object ConnectivityInterceptor : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val response = runCatching { chain.proceed(chain.request()) } + + val exception = response.exceptionOrNull() + + return when { + exception is IOException && !isNetworkConnected() -> throw NoConnectivityException( + App.INSTANCE.getString( + R.string.no_internet_connectivity + ) + ) + + exception is SocketTimeoutException && isNetworkConnected() -> throw NoConnectivityException( + App.INSTANCE.getString(R.string.connectivity_timeout) + ) + + else -> response.getOrThrow() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/NetworkUtil.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/NetworkUtil.kt index 913aed2e..1de24374 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/utils/NetworkUtil.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/NetworkUtil.kt @@ -1,61 +1,54 @@ -package com.huanchengfly.tieba.post.utils; +package com.huanchengfly.tieba.post.utils -import android.content.Context; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; +import android.content.Context +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.os.Build +import com.huanchengfly.tieba.post.App -public final class NetworkUtil { - private NetworkUtil() { +fun isNetworkConnected(context: Context = App.INSTANCE): Boolean { + val connectivityManager = + context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + val activeNetwork = connectivityManager.activeNetworkInfo ?: return false + return activeNetwork.isConnected + } else { + val network = connectivityManager.activeNetwork ?: return false + val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false + return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) + } +} + +object NetworkUtil { + fun isNetworkConnected(context: Context?): Boolean { + if (context == null) { + return false + } + val mConnectivityManager = context + .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val mNetworkInfo = mConnectivityManager.activeNetworkInfo ?: return false + return mNetworkInfo.isConnected } - public static boolean isNetworkConnected(Context context) { + fun isWifiConnected(context: Context?): Boolean { if (context == null) { - return false; + return false } - ConnectivityManager mConnectivityManager = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - if (mConnectivityManager == null) { - return false; - } - NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); - if (mNetworkInfo == null) { - return false; - } - return mNetworkInfo.isConnected(); + val mConnectivityManager = context + .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val mWiFiNetworkInfo = mConnectivityManager + .getNetworkInfo(ConnectivityManager.TYPE_WIFI) ?: return false + return mWiFiNetworkInfo.isConnected } - public static boolean isWifiConnected(Context context) { + fun isMobileConnected(context: Context?): Boolean { if (context == null) { - return false; + return false } - ConnectivityManager mConnectivityManager = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - if (mConnectivityManager == null) { - return false; - } - NetworkInfo mWiFiNetworkInfo = mConnectivityManager - .getNetworkInfo(ConnectivityManager.TYPE_WIFI); - - if (mWiFiNetworkInfo == null) { - return false; - } - return mWiFiNetworkInfo.isConnected(); - } - - public static boolean isMobileConnected(Context context) { - if (context == null) { - return false; - } - ConnectivityManager mConnectivityManager = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - if (mConnectivityManager == null) { - return false; - } - NetworkInfo mMobileNetworkInfo = mConnectivityManager - .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); - if (mMobileNetworkInfo == null) { - return false; - } - return mMobileNetworkInfo.isConnected(); + val mConnectivityManager = context + .getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + val mMobileNetworkInfo = mConnectivityManager + .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) ?: return false + return mMobileNetworkInfo.isConnected } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aa4c02d0..8fd3a784 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -649,4 +649,12 @@ 去登录 随便看看 你还未登录 + 无互联网连接 + 连接超时 + 网络找不到了 + 服务器有一些自己的想法 + 发生了一个奇怪的错误… + %s。请检查你的网络连接是否正常 + 哦我的老伙计,我向你保证这真的是一个奇怪的错误…… + 重新加载