Make ColorUtil an injectable and clean up a little

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
This commit is contained in:
Álvaro Brey 2022-08-05 16:43:52 +02:00 committed by Andy Scherzinger
parent 3a9009231d
commit a45166a9db
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
4 changed files with 45 additions and 48 deletions

View File

@ -26,45 +26,45 @@ import androidx.annotation.ColorRes
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.graphics.ColorUtils import androidx.core.graphics.ColorUtils
import com.nextcloud.talk.R import com.nextcloud.talk.R
import javax.inject.Inject
object ColorUtil { class ColorUtil @Inject constructor(private val context: Context) {
private const val HSL_SIZE: Int = 3
private const val INDEX_LUMINATION: Int = 2
private const val LUMINATION_DARK_THRESHOLD: Float = 0.6f
fun getPrimaryColor(context: Context, primaryColor: String?, @ColorRes fallbackColor: Int): Int { @ColorInt
return if (primaryColor != null) { fun getNullSafeColor(color: String?, @ColorInt fallbackColor: Int): Int {
Color.parseColor(primaryColor) return color.parseColorOrFallback { fallbackColor }
} else {
ContextCompat.getColor(context, fallbackColor)
}
}
fun getNullsafeColor(color: String?, @ColorInt fallbackColor: Int): Int {
return if (color != null) {
Color.parseColor(color)
} else {
fallbackColor
}
}
fun getTextColor(context: Context, colorText: String?, @ColorInt fallBackPrimaryColor: Int): Int {
return if (colorText != null) {
Color.parseColor(colorText)
} else {
getForegroundColorForBackgroundColor(context, fallBackPrimaryColor)
}
} }
@ColorInt @ColorInt
public fun getForegroundColorForBackgroundColor(context: Context, @ColorInt color: Int): Int { fun getNullSafeColorWithFallbackRes(color: String?, @ColorRes fallbackColorRes: Int): Int {
return color.parseColorOrFallback { ContextCompat.getColor(context, fallbackColorRes) }
}
@ColorInt
fun getTextColor(colorText: String?, @ColorInt backgroundColor: Int): Int {
return colorText.parseColorOrFallback { getForegroundColorForBackgroundColor(backgroundColor) }
}
@ColorInt
fun getForegroundColorForBackgroundColor(@ColorInt color: Int): Int {
val hsl = FloatArray(HSL_SIZE) val hsl = FloatArray(HSL_SIZE)
ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hsl) ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hsl)
return if (hsl[INDEX_LUMINATION] < LUMINATION_DARK_THRESHOLD) { return if (hsl[INDEX_LIGHTNESS] < LIGHTNESS_DARK_THRESHOLD) {
Color.WHITE Color.WHITE
} else { } else {
ContextCompat.getColor(context, R.color.grey_900) ContextCompat.getColor(context, R.color.grey_900)
} }
} }
@ColorInt
private fun String?.parseColorOrFallback(fallback: () -> Int): Int {
return this?.let { Color.parseColor(this) } ?: fallback()
}
companion object {
private const val HSL_SIZE: Int = 3
private const val INDEX_LIGHTNESS: Int = 2
private const val LIGHTNESS_DARK_THRESHOLD: Float = 0.6f
}
} }

View File

