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
This commit is contained in:
@@ -6,12 +6,25 @@ import coil.Coil
|
|||||||
import coil.ImageLoader
|
import coil.ImageLoader
|
||||||
import me.zhanghai.android.appiconloader.coil.AppIconFetcher
|
import me.zhanghai.android.appiconloader.coil.AppIconFetcher
|
||||||
import me.zhanghai.android.appiconloader.coil.AppIconKeyer
|
import me.zhanghai.android.appiconloader.coil.AppIconKeyer
|
||||||
|
import okhttp3.Cache
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
lateinit var ksuApp: KernelSUApplication
|
lateinit var ksuApp: KernelSUApplication
|
||||||
|
|
||||||
class KernelSUApplication : Application() {
|
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() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
ksuApp = this
|
ksuApp = this
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ import kotlinx.coroutines.launch
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import me.weishu.kernelsu.Natives
|
import me.weishu.kernelsu.Natives
|
||||||
import me.weishu.kernelsu.R
|
import me.weishu.kernelsu.R
|
||||||
|
import me.weishu.kernelsu.ksuApp
|
||||||
import me.weishu.kernelsu.ui.component.ConfirmResult
|
import me.weishu.kernelsu.ui.component.ConfirmResult
|
||||||
import me.weishu.kernelsu.ui.component.SearchAppBar
|
import me.weishu.kernelsu.ui.component.SearchAppBar
|
||||||
import me.weishu.kernelsu.ui.component.rememberConfirmDialog
|
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.util.uninstallModule
|
||||||
import me.weishu.kernelsu.ui.viewmodel.ModuleViewModel
|
import me.weishu.kernelsu.ui.viewmodel.ModuleViewModel
|
||||||
import me.weishu.kernelsu.ui.webui.WebUIActivity
|
import me.weishu.kernelsu.ui.webui.WebUIActivity
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Destination<RootGraph>
|
@Destination<RootGraph>
|
||||||
@@ -314,7 +314,7 @@ private fun ModuleList(
|
|||||||
val changelogResult = loadingDialog.withLoading {
|
val changelogResult = loadingDialog.withLoading {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
runCatching {
|
runCatching {
|
||||||
OkHttpClient().newCall(
|
ksuApp.okhttpClient.newCall(
|
||||||
okhttp3.Request.Builder().url(changelogUrl).build()
|
okhttp3.Request.Builder().url(changelogUrl).build()
|
||||||
).execute().body!!.string()
|
).execute().body!!.string()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import android.os.Environment
|
|||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.DisposableEffect
|
import androidx.compose.runtime.DisposableEffect
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
|
import me.weishu.kernelsu.ksuApp
|
||||||
import me.weishu.kernelsu.ui.util.module.LatestVersionInfo
|
import me.weishu.kernelsu.ui.util.module.LatestVersionInfo
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -66,7 +67,7 @@ fun checkNewVersion(): LatestVersionInfo {
|
|||||||
// default null value if failed
|
// default null value if failed
|
||||||
val defaultValue = LatestVersionInfo()
|
val defaultValue = LatestVersionInfo()
|
||||||
runCatching {
|
runCatching {
|
||||||
okhttp3.OkHttpClient().newCall(okhttp3.Request.Builder().url(url).build()).execute()
|
ksuApp.okhttpClient.newCall(okhttp3.Request.Builder().url(url).build()).execute()
|
||||||
.use { response ->
|
.use { response ->
|
||||||
if (!response.isSuccessful) {
|
if (!response.isSuccessful) {
|
||||||
return defaultValue
|
return defaultValue
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import androidx.lifecycle.ViewModel
|
|||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import me.weishu.kernelsu.ksuApp
|
||||||
import me.weishu.kernelsu.ui.util.HanziToPinyin
|
import me.weishu.kernelsu.ui.util.HanziToPinyin
|
||||||
import me.weishu.kernelsu.ui.util.listModules
|
import me.weishu.kernelsu.ui.util.listModules
|
||||||
import me.weishu.kernelsu.ui.util.overlayFsAvailable
|
import me.weishu.kernelsu.ui.util.overlayFsAvailable
|
||||||
@@ -137,11 +138,8 @@ class ModuleViewModel : ViewModel() {
|
|||||||
val result = kotlin.runCatching {
|
val result = kotlin.runCatching {
|
||||||
val url = m.updateJson
|
val url = m.updateJson
|
||||||
Log.i(TAG, "checkUpdate url: $url")
|
Log.i(TAG, "checkUpdate url: $url")
|
||||||
val response = okhttp3.OkHttpClient()
|
val response = ksuApp.okhttpClient.newCall(
|
||||||
.newCall(
|
okhttp3.Request.Builder().url(url).build()
|
||||||
okhttp3.Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
).execute()
|
).execute()
|
||||||
Log.d(TAG, "checkUpdate code: ${response.code}")
|
Log.d(TAG, "checkUpdate code: ${response.code}")
|
||||||
if (response.isSuccessful) {
|
if (response.isSuccessful) {
|
||||||
|
|||||||
@@ -11,18 +11,17 @@ import kotlinx.coroutines.Dispatchers
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
import me.weishu.kernelsu.Natives
|
import me.weishu.kernelsu.Natives
|
||||||
|
import me.weishu.kernelsu.ksuApp
|
||||||
import me.weishu.kernelsu.profile.Capabilities
|
import me.weishu.kernelsu.profile.Capabilities
|
||||||
import me.weishu.kernelsu.profile.Groups
|
import me.weishu.kernelsu.profile.Groups
|
||||||
import me.weishu.kernelsu.ui.util.getAppProfileTemplate
|
import me.weishu.kernelsu.ui.util.getAppProfileTemplate
|
||||||
import me.weishu.kernelsu.ui.util.listAppProfileTemplates
|
import me.weishu.kernelsu.ui.util.listAppProfileTemplates
|
||||||
import me.weishu.kernelsu.ui.util.setAppProfileTemplate
|
import me.weishu.kernelsu.ui.util.setAppProfileTemplate
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import org.json.JSONArray
|
import org.json.JSONArray
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import java.text.Collator
|
import java.text.Collator
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -138,13 +137,7 @@ class TemplateViewModel : ViewModel() {
|
|||||||
|
|
||||||
private fun fetchRemoteTemplates() {
|
private fun fetchRemoteTemplates() {
|
||||||
runCatching {
|
runCatching {
|
||||||
val client: OkHttpClient = OkHttpClient.Builder()
|
ksuApp.okhttpClient.newCall(
|
||||||
.connectTimeout(5, TimeUnit.SECONDS)
|
|
||||||
.writeTimeout(5, TimeUnit.SECONDS)
|
|
||||||
.readTimeout(10, TimeUnit.SECONDS)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
client.newCall(
|
|
||||||
Request.Builder().url(TEMPLATE_INDEX_URL).build()
|
Request.Builder().url(TEMPLATE_INDEX_URL).build()
|
||||||
).execute().use { response ->
|
).execute().use { response ->
|
||||||
if (!response.isSuccessful) {
|
if (!response.isSuccessful) {
|
||||||
@@ -155,7 +148,7 @@ private fun fetchRemoteTemplates() {
|
|||||||
0.until(remoteTemplateIds.length()).forEach { i ->
|
0.until(remoteTemplateIds.length()).forEach { i ->
|
||||||
val id = remoteTemplateIds.getString(i)
|
val id = remoteTemplateIds.getString(i)
|
||||||
Log.i(TAG, "fetch template: $id")
|
Log.i(TAG, "fetch template: $id")
|
||||||
val templateJson = client.newCall(
|
val templateJson = ksuApp.okhttpClient.newCall(
|
||||||
Request.Builder().url(TEMPLATE_URL.format(id)).build()
|
Request.Builder().url(TEMPLATE_URL.format(id)).build()
|
||||||
).runCatching {
|
).runCatching {
|
||||||
execute().use { response ->
|
execute().use { response ->
|
||||||
|
|||||||
Reference in New Issue
Block a user