Use imageVectors in badges and fix badge icon colors

This commit is contained in:
MM20
2024-06-16 17:15:57 +02:00
parent 553ab2d9c2
commit a63f434efc
11 changed files with 60 additions and 41 deletions
+1 -1
View File
@@ -38,7 +38,7 @@ dependencies {
implementation(libs.bundles.kotlin)
implementation(libs.androidx.core)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.compose.materialicons)
implementation(libs.bundles.androidx.lifecycle)
implementation(libs.koin.android)
@@ -2,26 +2,36 @@ package de.mm20.launcher2.badges
import android.graphics.drawable.Drawable
import android.util.Log
import androidx.compose.ui.graphics.vector.ImageVector
sealed interface BadgeIcon {
@JvmInline
value class Drawable(val drawable: android.graphics.drawable.Drawable): BadgeIcon
@JvmInline
value class Vector(val imageVector: ImageVector): BadgeIcon
}
fun BadgeIcon(drawable: Drawable): BadgeIcon = BadgeIcon.Drawable(drawable)
fun BadgeIcon(imageVector: ImageVector): BadgeIcon = BadgeIcon.Vector(imageVector)
interface Badge {
val number: Int?
val progress: Float?
val iconRes: Int?
val icon: Drawable?
val icon: BadgeIcon?
}
fun Badge(
number: Int? = null,
progress: Float? = null,
iconRes: Int? = null,
icon: Drawable? = null
): Badge = MutableBadge(number, progress, iconRes, icon)
icon: BadgeIcon? = null
): Badge = MutableBadge(number, progress, icon)
internal data class MutableBadge(
override var number: Int? = null,
override var progress: Float? = null,
override var iconRes: Int? = null,
override var icon: Drawable? = null
override var icon: BadgeIcon? = null
): Badge
fun Collection<Badge>.combine(): Badge? {
@@ -30,7 +40,6 @@ fun Collection<Badge>.combine(): Badge? {
var progresses = 0
forEach {
if (it.icon != null && badge.icon == null) badge.icon = it.icon
if (it.iconRes != null && badge.iconRes == null) badge.iconRes = it.iconRes
it.number?.let { a ->
badge.number?.let { b -> badge.number = a + b } ?: run {
badge.number = a
@@ -47,7 +47,7 @@ internal class BadgeServiceImpl(
providers += NotificationBadgeProvider()
}
if (it.cloudFiles) {
providers += CloudBadgeProvider()
providers += CloudBadgeProvider(context)
}
if (it.shortcuts) {
providers += AppShortcutBadgeProvider(context)
@@ -3,6 +3,7 @@ package de.mm20.launcher2.badges.providers
import android.content.Context
import android.content.pm.PackageManager
import de.mm20.launcher2.badges.Badge
import de.mm20.launcher2.badges.BadgeIcon
import de.mm20.launcher2.badges.MutableBadge
import de.mm20.launcher2.graphics.BadgeDrawable
import de.mm20.launcher2.search.AppShortcut
@@ -28,7 +29,7 @@ class AppShortcutBadgeProvider(
} catch (e: PackageManager.NameNotFoundException) {
return@withContext
}
val badge = MutableBadge(icon = BadgeDrawable(context, icon))
val badge = MutableBadge(icon = BadgeIcon(BadgeDrawable(context, icon)))
send(badge)
}
} else if (packageName != null) {
@@ -40,7 +41,7 @@ class AppShortcutBadgeProvider(
} catch (e: PackageManager.NameNotFoundException) {
return@withContext
}
val badge = MutableBadge(icon = BadgeDrawable(context, icon))
val badge = MutableBadge(icon = BadgeIcon(BadgeDrawable(context, icon)))
send(badge)
}
} else {
@@ -1,6 +1,9 @@
package de.mm20.launcher2.badges.providers
import android.content.Context
import androidx.compose.material.icons.Icons
import de.mm20.launcher2.badges.Badge
import de.mm20.launcher2.badges.BadgeIcon
import de.mm20.launcher2.badges.MutableBadge
import de.mm20.launcher2.search.File
import de.mm20.launcher2.search.Searchable
@@ -8,12 +11,14 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
class CloudBadgeProvider: BadgeProvider {
class CloudBadgeProvider(
private val context: Context
): BadgeProvider {
override fun getBadge(searchable: Searchable): Flow<Badge?> {
if (searchable is File) {
val iconResId = searchable.providerIconRes
if (iconResId != null) {
return flowOf(MutableBadge(iconRes = iconResId))
return flowOf(MutableBadge(icon = BadgeIcon(context.getDrawable(iconResId)!!)))
}
}
return flowOf(null)
@@ -1,6 +1,10 @@
package de.mm20.launcher2.badges.providers
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.HourglassBottom
import androidx.compose.material.icons.rounded.VisibilityOff
import de.mm20.launcher2.badges.Badge
import de.mm20.launcher2.badges.BadgeIcon
import de.mm20.launcher2.badges.R
import de.mm20.launcher2.search.SavableSearchable
import de.mm20.launcher2.search.Searchable
@@ -33,7 +37,7 @@ class HiddenItemBadgeProvider(
return hiddenItemKeys.map { keys ->
if (searchable.key in keys) {
Badge(
iconRes = R.drawable.ic_badge_hidden
icon = BadgeIcon(Icons.Rounded.VisibilityOff)
)
} else {
null
@@ -2,6 +2,7 @@ package de.mm20.launcher2.badges.providers
import android.content.Context
import de.mm20.launcher2.badges.Badge
import de.mm20.launcher2.badges.BadgeIcon
import de.mm20.launcher2.badges.MutableBadge
import de.mm20.launcher2.search.SavableSearchable
import de.mm20.launcher2.search.Searchable
@@ -16,7 +17,7 @@ class PluginBadgeProvider(private val context: Context): BadgeProvider {
emit(null)
val icon = searchable.getProviderIcon(context)
if (icon != null) {
emit(MutableBadge(icon = icon))
emit(MutableBadge(icon = BadgeIcon(icon)))
}
}
}
@@ -1,6 +1,9 @@
package de.mm20.launcher2.badges.providers
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.HourglassBottom
import de.mm20.launcher2.badges.Badge
import de.mm20.launcher2.badges.BadgeIcon
import de.mm20.launcher2.badges.MutableBadge
import de.mm20.launcher2.badges.R
import de.mm20.launcher2.search.Application
@@ -14,7 +17,7 @@ class SuspendedAppsBadgeProvider : BadgeProvider, KoinComponent {
override fun getBadge(searchable: Searchable): Flow<Badge?> {
return if (searchable is Application && searchable.isSuspended) {
flowOf(MutableBadge(iconRes = R.drawable.ic_badge_suspended))
flowOf(MutableBadge(icon = BadgeIcon(Icons.Rounded.HourglassBottom)))
} else {
flowOf(null)
}
@@ -1,6 +1,9 @@
package de.mm20.launcher2.badges.providers
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Work
import de.mm20.launcher2.badges.Badge
import de.mm20.launcher2.badges.BadgeIcon
import de.mm20.launcher2.badges.MutableBadge
import de.mm20.launcher2.badges.R
import de.mm20.launcher2.search.AppProfile
@@ -15,7 +18,7 @@ class WorkProfileBadgeProvider : BadgeProvider {
if (searchable is Application && searchable.profile == AppProfile.Work || searchable is AppShortcut && searchable.profile == AppProfile.Work) {
emit(
MutableBadge(
iconRes = R.drawable.ic_badge_workprofile
icon = BadgeIcon(Icons.Rounded.Work)
)
)
} else {