152 lines
5.0 KiB
Kotlin
152 lines
5.0 KiB
Kotlin
package com.sukisu.ultra
|
|
|
|
import android.annotation.SuppressLint
|
|
import android.app.Activity
|
|
import android.app.ActivityOptions
|
|
import android.app.Application
|
|
import android.content.Context
|
|
import android.content.res.Configuration
|
|
import android.content.res.Resources
|
|
import android.os.Build
|
|
import android.os.Bundle
|
|
import coil.Coil
|
|
import coil.ImageLoader
|
|
import com.dergoogler.mmrl.platform.Platform
|
|
import me.zhanghai.android.appiconloader.coil.AppIconFetcher
|
|
import me.zhanghai.android.appiconloader.coil.AppIconKeyer
|
|
import java.io.File
|
|
import java.util.Locale
|
|
|
|
@SuppressLint("StaticFieldLeak")
|
|
lateinit var ksuApp: KernelSUApplication
|
|
|
|
class KernelSUApplication : Application() {
|
|
private var currentActivity: Activity? = null
|
|
|
|
private val activityLifecycleCallbacks = object : ActivityLifecycleCallbacks {
|
|
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
|
|
currentActivity = activity
|
|
}
|
|
override fun onActivityStarted(activity: Activity) {
|
|
currentActivity = activity
|
|
}
|
|
override fun onActivityResumed(activity: Activity) {
|
|
currentActivity = activity
|
|
}
|
|
override fun onActivityPaused(activity: Activity) {}
|
|
override fun onActivityStopped(activity: Activity) {}
|
|
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
|
|
override fun onActivityDestroyed(activity: Activity) {
|
|
if (currentActivity == activity) {
|
|
currentActivity = null
|
|
}
|
|
}
|
|
}
|
|
|
|
override fun attachBaseContext(base: Context) {
|
|
val prefs = base.getSharedPreferences("settings", MODE_PRIVATE)
|
|
val languageCode = prefs.getString("app_language", "") ?: ""
|
|
|
|
var context = base
|
|
if (languageCode.isNotEmpty()) {
|
|
val locale = Locale.forLanguageTag(languageCode)
|
|
Locale.setDefault(locale)
|
|
|
|
val config = Configuration(base.resources.configuration)
|
|
config.setLocale(locale)
|
|
|
|
context = base.createConfigurationContext(config)
|
|
}
|
|
|
|
super.attachBaseContext(context)
|
|
}
|
|
|
|
@SuppressLint("ObsoleteSdkInt")
|
|
override fun getResources(): Resources {
|
|
val resources = super.getResources()
|
|
val prefs = getSharedPreferences("settings", MODE_PRIVATE)
|
|
val languageCode = prefs.getString("app_language", "") ?: ""
|
|
|
|
if (languageCode.isNotEmpty()) {
|
|
val locale = Locale.forLanguageTag(languageCode)
|
|
val config = Configuration(resources.configuration)
|
|
config.setLocale(locale)
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
return createConfigurationContext(config).resources
|
|
} else {
|
|
@Suppress("DEPRECATION")
|
|
resources.updateConfiguration(config, resources.displayMetrics)
|
|
}
|
|
}
|
|
|
|
return resources
|
|
}
|
|
|
|
override fun onCreate() {
|
|
super.onCreate()
|
|
ksuApp = this
|
|
|
|
// 注册Activity生命周期回调
|
|
registerActivityLifecycleCallbacks(activityLifecycleCallbacks)
|
|
|
|
Platform.setHiddenApiExemptions()
|
|
|
|
val context = this
|
|
val iconSize = resources.getDimensionPixelSize(android.R.dimen.app_icon_size)
|
|
Coil.setImageLoader(
|
|
ImageLoader.Builder(context)
|
|
.components {
|
|
add(AppIconKeyer())
|
|
add(AppIconFetcher.Factory(iconSize, false, context))
|
|
}
|
|
.build()
|
|
)
|
|
|
|
val webroot = File(dataDir, "webroot")
|
|
if (!webroot.exists()) {
|
|
webroot.mkdir()
|
|
}
|
|
}
|
|
|
|
override fun onConfigurationChanged(newConfig: Configuration) {
|
|
super.onConfigurationChanged(newConfig)
|
|
applyLanguageSetting()
|
|
}
|
|
|
|
@SuppressLint("ObsoleteSdkInt")
|
|
private fun applyLanguageSetting() {
|
|
val prefs = getSharedPreferences("settings", MODE_PRIVATE)
|
|
val languageCode = prefs.getString("app_language", "") ?: ""
|
|
|
|
if (languageCode.isNotEmpty()) {
|
|
val locale = Locale.forLanguageTag(languageCode)
|
|
Locale.setDefault(locale)
|
|
|
|
val resources = resources
|
|
val config = Configuration(resources.configuration)
|
|
config.setLocale(locale)
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
createConfigurationContext(config)
|
|
} else {
|
|
@Suppress("DEPRECATION")
|
|
resources.updateConfiguration(config, resources.displayMetrics)
|
|
}
|
|
}
|
|
}
|
|
|
|
// 添加刷新当前Activity的方法
|
|
fun refreshCurrentActivity() {
|
|
currentActivity?.let { activity ->
|
|
val intent = activity.intent
|
|
activity.finish()
|
|
|
|
val options = ActivityOptions.makeCustomAnimation(
|
|
activity, android.R.anim.fade_in, android.R.anim.fade_out
|
|
)
|
|
activity.startActivity(intent, options.toBundle())
|
|
}
|
|
}
|
|
}
|