-
-
Notifications
You must be signed in to change notification settings - Fork 442
/
ThemeHelper.kt
139 lines (124 loc) · 4.83 KB
/
ThemeHelper.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package com.github.libretube.helpers
import android.app.Activity
import android.content.ComponentName
import android.content.Context
import android.content.pm.PackageManager
import android.content.res.Configuration
import android.graphics.Color
import android.text.Spanned
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.text.HtmlCompat
import androidx.core.text.parseAsHtml
import com.github.libretube.R
import com.github.libretube.constants.PreferenceKeys
import com.github.libretube.ui.adapters.IconsSheetAdapter
import com.google.android.material.color.DynamicColors
import com.google.android.material.color.MaterialColors
object ThemeHelper {
/**
* Set the theme, including accent color and night mode
*/
fun updateTheme(activity: AppCompatActivity) {
val themeMode = PreferenceHelper.getString(PreferenceKeys.THEME_MODE, "A")
updateAccentColor(activity)
applyPureThemeIfEnabled(activity)
updateThemeMode(themeMode)
}
/**
* Update the accent color of the app and apply dynamic colors if needed
*/
private fun updateAccentColor(
activity: AppCompatActivity
) {
var accentColor = PreferenceHelper.getString(PreferenceKeys.ACCENT_COLOR, "")
// automatically choose an accent color on the first app startup
if (accentColor.isEmpty()) {
accentColor = when (DynamicColors.isDynamicColorAvailable()) {
true -> "my"
else -> "blue"
}
PreferenceHelper.putString(PreferenceKeys.ACCENT_COLOR, accentColor)
}
val theme = when (accentColor) {
// set the accent color, use the pure black/white theme if enabled
"my" -> R.style.BaseTheme
"red" -> R.style.Theme_Red
"blue" -> R.style.Theme_Blue
"yellow" -> R.style.Theme_Yellow
"green" -> R.style.Theme_Green
"purple" -> R.style.Theme_Purple
"monochrome" -> R.style.Theme_Monochrome
"violet" -> R.style.Theme_Violet
else -> throw IllegalArgumentException()
}
activity.setTheme(theme)
// apply dynamic wallpaper based colors
if (accentColor == "my") DynamicColors.applyToActivityIfAvailable(activity)
}
/**
* apply the pure black/white theme
*/
private fun applyPureThemeIfEnabled(activity: Activity) {
val pureThemeEnabled = PreferenceHelper.getBoolean(
PreferenceKeys.PURE_THEME,
false
)
if (pureThemeEnabled) activity.theme.applyStyle(R.style.Pure, true)
}
/**
* set the theme mode (light, dark, auto)
*/
private fun updateThemeMode(themeMode: String) {
val mode = when (themeMode) {
"A" -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
"L" -> AppCompatDelegate.MODE_NIGHT_NO
"D" -> AppCompatDelegate.MODE_NIGHT_YES
else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
}
AppCompatDelegate.setDefaultNightMode(mode)
}
/**
* change the app icon
*/
fun changeIcon(context: Context, newLogoActivityAlias: String) {
// Disable Old Icon(s)
for (appIcon in IconsSheetAdapter.availableIcons) {
val activityClass = "com.github.libretube." + appIcon.activityAlias
// remove old icons
context.packageManager.setComponentEnabledSetting(
ComponentName(context.packageName, activityClass),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
)
}
// set the class name for the activity alias
val newLogoActivityClass = "com.github.libretube.$newLogoActivityAlias"
// Enable New Icon
context.packageManager.setComponentEnabledSetting(
ComponentName(context.packageName, newLogoActivityClass),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
)
}
/**
* Get a color by a color resource attr
*/
fun getThemeColor(
context: Context,
colorCode: Int
) = MaterialColors.getColor(context, colorCode, Color.TRANSPARENT)
/**
* 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 "Libre<span style='color:$hexColor';>Tube</span>"
.parseAsHtml(HtmlCompat.FROM_HTML_MODE_COMPACT)
}
fun isDarkMode(context: Context): Boolean {
val darkModeFlag = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
return darkModeFlag == Configuration.UI_MODE_NIGHT_YES
}
}