From 1f2f4136e648ab4343afb1c80c6e042c429a8c91 Mon Sep 17 00:00:00 2001 From: Js0n Date: Sat, 22 Feb 2025 15:18:00 +0800 Subject: [PATCH] feat: properly set OkHttp header (#2463) properly send `User-Agent` and `Accept-Language` to `updateJson` server, module developers can check `User-Agent` whether to send update to user and set user preferred language for changelog. also added cache to reduce update server load --- .../java/me/weishu/kernelsu/KernelSUApplication.kt | 13 +++++++++++++ .../java/me/weishu/kernelsu/ui/screen/Module.kt | 4 ++-- .../java/me/weishu/kernelsu/ui/util/Downloader.kt | 3 ++- .../weishu/kernelsu/ui/viewmodel/ModuleViewModel.kt | 8 +++----- .../kernelsu/ui/viewmodel/TemplateViewModel.kt | 13 +++---------- 5 files changed, 23 insertions(+), 18 deletions(-) diff --git a/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt b/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt index 3b07b99c..1d3c64af 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/KernelSUApplication.kt @@ -6,12 +6,25 @@ import coil.Coil import coil.ImageLoader import me.zhanghai.android.appiconloader.coil.AppIconFetcher import me.zhanghai.android.appiconloader.coil.AppIconKeyer +import okhttp3.Cache +import okhttp3.OkHttpClient import java.io.File +import java.util.Locale lateinit var ksuApp: KernelSUApplication class KernelSUApplication : Application() { + val okhttpClient = + OkHttpClient.Builder().cache(Cache(File(cacheDir, "okhttp"), 10 * 1024 * 1024)) + .addInterceptor { block -> + block.proceed( + block.request().newBuilder() + .header("User-Agent", "KernelSU/${BuildConfig.VERSION_CODE}") + .header("Accept-Language", Locale.getDefault().toLanguageTag()).build() + ) + }.build() + override fun onCreate() { super.onCreate() ksuApp = this diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt index beddc887..dba15ded 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/screen/Module.kt @@ -92,6 +92,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import me.weishu.kernelsu.Natives import me.weishu.kernelsu.R +import me.weishu.kernelsu.ksuApp import me.weishu.kernelsu.ui.component.ConfirmResult import me.weishu.kernelsu.ui.component.SearchAppBar import me.weishu.kernelsu.ui.component.rememberConfirmDialog @@ -105,7 +106,6 @@ import me.weishu.kernelsu.ui.util.toggleModule import me.weishu.kernelsu.ui.util.uninstallModule import me.weishu.kernelsu.ui.viewmodel.ModuleViewModel import me.weishu.kernelsu.ui.webui.WebUIActivity -import okhttp3.OkHttpClient @OptIn(ExperimentalMaterial3Api::class) @Destination @@ -314,7 +314,7 @@ private fun ModuleList( val changelogResult = loadingDialog.withLoading { withContext(Dispatchers.IO) { runCatching { - OkHttpClient().newCall( + ksuApp.okhttpClient.newCall( okhttp3.Request.Builder().url(changelogUrl).build() ).execute().body!!.string() } diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/Downloader.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/Downloader.kt index bdf84966..3b799c45 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/util/Downloader.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/util/Downloader.kt @@ -11,6 +11,7 @@ import android.os.Environment import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.core.content.ContextCompat +import me.weishu.kernelsu.ksuApp import me.weishu.kernelsu.ui.util.module.LatestVersionInfo /** @@ -66,7 +67,7 @@ fun checkNewVersion(): LatestVersionInfo { // default null value if failed val defaultValue = LatestVersionInfo() runCatching { - okhttp3.OkHttpClient().newCall(okhttp3.Request.Builder().url(url).build()).execute() + ksuApp.okhttpClient.newCall(okhttp3.Request.Builder().url(url).build()).execute() .use { response -> if (!response.isSuccessful) { return defaultValue diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/ModuleViewModel.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/ModuleViewModel.kt index 6561aea1..928d5ab1 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/ModuleViewModel.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/ModuleViewModel.kt @@ -10,6 +10,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import me.weishu.kernelsu.ksuApp import me.weishu.kernelsu.ui.util.HanziToPinyin import me.weishu.kernelsu.ui.util.listModules import me.weishu.kernelsu.ui.util.overlayFsAvailable @@ -137,11 +138,8 @@ class ModuleViewModel : ViewModel() { val result = kotlin.runCatching { val url = m.updateJson Log.i(TAG, "checkUpdate url: $url") - val response = okhttp3.OkHttpClient() - .newCall( - okhttp3.Request.Builder() - .url(url) - .build() + val response = ksuApp.okhttpClient.newCall( + okhttp3.Request.Builder().url(url).build() ).execute() Log.d(TAG, "checkUpdate code: ${response.code}") if (response.isSuccessful) { diff --git a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/TemplateViewModel.kt b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/TemplateViewModel.kt index cbed82f2..e825d5e9 100644 --- a/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/TemplateViewModel.kt +++ b/manager/app/src/main/java/me/weishu/kernelsu/ui/viewmodel/TemplateViewModel.kt @@ -11,18 +11,17 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.parcelize.Parcelize import me.weishu.kernelsu.Natives +import me.weishu.kernelsu.ksuApp import me.weishu.kernelsu.profile.Capabilities import me.weishu.kernelsu.profile.Groups import me.weishu.kernelsu.ui.util.getAppProfileTemplate import me.weishu.kernelsu.ui.util.listAppProfileTemplates import me.weishu.kernelsu.ui.util.setAppProfileTemplate -import okhttp3.OkHttpClient import okhttp3.Request import org.json.JSONArray import org.json.JSONObject import java.text.Collator import java.util.Locale -import java.util.concurrent.TimeUnit /** @@ -138,13 +137,7 @@ class TemplateViewModel : ViewModel() { private fun fetchRemoteTemplates() { runCatching { - val client: OkHttpClient = OkHttpClient.Builder() - .connectTimeout(5, TimeUnit.SECONDS) - .writeTimeout(5, TimeUnit.SECONDS) - .readTimeout(10, TimeUnit.SECONDS) - .build() - - client.newCall( + ksuApp.okhttpClient.newCall( Request.Builder().url(TEMPLATE_INDEX_URL).build() ).execute().use { response -> if (!response.isSuccessful) { @@ -155,7 +148,7 @@ private fun fetchRemoteTemplates() { 0.until(remoteTemplateIds.length()).forEach { i -> val id = remoteTemplateIds.getString(i) Log.i(TAG, "fetch template: $id") - val templateJson = client.newCall( + val templateJson = ksuApp.okhttpClient.newCall( Request.Builder().url(TEMPLATE_URL.format(id)).build() ).runCatching { execute().use { response ->