ytdlnis/app/src/main/java/com/deniscerri/ytdl/util/ThemeUtil.kt
deniscerri 726ad19cf8
stuff
2025-07-27 14:37:45 +02:00

195 lines
No EOL
6.5 KiB
Kotlin

package com.deniscerri.ytdl.util
import android.app.Activity
import android.app.Application
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
import android.os.Bundle
import android.text.Spanned
import android.util.TypedValue
import androidx.annotation.DrawableRes
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.text.HtmlCompat
import androidx.core.text.parseAsHtml
import androidx.preference.PreferenceManager
import androidx.test.runner.lifecycle.ActivityLifecycleCallback
import androidx.test.runner.lifecycle.Stage
import com.deniscerri.ytdl.MainActivity
import com.deniscerri.ytdl.R
import com.google.android.material.color.DynamicColors
object ThemeUtil {
private val activities = mutableListOf<Activity>()
fun init(app: Application) {
app.registerActivityLifecycleCallbacks(object: Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(p0: Activity, p1: Bundle?) {
activities.add(p0)
}
override fun onActivityStarted(p0: Activity) {
}
override fun onActivityResumed(p0: Activity) {
}
override fun onActivityPaused(p0: Activity) {
}
override fun onActivityStopped(p0: Activity) {
}
override fun onActivitySaveInstanceState(p0: Activity, p1: Bundle) {
}
override fun onActivityDestroyed(p0: Activity) {
activities.remove(p0)
}
})
}
sealed class AppIcon(
@DrawableRes val iconResource: Int,
val activityAlias: String
) {
object Default : AppIcon(R.mipmap.ic_launcher, "Default")
object Light : AppIcon(R.mipmap.ic_launcher_light, "LightIcon")
object Dark : AppIcon(R.mipmap.ic_launcher_dark, "DarkIcon")
}
private val availableIcons = listOf(
AppIcon.Default,
AppIcon.Light,
AppIcon.Dark
)
fun recreateMain() {
activities.firstOrNull { it.javaClass == MainActivity::class.java }?.recreate()
}
fun recreateAllActivities() {
activities.forEach {
it.recreate()
}
}
fun updateThemes() {
activities.forEach {
updateTheme(it)
it.recreate()
}
}
fun updateTheme(activity: Activity) {
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
//update accent
when (sharedPreferences.getString("theme_accent","blue")) {
"Default" -> {
DynamicColors.applyToActivityIfAvailable(activity)
activity.setTheme(R.style.BaseTheme)
}
"blue" -> activity.setTheme(R.style.Theme_Blue)
"red" -> activity.setTheme(R.style.Theme_Red)
"green" -> activity.setTheme(R.style.Theme_Green)
"purple" -> activity.setTheme(R.style.Theme_Purple)
"yellow" -> activity.setTheme(R.style.Theme_Yellow)
"orange" -> activity.setTheme(R.style.Theme_Orange)
"monochrome" -> activity.setTheme(R.style.Theme_Monochrome)
}
//high contrast theme
if (sharedPreferences.getBoolean("high_contrast",false)) {
activity.theme.applyStyle(R.style.Pure, true)
}
//disable old icons
for (appIcon in availableIcons) {
val activityClass = "com.deniscerri.ytdl." + appIcon.activityAlias
// remove old icons
activity.packageManager.setComponentEnabledSetting(
ComponentName(activity.packageName, activityClass),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
)
}
when (sharedPreferences.getString("ytdlnis_theme", "System")!!) {
"System" -> {
//set dynamic icon
activity.packageManager.setComponentEnabledSetting(
ComponentName(activity.packageName, "com.deniscerri.ytdl.Default"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
"Light" -> {
//set light icon
activity.packageManager.setComponentEnabledSetting(
ComponentName(activity.packageName, "com.deniscerri.ytdl.LightIcon"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
"Dark" -> {
//set dark icon
activity.packageManager.setComponentEnabledSetting(
ComponentName(activity.packageName, "com.deniscerri.ytdl.DarkIcon"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
else -> {
//set dynamic icon
activity.packageManager.setComponentEnabledSetting(
ComponentName(activity.packageName, "com.deniscerri.ytdl.Default"),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM)
}
}
}
fun getThemeColor(context: Context, colorCode: Int): Int {
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
val accent = sharedPreferences.getString("theme_accent", "blue")
return if (accent == "blue"){
"d43c3b".toInt(16)
}else{
val value = TypedValue()
context.theme.resolveAttribute(colorCode, value, true)
value.data
}
}
/**
* Get the styled app name
*/
fun getStyledAppName(context: Context): Spanned {
val colorPrimary = getThemeColor(context, androidx.appcompat.R.attr.colorPrimaryDark)
val hexColor = "#%06X".format(0xFFFFFF and colorPrimary)
return "<span style='color:$hexColor';>YTDL</span>nis"
.parseAsHtml(HtmlCompat.FROM_HTML_MODE_COMPACT)
}
}