195 lines
No EOL
6.5 KiB
Kotlin
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)
|
|
}
|
|
} |