From bdb29d912bcea605bec27ac5c5bb864aba19255b Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Mon, 10 Oct 2022 13:42:40 +0200 Subject: [PATCH] Add pebble icon shape --- i18n/src/main/res/values/strings.xml | 1 + preferences/src/main/proto/settings.proto | 1 + .../ui/component/ShapedLauncherIcon.kt | 85 +++++++++++++++++-- .../appearance/AppearanceSettingsScreen.kt | 1 + 4 files changed, 83 insertions(+), 5 deletions(-) diff --git a/i18n/src/main/res/values/strings.xml b/i18n/src/main/res/values/strings.xml index c66876c7..3a56be27 100644 --- a/i18n/src/main/res/values/strings.xml +++ b/i18n/src/main/res/values/strings.xml @@ -470,6 +470,7 @@ Reuleaux triangle Circle Teardrop + Pebble Hexagon Search bar Services diff --git a/preferences/src/main/proto/settings.proto b/preferences/src/main/proto/settings.proto index 7b6a2b0d..6d1e492a 100644 --- a/preferences/src/main/proto/settings.proto +++ b/preferences/src/main/proto/settings.proto @@ -223,6 +223,7 @@ message Settings { Pentagon = 7; EasterEgg = 8; Teardrop = 9; + Pebble = 10; } IconShape shape = 1; bool themed_icons = 2; diff --git a/ui/src/main/java/de/mm20/launcher2/ui/component/ShapedLauncherIcon.kt b/ui/src/main/java/de/mm20/launcher2/ui/component/ShapedLauncherIcon.kt index 6ca39158..dff359cd 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/component/ShapedLauncherIcon.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/component/ShapedLauncherIcon.kt @@ -1,8 +1,10 @@ package de.mm20.launcher2.ui.component -import android.graphics.* import android.graphics.Matrix import android.graphics.Path +import android.graphics.PorterDuff +import android.graphics.PorterDuffColorFilter +import android.graphics.RectF import android.graphics.drawable.AdaptiveIconDrawable import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.LinearEasing @@ -23,17 +25,30 @@ import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text -import androidx.compose.runtime.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.compositionLocalOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Rect import androidx.compose.ui.geometry.toRect -import androidx.compose.ui.graphics.* import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.graphics.asComposePath import androidx.compose.ui.graphics.drawscope.drawIntoCanvas import androidx.compose.ui.graphics.drawscope.scale import androidx.compose.ui.graphics.drawscope.withTransform +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.graphics.nativeCanvas +import androidx.compose.ui.graphics.toAndroidRect +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource @@ -41,7 +56,19 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import de.mm20.launcher2.badges.Badge -import de.mm20.launcher2.icons.* +import de.mm20.launcher2.icons.ClockLayer +import de.mm20.launcher2.icons.ClockSublayer +import de.mm20.launcher2.icons.ClockSublayerRole +import de.mm20.launcher2.icons.ColorLayer +import de.mm20.launcher2.icons.DynamicLauncherIcon +import de.mm20.launcher2.icons.LauncherIcon +import de.mm20.launcher2.icons.LauncherIconLayer +import de.mm20.launcher2.icons.StaticIconLayer +import de.mm20.launcher2.icons.StaticLauncherIcon +import de.mm20.launcher2.icons.TextLayer +import de.mm20.launcher2.icons.TintedClockLayer +import de.mm20.launcher2.icons.TintedIconLayer +import de.mm20.launcher2.icons.TransparentLayer import de.mm20.launcher2.ktx.drawWithColorFilter import de.mm20.launcher2.preferences.Settings.IconSettings.IconShape import de.mm20.launcher2.ui.base.LocalTime @@ -139,7 +166,7 @@ fun ShapedLauncherIcon( ) } } else Modifier - ), + ), color = MaterialTheme.colorScheme.secondary, shape = CircleShape ) { @@ -219,6 +246,7 @@ private fun IconLayer( is ClockLayer -> { ClockLayer(layer.sublayers, scale = layer.scale, tintColor = null) } + is TintedClockLayer -> { ClockLayer( layer.sublayers, @@ -228,6 +256,7 @@ private fun IconLayer( ) } + is ColorLayer -> { Box( modifier = Modifier @@ -241,6 +270,7 @@ private fun IconLayer( ) ) } + is StaticIconLayer -> { Canvas(modifier = Modifier.fillMaxSize()) { withTransform({ @@ -253,6 +283,7 @@ private fun IconLayer( } } } + is TextLayer -> { Text( text = layer.text, @@ -266,6 +297,7 @@ private fun IconLayer( }, ) } + is TintedIconLayer -> { val color = if (layer.color == 0) defaultTintColor.toArgb() @@ -284,6 +316,7 @@ private fun IconLayer( } } } + is TransparentLayer -> {} } } @@ -347,12 +380,15 @@ private fun ClockLayer( ClockSublayerRole.Hour -> { rotate(hour.value / 12f * 360f) } + ClockSublayerRole.Minute -> { rotate(minute.value / 60f * 360f) } + ClockSublayerRole.Second -> { rotate(second.value / 60f * 360f) } + ClockSublayerRole.Static -> {} } }) { @@ -379,6 +415,7 @@ fun getShape(iconShape: IconShape): Shape { IconShape.Hexagon -> HexagonShape IconShape.Pentagon -> PentagonShape IconShape.Teardrop -> TeardropShape + IconShape.Pebble -> PebbleShape IconShape.EasterEgg -> EasterEggShape IconShape.UNRECOGNIZED -> CircleShape } @@ -507,6 +544,44 @@ private val TeardropShape: Shape close() } +private val PebbleShape: Shape + get() = GenericShape { size, _ -> + moveTo(0.55f * size.width, 0f * size.height) + cubicTo( + 0.25f * size.width, + 0f * size.height, + 0f * size.width, + 0.25f * size.height, + 0f * size.width, + 0.5f * size.height + ) + cubicTo( + 0f * size.width, + 0.78f * size.height, + 0.28f * size.width, + 1f * size.height, + 0.55f * size.width, + 1f * size.height + ) + cubicTo( + 0.85f * size.width, + 1f * size.height, + 1f * size.width, + 0.85f * size.height, + 1f * size.width, + 0.58f * size.height + ) + cubicTo( + 1f * size.width, + 0.3f * size.height, + 0.86f * size.width, + 0f * size.height, + 0.55f * size.width, + 0f * size.height + ) + close() + } + private val EasterEggShape: Shape get() = GenericShape { size, _ -> moveTo( diff --git a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt index 9fffd4af..530412b1 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/settings/appearance/AppearanceSettingsScreen.kt @@ -593,6 +593,7 @@ private fun getShapeName(shape: IconSettings.IconShape?): String? { IconSettings.IconShape.PlatformDefault -> R.string.preference_icon_shape_platform IconSettings.IconShape.Circle -> R.string.preference_icon_shape_circle IconSettings.IconShape.Teardrop -> R.string.preference_icon_shape_teardrop + IconSettings.IconShape.Pebble -> R.string.preference_icon_shape_pebble else -> return null } )