From 613e58767e14b30a058c4d1af922c4496e41633c Mon Sep 17 00:00:00 2001
From: ocean <503259349@qq.com>
Date: Mon, 22 Jul 2024 16:00:06 +0800
Subject: [PATCH] update
---
app/src/main/AndroidManifest.xml | 2 +
.../offline/music/fragment/MoHomeFragment.kt | 5 +++
.../melody/offline/music/http/MyHttpUtil.kt | 27 +++++++++++++
.../offline/music/innertube/Innertube.kt | 7 ++++
.../music/innertube/utils/CustomDns.kt | 39 +++++++++++++++++++
5 files changed, 80 insertions(+)
create mode 100644 app/src/main/java/melody/offline/music/innertube/utils/CustomDns.kt
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9ae704b..17f08bb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,6 +10,8 @@
+
+
diff --git a/app/src/main/java/melody/offline/music/fragment/MoHomeFragment.kt b/app/src/main/java/melody/offline/music/fragment/MoHomeFragment.kt
index 657a40c..01154da 100644
--- a/app/src/main/java/melody/offline/music/fragment/MoHomeFragment.kt
+++ b/app/src/main/java/melody/offline/music/fragment/MoHomeFragment.kt
@@ -46,6 +46,7 @@ import melody.offline.music.bean.FavoriteBean
import melody.offline.music.bean.OfflineBean
import melody.offline.music.bean.Playlist
import melody.offline.music.bean.PlaylistItem
+import melody.offline.music.http.MyHttpUtil
import melody.offline.music.service.MyDownloadService
import melody.offline.music.util.AnalysisUtil
import melody.offline.music.util.DownloadUtil
@@ -398,8 +399,12 @@ class MoHomeFragment : MoBaseFragment(),
}
private fun showNoContentUi(string: String) {
+ val networkType = MyHttpUtil.mInstance.getNetworkType(requireActivity())
+ val isVpnConnected = MyHttpUtil.mInstance.isVpnConnected(requireActivity())
val jsonObject = JSONObject()
jsonObject.put("fail", string)
+ jsonObject.put("networkType", networkType)
+ jsonObject.put("isVpnConnected", isVpnConnected)
val map = mutableMapOf(Pair(AnalysisUtil.PARAM_VALUE, jsonObject.toString()))
AnalysisUtil.logEvent(AnalysisUtil.HOME_B_MODULE_SHOW_FAIL_ACTION, map)
diff --git a/app/src/main/java/melody/offline/music/http/MyHttpUtil.kt b/app/src/main/java/melody/offline/music/http/MyHttpUtil.kt
index 4894bf2..9a78acf 100644
--- a/app/src/main/java/melody/offline/music/http/MyHttpUtil.kt
+++ b/app/src/main/java/melody/offline/music/http/MyHttpUtil.kt
@@ -2,6 +2,7 @@ package melody.offline.music.http
import android.content.Context
import android.net.ConnectivityManager
+import android.net.NetworkCapabilities
import okhttp3.Callback
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
@@ -87,4 +88,30 @@ class MyHttpUtil {
//同步执行会话请求
call.enqueue(callback)
}
+
+ fun getNetworkType(context: Context): String {
+ val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+ val activeNetwork = connectivityManager.activeNetwork
+ val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork)
+
+ return when {
+ networkCapabilities == null -> "No connection"
+ networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> "Wi-Fi"
+ networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> "Mobile Data"
+ networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> "Ethernet"
+ else -> "Unknown"
+ }
+ }
+
+ fun isVpnConnected(context: Context): Boolean {
+ val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
+ val networks = connectivityManager.allNetworks
+ for (network in networks) {
+ val networkCapabilities = connectivityManager.getNetworkCapabilities(network)
+ if (networkCapabilities != null && networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
+ return true
+ }
+ }
+ return false
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/melody/offline/music/innertube/Innertube.kt b/app/src/main/java/melody/offline/music/innertube/Innertube.kt
index b7c50be..b734c0f 100644
--- a/app/src/main/java/melody/offline/music/innertube/Innertube.kt
+++ b/app/src/main/java/melody/offline/music/innertube/Innertube.kt
@@ -21,6 +21,7 @@ import io.ktor.http.HttpHeaders
import io.ktor.serialization.kotlinx.json.json
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json
+import melody.offline.music.innertube.utils.CustomDns
object Innertube {
val TAG = LogTag.VO_API_LOG
@@ -29,6 +30,12 @@ object Innertube {
expectSuccess = true
+ engine {
+ config {
+ dns(CustomDns())
+ }
+ }
+
install(ContentNegotiation) {
@OptIn(ExperimentalSerializationApi::class)
json(Json {
diff --git a/app/src/main/java/melody/offline/music/innertube/utils/CustomDns.kt b/app/src/main/java/melody/offline/music/innertube/utils/CustomDns.kt
new file mode 100644
index 0000000..70cfeab
--- /dev/null
+++ b/app/src/main/java/melody/offline/music/innertube/utils/CustomDns.kt
@@ -0,0 +1,39 @@
+package melody.offline.music.innertube.utils
+
+import okhttp3.Dns
+import java.net.InetAddress
+import java.net.UnknownHostException
+
+// 自定义 DNS 解析器
+class CustomDns : Dns {
+ override fun lookup(hostname: String): List {
+ return try {
+ // 使用系统默认的 DNS 解析器
+ val systemAddresses = Dns.SYSTEM.lookup(hostname)
+ // 如果系统 DNS 解析失败,使用备用 DNS
+ if (systemAddresses.isEmpty()) {
+ mutableListOf().apply {
+ // 备用 DNS
+ add(InetAddress.getByName("1.1.1.1")) // Cloudflare DNS
+ add(InetAddress.getByName("8.8.8.8")) // Google DNS
+ add(InetAddress.getByName("8.8.4.4")) // Google DNS
+ add(InetAddress.getByName("200.1.123.5")) // Level3 DNS
+ add(InetAddress.getByName("200.1.123.6")) // Level3 DNS
+ add(InetAddress.getByName("189.38.95.95")) // NIC.br DNS
+ }
+ } else {
+ systemAddresses
+ }
+ } catch (e: UnknownHostException) {
+ // 处理异常情况,使用备用 DNS
+ mutableListOf().apply {
+ add(InetAddress.getByName("1.1.1.1")) // Cloudflare DNS
+ add(InetAddress.getByName("8.8.8.8")) // Google DNS
+ add(InetAddress.getByName("8.8.4.4")) // Google DNS
+ add(InetAddress.getByName("200.1.123.5")) // Level3 DNS
+ add(InetAddress.getByName("200.1.123.6")) // Level3 DNS
+ add(InetAddress.getByName("189.38.95.95")) // NIC.br DNS
+ }
+ }
+ }
+}
\ No newline at end of file