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。请检查你的网络连接是否正常
+ 哦我的老伙计,我向你保证这真的是一个奇怪的错误……
+ 重新加载