Migrate to Material symbols

This commit is contained in:
MM20
2025-11-07 22:27:31 +01:00
parent f05481e1e8
commit b4bb2ae663
537 changed files with 6142 additions and 4598 deletions

View File

@@ -78,7 +78,6 @@ dependencies {
implementation(libs.androidx.compose.ui)
implementation(libs.androidx.compose.uitooling)
implementation(libs.androidx.compose.material3)
implementation(libs.androidx.compose.materialicons)
implementation(libs.androidx.compose.animation)
implementation(libs.androidx.compose.animationgraphics)
implementation(libs.androidx.constraintlayout.compose)

View File

@@ -2,7 +2,6 @@ package de.mm20.launcher2.ui.common
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.EnterExitState
import androidx.compose.animation.SharedTransitionScope
import androidx.compose.animation.core.animateFloat
import androidx.compose.foundation.ScrollState
import androidx.compose.foundation.horizontalScroll
@@ -14,11 +13,6 @@ import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Edit
import androidx.compose.material.icons.rounded.ExpandLess
import androidx.compose.material.icons.rounded.ExpandMore
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material3.FilterChip
import androidx.compose.material3.FilterChipDefaults
import androidx.compose.material3.FloatingActionButtonDefaults
@@ -33,13 +27,13 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.search.Tag
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager
import de.mm20.launcher2.ui.layout.TopReversed
import de.mm20.launcher2.ui.modifier.consumeAllScrolling
@Composable
fun FavoritesTagSelector(
@@ -84,7 +78,7 @@ fun FavoritesTagSelector(
leadingIcon = if (compact) null else {
{
Icon(
imageVector = Icons.Rounded.Star,
painter = painterResource(R.drawable.star_20px_filled),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize),
)
@@ -93,7 +87,7 @@ fun FavoritesTagSelector(
label = {
if (compact) {
Icon(
imageVector = Icons.Rounded.Star,
painter = painterResource(R.drawable.star_20px_filled),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize),
)
@@ -129,7 +123,7 @@ fun FavoritesTagSelector(
modifier = Modifier
.rotate(rot),
onClick = { onExpand(true) }) {
Icon(Icons.Rounded.ExpandMore, null)
Icon(painterResource(R.drawable.arrow_drop_down_24px), null)
}
}
@@ -141,7 +135,7 @@ fun FavoritesTagSelector(
onClick = { sheetManager.showEditFavoritesSheet() }
) {
Icon(
imageVector = Icons.Rounded.Edit,
painter = painterResource(R.drawable.edit_24px),
contentDescription = null
)
}
@@ -164,7 +158,7 @@ fun FavoritesTagSelector(
leadingIcon = if (compact) null else {
{
Icon(
imageVector = Icons.Rounded.Star,
painter = painterResource(R.drawable.star_20px_filled),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize),
)
@@ -173,7 +167,7 @@ fun FavoritesTagSelector(
label = {
if (compact) {
Icon(
imageVector = Icons.Rounded.Star,
painter = painterResource(R.drawable.star_20px_filled),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize),
)
@@ -215,7 +209,7 @@ fun FavoritesTagSelector(
.rotate(rot),
onClick = { onExpand(false) }
) {
Icon(Icons.Rounded.ExpandLess, null)
Icon(painterResource(R.drawable.arrow_drop_up_24px), null)
}
if (editButton) {
@@ -224,7 +218,7 @@ fun FavoritesTagSelector(
onClick = { sheetManager.showEditFavoritesSheet() }
) {
Icon(
imageVector = Icons.Rounded.Edit,
painter = painterResource(R.drawable.edit_24px),
contentDescription = null
)
}

View File

@@ -13,10 +13,6 @@ import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowDropDown
import androidx.compose.material.icons.rounded.FilterAlt
import androidx.compose.material.icons.rounded.Search
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CircularProgressIndicator
@@ -36,6 +32,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
@@ -98,7 +95,7 @@ fun IconPicker(
SearchBarDefaults.InputField(
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Search,
painterResource(R.drawable.search_24px),
contentDescription = null
)
},
@@ -164,7 +161,7 @@ fun IconPicker(
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
.size(ButtonDefaults.IconSize),
imageVector = Icons.Rounded.FilterAlt,
painter = painterResource(R.drawable.filter_alt_20px),
contentDescription = null
)
} else {
@@ -218,7 +215,7 @@ fun IconPicker(
modifier = Modifier.animateContentSize()
)
Icon(
Icons.Rounded.ArrowDropDown,
painterResource(R.drawable.arrow_drop_down_20px),
modifier = Modifier
.padding(start = ButtonDefaults.IconSpacing)
.size(ButtonDefaults.IconSize),

View File

@@ -12,10 +12,6 @@ import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.DarkMode
import androidx.compose.material.icons.rounded.ErrorOutline
import androidx.compose.material.icons.rounded.LightMode
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
@@ -37,6 +33,7 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
@@ -87,7 +84,7 @@ fun ImportThemeSheet(
contentAlignment = Alignment.Center
) {
LargeMessage(
icon = Icons.Rounded.ErrorOutline,
icon = R.drawable.error_48px,
text = stringResource(R.string.import_theme_error),
)
}
@@ -157,14 +154,14 @@ fun ThemePreview(
selected = !darkTheme,
onClick = { darkTheme = false }
) {
Icon(Icons.Rounded.LightMode, null)
Icon(painterResource(R.drawable.light_mode_24px), null)
}
SegmentedButton(
shape = SegmentedButtonDefaults.itemShape(index = 1, count = 2),
selected = darkTheme,
onClick = { darkTheme = true }
) {
Icon(Icons.Rounded.DarkMode, null)
Icon(painterResource(R.drawable.dark_mode_24px), null)
}
}
}

View File

@@ -9,11 +9,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.CheckCircleOutline
import androidx.compose.material.icons.rounded.ErrorOutline
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material.icons.rounded.Warning
import androidx.compose.material3.Button
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
@@ -48,7 +43,7 @@ fun RestoreBackupSheet(
val compatibility by viewModel.compatibility
BottomSheetDialog(onDismissRequest) {
Column (
Column(
modifier = Modifier
.fillMaxWidth()
.padding(it),
@@ -67,13 +62,15 @@ fun RestoreBackupSheet(
)
}
}
RestoreBackupState.InvalidFile -> {
LargeMessage(
modifier = Modifier.aspectRatio(1f),
icon = Icons.Rounded.ErrorOutline,
icon = R.drawable.error_48px,
text = stringResource(id = R.string.restore_invalid_file)
)
}
RestoreBackupState.Ready -> {
val metadata by viewModel.metadata
@@ -84,7 +81,7 @@ fun RestoreBackupSheet(
.fillMaxWidth()
.wrapContentHeight()
.padding(bottom = 16.dp),
icon = Icons.Rounded.Info,
icon = R.drawable.info_24px,
text = stringResource(
R.string.restore_meta,
DateUtils.formatDateTime(
@@ -99,7 +96,7 @@ fun RestoreBackupSheet(
if (compatibility == BackupCompatibility.Incompatible) {
LargeMessage(
modifier = Modifier.aspectRatio(1f),
icon = Icons.Rounded.ErrorOutline,
icon = R.drawable.error_48px,
text = stringResource(
id = R.string.restore_incompatible_file,
stringResource(R.string.app_name)
@@ -112,18 +109,19 @@ fun RestoreBackupSheet(
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 16.dp),
icon = Icons.Rounded.Warning,
icon = R.drawable.warning_24px,
text =
stringResource(
R.string.restore_different_minor_version,
stringResource(R.string.app_name)
)
stringResource(
R.string.restore_different_minor_version,
stringResource(R.string.app_name)
)
)
}
}
}
}
}
RestoreBackupState.Restoring -> {
Box(
modifier = Modifier
@@ -136,10 +134,11 @@ fun RestoreBackupSheet(
)
}
}
RestoreBackupState.Restored -> {
LargeMessage(
modifier = Modifier.aspectRatio(1f),
icon = Icons.Rounded.CheckCircleOutline,
icon = R.drawable.check_circle_48px,
text = stringResource(
id = R.string.restore_complete
)

View File

@@ -8,9 +8,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.CheckCircle
import androidx.compose.material.icons.rounded.Search
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
@@ -21,6 +18,7 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@@ -53,7 +51,7 @@ fun SearchablePicker(
value = viewModel.searchQuery,
onValueChange = { viewModel.onSearchQueryChanged(it) },
leadingIcon = {
Icon(Icons.Rounded.Search, null)
Icon(painterResource(R.drawable.search_24px), null)
},
placeholder = {
Text(stringResource(R.string.search_bar_placeholder))
@@ -99,7 +97,7 @@ fun SearchablePicker(
)
if (selected) {
Icon(
imageVector = Icons.Rounded.CheckCircle,
painterResource(R.drawable.check_circle_24px_filled),
contentDescription = null,
tint = MaterialTheme.colorScheme.secondary,
)

View File

@@ -12,14 +12,11 @@ import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Close
import androidx.compose.material3.FilterChipDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.InputChipDefaults
@@ -32,6 +29,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.icons.IconService
@@ -41,6 +39,7 @@ import de.mm20.launcher2.icons.VectorLayer
import de.mm20.launcher2.search.Tag
import de.mm20.launcher2.ui.component.ShapedLauncherIcon
import de.mm20.launcher2.ui.ktx.toPixels
import de.mm20.launcher2.ui.R
import org.koin.compose.koinInject
@Composable
@@ -141,7 +140,7 @@ fun TagChip(
modifier = Modifier
.padding(start = 4.dp)
.size(FilterChipDefaults.IconSize),
imageVector = foregroundLayer.vector,
painter = painterResource(foregroundLayer.icon),
contentDescription = null,
tint = iconColor
)
@@ -162,7 +161,7 @@ fun TagChip(
onClear?.invoke()
}
.size(FilterChipDefaults.IconSize),
imageVector = Icons.Rounded.Close,
painter = painterResource(R.drawable.close_20px),
contentDescription = null,
)
}

View File

@@ -8,9 +8,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Error
import androidx.compose.material.icons.rounded.Search
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.SearchBar
@@ -24,6 +21,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
@@ -57,7 +55,7 @@ fun WeatherLocationSearchDialog(
SearchBarDefaults.InputField(
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Search,
painterResource(R.drawable.search_24px),
contentDescription = null
)
},
@@ -103,7 +101,7 @@ fun WeatherLocationSearchDialog(
} else if (query.isNotEmpty()) {
SmallMessage(
modifier = Modifier.fillMaxWidth(),
icon = Icons.Rounded.Error,
icon = R.drawable.error_24px,
text = stringResource(R.string.weather_location_search_no_result)
)
}

View File

@@ -1,5 +1,6 @@
package de.mm20.launcher2.ui.component
import androidx.annotation.DrawableRes
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -17,13 +18,14 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
@Composable
fun Banner(
modifier: Modifier = Modifier,
text: String,
icon: ImageVector,
@DrawableRes icon: Int,
color: Color = MaterialTheme.colorScheme.surfaceContainer,
primaryAction: (@Composable () -> Unit)? = null,
secondaryAction: (@Composable () -> Unit)? = null,
@@ -45,7 +47,7 @@ fun Banner(
) {
Icon(
modifier = Modifier.padding(end = 16.dp),
imageVector = icon,
painter = painterResource(icon),
contentDescription = null
)
Text(

View File

@@ -21,8 +21,6 @@ import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.layout.requiredWidth
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.UnfoldMore
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -37,10 +35,12 @@ import androidx.compose.ui.draw.rotate
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.coerceIn
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.isUnspecified
import de.mm20.launcher2.ui.R
enum class ResizeAxis {
Horizontal,
@@ -135,7 +135,7 @@ fun DragResizeHandle(
.padding(8.dp)
.rotate(90f)
.align(Alignment.Center),
imageVector = Icons.Rounded.UnfoldMore,
painter = painterResource(R.drawable.unfold_more_24px),
contentDescription = null,
tint = MaterialTheme.colorScheme.onPrimary,
)
@@ -191,7 +191,7 @@ fun DragResizeHandle(
.background(MaterialTheme.colorScheme.primary, CircleShape)
.padding(8.dp)
.align(Alignment.Center),
imageVector = Icons.Rounded.UnfoldMore,
painter = painterResource(R.drawable.unfold_more_24px),
contentDescription = null,
tint = MaterialTheme.colorScheme.onPrimary,
)

View File

@@ -1,5 +1,6 @@
package de.mm20.launcher2.ui.component
import androidx.annotation.DrawableRes
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
@@ -13,13 +14,17 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
/**
* @param icon the icon resource id. Should be an icon with optical size 48px.
*/
@Composable
fun LargeMessage(
modifier: Modifier = Modifier,
icon: ImageVector,
@DrawableRes icon: Int,
text: String,
color: Color = LocalContentColor.current
) {
@@ -29,7 +34,7 @@ fun LargeMessage(
verticalArrangement = Arrangement.Center,
) {
Icon(
imageVector = icon,
painter = painterResource(icon),
contentDescription = null,
modifier = Modifier
.padding(bottom = 24.dp)

View File

@@ -1,8 +1,6 @@
package de.mm20.launcher2.ui.component
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Lock
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -21,7 +19,7 @@ fun MissingPermissionBanner(
Banner(
modifier = modifier,
text = text,
icon = Icons.Rounded.Lock,
icon = R.drawable.lock_24px,
primaryAction = {
Button(
modifier = Modifier.padding(start = 8.dp),

View File

@@ -14,9 +14,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Clear
import androidx.compose.material.icons.rounded.Tag
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
@@ -42,10 +39,12 @@ import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.PopupProperties
import de.mm20.launcher2.ui.R
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.launch
@@ -153,7 +152,7 @@ fun OutlinedTagsInputField(
Icon(
modifier = Modifier
.size(InputChipDefaults.IconSize),
imageVector = Icons.Rounded.Tag,
painter = painterResource(R.drawable.tag_20px),
contentDescription = null
)
},
@@ -165,7 +164,7 @@ fun OutlinedTagsInputField(
.clickable {
onTagsChange(tags.filterIndexed { index, _ -> index != i })
},
imageVector = Icons.Rounded.Clear,
painter = painterResource(R.drawable.close_20px),
contentDescription = null
)
},

View File

@@ -4,10 +4,6 @@ import android.icu.text.DecimalFormat
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.StarHalf
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.StarOutline
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -15,9 +11,11 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.ui.R
import kotlin.math.round
/**
@@ -43,7 +41,7 @@ fun RatingBar(
) {
for (i in 0 until fullStars) {
Icon(
imageVector = Icons.Rounded.Star,
painter = painterResource(R.drawable.star_20px_filled),
contentDescription = null,
tint = tint,
modifier = iconModifier
@@ -51,7 +49,7 @@ fun RatingBar(
}
if (halfStar) {
Icon(
imageVector = Icons.AutoMirrored.Rounded.StarHalf,
painter = painterResource(R.drawable.star_half_20px),
contentDescription = null,
tint = tint,
modifier = iconModifier
@@ -59,7 +57,7 @@ fun RatingBar(
}
for (i in 0 until emptyStars) {
Icon(
imageVector = Icons.Rounded.StarOutline,
painter = painterResource(R.drawable.star_20px),
contentDescription = null,
tint = tint,
modifier = iconModifier

View File

@@ -4,49 +4,20 @@ import android.content.ComponentName
import android.content.pm.PackageManager
import android.graphics.drawable.Drawable
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.StickyNote2
import androidx.compose.material.icons.rounded.Alarm
import androidx.compose.material.icons.rounded.Call
import androidx.compose.material.icons.rounded.Email
import androidx.compose.material.icons.rounded.Error
import androidx.compose.material.icons.rounded.Event
import androidx.compose.material.icons.rounded.FindInPage
import androidx.compose.material.icons.rounded.Games
import androidx.compose.material.icons.rounded.ImageSearch
import androidx.compose.material.icons.rounded.Language
import androidx.compose.material.icons.rounded.LocationOn
import androidx.compose.material.icons.rounded.ManageSearch
import androidx.compose.material.icons.rounded.Movie
import androidx.compose.material.icons.rounded.MusicNote
import androidx.compose.material.icons.rounded.Person
import androidx.compose.material.icons.rounded.PersonAdd
import androidx.compose.material.icons.rounded.PersonSearch
import androidx.compose.material.icons.rounded.Place
import androidx.compose.material.icons.rounded.QueryStats
import androidx.compose.material.icons.rounded.Search
import androidx.compose.material.icons.rounded.Share
import androidx.compose.material.icons.rounded.Sms
import androidx.compose.material.icons.rounded.SportsEsports
import androidx.compose.material.icons.rounded.StickyNote2
import androidx.compose.material.icons.rounded.Timer
import androidx.compose.material.icons.rounded.Translate
import androidx.compose.material.icons.rounded.TravelExplore
import androidx.compose.material.icons.rounded.Warning
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.isSpecified
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import coil.compose.AsyncImage
@@ -55,6 +26,7 @@ import de.mm20.launcher2.searchactions.actions.SearchAction
import de.mm20.launcher2.searchactions.actions.SearchActionIcon
import de.mm20.launcher2.searchactions.builders.AppSearchActionBuilder
import de.mm20.launcher2.searchactions.builders.CustomizableSearchActionBuilder
import de.mm20.launcher2.ui.R
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@@ -66,7 +38,7 @@ fun SearchActionIcon(
componentName: ComponentName? = null,
size: Dp = 20.dp
) {
val tint = when(color) {
val tint = when (color) {
0 -> MaterialTheme.colorScheme.primary
1 -> Color.Unspecified
else -> Color(color)
@@ -74,7 +46,7 @@ fun SearchActionIcon(
if (icon != SearchActionIcon.Custom || customIcon == null && componentName == null) {
Icon(
modifier = Modifier.size(size),
imageVector = getSearchActionIconVector(icon),
painter = painterResource(getSearchActionIconVector(icon)),
contentDescription = null,
tint = tint,
)
@@ -121,39 +93,39 @@ fun SearchActionIcon(action: SearchAction, size: Dp = 20.dp) {
@Composable
fun SearchActionIcon(builder: CustomizableSearchActionBuilder, size: Dp = 20.dp) {
SearchActionIcon(
icon = builder.icon,
color = builder.iconColor,
customIcon = builder.customIcon,
componentName = (builder as? AppSearchActionBuilder)?.baseIntent?.component,
size = size,
)
SearchActionIcon(
icon = builder.icon,
color = builder.iconColor,
customIcon = builder.customIcon,
componentName = (builder as? AppSearchActionBuilder)?.baseIntent?.component,
size = size,
)
}
fun getSearchActionIconVector(icon: SearchActionIcon): ImageVector {
fun getSearchActionIconVector(icon: SearchActionIcon): Int {
return when (icon) {
SearchActionIcon.Phone -> Icons.Rounded.Call
SearchActionIcon.Website -> Icons.Rounded.Language
SearchActionIcon.Alarm -> Icons.Rounded.Alarm
SearchActionIcon.Timer -> Icons.Rounded.Timer
SearchActionIcon.Contact -> Icons.Rounded.PersonAdd
SearchActionIcon.Email -> Icons.Rounded.Email
SearchActionIcon.Message -> Icons.Rounded.Sms
SearchActionIcon.Calendar -> Icons.Rounded.Event
SearchActionIcon.Translate -> Icons.Rounded.Translate
SearchActionIcon.Search -> Icons.Rounded.Search
SearchActionIcon.Custom -> Icons.Rounded.Warning
SearchActionIcon.WebSearch -> Icons.Rounded.TravelExplore
SearchActionIcon.PersonSearch -> Icons.Rounded.PersonSearch
SearchActionIcon.StatsSearch -> Icons.Rounded.QueryStats
SearchActionIcon.SearchPage -> Icons.Rounded.FindInPage
SearchActionIcon.SearchList -> Icons.Rounded.ManageSearch
SearchActionIcon.ImageSearch -> Icons.Rounded.ImageSearch
SearchActionIcon.Location -> Icons.Rounded.Place
SearchActionIcon.Movie -> Icons.Rounded.Movie
SearchActionIcon.Music -> Icons.Rounded.MusicNote
SearchActionIcon.Game -> Icons.Rounded.SportsEsports
SearchActionIcon.Note -> Icons.AutoMirrored.Rounded.StickyNote2
SearchActionIcon.Share -> Icons.Rounded.Share
SearchActionIcon.Phone -> R.drawable.call_24px
SearchActionIcon.Website -> R.drawable.language_24px
SearchActionIcon.Alarm -> R.drawable.alarm_24px
SearchActionIcon.Timer -> R.drawable.timer_24px
SearchActionIcon.Contact -> R.drawable.person_add_24px
SearchActionIcon.Email -> R.drawable.mail_24px
SearchActionIcon.Message -> R.drawable.sms_24px
SearchActionIcon.Calendar -> R.drawable.event_24px
SearchActionIcon.Translate -> R.drawable.translate_24px
SearchActionIcon.Search -> R.drawable.search_24px
SearchActionIcon.Custom -> R.drawable.warning_24px
SearchActionIcon.WebSearch -> R.drawable.travel_explore_24px
SearchActionIcon.PersonSearch -> R.drawable.person_search_24px
SearchActionIcon.StatsSearch -> R.drawable.query_stats_24px
SearchActionIcon.SearchPage -> R.drawable.find_in_page_24px
SearchActionIcon.SearchList -> R.drawable.manage_search_24px
SearchActionIcon.ImageSearch -> R.drawable.image_search_24px
SearchActionIcon.Location -> R.drawable.location_on_24px
SearchActionIcon.Movie -> R.drawable.movie_24px
SearchActionIcon.Music -> R.drawable.music_note_24px
SearchActionIcon.Game -> R.drawable.sports_esports_24px
SearchActionIcon.Note -> R.drawable.sticky_note_2_24px
SearchActionIcon.Share -> R.drawable.share_24px
}
}

View File

@@ -18,7 +18,6 @@ import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardActionScope
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material.icons.rounded.Search
import androidx.compose.material3.Icon
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
@@ -36,6 +35,7 @@ import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
@@ -151,7 +151,7 @@ fun SearchBar(
) {
Icon(
modifier = Modifier.padding(12.dp),
imageVector = androidx.compose.material.icons.Icons.Rounded.Search,
painter = painterResource(R.drawable.search_24px),
contentDescription = null,
tint = contentColor
)

View File

@@ -10,7 +10,6 @@ import android.graphics.RectF
import android.graphics.drawable.AdaptiveIconDrawable
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
@@ -214,15 +213,15 @@ fun ShapedLauncherIcon(
is VectorLayer -> {
Icon(
imageVector = fg.vector, contentDescription = null,
painter = painterResource(fg.icon), contentDescription = null,
tint = if (fg.color == 0) {
Color(renderSettings.fgThemeColor)
} else {
Color(getTone(fg.color, renderSettings.fgTone))
},
modifier = Modifier.size(size / 2f),
)
}
else -> {}
}
} else {
@@ -268,7 +267,7 @@ fun ShapedLauncherIcon(
modifier = Modifier
.fillMaxSize()
.padding(size / 24),
imageVector = badgeIcon.imageVector,
painter = painterResource(badgeIcon.iconRes),
contentDescription = null,
tint = MaterialTheme.colorScheme.onTertiary,
)

View File

@@ -1,5 +1,6 @@
package de.mm20.launcher2.ui.component
import androidx.annotation.DrawableRes
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.*
@@ -8,13 +9,14 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
@Composable
fun SmallMessage(
modifier: Modifier = Modifier,
icon: ImageVector,
@DrawableRes icon: Int,
text: String,
color: Color = MaterialTheme.colorScheme.surfaceVariant
) {
@@ -29,7 +31,7 @@ fun SmallMessage(
.padding(16.dp),
verticalAlignment = Alignment.CenterVertically
) {
Icon(imageVector = icon, contentDescription = null)
Icon(painterResource(icon), contentDescription = null)
Text(
text = text,
modifier = Modifier.padding(start = 16.dp),

View File

@@ -8,9 +8,6 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ChevronRight
import androidx.compose.material.icons.rounded.MoreVert
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
@@ -22,8 +19,8 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.integerResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.ui.R
@@ -55,7 +52,10 @@ fun Icons(actions: List<ToolbarAction>, slots: Int) {
var showMenu by remember { mutableStateOf(false) }
Box {
IconButton(onClick = { showMenu = true }) {
Icon(Icons.Rounded.MoreVert, contentDescription = stringResource(R.string.action_more_actions))
Icon(
painterResource(R.drawable.more_vert_24px),
contentDescription = stringResource(R.string.action_more_actions)
)
}
Box(
modifier = Modifier
@@ -80,7 +80,7 @@ fun Icons(actions: List<ToolbarAction>, slots: Int) {
IconButton(
onClick = action.action,
) {
Icon(action.icon, contentDescription = action.label)
Icon(painterResource(action.icon), contentDescription = action.label)
}
}
@@ -92,7 +92,10 @@ fun Icons(actions: List<ToolbarAction>, slots: Int) {
showMenu = true
},
) {
Icon(action.icon, contentDescription = action.label)
Icon(
painterResource(action.icon),
contentDescription = action.label
)
}
Box(
modifier = Modifier
@@ -132,10 +135,10 @@ fun ColumnScope.OverflowMenuItems(items: List<ToolbarAction>, onDismiss: () -> U
)
},
leadingIcon = {
Icon(action.icon, null)
Icon(painterResource(action.icon), null)
},
trailingIcon = {
Icon(Icons.Rounded.ChevronRight, null)
Icon(painterResource(R.drawable.chevron_forward_24px), null)
}
)
}
@@ -152,7 +155,7 @@ fun ColumnScope.OverflowMenuItems(items: List<ToolbarAction>, onDismiss: () -> U
)
},
leadingIcon = {
Icon(action.icon, null)
Icon(painterResource(action.icon), null)
}
)
}
@@ -166,17 +169,17 @@ fun ColumnScope.OverflowMenuItems(items: List<ToolbarAction>, onDismiss: () -> U
interface ToolbarAction {
val label: String
val icon: ImageVector
val icon: Int
}
data class DefaultToolbarAction(
override val label: String,
override val icon: ImageVector,
override val icon: Int,
val action: () -> Unit
) : ToolbarAction
data class SubmenuToolbarAction(
override val label: String,
override val icon: ImageVector,
override val icon: Int,
val children: List<ToolbarAction>
) : ToolbarAction

View File

@@ -58,11 +58,32 @@ fun EmojiPicker(
}
}
val categoryNames = stringArrayResource(R.array.category_names)
val categoryIcons = remember {
val typedArray = context.resources.obtainTypedArray(R.array.emoji_categories_icons)
IntArray(typedArray.length()) { typedArray.getResourceId(it, 0) }.also {
typedArray.recycle()
}
listOf(
R.drawable.mood_24px,
R.drawable.emoji_people_24px,
R.drawable.emoji_nature_24px,
R.drawable.emoji_food_beverage_24px,
R.drawable.emoji_transportation_24px,
R.drawable.trophy_24px,
R.drawable.emoji_objects_24px,
R.drawable.emoji_symbols_24px,
R.drawable.flag_24px,
)
}
val categoryIconsFilled = remember {
listOf(
R.drawable.mood_24px_filled,
R.drawable.emoji_people_24px_filled,
R.drawable.emoji_nature_24px_filled,
R.drawable.emoji_food_beverage_24px_filled,
R.drawable.emoji_transportation_24px_filled,
R.drawable.trophy_24px_filled,
R.drawable.emoji_objects_24px_filled,
R.drawable.emoji_symbols_24px_filled,
R.drawable.flag_24px_filled,
)
}
val emojis = remember {
@@ -106,7 +127,10 @@ fun EmojiPicker(
) {
if (i < categoryIcons.size && categoryIcons[i] != 0) {
Icon(
painterResource(id = categoryIcons[i]),
painterResource(
if (selectedCategory.intValue == i) categoryIconsFilled[i]
else categoryIcons[i]
),
contentDescription = categoryNames[i]
)
}

View File

@@ -1,5 +1,6 @@
package de.mm20.launcher2.ui.component.preferences
import androidx.annotation.DrawableRes
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CheckboxColors
import androidx.compose.material3.CheckboxDefaults
@@ -9,7 +10,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
@Composable
fun CheckboxPreference(
title: String,
icon: ImageVector? = null,
@DrawableRes icon: Int? = null,
iconPadding: Boolean = icon != null,
summary: String? = null,
value: Boolean,

View File

@@ -1,18 +1,16 @@
package de.mm20.launcher2.ui.component.preferences
import androidx.annotation.DrawableRes
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Lock
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.ui.R
@@ -23,7 +21,7 @@ fun GuardedPreference(
locked: Boolean,
onUnlock: (() -> Unit)? = null,
description: String,
icon: ImageVector = Icons.Rounded.Lock,
@DrawableRes icon: Int = R.drawable.lock_24px,
unlockLabel: String = stringResource(R.string.grant_permission),
preference: @Composable () -> Unit,
) {

View File

@@ -1,5 +1,6 @@
package de.mm20.launcher2.ui.component.preferences
import androidx.annotation.DrawableRes
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
@@ -17,7 +18,7 @@ import androidx.compose.ui.window.Dialog
@Composable
fun <T> ListPreference(
title: String,
icon: ImageVector? = null,
@DrawableRes icon: Int? = null,
iconPadding: Boolean = icon != null,
items: List<ListPreferenceItem<T>>,
value: T,

View File

@@ -1,5 +1,6 @@
package de.mm20.launcher2.ui.component.preferences
import androidx.annotation.DrawableRes
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
@@ -17,6 +18,7 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
@Composable
@@ -113,7 +115,7 @@ fun Preference(
@Composable
fun Preference(
title: String,
icon: ImageVector? = null,
@DrawableRes icon: Int? = null,
iconPadding: Boolean = icon != null,
summary: String? = null,
onClick: () -> Unit = {},
@@ -126,7 +128,7 @@ fun Preference(
icon = {
if (icon != null) {
Icon(
imageVector = icon,
painter = painterResource(icon),
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
)

View File

@@ -15,11 +15,7 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.rounded.HelpOutline
import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.FilledTonalIconButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -39,12 +35,13 @@ import androidx.compose.ui.input.nestedscroll.NestedScrollSource
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalViewConfiguration
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.core.net.toUri
import de.mm20.launcher2.ui.locals.LocalNavController
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.locals.LocalNavController
@Composable
@@ -134,7 +131,7 @@ fun PreferenceScreen(
}
}) {
Icon(
imageVector = Icons.AutoMirrored.Rounded.ArrowBack,
painter = painterResource(R.drawable.arrow_back_24px),
contentDescription = "Back"
)
}
@@ -152,7 +149,7 @@ fun PreferenceScreen(
.build().launchUrl(context, helpUrl.toUri())
}) {
Icon(
imageVector = Icons.Rounded.HelpOutline,
painter = painterResource(R.drawable.help_24px),
contentDescription = stringResource(R.string.help)
)
}

View File

@@ -1,5 +1,6 @@
package de.mm20.launcher2.ui.component.preferences
import androidx.annotation.DrawableRes
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material3.LocalContentColor
@@ -16,7 +17,7 @@ import androidx.compose.ui.unit.dp
fun PreferenceWithSwitch(
title: String,
summary: String? = null,
icon: ImageVector? = null,
@DrawableRes icon: Int? = null,
enabled: Boolean = true,
onClick: () -> Unit = {},
switchValue: Boolean,

View File

@@ -1,5 +1,6 @@
package de.mm20.launcher2.ui.component.preferences
import androidx.annotation.DrawableRes
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Slider
@@ -11,6 +12,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import java.text.DecimalFormat
@@ -21,7 +23,7 @@ import kotlin.math.roundToInt
@Composable
fun SliderPreference(
title: String,
icon: ImageVector? = null,
@DrawableRes icon: Int? = null,
iconPadding: Boolean = icon != null,
value: Float,
min: Float = 0f,
@@ -52,7 +54,7 @@ fun SliderPreference(
) {
if (icon != null) {
Icon(
imageVector = icon,
painter = painterResource(icon),
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
)
@@ -106,7 +108,7 @@ fun SliderPreference(
@Composable
fun SliderPreference(
title: String,
icon: ImageVector? = null,
@DrawableRes icon: Int? = null,
value: Int,
min: Int = 0,
max: Int = 100,
@@ -135,7 +137,7 @@ fun SliderPreference(
@Composable
inline fun <reified T: Enum<T>> SliderPreference(
title: String,
icon: ImageVector? = null,
@DrawableRes icon: Int? = null,
value: T,
enabled: Boolean = true,
labels: List<EnumLocalization<T>>? = null,

View File

@@ -1,5 +1,6 @@
package de.mm20.launcher2.ui.component.preferences
import androidx.annotation.DrawableRes
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Switch
import androidx.compose.runtime.Composable
@@ -9,7 +10,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
@Composable
fun SwitchPreference(
title: String,
icon: ImageVector? = null,
@DrawableRes icon: Int? = null,
iconPadding: Boolean = icon != null,
summary: String? = null,
value: Boolean,

View File

@@ -8,11 +8,6 @@ import androidx.compose.animation.graphics.res.animatedVectorResource
import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter
import androidx.compose.animation.graphics.vector.AnimatedImageVector
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.AcUnit
import androidx.compose.material.icons.rounded.Air
import androidx.compose.material.icons.rounded.Bolt
import androidx.compose.material.icons.rounded.Thermostat
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
@@ -21,15 +16,9 @@ import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.draw.scale
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.icons.WeatherCloud
import de.mm20.launcher2.icons.WeatherFog
import de.mm20.launcher2.icons.WeatherHailAnimatable
import de.mm20.launcher2.icons.WeatherLightRainAnimatable
import de.mm20.launcher2.icons.WeatherRainAnimatable
import de.mm20.launcher2.icons.WeatherSleetRainAnimatable
import de.mm20.launcher2.icons.WeatherSleetSnowAnimatable
import de.mm20.launcher2.ui.R
import kotlin.math.PI
import kotlin.math.sin
@@ -126,7 +115,7 @@ private fun LightningBolt(icon: WeatherIcon, colors: WeatherIconColors) {
}
Icon(
Icons.Rounded.Bolt,
painter = painterResource(R.drawable.bolt_24px_filled),
null,
modifier = Modifier
.size(32.dp)
@@ -156,7 +145,7 @@ private fun LightningBolt2(icon: WeatherIcon, colors: WeatherIconColors) {
}
Icon(
Icons.Rounded.Bolt,
painter = painterResource(R.drawable.bolt_24px_filled),
null,
modifier = Modifier
.size(32.dp)
@@ -236,7 +225,7 @@ private fun Cloud1(icon: WeatherIcon, colors: WeatherIconColors) {
}
Icon(
Icons.Rounded.WeatherCloud,
WeatherCloud,
null,
modifier = Modifier
.size(32.dp)
@@ -312,7 +301,7 @@ private fun Cloud2(icon: WeatherIcon, colors: WeatherIconColors) {
}
Icon(
Icons.Rounded.WeatherCloud,
WeatherCloud,
null,
modifier = Modifier
.size(32.dp)
@@ -379,7 +368,7 @@ private fun Cloud3(icon: WeatherIcon, colors: WeatherIconColors) {
}
Icon(
Icons.Rounded.WeatherCloud,
WeatherCloud,
null,
modifier = Modifier
.size(32.dp)
@@ -399,7 +388,7 @@ private fun Hot(icon: WeatherIcon, colors: WeatherIconColors) {
}
)
Icon(
Icons.Rounded.Thermostat,
painterResource(R.drawable.heat_24px),
null,
modifier = Modifier
.scale(scale)
@@ -418,7 +407,7 @@ private fun Cold(icon: WeatherIcon, colors: WeatherIconColors) {
}
)
Icon(
Icons.Rounded.AcUnit,
painterResource(R.drawable.severe_cold_24px),
null,
modifier = Modifier
.scale(scale)
@@ -437,7 +426,7 @@ private fun Wind1(icon: WeatherIcon, colors: WeatherIconColors) {
}
)
Icon(
Icons.Rounded.Air,
painterResource(R.drawable.air_20px),
null,
modifier = Modifier
.scale(scale)
@@ -457,7 +446,7 @@ private fun Wind2(icon: WeatherIcon, colors: WeatherIconColors) {
}
)
Icon(
Icons.Rounded.Air,
painterResource(R.drawable.air_20px),
null,
modifier = Modifier
.scale(scale)
@@ -470,7 +459,7 @@ private fun Wind2(icon: WeatherIcon, colors: WeatherIconColors) {
@Preview
@Composable
fun AnimatedWeatherIconTestPanel() {
var icon by remember { mutableStateOf(WeatherIcon.MostlyCloudy) }
var icon by remember { mutableStateOf(WeatherIcon.ThunderstormWithRain) }
var night by remember { mutableStateOf(false) }
Row {
val icons = WeatherIcon.values()
@@ -532,7 +521,7 @@ private fun Precipitation(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.size(32.dp)
.offset(y = 8.dp + 11.dp * animProgress),
imageVector = Icons.Rounded.WeatherLightRainAnimatable,
imageVector = WeatherLightRainAnimatable,
contentDescription = null,
tint = colors.rain
)
@@ -548,7 +537,7 @@ private fun Precipitation(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.size(32.dp)
.offset(y = 8.dp + 11.dp * animProgress),
imageVector = Icons.Rounded.WeatherHailAnimatable,
imageVector = WeatherHailAnimatable,
contentDescription = null,
tint = colors.hail,
)
@@ -567,7 +556,7 @@ private fun Precipitation(icon: WeatherIcon, colors: WeatherIconColors) {
x = sin(animProgress * 2 * PI).dp,
y = 8.dp + 11.dp * animProgress
),
imageVector = Icons.Rounded.WeatherHailAnimatable,
imageVector = WeatherHailAnimatable,
contentDescription = null,
tint = colors.snow,
)
@@ -585,7 +574,7 @@ private fun Precipitation(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.size(32.dp)
.offset(y = 8.dp + 11.dp * animProgress),
imageVector = Icons.Rounded.WeatherRainAnimatable,
imageVector = WeatherRainAnimatable,
contentDescription = null,
tint = colors.rain,
)
@@ -601,7 +590,7 @@ private fun Precipitation(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.size(32.dp)
.offset(y = 8.dp + 11.dp * animProgress),
imageVector = Icons.Rounded.WeatherSleetRainAnimatable,
imageVector = WeatherSleetRainAnimatable,
contentDescription = null,
tint = colors.rain,
)
@@ -609,7 +598,7 @@ private fun Precipitation(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.size(32.dp)
.offset(y = 8.dp + 11.dp * animProgress),
imageVector = Icons.Rounded.WeatherSleetSnowAnimatable,
imageVector = WeatherSleetSnowAnimatable,
contentDescription = null,
tint = colors.snow,
)
@@ -629,7 +618,7 @@ private fun Fog(icon: WeatherIcon, colors: WeatherIconColors) {
.size(32.dp)
.scale(scale)
.offset(x = 6.dp, y = 7.dp),
imageVector = Icons.Rounded.WeatherFog,
imageVector = WeatherFog,
contentDescription = null,
tint = colors.fog
)

View File

@@ -0,0 +1,720 @@
package de.mm20.launcher2.ui.component.weather
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.graphics.StrokeJoin
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.PathBuilder
import androidx.compose.ui.graphics.vector.path
import androidx.compose.ui.unit.dp
private fun weatherIcon(
name: String,
path: PathBuilder.() -> Unit,
): ImageVector {
return ImageVector.Builder(
name = name,
defaultHeight = 24.dp,
defaultWidth = 24.dp,
viewportWidth = 24f,
viewportHeight = 24f,
).apply {
path(
fill = SolidColor(Color.Black),
fillAlpha = 1f,
stroke = null,
strokeAlpha = 1f,
strokeLineWidth = 1f,
strokeLineCap = StrokeCap.Butt,
strokeLineJoin = StrokeJoin.Bevel,
strokeLineMiter = 1f,
pathBuilder = path
)
}.build()
}
val WeatherCloud = weatherIcon("WeatherCloud") {
moveTo(15.240234f, 6.953125f)
arcTo(4.2818656f, 4.2818656f, 0f, false, false, 11.722656f, 8.7949219f)
arcTo(3.8614116f, 3.8614116f, 0f, false, false, 9.2871094f, 7.9296875f)
arcTo(3.8614116f, 3.8614116f, 0f, false, false, 5.4257812f, 11.791016f)
arcTo(3.8614116f, 3.8614116f, 0f, false, false, 5.4335938f, 12.035156f)
arcTo(3.0096498f, 3.0096498f, 0f, false, false, 4.8671875f, 11.980469f)
arcTo(3.0096498f, 3.0096498f, 0f, false, false, 1.8574219f, 14.990234f)
arcTo(3.0096498f, 3.0096498f, 0f, false, false, 4.8671875f, 18f)
arcTo(3.0096498f, 3.0096498f, 0f, false, false, 4.9316406f, 18f)
lineTo(19.220703f, 18f)
lineTo(19.220703f, 17.998047f)
arcTo(2.5873528f, 2.5873528f, 0f, false, false, 21.742188f, 15.412109f)
arcTo(2.5873528f, 2.5873528f, 0f, false, false, 19.214844f, 12.826172f)
arcTo(4.2818656f, 4.2818656f, 0f, false, false, 19.523438f, 11.234375f)
arcTo(4.2818656f, 4.2818656f, 0f, false, false, 15.240234f, 6.953125f)
close()
}
val WeatherLightRain = weatherIcon("WeatherLightRain") {
moveTo(7.7747158f, 16.298471f)
curveTo(7.7747158f, 16.298471f, 6.3149844f, 17.454229f, 6.1717047f, 18.266809f)
arcTo(1.237673f, 1.237673f, 0f, false, false, 7.1769077f, 19.699334f)
arcTo(1.237673f, 1.237673f, 0f, false, false, 8.6094328f, 18.696345f)
curveTo(8.7527126f, 17.883765f, 7.7747158f, 16.298471f, 7.7747158f, 16.298471f)
close()
moveTo(12.3092f, 16.298471f)
curveTo(12.3092f, 16.298471f, 10.849468f, 17.454229f, 10.706189f, 18.266809f)
arcTo(1.237673f, 1.237673f, 0f, false, false, 11.711392f, 19.699334f)
arcTo(1.237673f, 1.237673f, 0f, false, false, 13.143917f, 18.696345f)
curveTo(13.287198f, 17.883765f, 12.3092f, 16.298471f, 12.3092f, 16.298471f)
close()
moveTo(16.843685f, 16.298471f)
curveTo(16.843685f, 16.298471f, 15.383952f, 17.454229f, 15.240673f, 18.266809f)
arcTo(1.237673f, 1.237673f, 0f, false, false, 16.245876f, 19.699334f)
arcTo(1.237673f, 1.237673f, 0f, false, false, 17.678401f, 18.696345f)
curveTo(17.821682f, 17.883765f, 16.843685f, 16.298471f, 16.843685f, 16.298471f)
close()
}
val WeatherHail = weatherIcon("WeatherHail") {
moveTo(7.4093667f, 16.258438f)
curveTo(6.6975174f, 16.235656f, 6.09006f, 16.947847f, 6.2243877f, 17.647106f)
curveTo(6.3138584f, 18.353739f, 7.1127111f, 18.841403f, 7.7821731f, 18.599057f)
curveTo(8.4660776f, 18.399808f, 8.8227568f, 17.533933f, 8.4775745f, 16.910825f)
curveTo(8.2792236f, 16.515419f, 7.8517895f, 16.254332f, 7.4093667f, 16.258438f)
close()
moveTo(11.935705f, 16.258438f)
curveTo(11.223856f, 16.235656f, 10.616399f, 16.947847f, 10.750726f, 17.647106f)
curveTo(10.840183f, 18.35367f, 11.639079f, 18.841563f, 12.308486f, 18.598897f)
curveTo(12.992113f, 18.399396f, 13.348471f, 17.533766f, 13.003396f, 16.910825f)
curveTo(12.805121f, 16.51558f, 12.377952f, 16.254528f, 11.935705f, 16.258438f)
close()
moveTo(16.462044f, 16.258438f)
curveTo(15.750195f, 16.235656f, 15.142737f, 16.947847f, 15.277065f, 17.647106f)
curveTo(15.366522f, 18.35367f, 16.165418f, 18.841563f, 16.834825f, 18.598897f)
curveTo(17.518452f, 18.399396f, 17.87481f, 17.533766f, 17.529735f, 16.910825f)
curveTo(17.331459f, 16.51558f, 16.904291f, 16.254528f, 16.462044f, 16.258438f)
close()
}
val WeatherSleetSnow = weatherIcon("WeatherSleetSnow") {
moveTo(11.935705f, 16.258438f)
curveTo(11.223856f, 16.235656f, 10.616399f, 16.947847f, 10.750726f, 17.647106f)
curveTo(10.840183f, 18.35367f, 11.639079f, 18.841563f, 12.308486f, 18.598897f)
curveTo(12.992113f, 18.399396f, 13.348471f, 17.533766f, 13.003396f, 16.910825f)
curveTo(12.805121f, 16.51558f, 12.377952f, 16.254528f, 11.935705f, 16.258438f)
close()
}
val WeatherSleetRain = weatherIcon("WeatherSleetRain") {
moveTo(6.347656f, 15.96875f)
curveTo(5.938469f, 15.896599f, 5.550666f, 16.166984f, 5.478515f, 16.576172f)
lineTo(5.044922f, 19.039062f)
curveTo(4.972771f, 19.44825f, 5.243156f, 19.836052f, 5.652344f, 19.908203f)
curveTo(6.061531f, 19.980354f, 6.449333f, 19.708016f, 6.521484f, 19.298828f)
lineTo(6.955078f, 16.837891f)
curveTo(7.0272288f, 16.428703f, 6.7568437f, 16.040901f, 6.347656f, 15.96875f)
close()
moveTo(18.347656f, 15.96875f)
curveTo(17.938469f, 15.896599f, 17.550666f, 16.166984f, 17.478516f, 16.576172f)
lineTo(17.044922f, 19.039062f)
curveTo(16.972771f, 19.44825f, 17.243156f, 19.836052f, 17.652344f, 19.908203f)
curveTo(18.061531f, 19.980354f, 18.449333f, 19.708016f, 18.521484f, 19.298828f)
lineTo(18.955078f, 16.837891f)
curveTo(19.027229f, 16.428703f, 18.756844f, 16.040901f, 18.347656f, 15.96875f)
close()
}
val WeatherRain = weatherIcon("WeatherRain") {
moveTo(6.347656f, 15.96875f)
curveTo(5.938469f, 15.896599f, 5.550666f, 16.166984f, 5.478515f, 16.576172f)
lineTo(5.044922f, 19.039062f)
curveTo(4.972771f, 19.44825f, 5.243156f, 19.836052f, 5.652344f, 19.908203f)
curveTo(6.061531f, 19.980354f, 6.449333f, 19.708016f, 6.521484f, 19.298828f)
lineTo(6.955078f, 16.837891f)
curveTo(7.0272288f, 16.428703f, 6.7568437f, 16.040901f, 6.347656f, 15.96875f)
close()
moveTo(9.3476561f, 15.96875f)
curveTo(8.9384685f, 15.896599f, 8.5506663f, 16.166984f, 8.4785155f, 16.576172f)
lineTo(8.0449218f, 19.039062f)
curveTo(7.9727709f, 19.44825f, 8.243156f, 19.836052f, 8.6523436f, 19.908203f)
curveTo(9.0615312f, 19.980354f, 9.4493334f, 19.708016f, 9.5214842f, 19.298828f)
lineTo(9.955078f, 16.837891f)
curveTo(10.027229f, 16.428703f, 9.7568437f, 16.040901f, 9.3476561f, 15.96875f)
close()
moveTo(12.347656f, 15.96875f)
curveTo(11.938469f, 15.896599f, 11.550666f, 16.166984f, 11.478516f, 16.576172f)
lineTo(11.044922f, 19.039062f)
curveTo(10.972771f, 19.44825f, 11.243156f, 19.836052f, 11.652344f, 19.908203f)
curveTo(12.061531f, 19.980354f, 12.449333f, 19.708016f, 12.521484f, 19.298828f)
lineTo(12.955078f, 16.837891f)
curveTo(13.027229f, 16.428703f, 12.756844f, 16.040901f, 12.347656f, 15.96875f)
close()
moveTo(15.347656f, 15.96875f)
curveTo(14.938469f, 15.896599f, 14.550666f, 16.166984f, 14.478516f, 16.576172f)
lineTo(14.044922f, 19.039062f)
curveTo(13.972771f, 19.44825f, 14.243156f, 19.836052f, 14.652344f, 19.908203f)
curveTo(15.061531f, 19.980354f, 15.449333f, 19.708016f, 15.521484f, 19.298828f)
lineTo(15.955078f, 16.837891f)
curveTo(16.027229f, 16.428703f, 15.756844f, 16.040901f, 15.347656f, 15.96875f)
close()
moveTo(18.347656f, 15.96875f)
curveTo(17.938469f, 15.896599f, 17.550666f, 16.166984f, 17.478516f, 16.576172f)
lineTo(17.044922f, 19.039062f)
curveTo(16.972771f, 19.44825f, 17.243156f, 19.836052f, 17.652344f, 19.908203f)
curveTo(18.061531f, 19.980354f, 18.449333f, 19.708016f, 18.521484f, 19.298828f)
lineTo(18.955078f, 16.837891f)
curveTo(19.027229f, 16.428703f, 18.756844f, 16.040901f, 18.347656f, 15.96875f)
close()
}
val WeatherLightRainAnimatable = weatherIcon("WeatherLightRainAnimatable") {
moveTo(4.828129f, 0f)
curveTo(4.828129f, 0f, 3.6375041f, 1.3394488f, 3.6375041f, 2.1332031f)
curveTo(3.6375041f, 2.7907671f, 4.1705651f, 3.3238281f, 4.828129f, 3.3238281f)
curveTo(5.485693f, 3.3238281f, 6.018754f, 2.7907671f, 6.018754f, 2.1332031f)
curveTo(6.018754f, 1.3394488f, 4.828129f, 0f, 4.828129f, 0f)
close()
moveTo(12.765629f, 0f)
curveTo(12.765629f, 0f, 11.575004f, 1.3394488f, 11.575004f, 2.1332031f)
curveTo(11.575004f, 2.7907671f, 12.108065f, 3.3238281f, 12.765629f, 3.3238281f)
curveTo(13.423193f, 3.3238281f, 13.956254f, 2.7907671f, 13.956254f, 2.1332031f)
curveTo(13.956254f, 1.3394488f, 12.765629f, 0f, 12.765629f, 0f)
close()
moveTo(20.703129f, 0f)
curveTo(20.703129f, 0f, 19.512504f, 1.3394488f, 19.512504f, 2.1332031f)
curveTo(19.512504f, 2.7907671f, 20.045565f, 3.3238281f, 20.703129f, 3.3238281f)
curveTo(21.360693f, 3.3238281f, 21.893754f, 2.7907671f, 21.893754f, 2.1332031f)
curveTo(21.893754f, 1.3394488f, 20.703129f, 0f, 20.703129f, 0f)
close()
moveTo(8.796879f, 3.96875f)
curveTo(8.796879f, 3.96875f, 7.606254f, 5.3081983f, 7.606254f, 6.101953f)
curveTo(7.606254f, 6.759517f, 8.1393151f, 7.292578f, 8.796879f, 7.292578f)
curveTo(9.4544429f, 7.292578f, 9.987504f, 6.759517f, 9.987504f, 6.101953f)
curveTo(9.987504f, 5.3081983f, 8.796879f, 3.96875f, 8.796879f, 3.96875f)
close()
moveTo(16.734379f, 3.96875f)
curveTo(16.734379f, 3.96875f, 16.659965f, 4.0524664f, 16.548344f, 4.1904419f)
curveTo(16.21348f, 4.6043688f, 15.543754f, 5.5066369f, 15.543754f, 6.101953f)
curveTo(15.54381f, 6.7411813f, 16.048624f, 7.2662972f, 16.687353f, 7.2915446f)
curveTo(16.70302f, 7.2921986f, 16.718698f, 7.2925434f, 16.734379f, 7.292578f)
curveTo(17.391943f, 7.292578f, 17.925004f, 6.759517f, 17.925004f, 6.101953f)
curveTo(17.925004f, 5.3081983f, 16.734379f, 3.96875f, 16.734379f, 3.96875f)
close()
moveTo(4.828129f, 7.9374999f)
curveTo(4.828129f, 7.9374999f, 3.6375041f, 9.2769485f, 3.6375041f, 10.070703f)
curveTo(3.6375041f, 10.728267f, 4.1705651f, 11.261328f, 4.828129f, 11.261328f)
curveTo(5.485693f, 11.261328f, 6.018754f, 10.728267f, 6.018754f, 10.070703f)
curveTo(6.018754f, 9.2769485f, 4.828129f, 7.9374999f, 4.828129f, 7.9374999f)
close()
moveTo(12.765629f, 7.9374999f)
curveTo(12.765629f, 7.9374999f, 12.691215f, 8.0212162f, 12.579594f, 8.1591919f)
curveTo(12.24473f, 8.5731188f, 11.575004f, 9.4753868f, 11.575004f, 10.070703f)
curveTo(11.57496f, 10.567853f, 11.883816f, 11.012697f, 12.349634f, 11.186397f)
curveTo(12.364344f, 11.191857f, 12.379161f, 11.197026f, 12.394075f, 11.2019f)
curveTo(12.499019f, 11.236323f, 12.608242f, 11.255976f, 12.718603f, 11.260295f)
curveTo(12.73427f, 11.260949f, 12.749948f, 11.261293f, 12.765629f, 11.261328f)
curveTo(13.423193f, 11.261328f, 13.956254f, 10.728267f, 13.956254f, 10.070703f)
curveTo(13.956254f, 9.2769485f, 12.765629f, 7.9374999f, 12.765629f, 7.9374999f)
close()
moveTo(20.703129f, 7.9374999f)
curveTo(20.703129f, 7.9374999f, 20.628715f, 8.0212162f, 20.517094f, 8.1591919f)
curveTo(20.18223f, 8.5731188f, 19.512504f, 9.4753868f, 19.512504f, 10.070703f)
curveTo(19.51256f, 10.709931f, 20.017374f, 11.235047f, 20.656103f, 11.260295f)
curveTo(20.67177f, 11.260949f, 20.687448f, 11.261293f, 20.703129f, 11.261328f)
curveTo(21.360693f, 11.261328f, 21.893754f, 10.728267f, 21.893754f, 10.070703f)
curveTo(21.893754f, 9.2769485f, 20.703129f, 7.9374999f, 20.703129f, 7.9374999f)
close()
moveTo(8.796879f, 11.90625f)
curveTo(8.796879f, 11.90625f, 7.606254f, 13.245698f, 7.606254f, 14.039453f)
curveTo(7.606254f, 14.697017f, 8.1393151f, 15.230078f, 8.796879f, 15.230078f)
curveTo(9.4544429f, 15.230078f, 9.987504f, 14.697017f, 9.987504f, 14.039453f)
curveTo(9.987504f, 13.245698f, 8.796879f, 11.90625f, 8.796879f, 11.90625f)
close()
moveTo(16.734379f, 11.90625f)
curveTo(16.734379f, 11.90625f, 15.543754f, 13.245698f, 15.543754f, 14.039453f)
curveTo(15.543754f, 14.697017f, 16.076815f, 15.230078f, 16.734379f, 15.230078f)
curveTo(17.391943f, 15.230078f, 17.925004f, 14.697017f, 17.925004f, 14.039453f)
curveTo(17.925004f, 13.245698f, 16.734379f, 11.90625f, 16.734379f, 11.90625f)
close()
moveTo(4.828129f, 15.875f)
curveTo(4.828129f, 15.875f, 3.6375041f, 17.214448f, 3.6375041f, 18.008203f)
curveTo(3.6375041f, 18.665767f, 4.1705651f, 19.198828f, 4.828129f, 19.198828f)
curveTo(5.485693f, 19.198828f, 6.018754f, 18.665767f, 6.018754f, 18.008203f)
curveTo(6.018754f, 17.214448f, 4.828129f, 15.875f, 4.828129f, 15.875f)
close()
moveTo(12.765629f, 15.875f)
curveTo(12.765629f, 15.875f, 11.575004f, 17.214448f, 11.575004f, 18.008203f)
curveTo(11.575004f, 18.665767f, 12.108065f, 19.198828f, 12.765629f, 19.198828f)
curveTo(13.423193f, 19.198828f, 13.956254f, 18.665767f, 13.956254f, 18.008203f)
curveTo(13.956254f, 17.214448f, 12.765629f, 15.875f, 12.765629f, 15.875f)
close()
moveTo(20.703129f, 15.875f)
curveTo(20.703129f, 15.875f, 19.512504f, 17.214448f, 19.512504f, 18.008203f)
curveTo(19.512504f, 18.665767f, 20.045565f, 19.198828f, 20.703129f, 19.198828f)
curveTo(21.360693f, 19.198828f, 21.893754f, 18.665767f, 21.893754f, 18.008203f)
curveTo(21.893754f, 17.214448f, 20.703129f, 15.875f, 20.703129f, 15.875f)
close()
}
val WeatherHailAnimatable = weatherIcon("WeatherHailAnimatable") {
moveTo(4.8281292f, 1.0583334f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 3.5971949f, 2.2892661f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 4.8281292f, 3.5201987f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 6.0585449f, 2.2892661f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 4.8281292f, 1.0583334f)
close()
moveTo(12.765629f, 1.0583334f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 11.534695f, 2.2892661f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 12.765629f, 3.5201987f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 13.996045f, 2.2892661f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 12.765629f, 1.0583334f)
close()
moveTo(20.703129f, 1.0583334f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 19.472195f, 2.2892661f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 20.703129f, 3.5201987f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 21.933545f, 2.2892661f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 20.703129f, 1.0583334f)
close()
moveTo(8.7968792f, 5.0270833f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 7.5659449f, 6.258016f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 8.7968792f, 7.4889487f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 10.027295f, 6.258016f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 8.7968792f, 5.0270833f)
close()
moveTo(16.734379f, 5.0270833f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 15.503445f, 6.258016f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 16.734379f, 7.4889487f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 17.964795f, 6.258016f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 16.734379f, 5.0270833f)
close()
moveTo(4.8281292f, 8.9958333f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 3.5971949f, 10.226766f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 4.8281292f, 11.457699f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 6.0585449f, 10.226766f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 4.8281292f, 8.9958333f)
close()
moveTo(12.765629f, 8.9958333f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 11.534695f, 10.226766f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 12.765629f, 11.457699f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 13.996045f, 10.226766f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 12.765629f, 8.9958333f)
close()
moveTo(20.703129f, 8.9958333f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 19.472195f, 10.226766f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 20.703129f, 11.457699f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 21.933545f, 10.226766f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 20.703129f, 8.9958333f)
close()
moveTo(8.7968792f, 12.964583f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 7.5659449f, 14.195516f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 8.7968792f, 15.426449f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 10.027295f, 14.195516f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 8.7968792f, 12.964583f)
close()
moveTo(16.734379f, 12.964583f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 15.503445f, 14.195516f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 16.734379f, 15.426449f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 17.964795f, 14.195516f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 16.734379f, 12.964583f)
close()
moveTo(4.8281292f, 16.933333f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 3.5971949f, 18.164266f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 4.8281292f, 19.395199f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 6.0585449f, 18.164266f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 4.8281292f, 16.933333f)
close()
moveTo(12.765629f, 16.933333f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 11.534695f, 18.164266f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 12.765629f, 19.395199f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 13.996045f, 18.164266f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 12.765629f, 16.933333f)
close()
moveTo(20.703129f, 16.933333f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 19.472195f, 18.164266f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 20.703129f, 19.395199f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 21.933545f, 18.164266f)
arcTo(1.2307138f, 1.2307138f, 0f, false, false, 20.703129f, 16.933333f)
close()
}
val WeatherRainAnimatable = weatherIcon("WeatherRainAnimatable") {
moveTo(4.828129f, 0.1133928f)
curveTo(4.41263f, 0.1133928f, 4.0777866f, 0.4477181f, 4.0777866f, 0.8632184f)
verticalLineTo(4.8634909f)
curveTo(4.0777866f, 5.278991f, 4.41263f, 5.6133161f, 4.828129f, 5.6133161f)
curveTo(5.243628f, 5.6133161f, 5.5779529f, 5.278991f, 5.5779529f, 4.8634909f)
verticalLineTo(0.8632184f)
curveTo(5.5779529f, 0.4477181f, 5.243628f, 0.1133928f, 4.828129f, 0.1133928f)
close()
moveTo(12.765629f, 0.1133928f)
curveTo(12.35013f, 0.1133928f, 12.015286f, 0.4477181f, 12.015286f, 0.8632184f)
verticalLineTo(4.8634909f)
curveTo(12.015286f, 5.278991f, 12.35013f, 5.6133161f, 12.765629f, 5.6133161f)
curveTo(13.181128f, 5.6133161f, 13.515453f, 5.278991f, 13.515453f, 4.8634909f)
verticalLineTo(0.8632184f)
curveTo(13.515453f, 0.4477181f, 13.181128f, 0.1133928f, 12.765629f, 0.1133928f)
close()
moveTo(20.703129f, 0.1133928f)
curveTo(20.28763f, 0.1133928f, 19.952786f, 0.4477181f, 19.952786f, 0.8632184f)
verticalLineTo(4.8634909f)
curveTo(19.952786f, 5.278991f, 20.28763f, 5.6133161f, 20.703129f, 5.6133161f)
curveTo(21.118628f, 5.6133161f, 21.452953f, 5.278991f, 21.452953f, 4.8634909f)
verticalLineTo(0.8632184f)
curveTo(21.452953f, 0.4477181f, 21.118628f, 0.1133928f, 20.703129f, 0.1133928f)
close()
moveTo(8.796879f, 4.0821433f)
curveTo(8.3813799f, 4.0821433f, 8.0465365f, 4.4164684f, 8.0465365f, 4.8319684f)
verticalLineTo(8.8322408f)
curveTo(8.0465365f, 9.247741f, 8.3813799f, 9.582066f, 8.796879f, 9.582066f)
curveTo(9.212378f, 9.582066f, 9.5467028f, 9.247741f, 9.5467028f, 8.8322408f)
verticalLineTo(4.8319684f)
curveTo(9.5467028f, 4.4164684f, 9.212378f, 4.0821433f, 8.796879f, 4.0821433f)
close()
moveTo(16.734379f, 4.0821433f)
curveTo(16.31888f, 4.0821433f, 15.984036f, 4.4164684f, 15.984036f, 4.8319684f)
verticalLineTo(8.8322408f)
curveTo(15.984036f, 9.247741f, 16.31888f, 9.582066f, 16.734379f, 9.582066f)
curveTo(17.149878f, 9.582066f, 17.484203f, 9.247741f, 17.484203f, 8.8322408f)
verticalLineTo(4.8319684f)
curveTo(17.484203f, 4.4164684f, 17.149878f, 4.0821433f, 16.734379f, 4.0821433f)
close()
moveTo(4.828129f, 8.0508932f)
curveTo(4.41263f, 8.0508932f, 4.0777866f, 8.3852183f, 4.0777866f, 8.8007184f)
verticalLineTo(12.800991f)
curveTo(4.0777866f, 13.216491f, 4.41263f, 13.550816f, 4.828129f, 13.550816f)
curveTo(5.243628f, 13.550816f, 5.5779529f, 13.216491f, 5.5779529f, 12.800991f)
verticalLineTo(8.8007184f)
curveTo(5.5779529f, 8.3852183f, 5.243628f, 8.0508932f, 4.828129f, 8.0508932f)
close()
moveTo(12.765629f, 8.0508932f)
curveTo(12.35013f, 8.0508932f, 12.015286f, 8.3852183f, 12.015286f, 8.8007184f)
verticalLineTo(12.800991f)
curveTo(12.015286f, 13.216491f, 12.35013f, 13.550816f, 12.765629f, 13.550816f)
curveTo(13.181128f, 13.550816f, 13.515453f, 13.216491f, 13.515453f, 12.800991f)
verticalLineTo(8.8007184f)
curveTo(13.515453f, 8.3852183f, 13.181128f, 8.0508932f, 12.765629f, 8.0508932f)
close()
moveTo(20.703129f, 8.0508932f)
curveTo(20.28763f, 8.0508932f, 19.952786f, 8.3852183f, 19.952786f, 8.8007184f)
verticalLineTo(12.800991f)
curveTo(19.952786f, 13.216491f, 20.28763f, 13.550816f, 20.703129f, 13.550816f)
curveTo(21.118628f, 13.550816f, 21.452953f, 13.216491f, 21.452953f, 12.800991f)
verticalLineTo(8.8007184f)
curveTo(21.452953f, 8.3852183f, 21.118628f, 8.0508932f, 20.703129f, 8.0508932f)
close()
moveTo(8.796879f, 12.019643f)
curveTo(8.3813799f, 12.019643f, 8.0465365f, 12.353968f, 8.0465365f, 12.769468f)
verticalLineTo(16.769741f)
curveTo(8.0465365f, 17.185241f, 8.3813799f, 17.519566f, 8.796879f, 17.519566f)
curveTo(9.212378f, 17.519566f, 9.5467028f, 17.185241f, 9.5467028f, 16.769741f)
verticalLineTo(12.769468f)
curveTo(9.5467028f, 12.353968f, 9.212378f, 12.019643f, 8.796879f, 12.019643f)
close()
moveTo(16.734379f, 12.019643f)
curveTo(16.31888f, 12.019643f, 15.984036f, 12.353968f, 15.984036f, 12.769468f)
verticalLineTo(16.769741f)
curveTo(15.984036f, 17.185241f, 16.31888f, 17.519566f, 16.734379f, 17.519566f)
curveTo(17.149878f, 17.519566f, 17.484203f, 17.185241f, 17.484203f, 16.769741f)
verticalLineTo(12.769468f)
curveTo(17.484203f, 12.353968f, 17.149878f, 12.019643f, 16.734379f, 12.019643f)
close()
moveTo(4.828129f, 15.988393f)
curveTo(4.41263f, 15.988393f, 4.0777866f, 16.322718f, 4.0777866f, 16.738218f)
verticalLineTo(20.738491f)
curveTo(4.0777866f, 21.153991f, 4.41263f, 21.488316f, 4.828129f, 21.488316f)
curveTo(5.243628f, 21.488316f, 5.5779529f, 21.153991f, 5.5779529f, 20.738491f)
verticalLineTo(16.738218f)
curveTo(5.5779529f, 16.322718f, 5.243628f, 15.988393f, 4.828129f, 15.988393f)
close()
moveTo(12.765629f, 15.988393f)
curveTo(12.35013f, 15.988393f, 12.015286f, 16.322718f, 12.015286f, 16.738218f)
verticalLineTo(20.738491f)
curveTo(12.015286f, 21.153991f, 12.35013f, 21.488316f, 12.765629f, 21.488316f)
curveTo(13.181128f, 21.488316f, 13.515453f, 21.153991f, 13.515453f, 20.738491f)
verticalLineTo(16.738218f)
curveTo(13.515453f, 16.322718f, 13.181128f, 15.988393f, 12.765629f, 15.988393f)
close()
moveTo(20.703129f, 15.988393f)
curveTo(20.28763f, 15.988393f, 19.952786f, 16.322718f, 19.952786f, 16.738218f)
verticalLineTo(20.738491f)
curveTo(19.952786f, 21.153991f, 20.28763f, 21.488316f, 20.703129f, 21.488316f)
curveTo(21.118628f, 21.488316f, 21.452953f, 21.153991f, 21.452953f, 20.738491f)
verticalLineTo(16.738218f)
curveTo(21.452953f, 16.322718f, 21.118628f, 15.988393f, 20.703129f, 15.988393f)
close()
}
val WeatherSleetRainAnimatable = weatherIcon("WeatherSleetRainAnimatable") {
moveTo(4.8281293f, 0.11317139f)
curveTo(4.4126296f, 0.11317139f, 4.0777866f, 0.44749611f, 4.0777866f, 0.86299642f)
verticalLineTo(4.8632689f)
curveTo(4.0777866f, 5.278769f, 4.4126296f, 5.6130941f, 4.8281293f, 5.6130941f)
curveTo(5.2436283f, 5.6130941f, 5.5779543f, 5.278769f, 5.5779543f, 4.8632689f)
verticalLineTo(0.86299642f)
curveTo(5.5779543f, 0.44749611f, 5.2436283f, 0.11317139f, 4.8281293f, 0.11317139f)
close()
moveTo(12.765629f, 0.11317139f)
curveTo(12.35013f, 0.11317139f, 12.015287f, 0.44749611f, 12.015287f, 0.86299642f)
verticalLineTo(4.8632689f)
curveTo(12.015287f, 5.278769f, 12.35013f, 5.6130941f, 12.765629f, 5.6130941f)
curveTo(13.181128f, 5.6130941f, 13.515454f, 5.278769f, 13.515454f, 4.8632689f)
verticalLineTo(0.86299642f)
curveTo(13.515454f, 0.44749611f, 13.181128f, 0.11317139f, 12.765629f, 0.11317139f)
close()
moveTo(20.703129f, 0.11317139f)
curveTo(20.287629f, 0.11317139f, 19.952787f, 0.44749611f, 19.952787f, 0.86299642f)
verticalLineTo(4.8632689f)
curveTo(19.952787f, 5.278769f, 20.287629f, 5.6130941f, 20.703129f, 5.6130941f)
curveTo(21.118628f, 5.6130941f, 21.452953f, 5.278769f, 21.452953f, 4.8632689f)
verticalLineTo(0.86299642f)
curveTo(21.452953f, 0.44749611f, 21.118628f, 0.11317139f, 20.703129f, 0.11317139f)
close()
moveTo(4.8281293f, 8.0506712f)
curveTo(4.4126296f, 8.0506712f, 4.0777866f, 8.3849963f, 4.0777866f, 8.8004964f)
verticalLineTo(12.800769f)
curveTo(4.0777866f, 13.216269f, 4.4126296f, 13.550594f, 4.8281293f, 13.550594f)
curveTo(5.2436283f, 13.550594f, 5.5779543f, 13.216269f, 5.5779543f, 12.800769f)
verticalLineTo(8.8004964f)
curveTo(5.5779543f, 8.3849963f, 5.2436283f, 8.0506712f, 4.8281293f, 8.0506712f)
close()
moveTo(12.765629f, 8.0506712f)
curveTo(12.35013f, 8.0506712f, 12.015287f, 8.3849963f, 12.015287f, 8.8004964f)
verticalLineTo(12.800769f)
curveTo(12.015287f, 13.216269f, 12.35013f, 13.550594f, 12.765629f, 13.550594f)
curveTo(13.181128f, 13.550594f, 13.515454f, 13.216269f, 13.515454f, 12.800769f)
verticalLineTo(8.8004964f)
curveTo(13.515454f, 8.3849963f, 13.181128f, 8.0506712f, 12.765629f, 8.0506712f)
close()
moveTo(20.703129f, 8.0506712f)
curveTo(20.287629f, 8.0506712f, 19.952787f, 8.3849963f, 19.952787f, 8.8004964f)
verticalLineTo(12.800769f)
curveTo(19.952787f, 13.216269f, 20.287629f, 13.550594f, 20.703129f, 13.550594f)
curveTo(21.118628f, 13.550594f, 21.452953f, 13.216269f, 21.452953f, 12.800769f)
verticalLineTo(8.8004964f)
curveTo(21.452953f, 8.3849963f, 21.118628f, 8.0506712f, 20.703129f, 8.0506712f)
close()
moveTo(4.8281293f, 15.988171f)
curveTo(4.4126296f, 15.988171f, 4.0777866f, 16.322496f, 4.0777866f, 16.737996f)
verticalLineTo(20.738269f)
curveTo(4.0777866f, 21.153769f, 4.4126296f, 21.488094f, 4.8281293f, 21.488094f)
curveTo(5.2436283f, 21.488094f, 5.5779543f, 21.153769f, 5.5779543f, 20.738269f)
verticalLineTo(16.737996f)
curveTo(5.5779543f, 16.322496f, 5.2436283f, 15.988171f, 4.8281293f, 15.988171f)
close()
moveTo(12.765629f, 15.988171f)
curveTo(12.35013f, 15.988171f, 12.015287f, 16.322496f, 12.015287f, 16.737996f)
verticalLineTo(20.738269f)
curveTo(12.015287f, 21.153769f, 12.35013f, 21.488094f, 12.765629f, 21.488094f)
curveTo(13.181128f, 21.488094f, 13.515454f, 21.153769f, 13.515454f, 20.738269f)
verticalLineTo(16.737996f)
curveTo(13.515454f, 16.322496f, 13.181128f, 15.988171f, 12.765629f, 15.988171f)
close()
moveTo(20.703129f, 15.988171f)
curveTo(20.287629f, 15.988171f, 19.952787f, 16.322496f, 19.952787f, 16.737996f)
verticalLineTo(20.738269f)
curveTo(19.952787f, 21.153769f, 20.287629f, 21.488094f, 20.703129f, 21.488094f)
curveTo(21.118628f, 21.488094f, 21.452953f, 21.153769f, 21.452953f, 20.738269f)
verticalLineTo(16.737996f)
curveTo(21.452953f, 16.322496f, 21.118628f, 15.988171f, 20.703129f, 15.988171f)
close()
}
val WeatherSleetSnowAnimatable = weatherIcon("WeatherSleetSnowAnimatable") {
moveTo(8.796879f, 5.0270833f)
curveTo(7.8632606f, 4.9745641f, 7.2031834f, 6.1917513f, 7.7668228f, 6.9446931f)
curveTo(8.2182954f, 7.6432508f, 9.3919824f, 7.6787827f, 9.8262364f, 6.9412491f)
curveTo(10.250965f, 6.3103634f, 9.9588313f, 5.3184227f, 9.2064902f, 5.0975184f)
curveTo(9.0753076f, 5.0509595f, 8.9361544f, 5.0263693f, 8.796879f, 5.0270833f)
close()
moveTo(16.734379f, 5.0270833f)
curveTo(15.800761f, 4.974564f, 15.140683f, 6.1917512f, 15.704322f, 6.9446931f)
curveTo(16.155795f, 7.643251f, 17.329482f, 7.6787825f, 17.763736f, 6.9412491f)
curveTo(18.188465f, 6.3103636f, 17.896331f, 5.3184225f, 17.14399f, 5.0975184f)
curveTo(17.012808f, 5.0509596f, 16.873654f, 5.0263694f, 16.734379f, 5.0270833f)
close()
moveTo(8.796879f, 12.964583f)
curveTo(7.8632606f, 12.912064f, 7.2031834f, 14.129251f, 7.7668228f, 14.882193f)
curveTo(8.2182957f, 15.580751f, 9.3919822f, 15.616282f, 9.8262364f, 14.878749f)
curveTo(10.250965f, 14.247863f, 9.9588308f, 13.255923f, 9.2064902f, 13.035018f)
curveTo(9.0753077f, 12.988459f, 8.9361544f, 12.963869f, 8.796879f, 12.964583f)
close()
moveTo(16.734379f, 12.964583f)
curveTo(15.800761f, 12.912064f, 15.140683f, 14.129251f, 15.704322f, 14.882193f)
curveTo(16.155795f, 15.580751f, 17.329482f, 15.616282f, 17.763736f, 14.878749f)
curveTo(18.188465f, 14.247863f, 17.896331f, 13.255923f, 17.14399f, 13.035018f)
curveTo(17.012808f, 12.988459f, 16.873654f, 12.963869f, 16.734379f, 12.964583f)
close()
}
val WeatherFog = weatherIcon("WeatherFog") {
moveTo(9.7558594f, 9.9609375f)
curveTo(9.2018594f, 9.9609375f, 8.7558594f, 10.406937f, 8.7558594f, 10.960938f)
curveTo(8.7558594f, 11.514938f, 9.2018594f, 11.960938f, 9.7558594f, 11.960938f)
lineTo(19.662109f, 11.960938f)
curveTo(20.216109f, 11.960937f, 20.662109f, 11.514938f, 20.662109f, 10.960938f)
curveTo(20.662109f, 10.406937f, 20.216109f, 9.9609375f, 19.662109f, 9.9609375f)
lineTo(9.7558594f, 9.9609375f)
close()
moveTo(2.390625f, 12.818359f)
curveTo(1.836625f, 12.818359f, 1.390625f, 13.264359f, 1.390625f, 13.818359f)
curveTo(1.390625f, 14.372359f, 1.836625f, 14.818359f, 2.390625f, 14.818359f)
lineTo(11.5625f, 14.818359f)
curveTo(12.1165f, 14.818359f, 12.5625f, 14.372359f, 12.5625f, 13.818359f)
curveTo(12.5625f, 13.264359f, 12.1165f, 12.818359f, 11.5625f, 12.818359f)
lineTo(2.390625f, 12.818359f)
close()
moveTo(14.847656f, 12.818359f)
curveTo(14.293656f, 12.818359f, 13.847656f, 13.264359f, 13.847656f, 13.818359f)
curveTo(13.847656f, 14.372359f, 14.293656f, 14.818359f, 14.847656f, 14.818359f)
lineTo(21.183594f, 14.818359f)
curveTo(21.737594f, 14.818359f, 22.183594f, 14.372359f, 22.183594f, 13.818359f)
curveTo(22.183594f, 13.264359f, 21.737594f, 12.818359f, 21.183594f, 12.818359f)
lineTo(14.847656f, 12.818359f)
close()
}
val Rain = weatherIcon("Rain") {
moveTo(13.95f, 21.9f)
quadToRelative(-0.375f, 0.2f, -0.762f, 0.062f)
quadToRelative(-0.388f, -0.137f, -0.588f, -0.512f)
lineToRelative(-1.5f, -3f)
quadToRelative(-0.2f, -0.375f, -0.062f, -0.762f)
quadToRelative(0.137f, -0.388f, 0.512f, -0.588f)
quadToRelative(0.375f, -0.2f, 0.762f, -0.062f)
quadToRelative(0.388f, 0.137f, 0.588f, 0.512f)
lineToRelative(1.5f, 3f)
quadToRelative(0.2f, 0.375f, 0.063f, 0.762f)
quadToRelative(-0.138f, 0.388f, -0.513f, 0.588f)
close()
moveToRelative(6f, 0f)
quadToRelative(-0.375f, 0.2f, -0.762f, 0.062f)
quadToRelative(-0.388f, -0.137f, -0.588f, -0.512f)
lineToRelative(-1.5f, -3f)
quadToRelative(-0.2f, -0.375f, -0.062f, -0.762f)
quadToRelative(0.137f, -0.388f, 0.512f, -0.588f)
quadToRelative(0.375f, -0.2f, 0.762f, -0.062f)
quadToRelative(0.388f, 0.137f, 0.588f, 0.512f)
lineToRelative(1.5f, 3f)
quadToRelative(0.2f, 0.375f, 0.063f, 0.762f)
quadToRelative(-0.138f, 0.388f, -0.513f, 0.588f)
close()
moveToRelative(-12f, 0f)
quadToRelative(-0.375f, 0.2f, -0.762f, 0.062f)
quadToRelative(-0.388f, -0.137f, -0.588f, -0.512f)
lineToRelative(-1.5f, -3f)
quadToRelative(-0.2f, -0.375f, -0.062f, -0.762f)
quadToRelative(0.137f, -0.388f, 0.512f, -0.588f)
quadToRelative(0.375f, -0.2f, 0.762f, -0.062f)
quadToRelative(0.388f, 0.137f, 0.588f, 0.512f)
lineToRelative(1.5f, 3f)
quadToRelative(0.2f, 0.375f, 0.063f, 0.762f)
quadToRelative(-0.138f, 0.388f, -0.513f, 0.588f)
close()
moveTo(7.5f, 16f)
quadToRelative(-2.275f, 0f, -3.887f, -1.613f)
quadTo(2f, 12.775f, 2f, 10.5f)
quadToRelative(0f, -2.075f, 1.375f, -3.625f)
quadToRelative(1.375f, -1.55f, 3.4f, -1.825f)
quadToRelative(0.8f, -1.425f, 2.188f, -2.238f)
quadTo(10.35f, 2f, 12f, 2f)
quadToRelative(2.25f, 0f, 3.912f, 1.438f)
quadToRelative(1.663f, 1.437f, 2.013f, 3.587f)
quadToRelative(1.725f, 0.15f, 2.9f, 1.425f)
quadTo(22f, 9.725f, 22f, 11.5f)
quadToRelative(0f, 1.875f, -1.312f, 3.188f)
quadTo(19.375f, 16f, 17.5f, 16f)
close()
moveToRelative(0f, -2f)
horizontalLineToRelative(10f)
quadToRelative(1.05f, 0f, 1.775f, -0.725f)
quadTo(20f, 12.55f, 20f, 11.5f)
quadToRelative(0f, -1.05f, -0.725f, -1.775f)
quadTo(18.55f, 9f, 17.5f, 9f)
horizontalLineTo(16f)
verticalLineTo(8f)
quadToRelative(0f, -1.65f, -1.175f, -2.825f)
quadTo(13.65f, 4f, 12f, 4f)
quadToRelative(-1.2f, 0f, -2.188f, 0.65f)
quadToRelative(-0.987f, 0.65f, -1.487f, 1.75f)
lineToRelative(-0.25f, 0.6f)
horizontalLineTo(7.45f)
quadToRelative(-1.425f, 0.05f, -2.437f, 1.062f)
quadTo(4f, 9.075f, 4f, 10.5f)
quadToRelative(0f, 1.45f, 1.025f, 2.475f)
quadTo(6.05f, 14f, 7.5f, 14f)
close()
moveTo(12f, 9f)
close()
}
val HumidityPercentage = weatherIcon("HumidityPercentage") {
moveTo(14.5f, 18f)
quadToRelative(0.625f, 0f, 1.062f, -0.438f)
quadTo(16f, 17.125f, 16f, 16.5f)
reflectiveQuadToRelative(-0.438f, -1.062f)
quadTo(15.125f, 15f, 14.5f, 15f)
reflectiveQuadToRelative(-1.062f, 0.438f)
quadTo(13f, 15.875f, 13f, 16.5f)
reflectiveQuadToRelative(0.438f, 1.062f)
quadTo(13.875f, 18f, 14.5f, 18f)
close()
moveToRelative(-5.75f, -0.75f)
quadToRelative(0.3f, 0.3f, 0.7f, 0.3f)
quadToRelative(0.4f, 0f, 0.7f, -0.3f)
lineToRelative(5.1f, -5.1f)
quadToRelative(0.3f, -0.3f, 0.3f, -0.7f)
quadToRelative(0f, -0.4f, -0.3f, -0.7f)
quadToRelative(-0.3f, -0.3f, -0.712f, -0.3f)
quadToRelative(-0.413f, 0f, -0.713f, 0.3f)
lineTo(8.75f, 15.825f)
quadToRelative(-0.3f, 0.3f, -0.3f, 0.713f)
quadToRelative(0f, 0.412f, 0.3f, 0.712f)
close()
moveTo(9.5f, 13f)
quadToRelative(0.625f, 0f, 1.062f, -0.438f)
quadTo(11f, 12.125f, 11f, 11.5f)
reflectiveQuadToRelative(-0.438f, -1.062f)
quadTo(10.125f, 10f, 9.5f, 10f)
reflectiveQuadToRelative(-1.062f, 0.438f)
quadTo(8f, 10.875f, 8f, 11.5f)
reflectiveQuadToRelative(0.438f, 1.062f)
quadTo(8.875f, 13f, 9.5f, 13f)
close()
moveToRelative(2.5f, 9f)
quadToRelative(-3.175f, 0f, -5.587f, -2.212f)
quadTo(4f, 17.575f, 4f, 13.8f)
quadToRelative(0f, -2.375f, 1.8f, -5.15f)
quadToRelative(1.8f, -2.775f, 5.45f, -6f)
quadToRelative(0.15f, -0.125f, 0.35f, -0.2f)
quadToRelative(0.2f, -0.075f, 0.4f, -0.075f)
reflectiveQuadToRelative(0.4f, 0.075f)
quadToRelative(0.2f, 0.075f, 0.35f, 0.2f)
quadToRelative(3.65f, 3.225f, 5.45f, 6f)
quadTo(20f, 11.425f, 20f, 13.8f)
quadToRelative(0f, 3.775f, -2.413f, 5.988f)
quadTo(15.175f, 22f, 12f, 22f)
close()
moveToRelative(0f, -2f)
quadToRelative(2.525f, 0f, 4.262f, -1.725f)
quadTo(18f, 16.55f, 18f, 13.8f)
quadToRelative(0f, -1.775f, -1.475f, -4.063f)
quadTo(15.05f, 7.45f, 12f, 4.65f)
quadToRelative(-3.05f, 2.8f, -4.525f, 5.087f)
quadTo(6f, 12.025f, 6f, 13.8f)
quadToRelative(0f, 2.75f, 1.737f, 4.475f)
quadTo(9.475f, 20f, 12f, 20f)
close()
moveToRelative(0f, -6.2f)
close()
}

View File

@@ -3,28 +3,16 @@ package de.mm20.launcher2.ui.component.weather
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.AcUnit
import androidx.compose.material.icons.rounded.Air
import androidx.compose.material.icons.rounded.Bolt
import androidx.compose.material.icons.rounded.DarkMode
import androidx.compose.material.icons.rounded.LightMode
import androidx.compose.material.icons.rounded.Thermostat
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.scale
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.DpOffset
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.icons.WeatherCloud
import de.mm20.launcher2.icons.WeatherFog
import de.mm20.launcher2.icons.WeatherHail
import de.mm20.launcher2.icons.WeatherLightRain
import de.mm20.launcher2.icons.WeatherRain
import de.mm20.launcher2.icons.WeatherSleetRain
import de.mm20.launcher2.icons.WeatherSleetSnow
import de.mm20.launcher2.ui.R
@Composable
fun WeatherIcon(
@@ -82,7 +70,7 @@ private fun SunMoon(icon: WeatherIcon, night: Boolean, colors: WeatherIconColors
}
Icon(
if (night) Icons.Rounded.DarkMode else Icons.Rounded.LightMode,
painterResource(if (night) R.drawable.dark_mode_24px_filled else R.drawable.light_mode_24px_filled),
null,
modifier = Modifier
.size(24.dp)
@@ -176,7 +164,7 @@ private fun Cloud1(icon: WeatherIcon, colors: WeatherIconColors) {
}
Icon(
Icons.Rounded.WeatherCloud,
WeatherCloud,
null,
modifier = Modifier
.size(20.dp)
@@ -263,7 +251,7 @@ private fun Cloud2(icon: WeatherIcon, colors: WeatherIconColors) {
}
Icon(
Icons.Rounded.WeatherCloud,
WeatherCloud,
null,
modifier = Modifier
.size(20.dp)
@@ -325,7 +313,7 @@ private fun Cloud3(icon: WeatherIcon, colors: WeatherIconColors) {
}
Icon(
Icons.Rounded.WeatherCloud,
WeatherCloud,
null,
modifier = Modifier
.size(32.dp)
@@ -341,7 +329,7 @@ private fun Precipitation(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.offset(y = 2.dp)
.size(32.dp),
imageVector = Icons.Rounded.WeatherSleetSnow,
imageVector = WeatherSleetSnow,
contentDescription = null,
tint = colors.snow
)
@@ -349,7 +337,7 @@ private fun Precipitation(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.offset(y = 2.dp)
.size(32.dp),
imageVector = Icons.Rounded.WeatherSleetRain,
imageVector = WeatherSleetRain,
contentDescription = null,
tint = colors.rain
)
@@ -368,13 +356,13 @@ private fun Precipitation(icon: WeatherIcon, colors: WeatherIconColors) {
else -> return
}
val vector = when (icon) {
WeatherIcon.Drizzle -> Icons.Rounded.WeatherLightRain
WeatherIcon.Drizzle -> WeatherLightRain
WeatherIcon.Showers,
WeatherIcon.ThunderstormWithRain,
WeatherIcon.HeavyThunderstormWithRain -> Icons.Rounded.WeatherRain
WeatherIcon.HeavyThunderstormWithRain -> WeatherRain
WeatherIcon.Hail, WeatherIcon.Snow -> Icons.Rounded.WeatherHail
else -> Icons.Rounded.WeatherLightRain
WeatherIcon.Hail, WeatherIcon.Snow -> WeatherHail
else -> WeatherLightRain
}
val color = when (icon) {
WeatherIcon.Drizzle,
@@ -402,7 +390,7 @@ private fun HotCold(icon: WeatherIcon, colors: WeatherIconColors) {
Icon(
modifier = Modifier
.size(32.dp),
imageVector = Icons.Rounded.Thermostat,
painter = painterResource(R.drawable.heat_24px),
contentDescription = null,
tint = colors.hot
)
@@ -411,7 +399,7 @@ private fun HotCold(icon: WeatherIcon, colors: WeatherIconColors) {
Icon(
modifier = Modifier
.size(32.dp),
imageVector = Icons.Rounded.AcUnit,
painter = painterResource(R.drawable.severe_cold_24px),
contentDescription = null,
tint = colors.cold
)
@@ -425,7 +413,7 @@ private fun Wind(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.offset(x = 4.dp, y = 0.dp)
.size(24.dp),
imageVector = Icons.Rounded.Air,
painter = painterResource(R.drawable.air_24px),
contentDescription = null,
tint = colors.windDark
)
@@ -434,7 +422,7 @@ private fun Wind(icon: WeatherIcon, colors: WeatherIconColors) {
Icon(
modifier = Modifier
.size(if (icon == WeatherIcon.Wind) 32.dp else 24.dp),
imageVector = Icons.Rounded.Air,
painter = painterResource(R.drawable.air_24px),
contentDescription = null,
tint = colors.wind
)
@@ -452,7 +440,7 @@ private fun Fog(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.size(24.dp)
.offset(x = 3.dp, y = 4.dp),
imageVector = Icons.Rounded.WeatherFog,
imageVector = WeatherFog,
contentDescription = null,
tint = colors.fog
)
@@ -476,7 +464,7 @@ private fun LightningBolts(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.size(12.dp)
.offset(x = if (isHeavy) 4.dp else 1.dp, y = 6.dp),
imageVector = Icons.Rounded.Bolt,
painter = painterResource(R.drawable.bolt_24px_filled),
contentDescription = null,
tint = colors.lightningBolt
)
@@ -486,7 +474,7 @@ private fun LightningBolts(icon: WeatherIcon, colors: WeatherIconColors) {
modifier = Modifier
.size(10.dp)
.offset(x = -3.dp, y = 6.dp),
imageVector = Icons.Rounded.Bolt,
painter = painterResource(R.drawable.bolt_24px_filled),
contentDescription = null,
tint = colors.lightningBolt
)

View File

@@ -12,8 +12,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Notifications
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
@@ -26,12 +24,14 @@ import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.draw.scale
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import de.mm20.launcher2.globalactions.GlobalActionsService
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.GestureAction
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
@@ -95,7 +95,7 @@ internal object NotificationsComponent : ScaffoldComponent(), KoinComponent {
contentAlignment = Alignment.Center
) {
Icon(
Icons.Rounded.Notifications, null,
painterResource(R.drawable.notifications_24px), null,
modifier = Modifier.padding(16.dp),
tint = MaterialTheme.colorScheme.onSecondaryContainer,
)

View File

@@ -12,8 +12,6 @@ import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.PowerSettingsNew
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
@@ -30,6 +28,7 @@ import androidx.compose.ui.draw.shadow
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.times
@@ -38,6 +37,7 @@ import de.mm20.launcher2.globalactions.GlobalActionsService
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.GestureAction
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
@@ -157,7 +157,7 @@ internal object PowerMenuComponent : ScaffoldComponent(), KoinComponent {
contentAlignment = Alignment.Center
) {
Icon(
Icons.Rounded.PowerSettingsNew, null,
painterResource(R.drawable.power_settings_new_24px), null,
modifier = Modifier.padding(16.dp),
tint = MaterialTheme.colorScheme.onSecondaryContainer,
)

View File

@@ -12,8 +12,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Settings
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
@@ -26,12 +24,14 @@ import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.draw.scale
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import de.mm20.launcher2.globalactions.GlobalActionsService
import de.mm20.launcher2.permissions.PermissionGroup
import de.mm20.launcher2.permissions.PermissionsManager
import de.mm20.launcher2.preferences.GestureAction
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
@@ -92,7 +92,7 @@ internal object QuickSettingsComponent : ScaffoldComponent(), KoinComponent {
contentAlignment = Alignment.Center
) {
Icon(
Icons.Rounded.Settings, null,
painterResource(R.drawable.settings_24px), null,
modifier = Modifier.padding(16.dp),
tint = MaterialTheme.colorScheme.onSecondaryContainer,
)

View File

@@ -6,8 +6,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Settings
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.MaterialTheme
@@ -19,6 +17,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
@@ -71,7 +70,7 @@ internal object SecretComponent : ScaffoldComponent() {
context.startActivity(Intent(context, SettingsActivity::class.java))
}, modifier = Modifier.padding(top = 24.dp)) {
Icon(
Icons.Rounded.Settings,
painterResource(R.drawable.settings_20px),
contentDescription = null,
modifier = Modifier.padding(ButtonDefaults.IconSpacing).size(ButtonDefaults.IconSize)
)

View File

@@ -24,20 +24,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.automirrored.rounded.NavigateNext
import androidx.compose.material.icons.automirrored.rounded.OpenInNew
import androidx.compose.material.icons.rounded.Android
import androidx.compose.material.icons.rounded.Clear
import androidx.compose.material.icons.rounded.Delete
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material.icons.rounded.Link
import androidx.compose.material.icons.rounded.Notifications
import androidx.compose.material.icons.rounded.Share
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.StarOutline
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
@@ -56,6 +42,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
@@ -261,7 +248,7 @@ fun AppItem(
viewModel.clearNotification(not)
}
) {
Icon(Icons.Rounded.Clear, null)
Icon(painterResource(R.drawable.close_24px), null)
}
}
}
@@ -277,7 +264,7 @@ fun AppItem(
verticalAlignment = Alignment.CenterVertically
) {
Icon(
Icons.Rounded.Notifications,
painterResource(R.drawable.notifications_24px),
null,
modifier = Modifier.padding(horizontal = 16.dp)
)
@@ -291,7 +278,7 @@ fun AppItem(
modifier = Modifier.weight(1f),
)
Icon(
Icons.AutoMirrored.Rounded.NavigateNext,
painterResource(R.drawable.chevron_forward_24px),
null,
modifier = Modifier.padding(horizontal = 12.dp)
)
@@ -369,7 +356,10 @@ fun AppItem(
}
) {
Icon(
if (isPinned) Icons.Rounded.Star else Icons.Rounded.StarOutline,
painterResource(
if (isPinned) R.drawable.star_24px_filled
else R.drawable.star_24px
),
stringResource(if (isPinned) R.string.menu_favorites_unpin else R.string.menu_favorites_pin),
)
}
@@ -386,7 +376,7 @@ fun AppItem(
val favAction = if (isPinned) {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_unpin),
icon = Icons.Rounded.Star,
icon = R.drawable.star_24px_filled,
action = {
viewModel.unpin()
}
@@ -394,7 +384,7 @@ fun AppItem(
} else {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_pin),
icon = Icons.Rounded.StarOutline,
icon = R.drawable.star_24px,
action = {
viewModel.pin()
})
@@ -406,7 +396,7 @@ fun AppItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_app_info),
icon = Icons.Rounded.Info
icon = R.drawable.info_24px,
) {
app.openAppDetails(context)
})
@@ -415,7 +405,7 @@ fun AppItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_launch),
icon = Icons.AutoMirrored.Rounded.OpenInNew,
icon = R.drawable.open_in_new_24px,
action = {
viewModel.launch(context)
}
@@ -427,7 +417,7 @@ fun AppItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = Icons.Rounded.Tune,
icon = R.drawable.tune_24px,
action = { sheetManager.showCustomizeSearchableModal(app) }
))
}
@@ -437,7 +427,7 @@ fun AppItem(
val shareAction = if (storeDetails == null) {
DefaultToolbarAction(
label = stringResource(R.string.menu_share),
icon = Icons.Rounded.Share
icon = R.drawable.share_24px,
) {
scope.launch {
app.shareApkFile(context)
@@ -446,14 +436,14 @@ fun AppItem(
} else {
SubmenuToolbarAction(
label = stringResource(R.string.menu_share),
icon = Icons.Rounded.Share,
icon = R.drawable.share_24px,
children = listOf(
DefaultToolbarAction(
label = stringResource(
R.string.menu_share_store_link,
storeDetails.label
),
icon = Icons.Rounded.Link,
icon = R.drawable.link_24px,
action = {
val shareIntent = Intent(Intent.ACTION_SEND)
shareIntent.putExtra(
@@ -471,7 +461,7 @@ fun AppItem(
),
DefaultToolbarAction(
label = stringResource(R.string.menu_share_apk_file),
icon = Icons.Rounded.Android
icon = R.drawable.apk_document_24px,
) {
scope.launch {
app.shareApkFile(context)
@@ -487,7 +477,7 @@ fun AppItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_uninstall),
icon = Icons.Rounded.Delete,
icon = R.drawable.delete_24px,
) {
app.uninstall(context)
onBack()
@@ -499,7 +489,7 @@ fun AppItem(
leftActions = listOf(
DefaultToolbarAction(
label = stringResource(id = R.string.menu_back),
icon = Icons.AutoMirrored.Rounded.ArrowBack
icon = R.drawable.arrow_back_24px,
) {
onBack()
}

View File

@@ -9,12 +9,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Lock
import androidx.compose.material.icons.rounded.LockOpen
import androidx.compose.material.icons.rounded.Person
import androidx.compose.material.icons.rounded.Work
import androidx.compose.material.icons.rounded.WorkOff
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.FilledTonalButton
@@ -28,9 +22,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.icons.PrivateSpace
import de.mm20.launcher2.profiles.Profile
import de.mm20.launcher2.search.Application
import de.mm20.launcher2.ui.R
@@ -68,8 +62,9 @@ fun LazyListScope.AppResults(
divider = {}
) {
for ((i, profile) in profiles.withIndex()) {
val selected = selectedProfileIndex == profiles.indexOf(profile)
LeadingIconTab(
selected = selectedProfileIndex == profiles.indexOf(profile),
selected = selected,
text = {
Text(
when (profile.type) {
@@ -82,17 +77,17 @@ fun LazyListScope.AppResults(
icon = {
when (profile.type) {
Profile.Type.Personal -> Icon(
Icons.Rounded.Person,
painterResource(if (selected) R.drawable.person_24px_filled else R.drawable.person_24px),
contentDescription = null
)
Profile.Type.Work -> Icon(
Icons.Rounded.Work,
painterResource(if (selected) R.drawable.enterprise_24px_filled else R.drawable.enterprise_24px),
contentDescription = null
)
Profile.Type.Private -> Icon(
Icons.Rounded.PrivateSpace,
painterResource(if (selected) R.drawable.encrypted_24px_filled else R.drawable.encrypted_24px),
contentDescription = null
)
}
@@ -129,7 +124,7 @@ fun LazyListScope.AppResults(
horizontalAlignment = Alignment.CenterHorizontally,
) {
Icon(
if (profileType == Profile.Type.Work) Icons.Rounded.WorkOff else Icons.Rounded.Lock,
painterResource(if (profileType == Profile.Type.Work) R.drawable.enterprise_off_48px else R.drawable.lock_48px),
contentDescription = null,
modifier = Modifier.size(48.dp),
tint = MaterialTheme.colorScheme.secondary,
@@ -155,7 +150,7 @@ fun LazyListScope.AppResults(
contentPadding = ButtonDefaults.TextButtonWithIconContentPadding,
) {
Icon(
if (profileType == Profile.Type.Work) Icons.Rounded.Work else Icons.Rounded.LockOpen,
painterResource(if (profileType == Profile.Type.Work) R.drawable.enterprise_20px else R.drawable.lock_open_20px),
contentDescription = null,
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
@@ -184,7 +179,7 @@ fun LazyListScope.AppResults(
contentPadding = ButtonDefaults.TextButtonWithIconContentPadding,
) {
Icon(
if (profileType == Profile.Type.Work) Icons.Rounded.WorkOff else Icons.Rounded.Lock,
painterResource(if (profileType == Profile.Type.Work) R.drawable.enterprise_off_20px else R.drawable.lock_20px),
contentDescription = null,
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)

View File

@@ -18,19 +18,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.rounded.CheckCircle
import androidx.compose.material.icons.rounded.Circle
import androidx.compose.material.icons.rounded.Notes
import androidx.compose.material.icons.rounded.OpenInNew
import androidx.compose.material.icons.rounded.People
import androidx.compose.material.icons.rounded.Place
import androidx.compose.material.icons.rounded.RadioButtonUnchecked
import androidx.compose.material.icons.rounded.Schedule
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.StarOutline
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -43,6 +30,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.style.TextOverflow
@@ -97,11 +85,11 @@ fun CalendarItem(
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
when (calendar.isCompleted) {
true -> Icons.Rounded.CheckCircle
false -> Icons.Rounded.RadioButtonUnchecked
null -> Icons.Rounded.Circle
},
painterResource(when (calendar.isCompleted) {
true -> R.drawable.check_circle_24px_filled
false -> R.drawable.radio_button_unchecked_24px
null -> R.drawable.circle_24px_filled
}),
null,
modifier = Modifier
.padding(horizontal = 14.dp, vertical = 20.dp)
@@ -152,7 +140,7 @@ fun CalendarItem(
) {
Icon(
modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp),
imageVector = Icons.Rounded.Schedule,
painter = painterResource(R.drawable.schedule_24px),
contentDescription = null
)
Text(
@@ -174,7 +162,7 @@ fun CalendarItem(
) {
Icon(
modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp),
imageVector = Icons.Rounded.Notes,
painter = painterResource(R.drawable.notes_24px),
contentDescription = null
)
Text(
@@ -194,7 +182,7 @@ fun CalendarItem(
) {
Icon(
modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp),
imageVector = Icons.Rounded.People,
painter = painterResource(R.drawable.group_24px),
contentDescription = null
)
Text(
@@ -217,7 +205,7 @@ fun CalendarItem(
) {
Icon(
modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp),
imageVector = Icons.Rounded.Place,
painter = painterResource(R.drawable.location_on_24px),
contentDescription = null
)
Text(
@@ -233,7 +221,7 @@ fun CalendarItem(
val favAction = if (isPinned) {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_unpin),
icon = Icons.Rounded.Star,
icon = R.drawable.star_24px_filled,
action = {
viewModel.unpin()
}
@@ -241,7 +229,7 @@ fun CalendarItem(
} else {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_pin),
icon = Icons.Rounded.StarOutline,
icon = R.drawable.star_24px,
action = {
viewModel.pin()
})
@@ -252,7 +240,7 @@ fun CalendarItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_calendar_open_externally),
icon = Icons.Rounded.OpenInNew,
icon = R.drawable.open_in_new_24px,
action = {
viewModel.launch(context)
onBack()
@@ -263,7 +251,7 @@ fun CalendarItem(
val sheetManager = LocalBottomSheetManager.current
toolbarActions.add(DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = Icons.Rounded.Tune,
icon = R.drawable.tune_24px,
action = { sheetManager.showCustomizeSearchableModal(calendar) }
))
@@ -271,7 +259,7 @@ fun CalendarItem(
leftActions = listOf(
DefaultToolbarAction(
label = stringResource(id = R.string.menu_back),
icon = Icons.AutoMirrored.Rounded.ArrowBack
icon = R.drawable.arrow_back_24px,
) {
onBack()
}
@@ -286,11 +274,11 @@ fun CalendarItem(
.padding(16.dp)
) {
Icon(
when (calendar.isCompleted) {
true -> Icons.Rounded.CheckCircle
false -> Icons.Rounded.RadioButtonUnchecked
null -> Icons.Rounded.Circle
},
painterResource(when (calendar.isCompleted) {
true -> R.drawable.check_circle_24px_filled
false -> R.drawable.radio_button_unchecked_24px
null -> R.drawable.circle_24px_filled
}),
null,
modifier = Modifier
.padding(end = 16.dp)

View File

@@ -4,6 +4,7 @@ import android.content.Context
import android.content.Intent
import android.graphics.drawable.Drawable
import android.net.Uri
import androidx.annotation.DrawableRes
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.SharedTransitionLayout
@@ -21,19 +22,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.automirrored.rounded.Message
import androidx.compose.material.icons.automirrored.rounded.NavigateNext
import androidx.compose.material.icons.automirrored.rounded.OpenInNew
import androidx.compose.material.icons.rounded.Directions
import androidx.compose.material.icons.rounded.Email
import androidx.compose.material.icons.rounded.OpenInNew
import androidx.compose.material.icons.rounded.Phone
import androidx.compose.material.icons.rounded.Place
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.StarOutline
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -55,6 +43,7 @@ import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.AnnotatedString
@@ -148,7 +137,7 @@ fun ContactItem(
var expandedSection by remember { mutableStateOf(-1) }
if (contact.phoneNumbers.isNotEmpty()) {
ContactInfo(
icon = Icons.Rounded.Phone,
icon = R.drawable.call_24px,
label = pluralStringResource(
R.plurals.contact_phone_numbers,
contact.phoneNumbers.size,
@@ -171,7 +160,7 @@ fun ContactItem(
)
}) {
Icon(
Icons.AutoMirrored.Rounded.Message,
painterResource(R.drawable.sms_24px),
null,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -196,7 +185,7 @@ fun ContactItem(
}
if (contact.emailAddresses.isNotEmpty()) {
ContactInfo(
icon = Icons.Rounded.Email,
icon = R.drawable.mail_24px,
label = pluralStringResource(
R.plurals.contact_email_addresses,
contact.emailAddresses.size,
@@ -225,7 +214,7 @@ fun ContactItem(
}
if (contact.postalAddresses.isNotEmpty()) {
ContactInfo(
icon = Icons.Rounded.Place,
icon = R.drawable.location_on_24px,
label = pluralStringResource(
R.plurals.contact_postal_addresses,
contact.postalAddresses.size,
@@ -246,7 +235,7 @@ fun ContactItem(
)
}) {
Icon(
Icons.Rounded.Directions,
painterResource(R.drawable.directions_24px),
null,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -301,7 +290,7 @@ fun ContactItem(
if (itemsWithPermission.isEmpty()) continue
ContactInfo(
icon = Icons.AutoMirrored.Rounded.OpenInNew,
icon = R.drawable.open_in_new_24px,
customIcon = appIcon,
label = label,
items = itemsWithPermission,
@@ -336,7 +325,7 @@ fun ContactItem(
val favAction = if (isPinned) {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_unpin),
icon = Icons.Rounded.Star,
icon = R.drawable.star_24px_filled,
action = {
viewModel.unpin()
}
@@ -344,7 +333,7 @@ fun ContactItem(
} else {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_pin),
icon = Icons.Rounded.StarOutline,
icon = R.drawable.star_24px,
action = {
viewModel.pin()
})
@@ -355,7 +344,7 @@ fun ContactItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_contacts_open_externally),
icon = Icons.Rounded.OpenInNew,
icon = R.drawable.open_in_new_24px,
action = {
viewModel.launch(context)
}
@@ -365,7 +354,7 @@ fun ContactItem(
val sheetManager = LocalBottomSheetManager.current
toolbarActions.add(DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = Icons.Rounded.Tune,
icon = R.drawable.tune_24px,
action = { sheetManager.showCustomizeSearchableModal(contact) }
))
@@ -374,7 +363,7 @@ fun ContactItem(
leftActions = listOf(
DefaultToolbarAction(
label = stringResource(id = R.string.menu_back),
icon = Icons.AutoMirrored.Rounded.ArrowBack
icon = R.drawable.arrow_back_24px,
) {
onBack()
}
@@ -441,9 +430,9 @@ private fun <T> ContactInfo(
items: List<T>,
itemLabel: (T) -> String,
itemSubLabel: (T) -> String? = { null },
itemIcon: (T) -> ImageVector? = { null },
itemIcon: (T) -> Int? = { null },
secondaryAction: (@Composable (T) -> Unit)? = null,
icon: ImageVector,
@DrawableRes icon: Int,
customIcon: Drawable? = null,
copyText: ((T) -> String)? = null,
expanded: Boolean,
@@ -516,7 +505,7 @@ private fun <T> ContactInfo(
)
} else {
Icon(
itemIcon(item) ?: icon,
painterResource(itemIcon(item) ?: icon),
null,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(horizontal = 4.dp),
@@ -570,7 +559,7 @@ private fun <T> ContactInfo(
)
} else {
Icon(
icon,
painterResource(icon),
null,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.padding(horizontal = 4.dp)
@@ -584,7 +573,7 @@ private fun <T> ContactInfo(
.padding(horizontal = 16.dp),
)
Icon(
Icons.AutoMirrored.Rounded.NavigateNext,
painterResource(R.drawable.chevron_forward_24px),
null,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)

View File

@@ -6,9 +6,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.Tag
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.CompositionLocalProvider
@@ -62,7 +59,7 @@ fun LazyListScope.SearchFavorites(
text = stringResource(
if (selectedTag == null) R.string.favorites_empty else R.string.favorites_empty_tag
),
icon = if (selectedTag == null) Icons.Rounded.Star else Icons.Rounded.Tag,
icon = if (selectedTag == null) R.drawable.star_24px else R.drawable.tag_24px,
)
}
if (pinnedTags.isNotEmpty() || editButton) {

View File

@@ -12,21 +12,8 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material.icons.rounded.Delete
import androidx.compose.material.icons.rounded.Edit
import androidx.compose.material.icons.rounded.OpenInNew
import androidx.compose.material.icons.rounded.Share
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.StarOutline
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material.icons.rounded.Visibility
import androidx.compose.material.icons.rounded.VisibilityOff
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.SnackbarDuration
import androidx.compose.material3.SnackbarResult
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
@@ -38,17 +25,13 @@ 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.Rect
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.roundToIntRect
import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.lifecycleScope
import de.mm20.launcher2.search.File
import de.mm20.launcher2.search.FileMetaType
import de.mm20.launcher2.ui.R
@@ -62,9 +45,7 @@ import de.mm20.launcher2.ui.launcher.search.listItemViewModel
import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager
import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled
import de.mm20.launcher2.ui.locals.LocalGridSettings
import de.mm20.launcher2.ui.locals.LocalSnackbarHostState
import de.mm20.launcher2.ui.modifier.scale
import kotlinx.coroutines.launch
import java.text.DecimalFormat
@Composable
@@ -174,7 +155,7 @@ fun FileItem(
val favAction = if (isPinned) {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_unpin),
icon = Icons.Rounded.Star,
icon = R.drawable.star_24px_filled,
action = {
viewModel.unpin()
}
@@ -182,7 +163,7 @@ fun FileItem(
} else {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_pin),
icon = Icons.Rounded.StarOutline,
icon = R.drawable.star_24px,
action = {
viewModel.pin()
})
@@ -193,7 +174,7 @@ fun FileItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_open_file),
icon = Icons.Rounded.OpenInNew,
icon = R.drawable.open_in_new_24px,
action = {
viewModel.launch(context)
}
@@ -201,24 +182,26 @@ fun FileItem(
)
if (file.canShare) {
toolbarActions.add(DefaultToolbarAction(
label = stringResource(R.string.menu_share),
icon = Icons.Rounded.Share,
action = {
file.share(context)
}
))
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_share),
icon = R.drawable.share_24px,
action = {
file.share(context)
}
))
}
if (file.isDeletable) {
var showConfirmDialog by remember { mutableStateOf(false) }
toolbarActions.add(DefaultToolbarAction(
label = stringResource(R.string.menu_delete),
icon = Icons.Rounded.Delete,
action = {
showConfirmDialog = true
}
))
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_delete),
icon = R.drawable.delete_24px,
action = {
showConfirmDialog = true
}
))
if (showConfirmDialog) {
AlertDialog(
onDismissRequest = { showConfirmDialog = false },
@@ -251,17 +234,18 @@ fun FileItem(
}
val sheetManager = LocalBottomSheetManager.current
toolbarActions.add(DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = Icons.Rounded.Tune,
action = { sheetManager.showCustomizeSearchableModal(file) }
))
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = R.drawable.tune_24px,
action = { sheetManager.showCustomizeSearchableModal(file) }
))
Toolbar(
leftActions = listOf(
DefaultToolbarAction(
label = stringResource(id = R.string.menu_back),
icon = Icons.Rounded.ArrowBack
icon = R.drawable.arrow_back_24px,
) {
onBack()
}

View File

@@ -21,6 +21,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.preferences.KeyboardFilterBarItem
import de.mm20.launcher2.search.SearchFilters
@@ -67,7 +68,7 @@ fun KeyboardFilterBar(
},
leadingIcon = {
Icon(
imageVector = item.icon,
painter = painterResource(item.iconMedium),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)

View File

@@ -1,35 +1,38 @@
package de.mm20.launcher2.ui.launcher.search.filters
import android.content.Context
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.AppShortcut
import androidx.compose.material.icons.rounded.Apps
import androidx.compose.material.icons.rounded.Description
import androidx.compose.material.icons.rounded.Handyman
import androidx.compose.material.icons.rounded.Language
import androidx.compose.material.icons.rounded.Person
import androidx.compose.material.icons.rounded.Place
import androidx.compose.material.icons.rounded.Public
import androidx.compose.material.icons.rounded.Today
import androidx.compose.material.icons.rounded.VisibilityOff
import de.mm20.launcher2.preferences.KeyboardFilterBarItem
import de.mm20.launcher2.search.SearchFilters
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.icons.Wikipedia
val KeyboardFilterBarItem.icon
val KeyboardFilterBarItem.iconMedium
get() = when (this) {
KeyboardFilterBarItem.Apps -> Icons.Rounded.Apps
KeyboardFilterBarItem.Events -> Icons.Rounded.Today
KeyboardFilterBarItem.Contacts -> Icons.Rounded.Person
KeyboardFilterBarItem.Places -> Icons.Rounded.Place
KeyboardFilterBarItem.Files -> Icons.Rounded.Description
KeyboardFilterBarItem.Tools -> Icons.Rounded.Handyman
KeyboardFilterBarItem.Articles -> Icons.Rounded.Wikipedia
KeyboardFilterBarItem.Websites -> Icons.Rounded.Public
KeyboardFilterBarItem.Shortcuts -> Icons.Rounded.AppShortcut
KeyboardFilterBarItem.HiddenResults -> Icons.Rounded.VisibilityOff
KeyboardFilterBarItem.OnlineResults -> Icons.Rounded.Language
KeyboardFilterBarItem.Apps -> R.drawable.apps_24px
KeyboardFilterBarItem.Events -> R.drawable.today_24px
KeyboardFilterBarItem.Contacts -> R.drawable.person_24px
KeyboardFilterBarItem.Places -> R.drawable.location_on_24px
KeyboardFilterBarItem.Files -> R.drawable.description_24px
KeyboardFilterBarItem.Tools -> R.drawable.handyman_24px
KeyboardFilterBarItem.Articles -> R.drawable.wikipedia
KeyboardFilterBarItem.Websites -> R.drawable.public_24px
KeyboardFilterBarItem.Shortcuts -> R.drawable.mobile_arrow_up_right_24px
KeyboardFilterBarItem.HiddenResults -> R.drawable.visibility_off_24px
KeyboardFilterBarItem.OnlineResults -> R.drawable.language_24px
}
val KeyboardFilterBarItem.iconSmall
get() = when (this) {
KeyboardFilterBarItem.Apps -> R.drawable.apps_20px
KeyboardFilterBarItem.Events -> R.drawable.today_20px
KeyboardFilterBarItem.Contacts -> R.drawable.person_20px
KeyboardFilterBarItem.Places -> R.drawable.location_on_20px
KeyboardFilterBarItem.Files -> R.drawable.description_20px
KeyboardFilterBarItem.Tools -> R.drawable.handyman_20px
KeyboardFilterBarItem.Articles -> R.drawable.wikipedia
KeyboardFilterBarItem.Websites -> R.drawable.public_20px
KeyboardFilterBarItem.Shortcuts -> R.drawable.mobile_arrow_up_right_20px
KeyboardFilterBarItem.HiddenResults -> R.drawable.visibility_off_20px
KeyboardFilterBarItem.OnlineResults -> R.drawable.language_20px
}
fun KeyboardFilterBarItem.getLabel(context: Context): String {

View File

@@ -6,17 +6,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.AppShortcut
import androidx.compose.material.icons.rounded.Apps
import androidx.compose.material.icons.rounded.Description
import androidx.compose.material.icons.rounded.Handyman
import androidx.compose.material.icons.rounded.Language
import androidx.compose.material.icons.rounded.Person
import androidx.compose.material.icons.rounded.Place
import androidx.compose.material.icons.rounded.Public
import androidx.compose.material.icons.rounded.Today
import androidx.compose.material.icons.rounded.VisibilityOff
import androidx.compose.material3.FilterChip
import androidx.compose.material3.FilterChipDefaults
import androidx.compose.material3.HorizontalDivider
@@ -24,11 +13,11 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.search.SearchFilters
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.icons.Wikipedia
@Composable
fun SearchFilters(
@@ -50,7 +39,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Language,
painter = painterResource(R.drawable.language_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -71,7 +60,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Apps,
painter = painterResource(R.drawable.apps_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -90,7 +79,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Description,
painter = painterResource(R.drawable.description_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -109,7 +98,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Person,
painter = painterResource(R.drawable.person_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -128,7 +117,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Today,
painter = painterResource(R.drawable.today_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -147,7 +136,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.AppShortcut,
painter = painterResource(R.drawable.mobile_arrow_up_right_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -166,7 +155,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Wikipedia,
painter = painterResource(R.drawable.wikipedia),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -185,7 +174,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Public,
painter = painterResource(R.drawable.public_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -204,7 +193,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Place,
painter = painterResource(R.drawable.location_on_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -222,7 +211,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Handyman,
painter = painterResource(R.drawable.handyman_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -238,7 +227,7 @@ fun SearchFilters(
},
leadingIcon = {
Icon(
imageVector = Icons.Rounded.VisibilityOff,
painter = painterResource(R.drawable.visibility_off_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)

View File

@@ -44,30 +44,6 @@ import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.automirrored.rounded.NavigateNext
import androidx.compose.material.icons.automirrored.rounded.OpenInNew
import androidx.compose.material.icons.outlined.CreditCardOff
import androidx.compose.material.icons.outlined.CreditScore
import androidx.compose.material.icons.outlined.Toll
import androidx.compose.material.icons.rounded.AirplanemodeActive
import androidx.compose.material.icons.rounded.BugReport
import androidx.compose.material.icons.rounded.Commute
import androidx.compose.material.icons.rounded.Directions
import androidx.compose.material.icons.rounded.DirectionsBoat
import androidx.compose.material.icons.rounded.DirectionsBus
import androidx.compose.material.icons.rounded.DirectionsRailway
import androidx.compose.material.icons.rounded.DirectionsTransit
import androidx.compose.material.icons.rounded.Language
import androidx.compose.material.icons.rounded.Navigation
import androidx.compose.material.icons.rounded.Phone
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.StarOutline
import androidx.compose.material.icons.rounded.Subway
import androidx.compose.material.icons.rounded.Train
import androidx.compose.material.icons.rounded.Tram
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.AssistChip
import androidx.compose.material3.AssistChipDefaults
import androidx.compose.material3.FilterChipDefaults
@@ -95,6 +71,7 @@ import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign
@@ -112,9 +89,6 @@ import androidx.core.net.toUri
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import blend.Blend.harmonize
import coil.compose.AsyncImage
import de.mm20.launcher2.i18n.R
import de.mm20.launcher2.icons.CableCar
import de.mm20.launcher2.icons.TollOff
import de.mm20.launcher2.ktx.tryStartActivity
import de.mm20.launcher2.search.Location
import de.mm20.launcher2.search.isOpen
@@ -126,6 +100,7 @@ import de.mm20.launcher2.search.location.OpeningHours
import de.mm20.launcher2.search.location.OpeningSchedule
import de.mm20.launcher2.search.location.PaymentMethod
import de.mm20.launcher2.search.location.isNotEmpty
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.base.LocalTime
import de.mm20.launcher2.ui.component.DefaultToolbarAction
import de.mm20.launcher2.ui.component.MarqueeText
@@ -368,10 +343,12 @@ fun LocationItem(
)
for ((method, available) in acceptedPaymentMethods) {
Icon(
when (method) {
PaymentMethod.Cash -> if (available) Icons.Outlined.Toll else Icons.Outlined.TollOff
PaymentMethod.Card -> if (available) Icons.Outlined.CreditScore else Icons.Outlined.CreditCardOff
},
painterResource(
when (method) {
PaymentMethod.Cash -> if (available) R.drawable.toll_20px else R.drawable.toll_off_20px
PaymentMethod.Card -> if (available) R.drawable.credit_card_20px else R.drawable.credit_card_off_20px
}
),
contentDescription = null,
tint = MaterialTheme.colorScheme.secondary,
modifier = Modifier
@@ -493,7 +470,7 @@ fun LocationItem(
label = { Text(stringResource(R.string.menu_navigation)) },
leadingIcon = {
Icon(
Icons.Rounded.Directions, null,
painterResource(R.drawable.directions_20px), null,
modifier = Modifier.size(AssistChipDefaults.IconSize)
)
}
@@ -513,7 +490,7 @@ fun LocationItem(
label = { Text(stringResource(R.string.menu_dial)) },
leadingIcon = {
Icon(
Icons.Rounded.Phone, null,
painterResource(R.drawable.call_20px), null,
modifier = Modifier.size(AssistChipDefaults.IconSize)
)
}
@@ -533,7 +510,7 @@ fun LocationItem(
label = { Text(stringResource(R.string.menu_website)) },
leadingIcon = {
Icon(
Icons.Rounded.Language, null,
painterResource(R.drawable.language_20px), null,
modifier = Modifier.size(AssistChipDefaults.IconSize)
)
}
@@ -549,7 +526,7 @@ fun LocationItem(
val favAction = if (isPinned) {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_unpin),
icon = Icons.Rounded.Star,
icon = R.drawable.star_24px_filled,
action = {
viewModel.unpin()
}
@@ -557,7 +534,7 @@ fun LocationItem(
} else {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_pin),
icon = Icons.Rounded.StarOutline,
icon = R.drawable.star_24px,
action = {
viewModel.pin()
})
@@ -567,7 +544,7 @@ fun LocationItem(
toolbarActions += DefaultToolbarAction(
label = stringResource(id = R.string.menu_map),
icon = Icons.AutoMirrored.Rounded.OpenInNew,
icon = R.drawable.open_in_new_24px,
) {
viewModel.launch(context)
}
@@ -577,14 +554,14 @@ fun LocationItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = Icons.Rounded.Tune,
icon = R.drawable.tune_24px,
action = { sheetManager.showCustomizeSearchableModal(location) }
))
if (location.fixMeUrl != null) {
toolbarActions += DefaultToolbarAction(
label = stringResource(id = R.string.menu_bugreport),
icon = Icons.Rounded.BugReport,
icon = R.drawable.bug_report_24px,
) {
context.tryStartActivity(
Intent(
@@ -599,7 +576,7 @@ fun LocationItem(
leftActions = listOf(
DefaultToolbarAction(
label = stringResource(id = R.string.menu_back),
icon = Icons.AutoMirrored.Rounded.ArrowBack
icon = R.drawable.arrow_back_24px,
) {
onBack()
}),
@@ -667,7 +644,7 @@ private fun Departures(
style = MaterialTheme.typography.labelSmall,
modifier = Modifier.padding(end = 12.dp)
)
Icon(Icons.AutoMirrored.Rounded.NavigateNext, null)
Icon(painterResource(R.drawable.chevron_forward_24px), null)
}
} else {
val (lines, groupedDepartures) = remember(departures) {
@@ -894,7 +871,7 @@ private fun OpeningSchedule(
modifier = Modifier.weight(1f)
)
Icon(Icons.AutoMirrored.Rounded.NavigateNext, null)
Icon(painterResource(R.drawable.chevron_forward_24px), null)
}
}
}
@@ -967,7 +944,7 @@ private fun Compass(
) {
if (targetHeading != null) {
Icon(
Icons.Rounded.Navigation,
painterResource(R.drawable.assistant_navigation_24px),
null,
modifier = Modifier
.size(20f / 48f * size)
@@ -1078,18 +1055,21 @@ fun LineTypeIcon(
tint: Color,
modifier: Modifier = Modifier
) = Icon(
imageVector = when (lineType) {
LineType.Bus -> Icons.Rounded.DirectionsBus
LineType.Tram -> Icons.Rounded.Tram
LineType.Subway -> Icons.Rounded.Subway
LineType.Monorail -> Icons.Rounded.DirectionsTransit
LineType.CommuterTrain -> Icons.Rounded.DirectionsRailway
LineType.Train, LineType.RegionalTrain, LineType.HighSpeedTrain -> Icons.Rounded.Train
LineType.Boat -> Icons.Rounded.DirectionsBoat
LineType.CableCar -> Icons.Rounded.CableCar
LineType.Airplane -> Icons.Rounded.AirplanemodeActive
null -> Icons.Rounded.Commute
},
painter = painterResource(
when (lineType) {
LineType.Bus -> R.drawable.directions_bus_20px
LineType.Tram -> R.drawable.tram_20px
LineType.Subway -> R.drawable.subway_20px
LineType.Monorail -> R.drawable.monorail_20px
LineType.CommuterTrain -> R.drawable.directions_railway_20px
LineType.Train, LineType.RegionalTrain, LineType.HighSpeedTrain -> R.drawable.train_20px
LineType.Boat -> R.drawable.directions_boat_20px
LineType.CableCar -> R.drawable.cable_car_20px
LineType.AerialTramway -> R.drawable.gondola_lift_20px
LineType.Airplane -> R.drawable.flight_20px
null -> R.drawable.commute_20px
}
),
contentDescription = lineType?.name, // TODO localize (maybe) with ?.let{ stringResource("departure_line_type_$it") }
modifier = modifier,
tint = tint
@@ -1131,7 +1111,7 @@ fun LineFilterChip(
tint = color.atTone(if (dark) 20 else 100),
modifier = Modifier
.fillMaxSize()
.padding(4.dp)
.padding(2.dp)
)
}
},

View File

@@ -29,9 +29,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Navigation
import androidx.compose.material.icons.rounded.Place
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -53,6 +50,7 @@ import androidx.compose.ui.graphics.FilterQuality
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
@@ -76,6 +74,7 @@ import de.mm20.launcher2.search.location.LineType
import de.mm20.launcher2.search.location.LocationIcon
import de.mm20.launcher2.search.location.OpeningSchedule
import de.mm20.launcher2.search.location.PaymentMethod
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.ktx.DegreesConverter
import de.mm20.launcher2.ui.ktx.contrast
import de.mm20.launcher2.ui.ktx.hue
@@ -219,7 +218,7 @@ fun MapTiles(
)
Icon(
imageVector = Icons.Rounded.Place,
painterResource(R.drawable.location_on_24px_filled),
contentDescription = null,
tint = MaterialTheme.colorScheme.tertiary,
modifier = Modifier
@@ -238,47 +237,46 @@ fun MapTiles(
zoom
).let {
Offset(
(it.x - start.x) * tileSize.value - 8f,
(it.y - start.y) * tileSize.value - 8f
(it.x - start.x) * tileSize.value - 10f,
(it.y - start.y) * tileSize.value - 10f
)
},
animationSpec = tween()
)
if (userLocation.heading != null) {
val headingAnim by animateValueAsState(
targetValue = userLocation.heading,
typeConverter = Float.DegreesConverter
)
Icon(
imageVector = Icons.Rounded.Navigation,
contentDescription = null,
tint = MaterialTheme.colorScheme.tertiary,
modifier = Modifier
.align(Alignment.TopStart)
.size(16.dp)
.absoluteOffset(
userIndicatorOffset.x.dp,
userIndicatorOffset.y.dp
)
.rotate(headingAnim)
.absoluteOffset(y = -8.dp)
)
}
Box(
modifier = Modifier
.align(Alignment.TopStart)
.size(16.dp)
.size(20.dp)
.absoluteOffset(
userIndicatorOffset.x.dp,
userIndicatorOffset.y.dp
)
.background(MaterialTheme.colorScheme.tertiary, CircleShape)
.border(2.dp, MaterialTheme.colorScheme.onTertiary, CircleShape)
.background(MaterialTheme.colorScheme.onTertiary, CircleShape)
.shadow(1.dp, CircleShape)
)
) {
if (userLocation.heading != null) {
val headingAnim by animateValueAsState(
targetValue = userLocation.heading,
typeConverter = Float.DegreesConverter
)
Icon(
painterResource(R.drawable.assistant_navigation_20px),
null,
tint = MaterialTheme.colorScheme.tertiary,
modifier = Modifier
.size(20.dp)
.rotate(headingAnim)
)
} else {
Box(
modifier = Modifier
.padding(2.dp)
.size(16.dp)
.background(MaterialTheme.colorScheme.tertiary, CircleShape)
)
}
}
if (osmAttribution != null) {
Text(

View File

@@ -22,13 +22,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.rounded.Delete
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.StarOutline
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Icon
import androidx.compose.material3.InputChip
@@ -47,6 +40,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.role
@@ -54,7 +48,6 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.roundToIntRect
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import de.mm20.launcher2.ktx.tryStartActivity
import de.mm20.launcher2.search.AppShortcut
@@ -167,7 +160,7 @@ fun AppShortcutItem(
trailingIcon = if (LocalFavoritesEnabled.current) {
{
Icon(
if (isPinned) Icons.Rounded.Star else Icons.Rounded.StarOutline,
painterResource(if (isPinned) R.drawable.star_20px_filled else R.drawable.star_20px),
stringResource(if (isPinned) R.string.menu_favorites_unpin else R.string.menu_favorites_pin),
modifier = Modifier
.clip(CircleShape)
@@ -219,7 +212,7 @@ fun AppShortcutItem(
val favAction = if (isPinned) {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_unpin),
icon = Icons.Rounded.Star,
icon = R.drawable.star_24px_filled,
action = {
viewModel.unpin()
}
@@ -227,7 +220,7 @@ fun AppShortcutItem(
} else {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_pin),
icon = Icons.Rounded.StarOutline,
icon = R.drawable.star_24px,
action = {
viewModel.pin()
})
@@ -240,7 +233,7 @@ fun AppShortcutItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_app_info),
icon = Icons.Rounded.Info
icon = R.drawable.info_24px,
) {
context.tryStartActivity(
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
@@ -253,25 +246,27 @@ fun AppShortcutItem(
val sheetManager = LocalBottomSheetManager.current
toolbarActions.add(DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = Icons.Rounded.Tune,
action = { sheetManager.showCustomizeSearchableModal(shortcut) }
))
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = R.drawable.tune_24px,
action = { sheetManager.showCustomizeSearchableModal(shortcut) }
))
if (shortcut.canDelete) {
toolbarActions.add(DefaultToolbarAction(
label = stringResource(R.string.menu_delete),
icon = Icons.Rounded.Delete,
action = { requestDelete = true }
))
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_delete),
icon = R.drawable.delete_24px,
action = { requestDelete = true }
))
}
Toolbar(
leftActions = listOf(
DefaultToolbarAction(
label = stringResource(id = R.string.menu_back),
icon = Icons.AutoMirrored.Rounded.ArrowBack
icon = R.drawable.arrow_back_24px,
) {
onBack()
}
@@ -330,140 +325,6 @@ fun AppShortcutItem(
}
}
/*Column(
modifier = modifier
) {
AnimatedVisibility(showDetails && shortcut.isUnavailable) {
MissingPermissionBanner(
modifier = Modifier.padding(start = 16.dp, end = 16.dp, top = 16.dp),
text = stringResource(R.string.shortcut_unavailable_description, stringResource(R.string.app_name)),
onClick = {
viewModel.requestShortcutPermission(context as AppCompatActivity)
}
)
}
Row {
Column(
modifier = Modifier
.weight(1f)
.padding(16.dp)
) {
val titleStyle by animateTextStyleAsState(if (showDetails) MaterialTheme.typography.titleMedium else MaterialTheme.typography.titleSmall)
Text(
text = shortcut.labelOverride ?: shortcut.label,
style = titleStyle,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
AnimatedVisibility(showDetails) {
val tags by viewModel.tags.collectAsState(emptyList())
if (tags.isNotEmpty()) {
Text(
modifier = Modifier.padding(top = 1.dp, bottom = 2.dp),
text = tags.joinToString(separator = " #", prefix = "#"),
color = MaterialTheme.colorScheme.secondary,
style = MaterialTheme.typography.labelSmall
)
}
}
val textSpace by transition.animateDp(label = "textSpace") {
if (it) 4.dp else 2.dp
}
shortcut.appName?.let {
Text(
text = stringResource(R.string.shortcut_summary, it),
style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(top = textSpace),
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
}
val padding by transition.animateDp(label = "iconPadding") {
if (it) 16.dp else 8.dp
}
ShapedLauncherIcon(
size = 48.dp,
modifier = Modifier
.padding(padding),
badge = { badge },
icon = { icon },
)
}
AnimatedVisibility(showDetails) {
val toolbarActions = mutableListOf<ToolbarAction>()
if (LocalFavoritesEnabled.current) {
val isPinned by viewModel.isPinned.collectAsState(false)
val favAction = if (isPinned) {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_unpin),
icon = Icons.Rounded.Star,
action = {
viewModel.unpin()
}
)
} else {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_pin),
icon = Icons.Rounded.StarOutline,
action = {
viewModel.pin()
})
}
toolbarActions.add(favAction)
}
val packageName = shortcut.packageName
if (packageName != null) {
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_app_info),
icon = Icons.Rounded.Info
) {
context.tryStartActivity(
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply {
data = Uri.parse("package:$packageName")
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
)
})
}
val sheetManager = LocalBottomSheetManager.current
toolbarActions.add(DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = Icons.Rounded.Tune,
action = { sheetManager.showCustomizeSearchableModal(shortcut) }
))
if (shortcut.canDelete) {
toolbarActions.add(DefaultToolbarAction(
label = stringResource(R.string.menu_delete),
icon = Icons.Rounded.Delete,
action = { requestDelete = true }
))
}
Toolbar(
leftActions = listOf(
DefaultToolbarAction(
label = stringResource(id = R.string.menu_back),
icon = Icons.Rounded.ArrowBack
) {
onBack()
}
),
rightActions = toolbarActions
)
}
}*/
if (requestDelete) {
AlertDialog(
onDismissRequest = { requestDelete = false },

View File

@@ -2,14 +2,26 @@ package de.mm20.launcher2.ui.launcher.search.unitconverter
import android.icu.text.DateFormat
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
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.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
@@ -17,8 +29,7 @@ import androidx.compose.ui.unit.dp
import de.mm20.launcher2.search.data.CurrencyUnitConverter
import de.mm20.launcher2.search.data.UnitConverter
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.unitconverter.Dimension
import java.util.*
import java.util.Date
@Composable
fun UnitConverterItem(
@@ -51,7 +62,7 @@ fun UnitConverterItem(
contentAlignment = Alignment.Center
) {
Icon(
imageVector = getDimensionIcon(unitConverter.dimension),
painter = painterResource(getDimensionIcon(unitConverter.dimension)),
contentDescription = null,
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(24.dp)
@@ -113,16 +124,23 @@ fun UnitConverterItem(
}
)
if (showDisclaimer) {
AlertDialog(
onDismissRequest = { showDisclaimer = false },
confirmButton = {
TextButton(onClick = { showDisclaimer = false }) {
Text(text = stringResource(id = R.string.close))
}
},
title = { Text(stringResource(id = R.string.disclaimer)) },
text = { Text(stringResource(id = R.string.disclaimer_currency_converter, df.format(Date(it.updateTimestamp)))) }
)
AlertDialog(
onDismissRequest = { showDisclaimer = false },
confirmButton = {
TextButton(onClick = { showDisclaimer = false }) {
Text(text = stringResource(id = R.string.close))
}
},
title = { Text(stringResource(id = R.string.disclaimer)) },
text = {
Text(
stringResource(
id = R.string.disclaimer_currency_converter,
df.format(Date(it.updateTimestamp))
)
)
}
)
}
}
}

View File

@@ -11,16 +11,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Bolt
import androidx.compose.material.icons.rounded.FitnessCenter
import androidx.compose.material.icons.rounded.Schedule
import androidx.compose.material.icons.rounded.Speed
import androidx.compose.material.icons.rounded.SquareFoot
import androidx.compose.material.icons.rounded.Storage
import androidx.compose.material.icons.rounded.Straighten
import androidx.compose.material.icons.rounded.Thermostat
import androidx.compose.material.icons.rounded.Toll
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@@ -34,12 +24,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.icons.Cube
import de.mm20.launcher2.search.data.CurrencyUnitConverter
import de.mm20.launcher2.search.data.UnitConverter
import de.mm20.launcher2.ui.R
@@ -121,7 +111,7 @@ fun LazyListScope.UnitConverterResults(
}
}
Icon(
imageVector = getDimensionIcon(converter.dimension),
painter = painterResource(getDimensionIcon(converter.dimension)),
contentDescription = null,
tint = MaterialTheme.colorScheme.secondary,
modifier = Modifier
@@ -216,20 +206,20 @@ fun LazyListScope.UnitConverterResults(
}
}
fun getDimensionIcon(dimension: Dimension): ImageVector {
fun getDimensionIcon(dimension: Dimension): Int {
return when (dimension) {
Dimension.Mass -> Icons.Rounded.FitnessCenter
Dimension.Length -> Icons.Rounded.Straighten
Dimension.Velocity -> Icons.Rounded.Speed
Dimension.Volume -> Icons.Rounded.Cube
Dimension.Area -> Icons.Rounded.SquareFoot
Dimension.Currency -> Icons.Rounded.Toll
Dimension.Data -> Icons.Rounded.Storage
Dimension.Mass -> R.drawable.weight_24px
Dimension.Length -> R.drawable.straighten_24px
Dimension.Velocity -> R.drawable.speed_24px
Dimension.Volume -> R.drawable.deployed_code_24px
Dimension.Area -> R.drawable.square_foot_24px
Dimension.Currency -> R.drawable.payments_24px
Dimension.Data -> R.drawable.hard_disk_24px
Dimension.Bitrate -> TODO()
Dimension.Pressure -> TODO()
Dimension.Energy -> Icons.Rounded.Bolt
Dimension.Energy -> R.drawable.bolt_24px
Dimension.Frequency -> TODO()
Dimension.Temperature -> Icons.Rounded.Thermostat
Dimension.Time -> Icons.Rounded.Schedule
Dimension.Temperature -> R.drawable.device_thermostat_24px
Dimension.Time -> R.drawable.schedule_24px
}
}

View File

@@ -14,12 +14,6 @@ import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.rounded.Share
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.StarOutline
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -35,7 +29,6 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.roundToIntRect
import coil.compose.AsyncImage
import coil.request.ImageRequest
import de.mm20.launcher2.search.Website
@@ -226,7 +219,7 @@ fun WebsiteItem(
val favAction = if (isPinned) {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_unpin),
icon = Icons.Rounded.Star,
icon = R.drawable.star_24px_filled,
action = {
viewModel.unpin()
onBack?.invoke()
@@ -235,7 +228,7 @@ fun WebsiteItem(
} else {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_pin),
icon = Icons.Rounded.StarOutline,
icon = R.drawable.star_24px,
action = {
viewModel.pin()
onBack?.invoke()
@@ -247,7 +240,7 @@ fun WebsiteItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_share),
icon = Icons.Rounded.Share,
icon = R.drawable.share_24px,
action = {
website.share(context)
}
@@ -255,9 +248,10 @@ fun WebsiteItem(
)
val sheetManager = LocalBottomSheetManager.current
toolbarActions.add(DefaultToolbarAction(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = Icons.Rounded.Tune,
icon = R.drawable.tune_24px,
action = { sheetManager.showCustomizeSearchableModal(website) }
))
@@ -265,7 +259,7 @@ fun WebsiteItem(
leftActions = if (onBack != null) listOf(
DefaultToolbarAction(
stringResource(id = R.string.menu_back),
icon = Icons.AutoMirrored.Rounded.ArrowBack,
icon = R.drawable.arrow_back_24px,
action = onBack
)
) else emptyList(),

View File

@@ -14,13 +14,6 @@ import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.rounded.Edit
import androidx.compose.material.icons.rounded.Share
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.StarOutline
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
@@ -30,7 +23,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
@@ -38,7 +30,6 @@ import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.fromHtml
import androidx.compose.ui.unit.IntRect
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.roundToIntRect
import coil.compose.AsyncImage
import coil.request.ImageRequest
import de.mm20.launcher2.search.Article
@@ -213,7 +204,7 @@ fun ArticleItem(
val favAction = if (isPinned) {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_unpin),
icon = Icons.Rounded.Star,
icon = R.drawable.star_24px_filled,
action = {
viewModel.unpin()
onBack?.invoke()
@@ -222,7 +213,7 @@ fun ArticleItem(
} else {
DefaultToolbarAction(
label = stringResource(R.string.menu_favorites_pin),
icon = Icons.Rounded.StarOutline,
icon = R.drawable.star_24px,
action = {
viewModel.pin()
onBack?.invoke()
@@ -234,7 +225,7 @@ fun ArticleItem(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_share),
icon = Icons.Rounded.Share,
icon = R.drawable.share_24px,
action = {
article.share(context)
}
@@ -242,9 +233,10 @@ fun ArticleItem(
)
val sheetManager = LocalBottomSheetManager.current
toolbarActions.add(DefaultToolbarAction(
toolbarActions.add(
DefaultToolbarAction(
label = stringResource(R.string.menu_customize),
icon = Icons.Rounded.Tune,
icon = R.drawable.tune_24px,
action = { sheetManager.showCustomizeSearchableModal(article) }
))
@@ -252,7 +244,7 @@ fun ArticleItem(
leftActions = if (onBack != null) listOf(
DefaultToolbarAction(
stringResource(id = R.string.menu_back),
icon = Icons.AutoMirrored.Rounded.ArrowBack,
icon = R.drawable.arrow_back_24px,
action = onBack
)
) else emptyList(),

View File

@@ -2,21 +2,12 @@ package de.mm20.launcher2.ui.launcher.searchbar
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.scaleIn
import androidx.compose.animation.scaleOut
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.imeAnimationTarget
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.text.KeyboardActionScope
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.FilterAlt
import androidx.compose.material.icons.rounded.VisibilityOff
import androidx.compose.material3.Badge
import androidx.compose.material3.Icon
import androidx.compose.material3.IconToggleButton
@@ -29,8 +20,8 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.dp
@@ -41,7 +32,6 @@ import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.SearchBar
import de.mm20.launcher2.ui.component.SearchBarLevel
import de.mm20.launcher2.ui.launcher.search.SearchVM
import de.mm20.launcher2.ui.launcher.search.filters.KeyboardFilterBar
import de.mm20.launcher2.ui.launcher.sheets.LocalBottomSheetManager
@Composable
@@ -96,7 +86,13 @@ fun LauncherSearchBar(
checked = sheetManager.hiddenItemsSheetShown.value,
onCheckedChange = { if (it) sheetManager.showHiddenItemsSheet() },
) {
Icon(imageVector = Icons.Rounded.VisibilityOff, contentDescription = null)
Icon(
painter = painterResource(
if (sheetManager.hiddenItemsSheetShown.value) R.drawable.visibility_off_24px_filled
else R.drawable.visibility_off_24px
),
contentDescription = null
)
}
}
AnimatedVisibility(
@@ -111,9 +107,15 @@ fun LauncherSearchBar(
},
) {
Box {
Icon(imageVector = Icons.Rounded.FilterAlt, contentDescription = stringResource(
if (searchVM.showFilters.value) R.string.menu_hide_filters else R.string.menu_show_filters
))
Icon(
painter = painterResource(
if (searchVM.showFilters.value)R.drawable.filter_alt_24px_filled
else R.drawable.filter_alt_24px
),
contentDescription = stringResource(
if (searchVM.showFilters.value) R.string.menu_hide_filters else R.string.menu_show_filters
)
)
androidx.compose.animation.AnimatedVisibility(
!searchVM.filters.value.allCategoriesEnabled,
enter = scaleIn(tween(100)),

View File

@@ -8,8 +8,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Edit
import androidx.compose.material3.AssistChip
import androidx.compose.material3.AssistChipDefaults
import androidx.compose.material3.FloatingActionButtonDefaults
@@ -21,8 +19,10 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.searchactions.actions.SearchAction
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.SearchActionIcon
import de.mm20.launcher2.ui.modifier.consumeAllScrolling
import de.mm20.launcher2.ui.settings.SettingsActivity
@@ -83,7 +83,7 @@ fun ColumnScope.SearchBarActions(
}
) {
Icon(imageVector = Icons.Rounded.Edit, contentDescription = null)
Icon(painterResource(R.drawable.edit_24px), contentDescription = null)
}
}
}

View File

@@ -8,11 +8,6 @@ import androidx.compose.animation.graphics.res.animatedVectorResource
import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter
import androidx.compose.animation.graphics.vector.AnimatedImageVector
import androidx.compose.foundation.layout.RowScope
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Edit
import androidx.compose.material.icons.rounded.HelpOutline
import androidx.compose.material.icons.rounded.Settings
import androidx.compose.material.icons.rounded.Wallpaper
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
@@ -21,13 +16,13 @@ import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.ui.R
@@ -74,7 +69,7 @@ fun RowScope.SearchBarMenu(
Text(stringResource(R.string.wallpaper))
},
leadingIcon = {
Icon(imageVector = Icons.Rounded.Wallpaper, contentDescription = null)
Icon(painterResource(R.drawable.wallpaper_24px), contentDescription = null)
}
)
DropdownMenuItem(
@@ -86,7 +81,7 @@ fun RowScope.SearchBarMenu(
Text(stringResource(R.string.settings))
},
leadingIcon = {
Icon(imageVector = Icons.Rounded.Settings, contentDescription = null)
Icon(painterResource(R.drawable.settings_24px), contentDescription = null)
}
)
val colorScheme = MaterialTheme.colorScheme
@@ -107,7 +102,7 @@ fun RowScope.SearchBarMenu(
Text(stringResource(R.string.help))
},
leadingIcon = {
Icon(imageVector = Icons.Rounded.HelpOutline, contentDescription = null)
Icon(painterResource(R.drawable.help_24px), contentDescription = null)
}
)
}

View File

@@ -27,13 +27,6 @@ import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Build
import androidx.compose.material.icons.rounded.Error
import androidx.compose.material.icons.rounded.HelpOutline
import androidx.compose.material.icons.rounded.Link
import androidx.compose.material.icons.rounded.LinkOff
import androidx.compose.material.icons.rounded.OpenInNew
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CheckboxDefaults
import androidx.compose.material3.HorizontalDivider
@@ -58,6 +51,7 @@ import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.input.pointer.PointerEventPass
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
@@ -174,7 +168,7 @@ fun ColumnScope.ConfigureWeatherWidget(
modifier = Modifier
.padding(start = ButtonDefaults.IconSpacing)
.requiredSize(ButtonDefaults.IconSize),
imageVector = Icons.Rounded.OpenInNew, contentDescription = null
painter = painterResource(R.drawable.open_in_new_20px), contentDescription = null
)
}
}
@@ -225,7 +219,7 @@ fun ColumnScope.ConfigureFavoritesWidget(
modifier = Modifier
.padding(start = ButtonDefaults.IconSpacing)
.requiredSize(ButtonDefaults.IconSize),
imageVector = Icons.Rounded.OpenInNew, contentDescription = null
painter = painterResource(R.drawable.open_in_new_20px), contentDescription = null
)
}
}
@@ -278,7 +272,7 @@ fun ColumnScope.ConfigureMusicWidget(
modifier = Modifier
.padding(start = ButtonDefaults.IconSpacing)
.requiredSize(ButtonDefaults.IconSize),
imageVector = Icons.Rounded.OpenInNew, contentDescription = null
painter = painterResource(R.drawable.open_in_new_20px), contentDescription = null
)
}
}
@@ -305,7 +299,7 @@ fun ColumnScope.ConfigureAppWidget(
contentAlignment = Alignment.Center
) {
LargeMessage(
icon = Icons.Rounded.Error,
icon = R.drawable.error_48px,
text = stringResource(id = R.string.app_widget_loading_failed)
)
}
@@ -316,7 +310,7 @@ fun ColumnScope.ConfigureAppWidget(
contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
onClick = { replaceWidget = true }) {
Icon(
Icons.Rounded.Build,
painterResource(R.drawable.build_20px),
null,
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
@@ -506,7 +500,7 @@ fun ColumnScope.ConfigureAppWidget(
modifier = Modifier
.padding(start = ButtonDefaults.IconSpacing)
.requiredSize(ButtonDefaults.IconSize),
imageVector = Icons.Rounded.OpenInNew, contentDescription = null
painter = painterResource(R.drawable.open_in_new_20px), contentDescription = null
)
}
}
@@ -659,7 +653,7 @@ fun ColumnScope.ConfigureCalendarWidget(
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
.requiredSize(ButtonDefaults.IconSize),
imageVector = Icons.Rounded.HelpOutline, contentDescription = null
painter = painterResource(R.drawable.help_20px), contentDescription = null
)
Text(stringResource(R.string.widget_config_calendar_missing_calendars_hint))
}
@@ -706,7 +700,7 @@ fun ConfigureNotesWidget(
OutlinedCard {
if (widget.config.linkedFile != null) {
Preference(
icon = { Icon(Icons.Rounded.LinkOff, null) },
icon = { Icon(painterResource(R.drawable.link_off_24px), null) },
title = { Text(stringResource(R.string.note_widget_action_unlink_file)) },
summary = {
Text(
@@ -732,7 +726,7 @@ fun ConfigureNotesWidget(
Preference(
title = stringResource(R.string.note_widget_link_file),
summary = stringResource(R.string.note_widget_link_file_summary),
icon = Icons.Rounded.Link,
icon = R.drawable.link_24px,
onClick = {
linkFileLauncher.launch(
context.getString(

View File

@@ -5,20 +5,12 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.Label
import androidx.compose.material.icons.outlined.Visibility
import androidx.compose.material.icons.rounded.Edit
import androidx.compose.material.icons.rounded.Tag
import androidx.compose.material.icons.rounded.Visibility
import androidx.compose.material.icons.rounded.VisibilityOff
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.ExposedDropdownMenuDefaults
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.MenuAnchorType
import androidx.compose.material3.ModalBottomSheet
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
@@ -33,6 +25,7 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp
@@ -78,7 +71,7 @@ fun CustomizeSearchableSheet(
icon = { icon },
badge = {
Badge(
icon = BadgeIcon(Icons.Rounded.Edit)
icon = BadgeIcon(R.drawable.edit_20px)
)
},
modifier = Modifier.clickable {
@@ -105,7 +98,7 @@ fun CustomizeSearchableSheet(
Text(searchable.label)
},
leadingIcon = {
Icon(Icons.AutoMirrored.Rounded.Label, null)
Icon(painterResource(R.drawable.label_24px), null)
}
)
@@ -129,7 +122,7 @@ fun CustomizeSearchableSheet(
viewModel.autocompleteTags(it).minus(tags.toSet())
},
leadingIcon = {
Icon(Icons.Rounded.Tag, null)
Icon(painterResource(R.drawable.tag_24px), null)
}
)
@@ -169,11 +162,13 @@ fun CustomizeSearchableSheet(
trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = showDropdown) },
leadingIcon = {
Icon(
when (visibility) {
VisibilityLevel.Default -> Icons.Rounded.Visibility
VisibilityLevel.SearchOnly -> Icons.Outlined.Visibility
VisibilityLevel.Hidden -> Icons.Rounded.VisibilityOff
},
painterResource(
when (visibility) {
VisibilityLevel.Default -> R.drawable.visibility_24px_filled
VisibilityLevel.SearchOnly -> R.drawable.visibility_24px
VisibilityLevel.Hidden -> R.drawable.visibility_off_24px
}
),
null
)
},
@@ -195,7 +190,7 @@ fun CustomizeSearchableSheet(
Text(stringResource(R.string.item_visibility_app_default))
},
leadingIcon = {
Icon(Icons.Rounded.Visibility, null)
Icon(painterResource(R.drawable.visibility_24px_filled), null)
}
)
} else if (searchable is CalendarEvent) {
@@ -208,7 +203,7 @@ fun CustomizeSearchableSheet(
Text(stringResource(R.string.item_visibility_calendar_default))
},
leadingIcon = {
Icon(Icons.Rounded.Visibility, null)
Icon(painterResource(R.drawable.visibility_24px_filled), null)
}
)
} else {
@@ -221,7 +216,7 @@ fun CustomizeSearchableSheet(
Text(stringResource(R.string.item_visibility_search_only))
},
leadingIcon = {
Icon(Icons.Rounded.Visibility, null)
Icon(painterResource(R.drawable.visibility_24px_filled), null)
}
)
}
@@ -236,7 +231,7 @@ fun CustomizeSearchableSheet(
},
leadingIcon = {
Icon(
Icons.Outlined.Visibility,
painterResource(R.drawable.visibility_24px),
null
)
}
@@ -251,7 +246,7 @@ fun CustomizeSearchableSheet(
Text(stringResource(R.string.item_visibility_hidden))
},
leadingIcon = {
Icon(Icons.Rounded.VisibilityOff, null)
Icon(painterResource(R.drawable.visibility_off_24px), null)
}
)
}
@@ -267,7 +262,7 @@ fun CustomizeSearchableSheet(
}
if (pickIcon) {
val bottomSheetState = rememberModalBottomSheetState()
BottomSheetDialog (
BottomSheetDialog(
onDismissRequest = { viewModel.closeIconPicker() },
bottomSheetState = bottomSheetState
) {

View File

@@ -25,11 +25,6 @@ import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Add
import androidx.compose.material.icons.rounded.Delete
import androidx.compose.material.icons.rounded.Settings
import androidx.compose.material.icons.rounded.Tag
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
@@ -63,6 +58,7 @@ import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
@@ -253,7 +249,7 @@ fun ReorderFavoritesGrid(viewModel: EditFavoritesSheetVM, paddingValues: Padding
DropdownMenuItem(
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Delete,
painterResource(R.drawable.delete_24px),
contentDescription = null
)
},
@@ -297,7 +293,10 @@ fun ReorderFavoritesGrid(viewModel: EditFavoritesSheetVM, paddingValues: Padding
checked = showSettings,
onCheckedChange = { showSettings = it }) {
Icon(
imageVector = Icons.Rounded.Settings,
painterResource(
if (showSettings) R.drawable.settings_24px_filled
else R.drawable.settings_24px
),
contentDescription = null
)
}
@@ -308,7 +307,7 @@ fun ReorderFavoritesGrid(viewModel: EditFavoritesSheetVM, paddingValues: Padding
viewModel.pickShortcut(it.section)
}) {
Icon(
imageVector = Icons.Rounded.Add,
painterResource(R.drawable.add_24px),
contentDescription = null
)
}
@@ -471,7 +470,7 @@ fun ReorderFavoritesGrid(viewModel: EditFavoritesSheetVM, paddingValues: Padding
showAddMenu = true
}) {
Icon(
imageVector = Icons.Rounded.Add,
painterResource(R.drawable.add_24px),
contentDescription = null
)
}
@@ -481,7 +480,7 @@ fun ReorderFavoritesGrid(viewModel: EditFavoritesSheetVM, paddingValues: Padding
for (tag in availableTags) {
DropdownMenuItem(
leadingIcon = {
Icon(Icons.Rounded.Tag, null)
Icon(painterResource(R.drawable.tag_24px), null)
},
text = { Text(tag.tag) },
onClick = {
@@ -494,7 +493,7 @@ fun ReorderFavoritesGrid(viewModel: EditFavoritesSheetVM, paddingValues: Padding
}
DropdownMenuItem(
leadingIcon = {
Icon(Icons.Rounded.Add, null)
Icon(painterResource(R.drawable.add_24px), null)
},
text = {
Text(

View File

@@ -23,12 +23,6 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Apps
import androidx.compose.material.icons.rounded.Check
import androidx.compose.material.icons.rounded.EmojiEmotions
import androidx.compose.material.icons.rounded.Tag
import androidx.compose.material.icons.rounded.Warning
import androidx.compose.material3.Button
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@@ -55,6 +49,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.PathEffect
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
@@ -143,12 +138,12 @@ fun CreateNewTagPage(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
fun PickItems(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
val columns = LocalGridSettings.current.columnCount - 1
Scaffold (
Scaffold(
contentWindowInsets = WindowInsets(0.dp),
modifier = Modifier.padding(paddingValues),
containerColor = Color.Transparent,
bottomBar = {
Surface (
Surface(
modifier = Modifier.fillMaxWidth(),
color = MaterialTheme.colorScheme.surface.copy(alpha = 0.95f),
shape = MaterialTheme.shapes.medium
@@ -248,7 +243,11 @@ fun ListItem(
onTagChanged(false)
}
) {
Icon(Icons.Rounded.Check, null, modifier = Modifier.padding(4.dp))
Icon(
painterResource(R.drawable.check_20px),
null,
modifier = Modifier.padding(4.dp)
)
}
}
}
@@ -312,7 +311,8 @@ fun CustomizeTag(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
contentAlignment = Alignment.Center,
) {
if (tagIcon != null) {
var icon = remember(viewModel.tagIcon) { viewModel.tagIcon }.collectAsState(null)
var icon =
remember(viewModel.tagIcon) { viewModel.tagIcon }.collectAsState(null)
ShapedLauncherIcon(
size = 56.dp,
icon = { icon.value },
@@ -320,7 +320,7 @@ fun CustomizeTag(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
)
} else {
Icon(
Icons.Rounded.Tag,
painterResource(R.drawable.tag_24px),
null,
tint = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -397,7 +397,7 @@ fun CustomizeTag(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
AnimatedVisibility(viewModel.tagNameExists || viewModel.taggedItems.isEmpty() || viewModel.tagName.isEmpty()) {
SmallMessage(
modifier = Modifier.fillMaxWidth(),
icon = Icons.Rounded.Warning,
icon = R.drawable.warning_24px,
text = stringResource(
if (viewModel.taggedItems.isEmpty()) R.string.tag_no_items_message
else if (viewModel.tagNameExists) R.string.tag_exists_message
@@ -413,7 +413,7 @@ fun PickIcon(
viewModel: EditTagSheetVM,
paddingValues: PaddingValues
) {
val icon by remember (viewModel.tagCustomIcon) { viewModel.tagCustomIcon }.collectAsState()
val icon by remember(viewModel.tagCustomIcon) { viewModel.tagCustomIcon }.collectAsState()
val tag = Tag(viewModel.tagName)
var selectedTabIndex = remember {
mutableIntStateOf(
@@ -433,14 +433,14 @@ fun PickIcon(
) {
SegmentedButton(
selected = selectedTabIndex.intValue == 0,
icon = { Icon(Icons.Rounded.Apps, null) },
icon = { Icon(painterResource(R.drawable.apps_24px), null) },
label = { Text("Icon") },
onClick = { selectedTabIndex.intValue = 0 },
shape = SegmentedButtonDefaults.itemShape(0, 2)
)
SegmentedButton(
selected = selectedTabIndex.intValue == 1,
icon = { Icon(Icons.Rounded.EmojiEmotions, null) },
icon = { Icon(painterResource(R.drawable.mood_24px), null) },
label = { Text("Emoji") },
onClick = { selectedTabIndex.intValue = 1 },
shape = SegmentedButtonDefaults.itemShape(1, 2)

View File

@@ -27,17 +27,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Clear
import androidx.compose.material.icons.rounded.ExpandMore
import androidx.compose.material.icons.rounded.LightMode
import androidx.compose.material.icons.rounded.MusicNote
import androidx.compose.material.icons.rounded.Search
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.StickyNote2
import androidx.compose.material.icons.rounded.Today
import androidx.compose.material.icons.rounded.Widgets
import androidx.compose.material.icons.rounded.Work
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -57,6 +46,7 @@ import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Density
@@ -308,12 +298,12 @@ fun WidgetPickerSheet(
Text(stringResource(R.string.search_bar_placeholder))
},
leadingIcon = {
Icon(Icons.Rounded.Search, null)
Icon(painterResource(R.drawable.search_24px), null)
},
trailingIcon = {
if (query.isNotEmpty()) {
IconButton(onClick = { viewModel.search("") }) {
Icon(Icons.Rounded.Clear, null)
Icon(painterResource(R.drawable.close_24px), null)
}
}
}
@@ -344,14 +334,16 @@ fun WidgetPickerSheet(
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = when (it.type) {
WeatherWidget.Type -> Icons.Rounded.LightMode
CalendarWidget.Type -> Icons.Rounded.Today
MusicWidget.Type -> Icons.Rounded.MusicNote
FavoritesWidget.Type -> Icons.Rounded.Star
NotesWidget.Type -> Icons.Rounded.StickyNote2
else -> Icons.Rounded.Widgets
},
painter =
painterResource(
when (it.type) {
WeatherWidget.Type -> R.drawable.light_mode_24px
CalendarWidget.Type -> R.drawable.today_24px
MusicWidget.Type -> R.drawable.music_note_24px
FavoritesWidget.Type -> R.drawable.star_24px
NotesWidget.Type -> R.drawable.sticky_note_2_24px
else -> R.drawable.widgets_24px
}),
contentDescription = null,
modifier = Modifier.padding(end = 16.dp)
)
@@ -402,7 +394,7 @@ fun WidgetPickerSheet(
if (!expandAllGroups) {
Icon(
modifier = Modifier.rotate(rotate),
imageVector = Icons.Rounded.ExpandMore,
painter = painterResource(R.drawable.keyboard_arrow_down_24px),
contentDescription = null
)
}
@@ -465,7 +457,7 @@ fun WidgetPickerSheet(
.clip(CircleShape)
.background(MaterialTheme.colorScheme.tertiaryContainer)
.padding(4.dp),
imageVector = Icons.Rounded.Work,
painter = painterResource(R.drawable.enterprise_24px),
contentDescription = null,
tint = MaterialTheme.colorScheme.onTertiaryContainer
)

View File

@@ -32,6 +32,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.onPlaced
import androidx.compose.ui.layout.positionInParent
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.contentDescription
@@ -158,8 +159,6 @@ fun WidgetColumn(
if (editMode) R.string.widget_add_widget
else R.string.menu_edit_widgets
)
val icon =
AnimatedImageVector.animatedVectorResource(R.drawable.anim_ic_edit_add)
Button(
modifier = Modifier.align(Alignment.CenterHorizontally).padding(vertical = 8.dp),
@@ -175,9 +174,8 @@ fun WidgetColumn(
Icon(
modifier = Modifier.padding(end = ButtonDefaults.IconSpacing)
.size(ButtonDefaults.IconSize),
painter = rememberAnimatedVectorPainter(
animatedImageVector = icon,
atEnd = !editMode
painter = painterResource(
if (editMode) R.drawable.add_20px else R.drawable.edit_20px
), contentDescription = null
)
Text(title)

View File

@@ -11,10 +11,6 @@ import androidx.compose.foundation.gestures.rememberDraggableState
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Delete
import androidx.compose.material.icons.rounded.DragIndicator
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -28,6 +24,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@@ -89,7 +86,7 @@ fun WidgetItem(
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = Icons.Rounded.DragIndicator,
painterResource(R.drawable.drag_indicator_24px),
contentDescription = null,
modifier = Modifier.draggable(
state = draggableState,
@@ -129,13 +126,13 @@ fun WidgetItem(
configure = true
}) {
Icon(
imageVector = Icons.Rounded.Tune,
painterResource(R.drawable.tune_24px),
contentDescription = stringResource(R.string.settings)
)
}
IconButton(onClick = { onWidgetRemove() }) {
Icon(
imageVector = Icons.Rounded.Delete,
painterResource(R.drawable.delete_24px),
contentDescription = stringResource(R.string.widget_action_remove)
)
}

View File

@@ -4,7 +4,6 @@ import android.content.Context
import android.text.format.DateUtils
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.animateContentSize
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.slideIn
@@ -17,13 +16,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.OpenInNew
import androidx.compose.material.icons.rounded.Add
import androidx.compose.material.icons.rounded.ArrowDropDown
import androidx.compose.material.icons.rounded.ChevronLeft
import androidx.compose.material.icons.rounded.ChevronRight
import androidx.compose.material.icons.rounded.OpenInNew
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
@@ -42,6 +34,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
@@ -87,7 +80,7 @@ fun CalendarWidget(
modifier = Modifier.padding(start = 8.dp, end = 8.dp, top = 8.dp, bottom = 4.dp)
) {
IconButton(onClick = { viewModel.previousDay() }) {
Icon(imageVector = Icons.Rounded.ChevronLeft, contentDescription = stringResource(R.string.calendar_widget_previous_day))
Icon(painter = painterResource(R.drawable.chevron_backward_24px), contentDescription = stringResource(R.string.calendar_widget_previous_day))
}
Box(
modifier = Modifier.weight(1f),
@@ -103,7 +96,7 @@ fun CalendarWidget(
overflow = TextOverflow.Ellipsis
)
Icon(
imageVector = Icons.Rounded.ArrowDropDown,
painterResource(R.drawable.arrow_drop_down_24px),
contentDescription = null,
tint = MaterialTheme.colorScheme.onSurface,
)
@@ -121,13 +114,13 @@ fun CalendarWidget(
}
}
IconButton(onClick = { viewModel.nextDay() }) {
Icon(imageVector = Icons.Rounded.ChevronRight, contentDescription = stringResource(R.string.calendar_widget_next_day))
Icon(painter = painterResource(R.drawable.chevron_forward_24px), contentDescription = stringResource(R.string.calendar_widget_next_day))
}
IconButton(onClick = { viewModel.createEvent(context) }) {
Icon(imageVector = Icons.Rounded.Add, contentDescription = stringResource(R.string.calendar_widget_create_event))
Icon(painter = painterResource(R.drawable.add_24px), contentDescription = stringResource(R.string.calendar_widget_create_event))
}
IconButton(onClick = { viewModel.openCalendarApp(context) }) {
Icon(imageVector = Icons.AutoMirrored.Rounded.OpenInNew, contentDescription = stringResource(R.string.calendar_widget_open_calendar))
Icon(painter = painterResource(R.drawable.open_in_new_24px), contentDescription = stringResource(R.string.calendar_widget_open_calendar))
}
}
val events by viewModel.calendarEvents

View File

@@ -16,26 +16,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.rounded.AccessTime
import androidx.compose.material.icons.rounded.Alarm
import androidx.compose.material.icons.rounded.AlignVerticalBottom
import androidx.compose.material.icons.rounded.AlignVerticalCenter
import androidx.compose.material.icons.rounded.AlignVerticalTop
import androidx.compose.material.icons.rounded.AutoAwesome
import androidx.compose.material.icons.rounded.BatteryFull
import androidx.compose.material.icons.rounded.ColorLens
import androidx.compose.material.icons.rounded.DarkMode
import androidx.compose.material.icons.rounded.FormatColorText
import androidx.compose.material.icons.rounded.Height
import androidx.compose.material.icons.rounded.HorizontalSplit
import androidx.compose.material.icons.rounded.LightMode
import androidx.compose.material.icons.rounded.MusicNote
import androidx.compose.material.icons.rounded.Timer
import androidx.compose.material.icons.rounded.Today
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material.icons.rounded.VerticalSplit
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.HorizontalDivider
@@ -61,6 +41,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@@ -152,7 +133,7 @@ fun ClockWidget(
configure = true
}) {
Icon(
imageVector = Icons.Rounded.Tune,
painterResource(R.drawable.tune_24px),
contentDescription = stringResource(R.string.settings)
)
}
@@ -397,13 +378,13 @@ fun ConfigureClockWidgetSheet(
active = compact == false,
activeContent = {
Icon(
imageVector = Icons.Filled.Check,
painterResource(R.drawable.check_20px),
contentDescription = null,
)
}
) {
Icon(
imageVector = Icons.Rounded.HorizontalSplit,
painterResource(R.drawable.splitscreen_top_20px),
contentDescription = null,
)
}
@@ -422,13 +403,13 @@ fun ConfigureClockWidgetSheet(
active = compact == true,
activeContent = {
Icon(
imageVector = Icons.Filled.Check,
painterResource(R.drawable.check_20px),
contentDescription = null,
)
}
) {
Icon(
imageVector = Icons.Rounded.VerticalSplit,
painterResource(R.drawable.splitscreen_right_20px),
contentDescription = null,
)
}
@@ -463,7 +444,7 @@ fun ConfigureClockWidgetSheet(
shape = SegmentedButtonDefaults.itemShape(index = 0, count = 3),
) {
Icon(
imageVector = Icons.Rounded.AutoAwesome,
painterResource(R.drawable.auto_awesome_20dp),
contentDescription = null,
modifier = Modifier.size(SegmentedButtonDefaults.IconSize)
)
@@ -476,7 +457,7 @@ fun ConfigureClockWidgetSheet(
shape = SegmentedButtonDefaults.itemShape(index = 1, count = 3),
) {
Icon(
imageVector = Icons.Rounded.LightMode,
painterResource(R.drawable.light_mode_20px),
contentDescription = null,
modifier = Modifier.size(SegmentedButtonDefaults.IconSize)
)
@@ -489,7 +470,7 @@ fun ConfigureClockWidgetSheet(
shape = SegmentedButtonDefaults.itemShape(index = 2, count = 3),
) {
Icon(
imageVector = Icons.Rounded.DarkMode,
painterResource(R.drawable.dark_mode_20px),
contentDescription = null,
modifier = Modifier.size(SegmentedButtonDefaults.IconSize)
)
@@ -503,7 +484,7 @@ fun ConfigureClockWidgetSheet(
) {
SwitchPreference(
title = stringResource(R.string.widget_use_theme_colors),
icon = Icons.Rounded.ColorLens,
icon = R.drawable.palette_24px,
value = useAccentColor,
onValueChanged = {
viewModel.setUseThemeColor(it)
@@ -512,7 +493,7 @@ fun ConfigureClockWidgetSheet(
AnimatedVisibility(compact == false && style !is ClockWidgetStyle.Custom) {
SwitchPreference(
title = stringResource(R.string.preference_clock_widget_show_seconds),
icon = Icons.Rounded.Timer,
icon = R.drawable.timer_24px,
value = showSeconds,
onValueChanged = {
viewModel.setShowSeconds(it)
@@ -526,7 +507,7 @@ fun ConfigureClockWidgetSheet(
) {
SwitchPreference(
title = stringResource(R.string.preference_clock_widget_monospaced),
icon = Icons.Rounded.FormatColorText,
icon = R.drawable._123_24px,
value = monospaced,
onValueChanged = {
viewModel.setMonospaced(it)
@@ -546,7 +527,7 @@ fun ConfigureClockWidgetSheet(
TimeFormat.TwentyFourHour -> stringResource(R.string.preference_clock_widget_time_format_24h)
TimeFormat.System -> stringResource(R.string.preference_clock_widget_time_format_system)
},
icon = Icons.Rounded.AccessTime,
icon = R.drawable.schedule_24px,
onClick = {
showDropdown = true
}
@@ -593,7 +574,7 @@ fun ConfigureClockWidgetSheet(
) {
SwitchPreference(
title = stringResource(R.string.preference_clock_widget_fill_height),
icon = Icons.Rounded.Height,
icon = R.drawable.fit_page_height_24px,
value = fillHeight == true || widgetsOnHome == false,
onValueChanged = {
viewModel.setFillHeight(it)
@@ -609,9 +590,9 @@ fun ConfigureClockWidgetSheet(
else -> stringResource(R.string.preference_clock_widget_alignment_bottom)
},
icon = when (alignment) {
ClockWidgetAlignment.Top -> Icons.Rounded.AlignVerticalTop
ClockWidgetAlignment.Center -> Icons.Rounded.AlignVerticalCenter
else -> Icons.Rounded.AlignVerticalBottom
ClockWidgetAlignment.Top -> R.drawable.align_vertical_top_24px
ClockWidgetAlignment.Center -> R.drawable.align_vertical_center_24px
else -> R.drawable.align_vertical_bottom_24px
},
onClick = {
showDropdown = true
@@ -624,7 +605,7 @@ fun ConfigureClockWidgetSheet(
DropdownMenuItem(
leadingIcon = {
Icon(
Icons.Rounded.AlignVerticalTop,
painterResource(R.drawable.align_vertical_top_24px),
null
)
},
@@ -637,7 +618,7 @@ fun ConfigureClockWidgetSheet(
DropdownMenuItem(
leadingIcon = {
Icon(
Icons.Rounded.AlignVerticalCenter,
painterResource(R.drawable.align_vertical_center_24px),
null
)
},
@@ -649,7 +630,7 @@ fun ConfigureClockWidgetSheet(
DropdownMenuItem(
leadingIcon = {
Icon(
Icons.Rounded.AlignVerticalBottom,
painterResource(R.drawable.align_vertical_bottom_24px),
null
)
},
@@ -676,7 +657,7 @@ fun ConfigureClockWidgetSheet(
SwitchPreference(
title = stringResource(R.string.preference_clockwidget_date_part),
summary = stringResource(R.string.preference_clockwidget_date_part_summary),
icon = Icons.Rounded.Today,
icon = R.drawable.today_24px,
value = parts?.date == true,
onValueChanged = {
viewModel.setDatePart(it)
@@ -685,7 +666,7 @@ fun ConfigureClockWidgetSheet(
SwitchPreference(
title = stringResource(R.string.preference_clockwidget_music_part),
summary = stringResource(R.string.preference_clockwidget_music_part_summary),
icon = Icons.Rounded.MusicNote,
icon = R.drawable.music_note_24px,
value = parts?.music == true,
onValueChanged = {
viewModel.setMusicPart(it)
@@ -694,7 +675,7 @@ fun ConfigureClockWidgetSheet(
SwitchPreference(
title = stringResource(R.string.preference_clockwidget_alarm_part),
summary = stringResource(R.string.preference_clockwidget_alarm_part_summary),
icon = Icons.Rounded.Alarm,
icon = R.drawable.alarm_24px,
value = parts?.alarm == true,
onValueChanged = {
viewModel.setAlarmPart(it)
@@ -703,7 +684,7 @@ fun ConfigureClockWidgetSheet(
SwitchPreference(
title = stringResource(R.string.preference_clockwidget_battery_part),
summary = stringResource(R.string.preference_clockwidget_battery_part_summary),
icon = Icons.Rounded.BatteryFull,
icon = R.drawable.battery_full_24px,
value = parts?.battery == true,
onValueChanged = {
viewModel.setBatteryPart(it)

View File

@@ -26,19 +26,6 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.pager.HorizontalPager
import androidx.compose.foundation.pager.rememberPagerState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowDropDown
import androidx.compose.material.icons.rounded.CheckCircle
import androidx.compose.material.icons.rounded.ChevronLeft
import androidx.compose.material.icons.rounded.ChevronRight
import androidx.compose.material.icons.rounded.Done
import androidx.compose.material.icons.rounded.PhotoSizeSelectSmall
import androidx.compose.material.icons.rounded.RadioButtonUnchecked
import androidx.compose.material.icons.rounded.RestartAlt
import androidx.compose.material.icons.rounded.Settings
import androidx.compose.material.icons.rounded.SwapHoriz
import androidx.compose.material.icons.rounded.Tune
import androidx.compose.material.icons.rounded.Widgets
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
@@ -65,6 +52,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.PointerEventPass
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp
@@ -162,7 +150,7 @@ fun WatchFaceSelector(
modifier = Modifier
.padding(4.dp)
) {
Icon(Icons.Rounded.Tune, null)
Icon(painterResource(R.drawable.tune_24px), null)
DropdownMenu(
expanded = showStyleSettings,
onDismissRequest = { showStyleSettings = false }) {
@@ -171,8 +159,10 @@ fun WatchFaceSelector(
text = { Text(stringResource(R.string.clock_variant_outlined)) },
leadingIcon = {
Icon(
if (selected.outlined) Icons.Rounded.CheckCircle
else Icons.Rounded.RadioButtonUnchecked,
painterResource(
if (selected.outlined) R.drawable.check_circle_24px_filled
else R.drawable.circle_24px,
),
null
)
},
@@ -186,8 +176,10 @@ fun WatchFaceSelector(
text = { Text(stringResource(R.string.clock_variant_analog_ticks)) },
leadingIcon = {
Icon(
if (selected.showTicks) Icons.Rounded.CheckCircle
else Icons.Rounded.RadioButtonUnchecked,
painterResource(
if (selected.showTicks) R.drawable.check_circle_24px_filled
else R.drawable.circle_24px,
),
null
)
},
@@ -200,7 +192,7 @@ fun WatchFaceSelector(
DropdownMenuItem(
text = { Text(stringResource(R.string.widget_pick_widget)) },
leadingIcon = {
Icon(Icons.Rounded.SwapHoriz, null)
Icon(painterResource(R.drawable.swap_horiz_24px), null)
},
onClick = {
showWidgetPicker = true
@@ -209,7 +201,7 @@ fun WatchFaceSelector(
)
DropdownMenuItem(
leadingIcon = {
Icon(Icons.Rounded.PhotoSizeSelectSmall, null)
Icon(painterResource(R.drawable.resize_24px), null)
},
text = { Text(stringResource(R.string.widget_config_appwidget_resize)) },
onClick = { resizeCustomWidget = true }
@@ -224,7 +216,7 @@ fun WatchFaceSelector(
DropdownMenuItem(
text = { Text(stringResource(R.string.widget_config_appwidget_configure)) },
leadingIcon = {
Icon(Icons.Rounded.Settings, null)
Icon(painterResource(R.drawable.settings_24px), null)
},
onClick = {
appWidgetHost.startAppWidgetConfigureActivityForResult(
@@ -248,7 +240,7 @@ fun WatchFaceSelector(
if (BuildConfig.DEBUG) {
DropdownMenuItem(
leadingIcon = {
Icon(Icons.Rounded.RestartAlt, null)
Icon(painterResource(R.drawable.restart_alt_24px), null)
},
text = { Text("Reset") },
onClick = {
@@ -307,7 +299,7 @@ fun WatchFaceSelector(
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
.size(ButtonDefaults.IconSize),
imageVector = Icons.Rounded.Widgets,
painter = painterResource(R.drawable.widgets_20px),
contentDescription = null,
)
Text(stringResource(R.string.widget_pick_widget))
@@ -352,7 +344,7 @@ fun WatchFaceSelector(
)
}
}) {
Icon(Icons.Rounded.ChevronLeft, null)
Icon(painterResource(R.drawable.chevron_backward_24px), null)
}
var showStyleDropdown by remember { mutableStateOf(false) }
TextButton(
@@ -378,7 +370,7 @@ fun WatchFaceSelector(
textAlign = TextAlign.Center,
)
Icon(
Icons.Rounded.ArrowDropDown,
painterResource(R.drawable.arrow_drop_down_20px),
null,
modifier = Modifier
.padding(ButtonDefaults.IconSpacing)
@@ -417,7 +409,7 @@ fun WatchFaceSelector(
)
}
}) {
Icon(Icons.Rounded.ChevronRight, null)
Icon(painterResource(R.drawable.chevron_forward_24px), null)
}
}
}
@@ -599,7 +591,7 @@ private fun ResizeCustomWidget(
.offset(y = 64.dp),
onClick = onExit
) {
Icon(Icons.Rounded.Done, null)
Icon(painterResource(R.drawable.check_24px), null)
}
}
}

View File

@@ -9,8 +9,6 @@ import android.provider.AlarmClock
import android.text.format.DateUtils
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Alarm
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
@@ -18,9 +16,11 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.core.content.getSystemService
import de.mm20.launcher2.ktx.tryStartActivity
import de.mm20.launcher2.ui.R
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.channels.trySendBlocking
import kotlinx.coroutines.flow.*
@@ -89,7 +89,7 @@ class AlarmPartProvider : PartProvider {
)
) {
Icon(
imageVector = Icons.Rounded.Alarm,
painterResource(R.drawable.alarm_24px),
contentDescription = null
)
Text(
@@ -113,7 +113,7 @@ class AlarmPartProvider : PartProvider {
) {
Icon(
modifier = Modifier.padding(end = 8.dp).size(32.dp),
imageVector = Icons.Rounded.Alarm,
painter = painterResource(R.drawable.alarm_24px),
contentDescription = null
)
Text(

View File

@@ -10,9 +10,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.BatteryChargingFull
import androidx.compose.material.icons.rounded.BatteryFull
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -21,25 +18,11 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.content.getSystemService
import de.mm20.launcher2.icons.Battery0Bar
import de.mm20.launcher2.icons.Battery1Bar
import de.mm20.launcher2.icons.Battery2Bar
import de.mm20.launcher2.icons.Battery3Bar
import de.mm20.launcher2.icons.Battery4Bar
import de.mm20.launcher2.icons.Battery5Bar
import de.mm20.launcher2.icons.Battery6Bar
import de.mm20.launcher2.icons.BatteryCharging0Bar
import de.mm20.launcher2.icons.BatteryCharging1Bar
import de.mm20.launcher2.icons.BatteryCharging2Bar
import de.mm20.launcher2.icons.BatteryCharging3Bar
import de.mm20.launcher2.icons.BatteryCharging4Bar
import de.mm20.launcher2.icons.BatteryCharging5Bar
import de.mm20.launcher2.icons.BatteryCharging6Bar
import de.mm20.launcher2.ui.R
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.channels.trySendBlocking
@@ -77,7 +60,7 @@ class BatteryPartProvider : PartProvider {
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = getBatteryIcon(it),
painter = painterResource(getBatteryIcon(it)),
contentDescription = null
)
Text(
@@ -104,7 +87,7 @@ class BatteryPartProvider : PartProvider {
) {
Icon(
modifier = Modifier.padding(end = 12.dp).size(36.dp),
imageVector = getBatteryIcon(it),
painter = painterResource(getBatteryIcon(it)),
contentDescription = null
)
Column {
@@ -127,28 +110,25 @@ class BatteryPartProvider : PartProvider {
}
}
private fun getBatteryIcon(batteryInfo: BatteryInfo): ImageVector {
private fun getBatteryIcon(batteryInfo: BatteryInfo): Int {
return if (batteryInfo.charging) {
when (batteryInfo.level) {
in 0..12 -> Icons.Rounded.BatteryCharging0Bar
in 13..25 -> Icons.Rounded.BatteryCharging1Bar
in 26..37 -> Icons.Rounded.BatteryCharging2Bar
in 38..50 -> Icons.Rounded.BatteryCharging3Bar
in 51..63 -> Icons.Rounded.BatteryCharging4Bar
in 64..75 -> Icons.Rounded.BatteryCharging5Bar
in 76..88 -> Icons.Rounded.BatteryCharging6Bar
else -> Icons.Rounded.BatteryChargingFull
in 0..25 -> R.drawable.battery_charging_20_24px
in 26..55 -> R.drawable.battery_charging_30_24px
in 56..85 -> R.drawable.battery_charging_80_24px
in 86..95 -> R.drawable.battery_charging_90_24px
else -> R.drawable.battery_charging_full_24px
}
} else {
when (batteryInfo.level) {
in 0..12 -> Icons.Rounded.Battery0Bar
in 13..25 -> Icons.Rounded.Battery1Bar
in 26..37 -> Icons.Rounded.Battery2Bar
in 38..50 -> Icons.Rounded.Battery3Bar
in 51..63 -> Icons.Rounded.Battery4Bar
in 64..75 -> Icons.Rounded.Battery5Bar
in 76..88 -> Icons.Rounded.Battery6Bar
else -> Icons.Rounded.BatteryFull
in 0..12 -> R.drawable.battery_0_bar_24px
in 13..25 -> R.drawable.battery_1_bar_24px
in 26..37 -> R.drawable.battery_2_bar_24px
in 38..50 -> R.drawable.battery_3_bar_24px
in 51..63 -> R.drawable.battery_4_bar_24px
in 64..75 -> R.drawable.battery_5_bar_24px
in 76..88 -> R.drawable.battery_6_bar_24px
else -> R.drawable.battery_full_24px
}
}
}

View File

@@ -2,16 +2,18 @@ package de.mm20.launcher2.ui.launcher.widgets.clock.parts
import android.app.PendingIntent
import android.content.Context
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.graphics.res.animatedVectorResource
import androidx.compose.animation.graphics.res.rememberAnimatedVectorPainter
import androidx.compose.animation.graphics.vector.AnimatedImageVector
import androidx.compose.animation.togetherWith
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.SkipNext
import androidx.compose.material.icons.rounded.SkipPrevious
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -21,7 +23,9 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
@@ -58,8 +62,6 @@ class MusicPartProvider : PartProvider, KoinComponent {
val state by musicService.playbackState.collectAsState(PlaybackState.Stopped)
val supportedActions by musicService.supportedActions.collectAsState(SupportedActions())
val playIcon = AnimatedImageVector.animatedVectorResource(R.drawable.anim_ic_play_pause)
if (compactLayout) {
Row(
verticalAlignment = Alignment.CenterVertically
@@ -101,20 +103,35 @@ class MusicPartProvider : PartProvider, KoinComponent {
}
}
IconButton(onClick = { musicService.togglePause() }) {
Icon(
painter = rememberAnimatedVectorPainter(
animatedImageVector = playIcon,
atEnd = state == PlaybackState.Playing
), contentDescription = stringResource(
if (state == PlaybackState.Playing) R.string.music_widget_pause
else R.string.music_widget_play
AnimatedContent(
state == PlaybackState.Playing,
transitionSpec = {
fadeIn().togetherWith(fadeOut())
},
modifier = Modifier.rotate(
animateFloatAsState(
if (state == PlaybackState.Playing) 90f else 0f
).value
)
)
) {
if (it) {
Icon(
painterResource(R.drawable.pause_24px),
stringResource(R.string.music_widget_pause),
modifier = Modifier.rotate(-90f)
)
} else {
Icon(
painterResource(R.drawable.play_arrow_24px),
stringResource(R.string.music_widget_play),
)
}
}
}
if (supportedActions.skipToNext) {
IconButton(onClick = { musicService.next() }) {
Icon(
imageVector = Icons.Rounded.SkipNext,
painterResource(R.drawable.skip_next_24px),
contentDescription = stringResource(R.string.music_widget_next_track)
)
}
@@ -164,26 +181,41 @@ class MusicPartProvider : PartProvider, KoinComponent {
if (supportedActions.skipToPrevious) {
IconButton(onClick = { musicService.previous() }) {
Icon(
imageVector = Icons.Rounded.SkipPrevious,
painterResource(R.drawable.skip_previous_24px),
contentDescription = stringResource(R.string.music_widget_previous_track)
)
}
}
IconButton(onClick = { musicService.togglePause() }) {
Icon(
painter = rememberAnimatedVectorPainter(
animatedImageVector = playIcon,
atEnd = state == PlaybackState.Playing
), contentDescription = stringResource(
if (state == PlaybackState.Playing) R.string.music_widget_pause
else R.string.music_widget_play
AnimatedContent(
state == PlaybackState.Playing,
transitionSpec = {
fadeIn().togetherWith(fadeOut())
},
modifier = Modifier.rotate(
animateFloatAsState(
if (state == PlaybackState.Playing) 90f else 0f
).value
)
)
) {
if (it) {
Icon(
painterResource(R.drawable.pause_24px),
stringResource(R.string.music_widget_pause),
modifier = Modifier.rotate(-90f)
)
} else {
Icon(
painterResource(R.drawable.play_arrow_24px),
stringResource(R.string.music_widget_play),
)
}
}
}
if (supportedActions.skipToPrevious) {
IconButton(onClick = { musicService.next() }) {
Icon(
imageVector = Icons.Rounded.SkipNext,
painterResource(R.drawable.skip_next_24px),
contentDescription = stringResource(R.string.music_widget_next_track)
)
}

View File

@@ -6,10 +6,7 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredWidth
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Warning
import androidx.compose.material3.Button
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Text
@@ -61,7 +58,7 @@ fun AppWidget(
Banner(
modifier = Modifier.padding(16.dp),
text = stringResource(R.string.app_widget_loading_failed),
icon = Icons.Rounded.Warning,
icon = R.drawable.warning_24px,
secondaryAction = {
OutlinedButton(onClick = onWidgetRemove) {
Text(stringResource(R.string.widget_action_remove))

View File

@@ -1,16 +1,8 @@
package de.mm20.launcher2.ui.launcher.widgets.favorites
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.Crossfade
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.togetherWith
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.Tag
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
@@ -52,7 +44,7 @@ fun FavoritesWidget(widget: FavoritesWidget) {
text = stringResource(
if (selectedTag == null) R.string.favorites_empty else R.string.favorites_empty_tag
),
icon = if (selectedTag == null) Icons.Rounded.Star else Icons.Rounded.Tag,
icon = if (selectedTag == null) R.drawable.star_24px else R.drawable.tag_24px,
)
}
if (pinnedTags.isNotEmpty() || favoritesEditButton) {

View File

@@ -6,6 +6,7 @@ import android.media.session.PlaybackState.CustomAction
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.AnimatedContent
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
@@ -35,12 +36,6 @@ import androidx.compose.foundation.layout.requiredHeightIn
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Audiotrack
import androidx.compose.material.icons.rounded.MoreVert
import androidx.compose.material.icons.rounded.MusicNote
import androidx.compose.material.icons.rounded.SkipNext
import androidx.compose.material.icons.rounded.SkipPrevious
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.FilledTonalIconButton
@@ -60,12 +55,14 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.rotate
import androidx.compose.ui.graphics.StrokeCap
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.layout.boundsInWindow
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
@@ -309,7 +306,7 @@ fun MusicWidget(widget: MusicWidget) {
}
} else {
Icon(
imageVector = Icons.Rounded.MusicNote,
painterResource(R.drawable.music_note_48px),
contentDescription = null,
tint = MaterialTheme.colorScheme.onSecondaryContainer,
modifier = Modifier.size(48.dp)
@@ -336,7 +333,7 @@ fun MusicWidget(widget: MusicWidget) {
viewModel.skipPrevious()
}) {
Icon(
imageVector = Icons.Rounded.SkipPrevious,
painter = painterResource(R.drawable.skip_previous_24px),
stringResource(R.string.music_widget_previous_track)
)
}
@@ -356,16 +353,30 @@ fun MusicWidget(widget: MusicWidget) {
),
onClick = { viewModel.togglePause() },
) {
Icon(
painter = rememberAnimatedVectorPainter(
playPauseIcon,
atEnd = playbackState == PlaybackState.Playing
),
contentDescription = stringResource(
if (playbackState == PlaybackState.Playing) R.string.music_widget_pause
else R.string.music_widget_play
AnimatedContent(
playbackState == PlaybackState.Playing,
transitionSpec = {
fadeIn().togetherWith(fadeOut())
},
modifier = Modifier.rotate(
animateFloatAsState(
if (playbackState == PlaybackState.Playing) 90f else 0f
).value
)
)
) {
if (it) {
Icon(
painterResource(R.drawable.pause_24px),
stringResource(R.string.music_widget_pause),
modifier = Modifier.rotate(-90f)
)
} else {
Icon(
painterResource(R.drawable.play_arrow_24px),
stringResource(R.string.music_widget_play),
)
}
}
}
}
if (supportedActions.skipToNext) {
@@ -376,7 +387,7 @@ fun MusicWidget(widget: MusicWidget) {
viewModel.skipNext()
}) {
Icon(
imageVector = Icons.Rounded.SkipNext,
painter = painterResource(R.drawable.skip_next_24px),
stringResource(R.string.music_widget_next_track)
)
}
@@ -423,7 +434,10 @@ fun CustomActions(
tooltipText = stringResource(R.string.action_more_actions)
) {
IconButton(onClick = { showOverflowMenu = true }) {
Icon(imageVector = Icons.Rounded.MoreVert, contentDescription = null)
Icon(
painterResource(R.drawable.more_vert_24px),
contentDescription = null
)
}
}
DropdownMenu(
@@ -452,7 +466,7 @@ fun CustomActions(
}
} else if (slots == actions.customActions.size) {
val action = actions.customActions.last()
Tooltip (
Tooltip(
tooltipText = action.name.toString()
) {
IconButton(
@@ -516,7 +530,7 @@ fun NoData() {
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = Icons.Rounded.Audiotrack,
painter = painterResource(R.drawable.music_note_24px),
contentDescription = "",
modifier = Modifier
.padding(24.dp)

View File

@@ -21,20 +21,6 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Add
import androidx.compose.material.icons.rounded.CheckCircle
import androidx.compose.material.icons.rounded.CheckCircleOutline
import androidx.compose.material.icons.rounded.Delete
import androidx.compose.material.icons.rounded.ErrorOutline
import androidx.compose.material.icons.rounded.ExpandLess
import androidx.compose.material.icons.rounded.ExpandMore
import androidx.compose.material.icons.rounded.Link
import androidx.compose.material.icons.rounded.LinkOff
import androidx.compose.material.icons.rounded.MoreVert
import androidx.compose.material.icons.rounded.RadioButtonUnchecked
import androidx.compose.material.icons.rounded.SaveAlt
import androidx.compose.material.icons.rounded.Share
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DropdownMenu
@@ -60,6 +46,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
@@ -128,7 +115,7 @@ fun NotesWidget(
Banner(
modifier = Modifier.padding(16.dp),
text = stringResource(R.string.note_widget_conflict),
icon = Icons.Rounded.ErrorOutline,
icon = R.drawable.error_24px,
primaryAction = {
Button(onClick = { showConflictResolveSheet = true }) {
Text(stringResource(R.string.note_widget_conflict_action_resolve))
@@ -193,8 +180,10 @@ fun NotesWidget(
},
) {
Icon(
if (widget.config.linkedFile == null) Icons.Rounded.Link
else Icons.Rounded.LinkOff,
painterResource(
if (widget.config.linkedFile == null) R.drawable.link_24px
else R.drawable.link_off_24px,
),
stringResource(
if (widget.config.linkedFile == null) R.string.note_widget_link_file
else R.string.note_widget_action_unlink_file
@@ -211,7 +200,7 @@ fun NotesWidget(
viewModel.dismissNote()
},
) {
Icon(Icons.Rounded.Delete, null)
Icon(painterResource(R.drawable.delete_24px), null)
}
}
}
@@ -238,7 +227,7 @@ fun NotesWidget(
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
.size(ButtonDefaults.IconSize),
imageVector = Icons.Rounded.ErrorOutline,
painter = painterResource(R.drawable.error_20px),
contentDescription = null,
)
Text(stringResource(R.string.note_widget_file_write_error))
@@ -254,7 +243,7 @@ fun NotesWidget(
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
.size(ButtonDefaults.IconSize),
imageVector = Icons.Rounded.ErrorOutline,
painter = painterResource(R.drawable.error_20px),
contentDescription = null,
)
Text(stringResource(R.string.note_widget_file_read_error))
@@ -266,14 +255,14 @@ fun NotesWidget(
tooltipText = stringResource(R.string.action_more_actions)
) {
IconButton(onClick = { showMenu = true }) {
Icon(Icons.Rounded.MoreVert, stringResource(R.string.action_more_actions))
Icon(painterResource(R.drawable.more_vert_24px), stringResource(R.string.action_more_actions))
}
}
DropdownMenu(expanded = showMenu, onDismissRequest = { showMenu = false }) {
DropdownMenuItem(
text = { Text(stringResource(R.string.notes_widget_action_new)) },
leadingIcon = {
Icon(Icons.Rounded.Add, null)
Icon(painterResource(R.drawable.add_24px), null)
},
onClick = {
val newWidget = NotesWidget(
@@ -286,7 +275,7 @@ fun NotesWidget(
DropdownMenuItem(
text = { Text(stringResource(R.string.menu_share)) },
leadingIcon = {
Icon(Icons.Rounded.Share, null)
Icon(painterResource(R.drawable.share_24px), null)
},
onClick = {
Intent(Intent.ACTION_SEND).apply {
@@ -300,7 +289,7 @@ fun NotesWidget(
DropdownMenuItem(
text = { Text(stringResource(R.string.notes_widget_action_save)) },
leadingIcon = {
Icon(Icons.Rounded.SaveAlt, null)
Icon(painterResource(R.drawable.file_save_24px), null)
},
onClick = {
val fileName = getDefaultNoteFileName(context)
@@ -312,7 +301,7 @@ fun NotesWidget(
DropdownMenuItem(
text = { Text(stringResource(R.string.note_widget_link_file)) },
leadingIcon = {
Icon(Icons.Rounded.Link, null)
Icon(painterResource(R.drawable.link_24px), null)
},
onClick = {
linkFileLauncher.launch(getDefaultNoteFileName(context))
@@ -323,7 +312,7 @@ fun NotesWidget(
DropdownMenuItem(
text = { Text(stringResource(R.string.note_widget_action_unlink_file)) },
leadingIcon = {
Icon(Icons.Rounded.LinkOff, null)
Icon(painterResource(R.drawable.link_off_24px), null)
},
onClick = {
viewModel.unlinkFile(context)
@@ -334,7 +323,7 @@ fun NotesWidget(
DropdownMenuItem(
text = { Text(stringResource(R.string.notes_widget_action_dismiss)) },
leadingIcon = {
Icon(Icons.Rounded.Delete, null)
Icon(painterResource(R.drawable.delete_24px), null)
},
onClick = {
val wasLast = isLastWidget != false
@@ -446,7 +435,7 @@ fun NoteWidgetConflictResolveSheet(
),
) {
Icon(
Icons.Rounded.LinkOff,
painterResource(R.drawable.link_off_24px),
null,
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
@@ -460,7 +449,7 @@ fun NoteWidgetConflictResolveSheet(
modifier = Modifier.fillMaxWidth()
) {
Icon(
Icons.Rounded.CheckCircleOutline,
painterResource(R.drawable.check_circle_20px),
null,
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
@@ -515,10 +504,7 @@ fun SelectableNoteContent(
onClick = onSelect
) {
Icon(
if (selected)
Icons.Rounded.CheckCircle
else
Icons.Rounded.RadioButtonUnchecked,
painterResource(if (selected) R.drawable.check_circle_24px_filled else R.drawable.circle_24px),
tint = if (selected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant,
contentDescription = null
)
@@ -528,10 +514,7 @@ fun SelectableNoteContent(
onClick = { expanded = !expanded }
) {
Icon(
if (expanded)
Icons.Rounded.ExpandLess
else
Icons.Rounded.ExpandMore,
painterResource(if (expanded) R.drawable.keyboard_arrow_up_24px else R.drawable.keyboard_arrow_down_24px),
contentDescription = null
)
}
@@ -572,7 +555,7 @@ fun NoteReadWriteErrorSheet(
.padding(horizontal = 24.dp, vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(Icons.Rounded.Link, null)
Icon(painterResource(R.drawable.link_24px), null)
Text(
stringResource(R.string.note_widget_action_relink_file),
modifier = Modifier.padding(start = 16.dp),
@@ -589,7 +572,7 @@ fun NoteReadWriteErrorSheet(
.padding(horizontal = 24.dp, vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(Icons.Rounded.LinkOff, null)
Icon(painterResource(R.drawable.link_off_24px), null)
Text(
stringResource(R.string.note_widget_action_unlink_file),
modifier = Modifier.padding(start = 16.dp),

View File

@@ -33,14 +33,6 @@ import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.CornerSize
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.OpenInNew
import androidx.compose.material.icons.rounded.Air
import androidx.compose.material.icons.rounded.ErrorOutline
import androidx.compose.material.icons.rounded.LightMode
import androidx.compose.material.icons.rounded.LocationCity
import androidx.compose.material.icons.rounded.MyLocation
import androidx.compose.material.icons.rounded.North
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Icon
@@ -64,6 +56,7 @@ import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.layout.onPlaced
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
@@ -76,8 +69,6 @@ import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.repeatOnLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.icons.HumidityPercentage
import de.mm20.launcher2.icons.Rain
import de.mm20.launcher2.ktx.tryStartActivity
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.common.WeatherLocationSearchDialog
@@ -129,7 +120,7 @@ fun WeatherWidget(widget: WeatherWidget) {
.fillMaxWidth()
.padding(16.dp),
text = stringResource(R.string.weather_widget_no_provider),
icon = Icons.Rounded.ErrorOutline,
icon = R.drawable.error_24px,
primaryAction = {
Button(
onClick = {
@@ -138,7 +129,7 @@ fun WeatherWidget(widget: WeatherWidget) {
contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
) {
Icon(
Icons.AutoMirrored.Rounded.OpenInNew,
painterResource(R.drawable.open_in_new_24px),
null,
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
@@ -271,20 +262,12 @@ fun CurrentWeather(forecast: Forecast, imperialUnits: Boolean) {
verticalAlignment = Alignment.Top,
horizontalArrangement = Arrangement.SpaceBetween,
) {
val latLonRegexp =
remember { Regex("^\\d{1,2}°\\d{1,2}'[NS] \\d{1,3}°\\d{1,2}'[EW]\$") }
val isLatLon = latLonRegexp.matches(forecast.location)
Row(
modifier = Modifier
.weight(1f)
.padding(top = 16.dp, start = 16.dp, end = 16.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
imageVector = if (isLatLon) Icons.Rounded.MyLocation else Icons.Rounded.LocationCity,
contentDescription = null
)
Spacer(modifier = Modifier.padding(4.dp))
Text(
text = forecast.location,
style = MaterialTheme.typography.titleMedium
@@ -363,7 +346,7 @@ fun CurrentWeather(forecast: Forecast, imperialUnits: Boolean) {
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = Icons.Rounded.HumidityPercentage,
painter = painterResource(R.drawable.humidity_percentage_20px),
modifier = Modifier.size(20.dp),
tint = MaterialTheme.colorScheme.secondary,
contentDescription = null
@@ -388,7 +371,7 @@ fun CurrentWeather(forecast: Forecast, imperialUnits: Boolean) {
// windDirection is "fromDirection"; Wind (arrow) blows into opposite direction
val angle by animateFloatAsState(forecast.windDirection!!.toFloat() + 180f)
Icon(
imageVector = Icons.Rounded.North,
painter = painterResource(R.drawable.north_20px),
modifier = Modifier
.rotate(angle)
.size(20.dp),
@@ -397,7 +380,7 @@ fun CurrentWeather(forecast: Forecast, imperialUnits: Boolean) {
)
} else {
Icon(
imageVector = Icons.Rounded.Air,
painter = painterResource(R.drawable.air_20px),
contentDescription = null,
modifier = Modifier.size(20.dp),
tint = MaterialTheme.colorScheme.secondary,
@@ -423,7 +406,7 @@ fun CurrentWeather(forecast: Forecast, imperialUnits: Boolean) {
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = Icons.Rounded.Rain,
painter = painterResource(R.drawable.rainy_20px),
modifier = Modifier.size(20.dp),
contentDescription = null,
tint = MaterialTheme.colorScheme.secondary,
@@ -693,7 +676,7 @@ fun NoData() {
verticalAlignment = Alignment.CenterVertically
) {
Icon(
imageVector = Icons.Rounded.LightMode,
painter = painterResource(R.drawable.light_mode_24px),
contentDescription = "",
modifier = Modifier
.padding(24.dp)

View File

@@ -1,7 +1,6 @@
package de.mm20.launcher2.ui.settings
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
@@ -48,7 +47,6 @@ import de.mm20.launcher2.ui.settings.breezyweather.BreezyWeatherSettingsScreen
import de.mm20.launcher2.ui.settings.buildinfo.BuildInfoSettingsScreen
import de.mm20.launcher2.ui.settings.calendarsearch.CalendarProviderSettingsScreen
import de.mm20.launcher2.ui.settings.calendarsearch.CalendarSearchSettingsScreen
import de.mm20.launcher2.ui.settings.cards.CardsSettingsScreen
import de.mm20.launcher2.ui.settings.colorscheme.ColorSchemeSettingsScreen
import de.mm20.launcher2.ui.settings.colorscheme.ColorSchemesSettingsScreen
import de.mm20.launcher2.ui.settings.contacts.ContactsSettingsScreen
@@ -212,9 +210,6 @@ class SettingsActivity : BaseActivity() {
?: return@composable
TypographySettingsScreen(UUID.fromString(route.id))
}
composable("settings/appearance/cards") {
CardsSettingsScreen()
}
composable("settings/search") {
SearchSettingsScreen()
}

View File

@@ -2,10 +2,12 @@ package de.mm20.launcher2.ui.settings.about
import android.content.Intent
import android.net.Uri
import android.widget.Toast
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Info
import androidx.compose.runtime.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewmodel.compose.viewModel
@@ -14,9 +16,6 @@ import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.preferences.Preference
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
import de.mm20.launcher2.icons.Fdroid
import de.mm20.launcher2.icons.GitHub
import de.mm20.launcher2.icons.Telegram
import de.mm20.launcher2.ui.locals.LocalNavController
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@@ -62,7 +61,7 @@ fun AboutSettingsScreen() {
item {
PreferenceCategory(title = stringResource(id = R.string.preference_category_license)) {
Preference(
icon = Icons.Rounded.Info,
icon = R.drawable.info_24px,
title = stringResource(id = R.string.preference_about_license),
summary = stringResource(id = R.string.preference_about_license_summary),
onClick = {
@@ -74,7 +73,7 @@ fun AboutSettingsScreen() {
item {
PreferenceCategory(title = stringResource(id = R.string.preference_category_links)) {
Preference(
icon = Icons.Rounded.GitHub,
icon = R.drawable.github,
title = "GitHub",
summary = "github.com/MM2-0/Kvaesitso",
onClick = {
@@ -84,7 +83,7 @@ fun AboutSettingsScreen() {
}
)
Preference(
icon = Icons.Rounded.Telegram,
icon = R.drawable.telegram,
title = stringResource(id = R.string.preference_about_telegram),
summary = "t.me/Kvaesitso",
onClick = {
@@ -94,7 +93,7 @@ fun AboutSettingsScreen() {
}
)
Preference(
icon = Icons.Rounded.Fdroid,
icon = R.drawable.fdroid,
title = stringResource(id = R.string.preference_about_fdroid),
summary = "fdroid.mm20.de",
onClick = {

View File

@@ -2,35 +2,22 @@ package de.mm20.launcher2.ui.settings.appearance
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowCircleDown
import androidx.compose.material.icons.rounded.ArrowCircleUp
import androidx.compose.material.icons.rounded.CropSquare
import androidx.compose.material.icons.rounded.Opacity
import androidx.compose.material.icons.rounded.Palette
import androidx.compose.material.icons.rounded.TextFields
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.ktx.isAtLeastApiLevel
import de.mm20.launcher2.preferences.ColorScheme
import de.mm20.launcher2.preferences.Font
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.preferences.ListPreference
import de.mm20.launcher2.ui.component.preferences.Preference
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
import de.mm20.launcher2.ui.component.preferences.value
import de.mm20.launcher2.ui.locals.LocalNavController
import de.mm20.launcher2.ui.settings.transparencies.TransparencySchemesSettingsRoute
import de.mm20.launcher2.ui.settings.typography.TypographiesSettingsRoute
import de.mm20.launcher2.ui.theme.getTypography
@Composable
fun AppearanceSettingsScreen() {
@@ -76,7 +63,7 @@ fun AppearanceSettingsScreen() {
onClick = {
navController?.navigate("settings/appearance/colors")
},
icon = Icons.Rounded.Palette,
icon = R.drawable.palette_24px,
)
Preference(
title = stringResource(id = R.string.preference_screen_typography),
@@ -84,7 +71,7 @@ fun AppearanceSettingsScreen() {
onClick = {
navController?.navigate(TypographiesSettingsRoute)
},
icon = Icons.Rounded.TextFields,
icon = R.drawable.text_fields_24px,
)
Preference(
title = stringResource(id = R.string.preference_screen_shapes),
@@ -92,7 +79,7 @@ fun AppearanceSettingsScreen() {
onClick = {
navController?.navigate("settings/appearance/shapes")
},
icon = Icons.Rounded.CropSquare,
icon = R.drawable.crop_square_24px,
)
Preference(
title = stringResource(id = R.string.preference_screen_transparencies),
@@ -100,7 +87,7 @@ fun AppearanceSettingsScreen() {
onClick = {
navController?.navigate(TransparencySchemesSettingsRoute)
},
icon = Icons.Rounded.Opacity,
icon = R.drawable.opacity_24px,
)
}
}
@@ -109,14 +96,14 @@ fun AppearanceSettingsScreen() {
PreferenceCategory {
Preference(
title = stringResource(R.string.theme_import_title),
icon = Icons.Rounded.ArrowCircleDown,
icon = R.drawable.arrow_circle_down_24px,
onClick = {
importLauncher.launch(arrayOf("*/*"))
}
)
Preference(
title = stringResource(R.string.theme_export_title),
icon = Icons.Rounded.ArrowCircleUp,
icon = R.drawable.arrow_circle_up_24px,
onClick = {
navController?.navigate("settings/appearance/export")
}

View File

@@ -9,14 +9,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.CropSquare
import androidx.compose.material.icons.rounded.KeyboardArrowDown
import androidx.compose.material.icons.rounded.Opacity
import androidx.compose.material.icons.rounded.Palette
import androidx.compose.material.icons.rounded.Save
import androidx.compose.material.icons.rounded.Share
import androidx.compose.material.icons.rounded.TextFields
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
@@ -35,6 +27,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
@@ -61,9 +54,10 @@ fun ExportThemeSettingsScreen() {
}
}
val fileChooserLauncher = rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument("application/vnd.de.mm20.launcher2.theme")) {
if (it != null) viewModel.exportTheme(context, it)
}
val fileChooserLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument("application/vnd.de.mm20.launcher2.theme")) {
if (it != null) viewModel.exportTheme(context, it)
}
LaunchedEffect(Unit) {
viewModel.init()
@@ -95,7 +89,7 @@ fun ExportThemeSettingsScreen() {
PreferenceCategory {
ListPreference(
stringResource(R.string.preference_screen_colors),
icon = Icons.Rounded.Palette,
icon = R.drawable.palette_24px,
value = viewModel.colorScheme,
items = listOf(stringResource(R.string.no_selection) to null) + colorSchemes.map {
it.name to it
@@ -106,7 +100,7 @@ fun ExportThemeSettingsScreen() {
)
ListPreference(
stringResource(R.string.preference_screen_typography),
icon = Icons.Rounded.TextFields,
icon = R.drawable.text_fields_24px,
value = viewModel.typographyScheme,
items = listOf(stringResource(R.string.no_selection) to null) + typographyThemes.map {
it.name to it
@@ -117,7 +111,7 @@ fun ExportThemeSettingsScreen() {
)
ListPreference(
stringResource(R.string.preference_screen_shapes),
icon = Icons.Rounded.CropSquare,
icon = R.drawable.crop_square_24px,
value = viewModel.shapeScheme,
items = listOf(stringResource(R.string.no_selection) to null) + shapeThemes.map {
it.name to it
@@ -128,7 +122,7 @@ fun ExportThemeSettingsScreen() {
)
ListPreference(
stringResource(R.string.preference_screen_transparencies),
icon = Icons.Rounded.Opacity,
icon = R.drawable.opacity_24px,
value = viewModel.transparencyScheme,
items = listOf(stringResource(R.string.no_selection) to null) + transparencySchemes.map {
it.name to it
@@ -160,7 +154,7 @@ fun ExportThemeSettingsScreen() {
}
) {
Icon(
Icons.Rounded.Share,
painterResource(R.drawable.share_20px),
null,
modifier = Modifier
.padding(end = ButtonDefaults.IconSpacing)
@@ -179,7 +173,7 @@ fun ExportThemeSettingsScreen() {
label = "Trailing Icon Rotation"
)
Icon(
Icons.Rounded.KeyboardArrowDown,
painterResource(R.drawable.keyboard_arrow_down_24px),
modifier =
Modifier
.size(SplitButtonDefaults.TrailingIconSize)
@@ -189,14 +183,21 @@ fun ExportThemeSettingsScreen() {
contentDescription = null
)
DropdownMenu(expanded = showDropdown, onDismissRequest = { showDropdown = false }) {
DropdownMenu(
expanded = showDropdown,
onDismissRequest = { showDropdown = false }) {
DropdownMenuItem(
text = { Text(stringResource(R.string.save_as_file)) },
onClick = {
fileChooserLauncher.launch("${viewModel.themeName}.kvtheme")
showDropdown = false
},
leadingIcon = { Icon(Icons.Rounded.Save, contentDescription = null) }
leadingIcon = {
Icon(
painterResource(R.drawable.save_24px),
contentDescription = null
)
}
)
}
}

View File

@@ -11,18 +11,6 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ChangeCircle
import androidx.compose.material.icons.rounded.CropSquare
import androidx.compose.material.icons.rounded.DarkMode
import androidx.compose.material.icons.rounded.Edit
import androidx.compose.material.icons.rounded.ErrorOutline
import androidx.compose.material.icons.rounded.LightMode
import androidx.compose.material.icons.rounded.MoreVert
import androidx.compose.material.icons.rounded.Opacity
import androidx.compose.material.icons.rounded.Palette
import androidx.compose.material.icons.rounded.Star
import androidx.compose.material.icons.rounded.TextFields
import androidx.compose.material3.Button
import androidx.compose.material3.FilledTonalIconButton
import androidx.compose.material3.FilterChip
@@ -49,8 +37,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.innerShadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shadow
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@@ -103,7 +91,7 @@ fun ImportThemeSettingsScreen(
PreferenceCategory {
Banner(
text = stringResource(R.string.import_theme_error),
icon = Icons.Rounded.ErrorOutline,
icon = R.drawable.error_24px,
modifier = Modifier
.background(MaterialTheme.colorScheme.surface)
.padding(16.dp),
@@ -126,9 +114,12 @@ fun ImportThemeSettingsScreen(
if (darkModePreview) darkColorSchemeOf(it) else lightColorSchemeOf(it)
} ?: MaterialTheme.colorScheme,
shapes = themeBundle.shapes?.let { shapesOf(it) } ?: MaterialTheme.shapes,
typography = themeBundle.typography?.let { typographyOf(it) } ?: MaterialTheme.typography,
typography = themeBundle.typography?.let { typographyOf(it) }
?: MaterialTheme.typography,
) {
val transparencies = themeBundle.transparencies?.let { transparencySchemeOf(it) } ?: MaterialTheme.transparency
val transparencies =
themeBundle.transparencies?.let { transparencySchemeOf(it) }
?: MaterialTheme.transparency
CompositionLocalProvider(
LocalTransparencyScheme provides transparencies
) {
@@ -143,13 +134,13 @@ fun ImportThemeSettingsScreen(
PreferenceCategory(stringResource(R.string.import_theme_contents)) {
if (themeBundle.colors != null) {
Preference(
icon = Icons.Rounded.Palette,
icon = R.drawable.palette_24px,
title = stringResource(R.string.preference_screen_colors),
summary = themeBundle.colors?.name,
controls = if (viewModel.colorsExists) {
{
Icon(
Icons.Rounded.ChangeCircle,
painterResource(R.drawable.change_circle_24px),
stringResource(R.string.import_theme_exists)
)
}
@@ -158,13 +149,13 @@ fun ImportThemeSettingsScreen(
}
if (themeBundle.typography != null) {
Preference(
icon = Icons.Rounded.TextFields,
icon = R.drawable.text_fields_24px,
title = stringResource(R.string.preference_screen_typography),
summary = themeBundle.typography?.name,
controls = if (viewModel.typographyExists) {
{
Icon(
Icons.Rounded.ChangeCircle,
painterResource(R.drawable.change_circle_24px),
stringResource(R.string.import_theme_exists)
)
}
@@ -173,13 +164,13 @@ fun ImportThemeSettingsScreen(
}
if (themeBundle.shapes != null) {
Preference(
icon = Icons.Rounded.CropSquare,
icon = R.drawable.crop_square_24px,
title = stringResource(R.string.preference_screen_shapes),
summary = themeBundle.shapes?.name,
controls = if (viewModel.shapesExists) {
{
Icon(
Icons.Rounded.ChangeCircle,
painterResource(R.drawable.change_circle_24px),
stringResource(R.string.import_theme_exists)
)
}
@@ -187,20 +178,20 @@ fun ImportThemeSettingsScreen(
)
}
if (themeBundle.transparencies != null) {
Preference(
icon = Icons.Rounded.Opacity,
title = stringResource(R.string.preference_screen_transparencies),
summary = themeBundle.transparencies?.name,
controls = if (viewModel.transparenciesExists) {
{
Icon(
Icons.Rounded.ChangeCircle,
stringResource(R.string.import_theme_exists)
)
}
} else null,
)
}
Preference(
icon = R.drawable.opacity_24px,
title = stringResource(R.string.preference_screen_transparencies),
summary = themeBundle.transparencies?.name,
controls = if (viewModel.transparenciesExists) {
{
Icon(
painterResource(R.drawable.change_circle_24px),
stringResource(R.string.import_theme_exists)
)
}
} else null,
)
}
if (viewModel.colorsExists || viewModel.shapesExists) {
Banner(
modifier = Modifier
@@ -209,7 +200,7 @@ fun ImportThemeSettingsScreen(
MaterialTheme.shapes.extraSmall
)
.padding(16.dp),
icon = Icons.Rounded.ChangeCircle,
icon = R.drawable.change_circle_24px,
text = stringResource(R.string.import_theme_exists)
)
}
@@ -284,7 +275,7 @@ private fun ThemePreview(
readOnly = true,
menu = {
IconButton(onClick = {}) {
Icon(Icons.Rounded.MoreVert, null)
Icon(painterResource(R.drawable.more_vert_24px), null)
}
}
)
@@ -341,7 +332,7 @@ private fun ThemePreview(
label = { Text(previewTexts.Short1) },
leadingIcon = {
Icon(
Icons.Rounded.Star, null,
painterResource(R.drawable.star_20px), null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
},
@@ -352,7 +343,7 @@ private fun ThemePreview(
label = { Text(previewTexts.Short2) },
leadingIcon = {
Icon(
Icons.Rounded.Star, null,
painterResource(R.drawable.star_20px), null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
},
@@ -360,7 +351,7 @@ private fun ThemePreview(
)
Spacer(modifier = Modifier.weight(1f))
FilledTonalIconButton(onClick = {}) {
Icon(Icons.Rounded.Edit, null)
Icon(painterResource(R.drawable.edit_24px), null)
}
}
HorizontalDivider(
@@ -386,14 +377,14 @@ private fun ThemePreview(
selected = !darkMode,
onClick = { onDarkModeChanged(false) }
) {
Icon(Icons.Rounded.LightMode, null)
Icon(painterResource(R.drawable.light_mode_24px), null)
}
SegmentedButton(
shape = SegmentedButtonDefaults.itemShape(index = 1, count = 2),
selected = darkMode,
onClick = { onDarkModeChanged(true) }
) {
Icon(Icons.Rounded.DarkMode, null)
Icon(painterResource(R.drawable.dark_mode_24px), null)
}
}
}

View File

@@ -6,8 +6,6 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.aspectRatio
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.CheckCircleOutline
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
@@ -65,7 +63,7 @@ fun CreateBackupSheet(
else {
LargeMessage(
modifier = Modifier.aspectRatio(1f),
icon = Icons.Rounded.CheckCircleOutline,
icon = R.drawable.check_circle_48px,
text = stringResource(
id = R.string.backup_complete
)

View File

@@ -4,9 +4,6 @@ import androidx.activity.compose.LocalActivity
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.OpenInNew
import androidx.compose.material.icons.rounded.Info
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
@@ -42,7 +39,7 @@ fun BreezyWeatherSettingsScreen() {
R.string.preference_breezyweather_integration_description,
stringResource(R.string.app_name),
),
icon = Icons.Rounded.Info,
icon = R.drawable.info_24px,
modifier = Modifier.background(MaterialTheme.colorScheme.surface).padding(16.dp),
primaryAction = {
Button(onClick = {
@@ -63,7 +60,7 @@ fun BreezyWeatherSettingsScreen() {
R.string.preference_breezyweather_integration_instructions,
stringResource(R.string.app_name),
),
icon = Icons.Rounded.Info,
icon = R.drawable.info_24px,
modifier = Modifier.background(MaterialTheme.colorScheme.surface).padding(16.dp),
)
Preference(
@@ -79,7 +76,7 @@ fun BreezyWeatherSettingsScreen() {
)
Preference(
title = stringResource(R.string.preference_launch_breezyweather_app),
icon = Icons.AutoMirrored.Rounded.OpenInNew,
icon = R.drawable.open_in_new_24px,
onClick = {
viewModel.launchBreezyApp(activity)
}

View File

@@ -2,17 +2,11 @@ package de.mm20.launcher2.ui.settings.calendarsearch
import android.app.PendingIntent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ErrorOutline
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
@@ -20,7 +14,6 @@ import de.mm20.launcher2.crashreporter.CrashReporter
import de.mm20.launcher2.ktx.sendWithBackgroundPermission
import de.mm20.launcher2.plugin.PluginState
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.MissingPermissionBanner
import de.mm20.launcher2.ui.component.preferences.GuardedPreference
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
@@ -102,7 +95,7 @@ fun CalendarSearchSettingsScreen() {
},
description = (state as? PluginState.SetupRequired)?.message
?: stringResource(id = R.string.plugin_state_setup_required),
icon = Icons.Rounded.ErrorOutline,
icon = R.drawable.error_24px,
unlockLabel = stringResource(id = R.string.plugin_action_setup),
) {
PreferenceWithSwitch(

View File

@@ -1,64 +0,0 @@
package de.mm20.launcher2.ui.settings.cards
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.*
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.preferences.SurfaceShape
import de.mm20.launcher2.preferences.ui.CardStyle
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.LauncherCard
import de.mm20.launcher2.ui.component.preferences.ListPreference
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
import de.mm20.launcher2.ui.component.preferences.SliderPreference
@Composable
fun CardsSettingsScreen() {
val viewModel: CardsSettingsScreenVM = viewModel()
val cardStyle by viewModel.cardStyle.collectAsState(CardStyle())
PreferenceScreen(title = stringResource(R.string.preference_cards)) {
item {
Box(
modifier = Modifier
.fillMaxWidth()
.background(MaterialTheme.colorScheme.secondary)
) {
LauncherCard(
modifier = Modifier
.height(200.dp)
.fillMaxWidth()
.padding(16.dp)
)
}
}
item {
PreferenceCategory {
SliderPreference(
title = stringResource(R.string.preference_cards_stroke_width),
icon = Icons.Rounded.LineWeight,
value = cardStyle.borderWidth,
min = 0,
max = 8,
step = 1,
onValueChanged = {
viewModel.setBorderWidth(it)
}
)
}
}
}
}

View File

@@ -1,21 +0,0 @@
package de.mm20.launcher2.ui.settings.cards
import androidx.lifecycle.ViewModel
import de.mm20.launcher2.preferences.ui.UiSettings
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject
class CardsSettingsScreenVM : ViewModel(), KoinComponent {
private val uiSettings: UiSettings by inject()
val cardStyle = uiSettings.cardStyle
fun setOpacity(opacity: Float) {
uiSettings.setCardOpacity(opacity)
}
fun setBorderWidth(borderWidth: Int) {
uiSettings.setCardBorderWidth(borderWidth)
}
}

View File

@@ -9,9 +9,6 @@ import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.DarkMode
import androidx.compose.material.icons.rounded.LightMode
import androidx.compose.material3.ColorScheme
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@@ -23,7 +20,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.ui.R
@Composable
fun ColorSchemePreferenceCategory(
@@ -56,14 +55,14 @@ fun ColorSchemePreferenceCategory(
selected = !darkMode,
onClick = { onDarkModeChanged(false) }
) {
Icon(Icons.Rounded.LightMode, null)
Icon(painterResource(R.drawable.light_mode_24px), null)
}
SegmentedButton(
shape = SegmentedButtonDefaults.itemShape(index = 1, count = 2),
selected = darkMode,
onClick = { onDarkModeChanged(true) }
) {
Icon(Icons.Rounded.DarkMode, null)
Icon(painterResource(R.drawable.dark_mode_24px), null)
}
}
}

View File

@@ -10,14 +10,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Edit
import androidx.compose.material.icons.rounded.Lock
import androidx.compose.material.icons.rounded.OpenInNew
import androidx.compose.material.icons.rounded.PlayArrow
import androidx.compose.material.icons.rounded.Search
import androidx.compose.material.icons.rounded.StarBorder
import androidx.compose.material.icons.rounded.Tag
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
@@ -49,6 +41,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.core.content.ContextCompat
@@ -377,7 +370,7 @@ fun ColorSchemeSettingsScreen(themeId: UUID) {
.align(Alignment.CenterVertically),
onClick = { }
) {
Icon(Icons.Rounded.Edit, null)
Icon(painterResource(R.drawable.edit_24px), null)
}
ShapedLauncherIcon(
size = 48.dp,
@@ -512,7 +505,7 @@ fun ColorSchemeSettingsScreen(themeId: UUID) {
label = { Text("Tag") },
leadingIcon = {
Icon(
Icons.Rounded.Tag,
painterResource(R.drawable.tag_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)
@@ -526,7 +519,7 @@ fun ColorSchemeSettingsScreen(themeId: UUID) {
.align(Alignment.CenterVertically),
onClick = { },
) {
Icon(Icons.Rounded.PlayArrow, null)
Icon(painterResource(R.drawable.play_arrow_24px), null)
}
}
}
@@ -788,7 +781,7 @@ fun ColorSchemeSettingsScreen(themeId: UUID) {
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
) {
Icon(Icons.Rounded.Search, null, tint = MaterialTheme.colorScheme.onSurface)
Icon(painterResource(R.drawable.search_24px), null, tint = MaterialTheme.colorScheme.onSurface)
}
}
}
@@ -946,7 +939,7 @@ fun ColorSchemeSettingsScreen(themeId: UUID) {
.align(Alignment.CenterVertically)
.width(240.dp),
text = "Banner",
icon = Icons.Rounded.Lock
icon = R.drawable.lock_24px,
)
Switch(
modifier = Modifier
@@ -1078,12 +1071,12 @@ fun ColorSchemeSettingsScreen(themeId: UUID) {
}
IconButton(
onClick = { /*TODO*/ },
onClick = { },
modifier = Modifier
.padding(end = 16.dp)
.align(Alignment.CenterVertically),
) {
Icon(Icons.Rounded.StarBorder, null)
Icon(painterResource(R.drawable.star_24px), null)
}
Surface(
@@ -1100,7 +1093,7 @@ fun ColorSchemeSettingsScreen(themeId: UUID) {
) {
DropdownMenuItem(
leadingIcon = {
Icon(Icons.Rounded.OpenInNew, null)
Icon(painterResource(R.drawable.open_in_new_24px), null)
},
text = { Text("Menu") },
onClick = { })
@@ -1170,7 +1163,7 @@ fun ColorSchemeSettingsScreen(themeId: UUID) {
label = { Text("Tag") },
leadingIcon = {
Icon(
Icons.Rounded.Tag,
painterResource(R.drawable.tag_20px),
contentDescription = null,
modifier = Modifier.size(FilterChipDefaults.IconSize)
)

View File

@@ -10,14 +10,6 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Add
import androidx.compose.material.icons.rounded.ContentCopy
import androidx.compose.material.icons.rounded.Delete
import androidx.compose.material.icons.rounded.Edit
import androidx.compose.material.icons.rounded.MoreVert
import androidx.compose.material.icons.rounded.RadioButtonChecked
import androidx.compose.material.icons.rounded.RadioButtonUnchecked
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
@@ -35,6 +27,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -66,7 +59,7 @@ fun ColorSchemesSettingsScreen() {
title = stringResource(R.string.preference_screen_colors),
topBarActions = {
IconButton(onClick = { viewModel.createNew(context) }) {
Icon(Icons.Rounded.Add, null)
Icon(painterResource(R.drawable.add_24px), null)
}
},
) {
@@ -75,7 +68,7 @@ fun ColorSchemesSettingsScreen() {
for (theme in builtin) {
var showMenu by remember { mutableStateOf(false) }
Preference(
icon = if (theme.id == selectedTheme) Icons.Rounded.RadioButtonChecked else Icons.Rounded.RadioButtonUnchecked,
icon = if (theme.id == selectedTheme) R.drawable.radio_button_checked_24px else R.drawable.radio_button_unchecked_24px,
title = theme.name,
controls = {
Row(
@@ -85,7 +78,7 @@ fun ColorSchemesSettingsScreen() {
IconButton(
modifier = Modifier.padding(start = 12.dp),
onClick = { showMenu = true }) {
Icon(Icons.Rounded.MoreVert, null)
Icon(painterResource(R.drawable.more_vert_24px), null)
}
DropdownMenu(
expanded = showMenu,
@@ -93,7 +86,7 @@ fun ColorSchemesSettingsScreen() {
) {
DropdownMenuItem(
leadingIcon = {
Icon(Icons.Rounded.ContentCopy, null)
Icon(painterResource(R.drawable.content_copy_24px), null)
},
text = { Text(stringResource(R.string.duplicate)) },
onClick = {
@@ -118,7 +111,7 @@ fun ColorSchemesSettingsScreen() {
for (theme in user) {
var showMenu by remember { mutableStateOf(false) }
Preference(
icon = if (theme.id == selectedTheme) Icons.Rounded.RadioButtonChecked else Icons.Rounded.RadioButtonUnchecked,
icon = if (theme.id == selectedTheme) R.drawable.radio_button_checked_24px else R.drawable.radio_button_unchecked_24px,
title = theme.name,
controls = {
Row(
@@ -128,7 +121,7 @@ fun ColorSchemesSettingsScreen() {
IconButton(
modifier = Modifier.padding(start = 12.dp),
onClick = { showMenu = true }) {
Icon(Icons.Rounded.MoreVert, null)
Icon(painterResource(R.drawable.more_vert_24px), null)
}
DropdownMenu(
expanded = showMenu,
@@ -136,7 +129,7 @@ fun ColorSchemesSettingsScreen() {
) {
DropdownMenuItem(
leadingIcon = {
Icon(Icons.Rounded.Edit, null)
Icon(painterResource(R.drawable.edit_24px), null)
},
text = { Text(stringResource(R.string.edit)) },
onClick = {
@@ -146,7 +139,7 @@ fun ColorSchemesSettingsScreen() {
)
DropdownMenuItem(
leadingIcon = {
Icon(Icons.Rounded.ContentCopy, null)
Icon(painterResource(R.drawable.content_copy_24px), null)
},
text = { Text(stringResource(R.string.duplicate)) },
onClick = {
@@ -156,7 +149,7 @@ fun ColorSchemesSettingsScreen() {
)
DropdownMenuItem(
leadingIcon = {
Icon(Icons.Rounded.Delete, null)
Icon(painterResource(R.drawable.delete_24px), null)
},
text = { Text(stringResource(R.string.menu_delete)) },
onClick = {

View File

@@ -6,8 +6,6 @@ import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.CheckCircle
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
@@ -15,7 +13,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.locals.LocalDarkTheme
import hct.Hct
@@ -57,7 +57,7 @@ fun ColorSwatch(
) {
if (selected) {
Icon(
Icons.Rounded.CheckCircle,
painterResource(R.drawable.check_circle_24px),
null,
modifier = Modifier.size(32.dp),
tint = iconColor,

View File

@@ -12,9 +12,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.AutoFixHigh
import androidx.compose.material.icons.rounded.SettingsSuggest
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
@@ -31,6 +28,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
@@ -88,7 +86,7 @@ fun CorePaletteColorPreference(
.padding(it)
) {
SwitchPreference(
icon = Icons.Rounded.SettingsSuggest,
icon = R.drawable.rule_settings_24px,
title = stringResource(R.string.theme_color_scheme_system_default),
value = currentValue == null,
onValueChanged = {
@@ -141,7 +139,7 @@ fun CorePaletteColorPreference(
}
) {
Icon(
Icons.Rounded.AutoFixHigh, null,
painterResource(R.drawable.wand_stars_20px), null,
modifier = Modifier
.padding(ButtonDefaults.IconSpacing)
.size(ButtonDefaults.IconSize)

View File

@@ -16,10 +16,6 @@ import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Colorize
import androidx.compose.material.icons.rounded.Palette
import androidx.compose.material.icons.rounded.RestartAlt
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
@@ -44,6 +40,7 @@ import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.Fill
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.style.TextAlign
@@ -127,7 +124,7 @@ fun ThemeColorPreference(
active = actualValue is ColorRef,
) {
Icon(
Icons.Rounded.Palette,
painterResource(R.drawable.palette_20px),
null,
modifier = Modifier
.size(SegmentedButtonDefaults.IconSize)
@@ -148,7 +145,7 @@ fun ThemeColorPreference(
active = actualValue is StaticColor,
) {
Icon(
Icons.Rounded.Colorize,
painterResource(R.drawable.colorize_20px),
null,
modifier = Modifier
.size(SegmentedButtonDefaults.IconSize)
@@ -424,7 +421,8 @@ fun ThemeColorPreference(
onClick = { currentValue = null }
) {
Icon(
Icons.Rounded.RestartAlt, null,
painterResource(R.drawable.restart_alt_20px),
null,
modifier = Modifier
.padding(ButtonDefaults.IconSpacing)
.size(ButtonDefaults.IconSize)

View File

@@ -2,21 +2,11 @@ package de.mm20.launcher2.ui.settings.contacts
import android.app.PendingIntent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Call
import androidx.compose.material.icons.rounded.ErrorOutline
import androidx.compose.material.icons.rounded.Person
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
@@ -24,8 +14,6 @@ import de.mm20.launcher2.crashreporter.CrashReporter
import de.mm20.launcher2.ktx.sendWithBackgroundPermission
import de.mm20.launcher2.plugin.PluginState
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.Banner
import de.mm20.launcher2.ui.component.MissingPermissionBanner
import de.mm20.launcher2.ui.component.preferences.GuardedPreference
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
@@ -60,7 +48,7 @@ fun ContactsSettingsScreen() {
SwitchPreference(
title = stringResource(R.string.preference_search_contacts),
summary = stringResource(R.string.preference_search_contacts_summary),
icon = Icons.Rounded.Person,
icon = R.drawable.person_24px,
value = enabledProviders.contains("local"),
onValueChanged = {
viewModel.setProviderEnabled("local", it)
@@ -82,7 +70,7 @@ fun ContactsSettingsScreen() {
},
description = (state as? PluginState.SetupRequired)?.message
?: stringResource(id = R.string.plugin_state_setup_required),
icon = Icons.Rounded.ErrorOutline,
icon = R.drawable.error_24px,
unlockLabel = stringResource(id = R.string.plugin_action_setup),
) {
SwitchPreference(
@@ -112,7 +100,7 @@ fun ContactsSettingsScreen() {
SwitchPreference(
title = stringResource(R.string.preference_contacts_call_on_tap),
summary = stringResource(R.string.preference_contacts_call_on_tap_summary),
icon = Icons.Rounded.Call,
icon = R.drawable.call_24px,
value = callOnTap == true && hasCallPermission == true,
onValueChanged = {
viewModel.setCallOnTap(it)

View File

@@ -7,9 +7,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.BugReport
import androidx.compose.material.icons.rounded.Share
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -21,9 +18,11 @@ import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.crashreporter.CrashReportType
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
@Composable
@@ -39,11 +38,11 @@ fun CrashReportScreen(fileName: String) {
},
topBarActions = {
IconButton(onClick = { crashReport?.let { viewModel.shareCrashReport(context, it) } }) {
Icon(imageVector = Icons.Rounded.Share, contentDescription = null)
Icon(painterResource(R.drawable.share_24px), contentDescription = null)
}
if (crashReport?.type == CrashReportType.Crash) {
IconButton(onClick = { crashReport?.let { viewModel.createIssue(context, it) } }) {
Icon(imageVector = Icons.Rounded.BugReport, contentDescription = null)
Icon(painterResource(R.drawable.bug_report_24px), contentDescription = null)
}
}
}

View File

@@ -4,11 +4,6 @@ import android.text.format.DateUtils
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Error
import androidx.compose.material.icons.rounded.ErrorOutline
import androidx.compose.material.icons.rounded.Warning
import androidx.compose.material.icons.rounded.WarningAmber
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
@@ -17,6 +12,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@@ -49,7 +45,7 @@ fun CrashReporterScreen() {
viewModel.setShowExceptions(value)
}) {
Icon(
imageVector = if (showExceptions) Icons.Rounded.Warning else Icons.Rounded.WarningAmber,
painterResource(if (showExceptions) R.drawable.warning_24px_filled else R.drawable.warning_24px),
contentDescription = null,
modifier = Modifier.alpha(if (showExceptions) 1f else 0.5f)
)
@@ -58,7 +54,7 @@ fun CrashReporterScreen() {
viewModel.setShowCrashes(value)
}) {
Icon(
imageVector = if (showCrashes) Icons.Rounded.Error else Icons.Rounded.ErrorOutline,
painterResource(if (showCrashes) R.drawable.error_24px_filled else R.drawable.error_24px),
contentDescription = null,
modifier = Modifier.alpha(if (showCrashes) 1f else 0.5f)
)
@@ -95,7 +91,9 @@ fun CrashReporterScreen() {
) {
Icon(
modifier = Modifier.padding(end = 8.dp),
imageVector = if (it.type == CrashReportType.Exception) Icons.Rounded.Warning else Icons.Rounded.Error,
painter = painterResource(
if (it.type == CrashReportType.Exception) R.drawable.warning_24px else R.drawable.error_24px
),
contentDescription = null
)
Text(

View File

@@ -1,11 +1,5 @@
package de.mm20.launcher2.ui.settings.favorites
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Edit
import androidx.compose.material.icons.rounded.Insights
import androidx.compose.material.icons.rounded.Sort
import androidx.compose.material.icons.rounded.SwapVert
import androidx.compose.material.icons.rounded.TableRows
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
@@ -36,7 +30,7 @@ fun FavoritesSettingsScreen() {
Preference(
title = stringResource(R.string.menu_item_edit_favs),
summary = stringResource(R.string.preference_edit_favorites_summary),
icon = Icons.Rounded.Sort,
icon = R.drawable.sort_24px,
onClick = {
showEditSheet = true
}
@@ -53,7 +47,7 @@ fun FavoritesSettingsScreen() {
onValueChanged = {
viewModel.setFrequentlyUsed(it)
},
icon = Icons.Rounded.Insights
icon = R.drawable.show_chart_24px,
)
val frequentlyUsedRows by viewModel.frequentlyUsedRows.collectAsState()
SliderPreference(
@@ -65,12 +59,12 @@ fun FavoritesSettingsScreen() {
onValueChanged = {
viewModel.setFrequentlyUsedRows(it)
},
icon = Icons.Rounded.TableRows
icon = R.drawable.table_rows_24px,
)
val searchResultWeightFactor by viewModel.searchResultWeightFactor.collectAsState()
ListPreference(
title = stringResource(R.string.preference_search_result_ordering_weight_factor),
icon = Icons.Rounded.SwapVert,
icon = R.drawable.swap_vert_24px,
value = searchResultWeightFactor,
items = listOf(
stringResource(R.string.preference_search_result_ordering_weight_factor_low) to WeightFactor.Low,
@@ -92,7 +86,7 @@ fun FavoritesSettingsScreen() {
onValueChanged = {
viewModel.setEditButton(it)
},
icon = Icons.Rounded.Edit
icon = R.drawable.edit_24px,
)
SwitchPreference(
title = stringResource(R.string.preference_compact_tags),

View File

@@ -3,13 +3,7 @@ package de.mm20.launcher2.ui.settings.filesearch
import android.app.PendingIntent
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.AccountBox
import androidx.compose.material.icons.rounded.ErrorOutline
import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
@@ -18,7 +12,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.repeatOnLifecycle
@@ -29,7 +22,6 @@ import de.mm20.launcher2.ktx.isAtLeastApiLevel
import de.mm20.launcher2.ktx.sendWithBackgroundPermission
import de.mm20.launcher2.plugin.PluginState
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.Banner
import de.mm20.launcher2.ui.component.preferences.GuardedPreference
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
import de.mm20.launcher2.ui.component.preferences.PreferenceScreen
@@ -93,7 +85,7 @@ fun FileSearchSettingsScreen() {
onUnlock = {
viewModel.login(context as AppCompatActivity, AccountType.Nextcloud)
},
icon = Icons.Rounded.AccountBox,
icon = R.drawable.account_box_24px,
description = stringResource(R.string.no_account_nextcloud),
unlockLabel = stringResource(R.string.connect_account),
) {
@@ -117,7 +109,7 @@ fun FileSearchSettingsScreen() {
onUnlock = {
viewModel.login(context as AppCompatActivity, AccountType.Owncloud)
},
icon = Icons.Rounded.AccountBox,
icon = R.drawable.account_box_24px,
description = stringResource(R.string.no_account_owncloud),
unlockLabel = stringResource(R.string.connect_account),
) {
@@ -149,7 +141,7 @@ fun FileSearchSettingsScreen() {
},
description = (state as? PluginState.SetupRequired)?.message
?: stringResource(id = R.string.plugin_state_setup_required),
icon = Icons.Rounded.ErrorOutline,
icon = R.drawable.error_24px,
unlockLabel = stringResource(id = R.string.plugin_action_setup),
) {
SwitchPreference(

View File

@@ -8,8 +8,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.rounded.ArrowBack
import androidx.compose.material.icons.outlined.Info
import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material3.CenterAlignedTopAppBar
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
@@ -27,6 +25,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@@ -40,7 +39,7 @@ import de.mm20.launcher2.ui.component.dragndrop.LazyDragAndDropColumn
import de.mm20.launcher2.ui.component.dragndrop.rememberLazyDragAndDropListState
import de.mm20.launcher2.ui.component.preferences.SwitchPreference
import de.mm20.launcher2.ui.launcher.search.filters.getLabel
import de.mm20.launcher2.ui.launcher.search.filters.icon
import de.mm20.launcher2.ui.launcher.search.filters.iconMedium
import de.mm20.launcher2.ui.launcher.search.filters.isCategory
import de.mm20.launcher2.ui.locals.LocalNavController
@@ -60,8 +59,10 @@ fun FilterBarSettingsScreen() {
it.key is KeyboardFilterBarItem
},
onItemMove = { from, to ->
val item = (from.key as? KeyboardFilterBarItem) ?: return@rememberLazyDragAndDropListState
val toItem = (to.key as? KeyboardFilterBarItem) ?: return@rememberLazyDragAndDropListState
val item =
(from.key as? KeyboardFilterBarItem) ?: return@rememberLazyDragAndDropListState
val toItem =
(to.key as? KeyboardFilterBarItem) ?: return@rememberLazyDragAndDropListState
viewModel.moveItem(item, toItem)
}
)
@@ -91,7 +92,10 @@ fun FilterBarSettingsScreen() {
activity?.onBackPressed()
}
}) {
Icon(imageVector = Icons.AutoMirrored.Rounded.ArrowBack, contentDescription = "Back")
Icon(
imageVector = Icons.AutoMirrored.Rounded.ArrowBack,
contentDescription = "Back"
)
}
},
)
@@ -116,8 +120,11 @@ fun FilterBarSettingsScreen() {
.padding(start = 28.dp, top = 16.dp, end = 16.dp, bottom = 16.dp),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(Icons.Outlined.Info, null,
modifier = Modifier.padding(end = 24.dp).size(16.dp),
Icon(
painterResource(R.drawable.info_20px), null,
modifier = Modifier
.padding(end = 24.dp)
.size(16.dp),
tint = MaterialTheme.colorScheme.secondary
)
Text(
@@ -130,7 +137,8 @@ fun FilterBarSettingsScreen() {
}
for (i in 0 until KeyboardFilterBarItem.entries.size) {
val item = enabledItems!!.getOrNull(i) ?: disabledItems[i - enabledItems!!.size]
val prevItem = enabledItems!!.getOrNull(i - 1) ?: disabledItems.getOrNull(i - enabledItems!!.size - 1)
val prevItem = enabledItems!!.getOrNull(i - 1)
?: disabledItems.getOrNull(i - enabledItems!!.size - 1)
if (prevItem != null && prevItem.isCategory != item.isCategory) {
item(key = "divider-$i") {
HorizontalDivider()
@@ -146,7 +154,7 @@ fun FilterBarSettingsScreen() {
) {
SwitchPreference(
title = item.getLabel(context),
icon = item.icon,
icon = item.iconMedium,
value = enabledItems!!.contains(item), onValueChanged = {
if (it) {
viewModel.addAction(item)

View File

@@ -1,7 +1,7 @@
package de.mm20.launcher2.ui.settings.gestures
import androidx.annotation.DrawableRes
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
@@ -9,14 +9,6 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Adjust
import androidx.compose.material.icons.rounded.Circle
import androidx.compose.material.icons.rounded.Home
import androidx.compose.material.icons.rounded.SwipeDownAlt
import androidx.compose.material.icons.rounded.SwipeLeftAlt
import androidx.compose.material.icons.rounded.SwipeRightAlt
import androidx.compose.material.icons.rounded.SwipeUpAlt
import androidx.compose.material3.LocalContentColor
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
@@ -27,7 +19,6 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
@@ -39,7 +30,6 @@ import de.mm20.launcher2.preferences.GestureAction
import de.mm20.launcher2.search.SavableSearchable
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.common.SearchablePicker
import de.mm20.launcher2.ui.component.MissingPermissionBanner
import de.mm20.launcher2.ui.component.ShapedLauncherIcon
import de.mm20.launcher2.ui.component.preferences.GuardedPreference
import de.mm20.launcher2.ui.component.preferences.ListPreference
@@ -86,7 +76,7 @@ fun GestureSettingsScreen() {
) {
GesturePreference(
title = stringResource(R.string.preference_gesture_swipe_down),
icon = Icons.Rounded.SwipeDownAlt,
icon = R.drawable.swipe_down_alt_24px,
value = swipeDown,
onValueChanged = { viewModel.setSwipeDown(it) },
options = options,
@@ -108,7 +98,7 @@ fun GestureSettingsScreen() {
) {
GesturePreference(
title = stringResource(R.string.preference_gesture_swipe_left),
icon = Icons.Rounded.SwipeLeftAlt,
icon = R.drawable.swipe_left_alt_24px,
value = swipeLeft,
onValueChanged = { viewModel.setSwipeLeft(it) },
options = options,
@@ -130,7 +120,7 @@ fun GestureSettingsScreen() {
) {
GesturePreference(
title = stringResource(R.string.preference_gesture_swipe_right),
icon = Icons.Rounded.SwipeRightAlt,
icon = R.drawable.swipe_right_alt_24px,
value = swipeRight,
onValueChanged = { viewModel.setSwipeRight(it) },
options = options,
@@ -152,7 +142,7 @@ fun GestureSettingsScreen() {
) {
GesturePreference(
title = stringResource(R.string.preference_gesture_swipe_up),
icon = Icons.Rounded.SwipeUpAlt,
icon = R.drawable.swipe_up_alt_24px,
value = swipeUp,
onValueChanged = { viewModel.setSwipeUp(it) },
options = options,
@@ -174,7 +164,7 @@ fun GestureSettingsScreen() {
) {
GesturePreference(
title = stringResource(R.string.preference_gesture_double_tap),
icon = Icons.Rounded.Adjust,
icon = R.drawable.adjust_24px,
value = doubleTap,
onValueChanged = { viewModel.setDoubleTap(it) },
options = options,
@@ -196,7 +186,7 @@ fun GestureSettingsScreen() {
) {
GesturePreference(
title = stringResource(R.string.preference_gesture_long_press),
icon = Icons.Rounded.Circle,
icon = R.drawable.circle_24px,
value = longPress,
onValueChanged = { viewModel.setLongPress(it) },
options = options,
@@ -217,7 +207,7 @@ fun GestureSettingsScreen() {
) {
GesturePreference(
title = stringResource(R.string.preference_gesture_home_button),
icon = Icons.Rounded.Home,
icon = R.drawable.home_24px,
value = homeButton,
onValueChanged = { viewModel.setHomeButton(it) },
options = options,
@@ -246,7 +236,7 @@ fun requiresAccessibilityService(action: GestureAction?): Boolean {
@Composable
fun GesturePreference(
title: String,
icon: ImageVector,
@DrawableRes icon: Int,
value: GestureAction?,
onValueChanged: (GestureAction) -> Unit,
options: List<Pair<String, GestureAction>>,
@@ -266,7 +256,8 @@ fun GesturePreference(
icon = icon,
items = options,
value = value,
summary = options.find { value?.javaClass == it.second.javaClass }?.first ?: stringResource(R.string.gesture_action_none),
summary = options.find { value?.javaClass == it.second.javaClass }?.first
?: stringResource(R.string.gesture_action_none),
onValueChanged = { if (it != null) onValueChanged(it) }
)
}

View File

@@ -8,13 +8,7 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Visibility
import androidx.compose.material.icons.rounded.Check
import androidx.compose.material.icons.rounded.Visibility
import androidx.compose.material.icons.rounded.VisibilityOff
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
@@ -31,6 +25,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
@@ -224,7 +219,7 @@ private fun VisibilityDropdown(
DropdownMenuItem(
leadingIcon = {
Icon(
imageVector = Icons.Rounded.Visibility,
painterResource(R.drawable.visibility_24px_filled),
contentDescription = null
)
},
@@ -243,7 +238,7 @@ private fun VisibilityDropdown(
trailingIcon = {
if (value == VisibilityLevel.Default) {
Icon(
imageVector = Icons.Rounded.Check,
painterResource(R.drawable.check_24px),
tint = MaterialTheme.colorScheme.primary,
contentDescription = null
)
@@ -254,7 +249,7 @@ private fun VisibilityDropdown(
DropdownMenuItem(
leadingIcon = {
Icon(
imageVector = Icons.Outlined.Visibility,
painterResource(R.drawable.visibility_24px),
contentDescription = null
)
},
@@ -267,7 +262,7 @@ private fun VisibilityDropdown(
trailingIcon = {
if (value == VisibilityLevel.SearchOnly) {
Icon(
imageVector = Icons.Rounded.Check,
painterResource(R.drawable.check_24px),
tint = MaterialTheme.colorScheme.primary,
contentDescription = null
)
@@ -278,7 +273,7 @@ private fun VisibilityDropdown(
DropdownMenuItem(
leadingIcon = {
Icon(
imageVector = Icons.Rounded.VisibilityOff,
painterResource(R.drawable.visibility_off_24px),
contentDescription = null
)
},
@@ -291,7 +286,7 @@ private fun VisibilityDropdown(
trailingIcon = {
if (value == VisibilityLevel.Hidden) {
Icon(
imageVector = Icons.Rounded.Check,
painterResource(R.drawable.check_24px),
tint = MaterialTheme.colorScheme.primary,
contentDescription = null
)
@@ -326,11 +321,12 @@ private fun HiddenItem(
if (visibility != null) {
Icon(
modifier = Modifier.alpha(if (visibility == VisibilityLevel.Hidden) 0.3f else 1f),
imageVector = when (visibility) {
VisibilityLevel.Hidden -> Icons.Rounded.VisibilityOff
VisibilityLevel.Default -> Icons.Rounded.Visibility
VisibilityLevel.SearchOnly -> Icons.Outlined.Visibility
},
painter = painterResource(
when (visibility) {
VisibilityLevel.Hidden -> R.drawable.visibility_off_24px
VisibilityLevel.Default -> R.drawable.visibility_24px_filled
VisibilityLevel.SearchOnly -> R.drawable.visibility_24px
}),
tint = if (visibility == VisibilityLevel.Default) MaterialTheme.colorScheme.primary
else MaterialTheme.colorScheme.onSurfaceVariant,
contentDescription = null

View File

@@ -17,12 +17,6 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Circle
import androidx.compose.material.icons.rounded.AutoAwesome
import androidx.compose.material.icons.rounded.CheckCircle
import androidx.compose.material.icons.rounded.DarkMode
import androidx.compose.material.icons.rounded.LightMode
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
@@ -30,23 +24,21 @@ import androidx.compose.material3.SegmentedButton
import androidx.compose.material3.SegmentedButtonDefaults
import androidx.compose.material3.SingleChoiceSegmentedButtonRow
import androidx.compose.material3.Text
import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.preferences.ClockWidgetColors
import de.mm20.launcher2.preferences.SearchBarColors
import de.mm20.launcher2.preferences.SearchBarStyle
import de.mm20.launcher2.preferences.SystemBarColors
@@ -310,7 +302,8 @@ fun SearchBarStylePreference(
SearchBarStyle.entries
}
val darkColors = LocalPreferDarkContentOverWallpaper.current && colors == SearchBarColors.Auto || colors == SearchBarColors.Dark
val darkColors =
LocalPreferDarkContentOverWallpaper.current && colors == SearchBarColors.Auto || colors == SearchBarColors.Dark
BottomSheetDialog(
onDismissRequest = {
@@ -334,7 +327,7 @@ fun SearchBarStylePreference(
) {
Text(
text = stringResource(
when(style) {
when (style) {
SearchBarStyle.Transparent -> R.string.preference_search_bar_style_transparent
SearchBarStyle.Solid -> R.string.preference_search_bar_style_solid
SearchBarStyle.Hidden -> R.string.preference_search_bar_style_hidden
@@ -350,7 +343,10 @@ fun SearchBarStylePreference(
}
) {
Icon(
if (style == value) Icons.Rounded.CheckCircle else Icons.Outlined.Circle,
painterResource(
if (style == value) R.drawable.check_circle_24px_filled
else R.drawable.circle_24px
),
contentDescription = null,
tint = if (style == value) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface,
)
@@ -365,7 +361,7 @@ fun SearchBarStylePreference(
)
.clip(MaterialTheme.shapes.medium)
.background(
when {
when {
style != SearchBarStyle.Transparent -> MaterialTheme.colorScheme.inverseSurface
LocalDarkTheme.current != darkColors -> MaterialTheme.colorScheme.surfaceContainer
else -> MaterialTheme.colorScheme.inverseSurface
@@ -393,7 +389,9 @@ fun SearchBarStylePreference(
}
if (style == SearchBarStyle.Transparent) {
SingleChoiceSegmentedButtonRow(
modifier = Modifier.fillMaxWidth().padding(top = 16.dp),
modifier = Modifier
.fillMaxWidth()
.padding(top = 16.dp),
) {
SegmentedButton(
selected = colors == SearchBarColors.Auto,
@@ -406,7 +404,7 @@ fun SearchBarStylePreference(
),
) {
Icon(
imageVector = Icons.Rounded.AutoAwesome,
painterResource(R.drawable.auto_awesome_20dp),
contentDescription = null,
modifier = Modifier.size(SegmentedButtonDefaults.IconSize)
)
@@ -422,7 +420,7 @@ fun SearchBarStylePreference(
),
) {
Icon(
imageVector = Icons.Rounded.LightMode,
painterResource(R.drawable.light_mode_20px),
contentDescription = null,
modifier = Modifier.size(SegmentedButtonDefaults.IconSize)
)
@@ -438,7 +436,7 @@ fun SearchBarStylePreference(
),
) {
Icon(
imageVector = Icons.Rounded.DarkMode,
painterResource(R.drawable.dark_mode_20px),
contentDescription = null,
modifier = Modifier.size(SegmentedButtonDefaults.IconSize)
)

View File

@@ -15,8 +15,6 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Palette
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
@@ -34,6 +32,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
@@ -347,7 +346,7 @@ private fun IconPackSelectorSheet(
Icon(
modifier = Modifier
.size(20.dp),
imageVector = Icons.Rounded.Palette,
painter = painterResource(R.drawable.palette_20px),
contentDescription = null,
tint = MaterialTheme.colorScheme.primary
)

View File

@@ -1,17 +1,8 @@
package de.mm20.launcher2.ui.settings.integrations
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Check
import androidx.compose.material.icons.rounded.LightMode
import androidx.compose.material.icons.rounded.PlayCircleOutline
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.icons.BreezyWeather
import de.mm20.launcher2.icons.Google
import de.mm20.launcher2.icons.Nextcloud
import de.mm20.launcher2.icons.Owncloud
import de.mm20.launcher2.icons.Wikipedia
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.preferences.Preference
import de.mm20.launcher2.ui.component.preferences.PreferenceCategory
@@ -28,14 +19,14 @@ fun IntegrationsSettingsScreen() {
PreferenceCategory {
Preference(
title = stringResource(R.string.preference_weather_integration),
icon = Icons.Rounded.LightMode,
icon = R.drawable.light_mode_24px,
onClick = {
navController?.navigate("settings/integrations/weather")
}
)
Preference(
title = stringResource(R.string.preference_media_integration),
icon = Icons.Rounded.PlayCircleOutline,
icon = R.drawable.play_circle_24px,
onClick = {
navController?.navigate("settings/integrations/media")
}
@@ -46,35 +37,35 @@ fun IntegrationsSettingsScreen() {
PreferenceCategory {
Preference(
title = stringResource(R.string.preference_nextcloud),
icon = Icons.Rounded.Nextcloud,
icon = R.drawable.nextcloud,
onClick = {
navController?.navigate("settings/integrations/nextcloud")
}
)
Preference(
title = stringResource(R.string.preference_owncloud),
icon = Icons.Rounded.Owncloud,
icon = R.drawable.owncloud,
onClick = {
navController?.navigate("settings/integrations/owncloud")
}
)
Preference(
title = stringResource(R.string.preference_search_wikipedia),
icon = Icons.Rounded.Wikipedia,
icon = R.drawable.wikipedia,
onClick = {
navController?.navigate("settings/search/wikipedia")
}
)
Preference(
title = stringResource(R.string.preference_tasks_integration),
icon = Icons.Default.Check,
icon = R.drawable.check_24px_sharp,
onClick = {
navController?.navigate("settings/integrations/tasks")
}
)
Preference(
title = stringResource(R.string.preference_breezyweather_integration),
icon = Icons.Rounded.BreezyWeather,
icon = R.drawable.breezy_weather,
onClick = {
navController?.navigate("settings/integrations/breezyweather")
}

View File

@@ -6,9 +6,6 @@ import androidx.browser.customtabs.CustomTabsIntent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.ArrowBack
import androidx.compose.material.icons.rounded.OpenInBrowser
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
@@ -17,6 +14,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
@@ -45,7 +43,7 @@ fun LicenseScreen(library: OpenSourceLibrary) {
IconButton(onClick = {
navController?.navigateUp()
}) {
Icon(imageVector = Icons.Rounded.ArrowBack, contentDescription = "Back")
Icon(painterResource(R.drawable.arrow_back_24px), contentDescription = "Back")
}
},
scrollBehavior = scrollBehavior,
@@ -60,7 +58,7 @@ fun LicenseScreen(library: OpenSourceLibrary) {
.launchUrl(context, Uri.parse(library.url))
}) {
Icon(
imageVector = Icons.Rounded.OpenInBrowser,
painterResource(R.drawable.open_in_browser_24px),
contentDescription = stringResource(
R.string.open_webpage
)

Some files were not shown because too many files have changed in this diff Show More