@ -23,11 +23,10 @@
package com.nextcloud.talk.ui.theme package com.nextcloud.talk.ui.theme
import android.content.Context
import com.nextcloud.talk.R import com.nextcloud.talk.R
import com.nextcloud.talk.models.json.capabilities.ThemingCapability import com.nextcloud.talk.models.json.capabilities.ThemingCapability
internal class ServerThemeImpl(context: Context, themingCapability: ThemingCapability?) : internal class ServerThemeImpl(themingCapability: ThemingCapability?, colorUtil: ColorUtil) :
ServerTheme { ServerTheme {
override val primaryColor: Int override val primaryColor: Int
@ -37,12 +36,12 @@ internal class ServerThemeImpl(context: Context, themingCapability: ThemingCapab
override val colorText: Int override val colorText: Int
init { init {
primaryColor = ColorUtil.getPrimaryColor(context, themingCapability?.color, R.color.colorPrimary) primaryColor = colorUtil.getNullSafeColorWithFallbackRes(themingCapability?.color, R.color.colorPrimary)
colorElement = ColorUtil.getNullsafeColor(themingCapability?.colorElement, primaryColor) colorElement = colorUtil.getNullSafeColor(themingCapability?.colorElement, primaryColor)
colorElementBright = ColorUtil.getNullsafeColor(themingCapability?.colorElementBright, primaryColor) colorElementBright = colorUtil.getNullSafeColor(themingCapability?.colorElementBright, primaryColor)
colorElementDark = ColorUtil.getNullsafeColor(themingCapability?.colorElementDark, primaryColor) colorElementDark = colorUtil.getNullSafeColor(themingCapability?.colorElementDark, primaryColor)
colorText = ColorUtil.getTextColor(context, themingCapability?.colorText, primaryColor) colorText = colorUtil.getTextColor(themingCapability?.colorText, primaryColor)
} }
} }

View File

@ -24,7 +24,6 @@
package com.nextcloud.talk.ui.theme package com.nextcloud.talk.ui.theme
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context
import com.nextcloud.talk.data.user.model.User import com.nextcloud.talk.data.user.model.User
import com.nextcloud.talk.models.json.capabilities.Capabilities import com.nextcloud.talk.models.json.capabilities.Capabilities
import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
@ -32,11 +31,11 @@ import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject import javax.inject.Inject
internal class ServerThemeProviderImpl @Inject constructor( internal class ServerThemeProviderImpl @Inject constructor(
private val context: Context, private val userProvider: CurrentUserProviderNew,
private val userProvider: CurrentUserProviderNew private val colorUtil: ColorUtil
) : ServerThemeProvider { ) : ServerThemeProvider {
val themeCache: ConcurrentHashMap<String, ServerTheme> = ConcurrentHashMap() private val themeCache: ConcurrentHashMap<String, ServerTheme> = ConcurrentHashMap()
// TODO move this logic to currentUserProvider or something // TODO move this logic to currentUserProvider or something
private var _currentUser: User? = null private var _currentUser: User? = null
@ -76,7 +75,7 @@ internal class ServerThemeProviderImpl @Inject constructor(
} }
override fun getServerThemeForCapabilities(capabilities: Capabilities?): ServerTheme { override fun getServerThemeForCapabilities(capabilities: Capabilities?): ServerTheme {
return ServerThemeImpl(context, capabilities?.themingCapability) return ServerThemeImpl(capabilities?.themingCapability, colorUtil)
} }
companion object { companion object {

View File

@ -56,7 +56,6 @@ import com.yarolegovich.mp.MaterialPreferenceCategory
import com.yarolegovich.mp.MaterialSwitchPreference import com.yarolegovich.mp.MaterialSwitchPreference
import javax.inject.Inject import javax.inject.Inject
@Suppress("Detekt.TooManyFunctions")
class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) { class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
private fun isDarkMode(context: Context): Boolean = when ( private fun isDarkMode(context: Context): Boolean = when (
@ -235,7 +234,7 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
checkbox.buttonTintList = ColorStateList( checkbox.buttonTintList = ColorStateList(
arrayOf( arrayOf(
intArrayOf(-android.R.attr.state_checked), intArrayOf(-android.R.attr.state_checked),
intArrayOf(android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked)
), ),
intArrayOf(Color.GRAY, color) intArrayOf(Color.GRAY, color)
) )
@ -247,7 +246,7 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
radioButton.buttonTintList = ColorStateList( radioButton.buttonTintList = ColorStateList(
arrayOf( arrayOf(
intArrayOf(-android.R.attr.state_checked), intArrayOf(-android.R.attr.state_checked),
intArrayOf(android.R.attr.state_checked), intArrayOf(android.R.attr.state_checked)
), ),
intArrayOf(Color.GRAY, color) intArrayOf(Color.GRAY, color)
) )
@ -357,9 +356,9 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hsl) ColorUtils.RGBToHSL(Color.red(color), Color.green(color), Color.blue(color), hsl)
if (isDarkMode(context)) { if (isDarkMode(context)) {
hsl[INDEX_LUMINATION] = LUMINATION_DARK_THEME hsl[INDEX_LIGHTNESS] = LIGHTNESS_DARK_THEME
} else { } else {
hsl[INDEX_LUMINATION] = LUMINATION_LIGHT_THEME hsl[INDEX_LIGHTNESS] = LIGHTNESS_LIGHT_THEME
} }
return ColorUtils.HSLToColor(hsl) return ColorUtils.HSLToColor(hsl)
@ -372,8 +371,8 @@ class ViewThemeUtils @Inject constructor(private val theme: ServerTheme) {
) )
private const val TRACK_ALPHA: Int = 77 private const val TRACK_ALPHA: Int = 77
private const val HSL_SIZE: Int = 3 private const val HSL_SIZE: Int = 3
private const val INDEX_LUMINATION: Int = 2 private const val INDEX_LIGHTNESS: Int = 2
private const val LUMINATION_LIGHT_THEME: Float = 0.76f private const val LIGHTNESS_LIGHT_THEME: Float = 0.76f
private const val LUMINATION_DARK_THEME: Float = 0.28f private const val LIGHTNESS_DARK_THEME: Float = 0.28f
} }
} }