Rename favorites widget

This commit is contained in:
MM20
2025-12-23 17:55:21 +01:00
parent 8bff6bd24b
commit c09a5aa425
11 changed files with 49 additions and 50 deletions

View File

@@ -13,17 +13,15 @@ import de.mm20.launcher2.ktx.isAtLeastApiLevel
import de.mm20.launcher2.preferences.IconShape import de.mm20.launcher2.preferences.IconShape
import de.mm20.launcher2.preferences.MeasurementSystem import de.mm20.launcher2.preferences.MeasurementSystem
import de.mm20.launcher2.preferences.TimeFormat import de.mm20.launcher2.preferences.TimeFormat
import de.mm20.launcher2.preferences.ui.CardStyle
import de.mm20.launcher2.preferences.ui.GridSettings import de.mm20.launcher2.preferences.ui.GridSettings
import de.mm20.launcher2.preferences.ui.LocaleSettings import de.mm20.launcher2.preferences.ui.LocaleSettings
import de.mm20.launcher2.preferences.ui.UiSettings import de.mm20.launcher2.preferences.ui.UiSettings
import de.mm20.launcher2.ui.component.ProvideIconShape import de.mm20.launcher2.ui.component.ProvideIconShape
import de.mm20.launcher2.ui.locals.LocalCardStyle
import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled import de.mm20.launcher2.ui.locals.LocalFavoritesEnabled
import de.mm20.launcher2.ui.locals.LocalGridSettings import de.mm20.launcher2.ui.locals.LocalGridSettings
import de.mm20.launcher2.ui.locals.LocalMeasurementSystem import de.mm20.launcher2.ui.locals.LocalMeasurementSystem
import de.mm20.launcher2.ui.locals.LocalTimeFormat import de.mm20.launcher2.ui.locals.LocalTimeFormat
import de.mm20.launcher2.widgets.FavoritesWidget import de.mm20.launcher2.widgets.AppsWidget
import de.mm20.launcher2.widgets.WidgetRepository import de.mm20.launcher2.widgets.WidgetRepository
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
@@ -46,7 +44,7 @@ fun ProvideSettings(
val favoritesEnabled by remember { val favoritesEnabled by remember {
combine( combine(
widgetRepository.exists(FavoritesWidget.Type), widgetRepository.exists(AppsWidget.Type),
settings.favoritesEnabled, settings.favoritesEnabled,
) { a, b -> a || b }.distinctUntilChanged() ) { a, b -> a || b }.distinctUntilChanged()
}.collectAsState(true) }.collectAsState(true)

View File

@@ -114,7 +114,7 @@ import de.mm20.launcher2.ui.locals.LocalPreferDarkContentOverWallpaper
import de.mm20.launcher2.ui.settings.SettingsActivity import de.mm20.launcher2.ui.settings.SettingsActivity
import de.mm20.launcher2.widgets.AppWidget import de.mm20.launcher2.widgets.AppWidget
import de.mm20.launcher2.widgets.CalendarWidget import de.mm20.launcher2.widgets.CalendarWidget
import de.mm20.launcher2.widgets.FavoritesWidget import de.mm20.launcher2.widgets.AppsWidget
import de.mm20.launcher2.widgets.MusicWidget import de.mm20.launcher2.widgets.MusicWidget
import de.mm20.launcher2.widgets.NotesWidget import de.mm20.launcher2.widgets.NotesWidget
import de.mm20.launcher2.widgets.WeatherWidget import de.mm20.launcher2.widgets.WeatherWidget
@@ -148,7 +148,7 @@ fun ConfigureWidgetSheet(
is WeatherWidget -> ConfigureWeatherWidget(widget, onWidgetUpdated) is WeatherWidget -> ConfigureWeatherWidget(widget, onWidgetUpdated)
is AppWidget -> ConfigureAppWidget(widget, onWidgetUpdated) is AppWidget -> ConfigureAppWidget(widget, onWidgetUpdated)
is CalendarWidget -> ConfigureCalendarWidget(widget, onWidgetUpdated) is CalendarWidget -> ConfigureCalendarWidget(widget, onWidgetUpdated)
is FavoritesWidget -> ConfigureFavoritesWidget(widget, onWidgetUpdated) is AppsWidget -> ConfigureFavoritesWidget(widget, onWidgetUpdated)
is MusicWidget -> ConfigureMusicWidget(widget, onWidgetUpdated) is MusicWidget -> ConfigureMusicWidget(widget, onWidgetUpdated)
is NotesWidget -> ConfigureNotesWidget(widget, onWidgetUpdated) is NotesWidget -> ConfigureNotesWidget(widget, onWidgetUpdated)
} }
@@ -212,8 +212,8 @@ fun ColumnScope.ConfigureWeatherWidget(
@Composable @Composable
fun ColumnScope.ConfigureFavoritesWidget( fun ColumnScope.ConfigureFavoritesWidget(
widget: FavoritesWidget, widget: AppsWidget,
onWidgetUpdated: (FavoritesWidget) -> Unit, onWidgetUpdated: (AppsWidget) -> Unit,
) { ) {
val customAttrRepository = koinInject<CustomAttributesRepository>() val customAttrRepository = koinInject<CustomAttributesRepository>()
@@ -662,7 +662,7 @@ fun ColumnScope.ConfigureAppWidget(
is WeatherWidget -> it.copy(id = widget.id) is WeatherWidget -> it.copy(id = widget.id)
is MusicWidget -> it.copy(id = widget.id) is MusicWidget -> it.copy(id = widget.id)
is CalendarWidget -> it.copy(id = widget.id) is CalendarWidget -> it.copy(id = widget.id)
is FavoritesWidget -> it.copy(id = widget.id) is AppsWidget -> it.copy(id = widget.id)
is NotesWidget -> it.copy(id = widget.id) is NotesWidget -> it.copy(id = widget.id)
} }
onWidgetUpdated(updatedWidget) onWidgetUpdated(updatedWidget)

View File

@@ -58,7 +58,7 @@ import de.mm20.launcher2.ui.component.BottomSheetDialog
import de.mm20.launcher2.widgets.AppWidget import de.mm20.launcher2.widgets.AppWidget
import de.mm20.launcher2.widgets.AppWidgetConfig import de.mm20.launcher2.widgets.AppWidgetConfig
import de.mm20.launcher2.widgets.CalendarWidget import de.mm20.launcher2.widgets.CalendarWidget
import de.mm20.launcher2.widgets.FavoritesWidget import de.mm20.launcher2.widgets.AppsWidget
import de.mm20.launcher2.widgets.MusicWidget import de.mm20.launcher2.widgets.MusicWidget
import de.mm20.launcher2.widgets.NotesWidget import de.mm20.launcher2.widgets.NotesWidget
import de.mm20.launcher2.widgets.WeatherWidget import de.mm20.launcher2.widgets.WeatherWidget
@@ -177,6 +177,7 @@ class BindAndConfigureAppWidgetActivity : Activity() {
cancel() cancel()
} }
} }
else -> { else -> {
Log.w("MM20", "Unknown request code $requestCode") Log.w("MM20", "Unknown request code $requestCode")
cancel() cancel()
@@ -186,7 +187,10 @@ class BindAndConfigureAppWidgetActivity : Activity() {
private fun finishWithResult(widgetId: Int) { private fun finishWithResult(widgetId: Int) {
val data = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId) val data = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId)
data.putExtra(ExtraAppWidgetProviderInfo, intent.getParcelableExtra<AppWidgetProviderInfo>(ExtraAppWidgetProviderInfo)) data.putExtra(
ExtraAppWidgetProviderInfo,
intent.getParcelableExtra<AppWidgetProviderInfo>(ExtraAppWidgetProviderInfo)
)
setResult(RESULT_OK, data) setResult(RESULT_OK, data)
appWidgetId = null appWidgetId = null
finish() finish()
@@ -230,7 +234,10 @@ private class BindAndConfigureAppWidgetContract(
), ),
) )
} else { } else {
Log.e("MM20", "Could not parse widget result: widgetId=$widgetId, widgetProviderInfo=$widgetProviderInfo") Log.e(
"MM20",
"Could not parse widget result: widgetId=$widgetId, widgetProviderInfo=$widgetProviderInfo"
)
} }
} else { } else {
Log.e("MM20", "Widget result was not OK") Log.e("MM20", "Widget result was not OK")
@@ -322,7 +329,7 @@ fun WidgetPickerSheet(
WeatherWidget.Type -> WeatherWidget(id) WeatherWidget.Type -> WeatherWidget(id)
CalendarWidget.Type -> CalendarWidget(id) CalendarWidget.Type -> CalendarWidget(id)
MusicWidget.Type -> MusicWidget(id) MusicWidget.Type -> MusicWidget(id)
FavoritesWidget.Type -> FavoritesWidget(id) AppsWidget.Type -> AppsWidget(id)
NotesWidget.Type -> NotesWidget(id) NotesWidget.Type -> NotesWidget(id)
else -> return@OutlinedCard else -> return@OutlinedCard
} }
@@ -336,14 +343,15 @@ fun WidgetPickerSheet(
Icon( Icon(
painter = painter =
painterResource( painterResource(
when (it.type) { when (it.type) {
WeatherWidget.Type -> R.drawable.light_mode_24px WeatherWidget.Type -> R.drawable.light_mode_24px
CalendarWidget.Type -> R.drawable.today_24px CalendarWidget.Type -> R.drawable.today_24px
MusicWidget.Type -> R.drawable.music_note_24px MusicWidget.Type -> R.drawable.music_note_24px
FavoritesWidget.Type -> R.drawable.star_24px AppsWidget.Type -> R.drawable.apps_24px
NotesWidget.Type -> R.drawable.sticky_note_2_24px NotesWidget.Type -> R.drawable.sticky_note_2_24px
else -> R.drawable.widgets_24px else -> R.drawable.widgets_24px
}), }
),
contentDescription = null, contentDescription = null,
modifier = Modifier.padding(end = 16.dp) modifier = Modifier.padding(end = 16.dp)
) )

View File

@@ -34,14 +34,14 @@ import de.mm20.launcher2.ui.component.LauncherCard
import de.mm20.launcher2.ui.launcher.sheets.ConfigureWidgetSheet import de.mm20.launcher2.ui.launcher.sheets.ConfigureWidgetSheet
import de.mm20.launcher2.ui.launcher.widgets.calendar.CalendarWidget import de.mm20.launcher2.ui.launcher.widgets.calendar.CalendarWidget
import de.mm20.launcher2.ui.launcher.widgets.external.AppWidget import de.mm20.launcher2.ui.launcher.widgets.external.AppWidget
import de.mm20.launcher2.ui.launcher.widgets.favorites.FavoritesWidget import de.mm20.launcher2.ui.launcher.widgets.favorites.AppsWidget
import de.mm20.launcher2.ui.launcher.widgets.music.MusicWidget import de.mm20.launcher2.ui.launcher.widgets.music.MusicWidget
import de.mm20.launcher2.ui.launcher.widgets.notes.NotesWidget import de.mm20.launcher2.ui.launcher.widgets.notes.NotesWidget
import de.mm20.launcher2.ui.launcher.widgets.weather.WeatherWidget import de.mm20.launcher2.ui.launcher.widgets.weather.WeatherWidget
import de.mm20.launcher2.ui.theme.transparency.transparency import de.mm20.launcher2.ui.theme.transparency.transparency
import de.mm20.launcher2.widgets.AppWidget import de.mm20.launcher2.widgets.AppWidget
import de.mm20.launcher2.widgets.CalendarWidget import de.mm20.launcher2.widgets.CalendarWidget
import de.mm20.launcher2.widgets.FavoritesWidget import de.mm20.launcher2.widgets.AppsWidget
import de.mm20.launcher2.widgets.MusicWidget import de.mm20.launcher2.widgets.MusicWidget
import de.mm20.launcher2.widgets.NotesWidget import de.mm20.launcher2.widgets.NotesWidget
import de.mm20.launcher2.widgets.WeatherWidget import de.mm20.launcher2.widgets.WeatherWidget
@@ -106,7 +106,7 @@ fun WidgetItem(
is WeatherWidget -> stringResource(R.string.widget_name_weather) is WeatherWidget -> stringResource(R.string.widget_name_weather)
is MusicWidget -> stringResource(R.string.widget_name_music) is MusicWidget -> stringResource(R.string.widget_name_music)
is CalendarWidget -> stringResource(R.string.widget_name_calendar) is CalendarWidget -> stringResource(R.string.widget_name_calendar)
is FavoritesWidget -> stringResource(R.string.widget_name_favorites) is AppsWidget -> stringResource(R.string.widget_name_apps)
is NotesWidget -> stringResource(R.string.widget_name_notes) is NotesWidget -> stringResource(R.string.widget_name_notes)
is AppWidget -> remember(widget.config.widgetId) { is AppWidget -> remember(widget.config.widgetId) {
appWidget?.loadLabel( appWidget?.loadLabel(
@@ -152,8 +152,8 @@ fun WidgetItem(
CalendarWidget(widget) CalendarWidget(widget)
} }
is FavoritesWidget -> { is AppsWidget -> {
FavoritesWidget(widget) AppsWidget(widget)
} }
is NotesWidget -> { is NotesWidget -> {

View File

@@ -1,6 +1,5 @@
package de.mm20.launcher2.ui.launcher.widgets.external package de.mm20.launcher2.ui.launcher.widgets.external
import android.appwidget.AppWidgetHost
import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetManager
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
@@ -21,21 +20,18 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.isUnspecified
import de.mm20.launcher2.ui.R import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.component.Banner import de.mm20.launcher2.ui.component.Banner
import de.mm20.launcher2.ui.ktx.toPixels
import de.mm20.launcher2.ui.launcher.sheets.WidgetPickerSheet import de.mm20.launcher2.ui.launcher.sheets.WidgetPickerSheet
import de.mm20.launcher2.ui.locals.LocalDarkTheme import de.mm20.launcher2.ui.locals.LocalDarkTheme
import de.mm20.launcher2.ui.locals.LocalPreferDarkContentOverWallpaper import de.mm20.launcher2.ui.locals.LocalPreferDarkContentOverWallpaper
import de.mm20.launcher2.widgets.AppWidget import de.mm20.launcher2.widgets.AppWidget
import de.mm20.launcher2.widgets.CalendarWidget import de.mm20.launcher2.widgets.CalendarWidget
import de.mm20.launcher2.widgets.FavoritesWidget import de.mm20.launcher2.widgets.AppsWidget
import de.mm20.launcher2.widgets.MusicWidget import de.mm20.launcher2.widgets.MusicWidget
import de.mm20.launcher2.widgets.NotesWidget import de.mm20.launcher2.widgets.NotesWidget
import de.mm20.launcher2.widgets.WeatherWidget import de.mm20.launcher2.widgets.WeatherWidget
import de.mm20.launcher2.widgets.Widget import de.mm20.launcher2.widgets.Widget
import kotlin.math.roundToInt
@Composable @Composable
fun AppWidget( fun AppWidget(
@@ -84,7 +80,7 @@ fun AppWidget(
is WeatherWidget -> it.copy(id = widget.id) is WeatherWidget -> it.copy(id = widget.id)
is MusicWidget -> it.copy(id = widget.id) is MusicWidget -> it.copy(id = widget.id)
is CalendarWidget -> it.copy(id = widget.id) is CalendarWidget -> it.copy(id = widget.id)
is FavoritesWidget -> it.copy(id = widget.id) is AppsWidget -> it.copy(id = widget.id)
is NotesWidget -> it.copy(id = widget.id) is NotesWidget -> it.copy(id = widget.id)
} }
onWidgetUpdate(updatedWidget) onWidgetUpdate(updatedWidget)

View File

@@ -17,11 +17,11 @@ import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.common.FavoritesTagSelector import de.mm20.launcher2.ui.common.FavoritesTagSelector
import de.mm20.launcher2.ui.component.Banner import de.mm20.launcher2.ui.component.Banner
import de.mm20.launcher2.ui.launcher.search.common.grid.SearchResultGrid import de.mm20.launcher2.ui.launcher.search.common.grid.SearchResultGrid
import de.mm20.launcher2.widgets.FavoritesWidget import de.mm20.launcher2.widgets.AppsWidget
@Composable @Composable
fun FavoritesWidget(widget: FavoritesWidget) { fun AppsWidget(widget: AppsWidget) {
val viewModel: FavoritesWidgetVM = viewModel(key = "favorites-widget-${widget.id}") val viewModel: AppsWidgetVM = viewModel(key = "favorites-widget-${widget.id}")
val favorites by remember { viewModel.favorites }.collectAsState(emptyList()) val favorites by remember { viewModel.favorites }.collectAsState(emptyList())
val pinnedTags by viewModel.pinnedTags.collectAsState(emptyList()) val pinnedTags by viewModel.pinnedTags.collectAsState(emptyList())
val selectedTag by viewModel.selectedTag.collectAsState(null) val selectedTag by viewModel.selectedTag.collectAsState(null)

View File

@@ -1,21 +1,18 @@
package de.mm20.launcher2.ui.launcher.widgets.favorites package de.mm20.launcher2.ui.launcher.widgets.favorites
import de.mm20.launcher2.preferences.ui.GridSettings
import de.mm20.launcher2.preferences.ui.UiSettings
import de.mm20.launcher2.services.widgets.WidgetsService import de.mm20.launcher2.services.widgets.WidgetsService
import de.mm20.launcher2.ui.common.FavoritesVM import de.mm20.launcher2.ui.common.FavoritesVM
import de.mm20.launcher2.widgets.FavoritesWidget import de.mm20.launcher2.widgets.AppsWidget
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import org.koin.core.component.inject import org.koin.core.component.inject
class FavoritesWidgetVM : FavoritesVM() { class AppsWidgetVM : FavoritesVM() {
private val widgetsService: WidgetsService by inject() private val widgetsService: WidgetsService by inject()
private val widget = MutableStateFlow<FavoritesWidget?>(null) private val widget = MutableStateFlow<AppsWidget?>(null)
override val tagsExpanded = widget.map { it?.config?.tagsMultiline == true } override val tagsExpanded = widget.map { it?.config?.tagsMultiline == true }
override val compactTags: Flow<Boolean> = widget.map { it?.config?.compactTags == true } override val compactTags: Flow<Boolean> = widget.map { it?.config?.compactTags == true }
@@ -28,7 +25,7 @@ class FavoritesWidgetVM : FavoritesVM() {
) )
} }
fun updateWidget(widget: FavoritesWidget) { fun updateWidget(widget: AppsWidget) {
selectTag(null) selectTag(null)
if (widget.config.customTags) { if (widget.config.customTags) {
selectTag(widget.config.tagList.firstOrNull()) selectTag(widget.config.tagList.firstOrNull())

View File

@@ -223,7 +223,7 @@
<string name="widget_name_weather">Weather</string> <string name="widget_name_weather">Weather</string>
<string name="widget_name_calendar">Calendar</string> <string name="widget_name_calendar">Calendar</string>
<string name="widget_name_music">Media</string> <string name="widget_name_music">Media</string>
<string name="widget_name_favorites">Favorites</string> <string name="widget_name_apps">Apps</string>
<string name="widget_name_notes">Note</string> <string name="widget_name_notes">Note</string>
<string name="widget_name_unknown">Unknown</string> <string name="widget_name_unknown">Unknown</string>
<string name="widget_add_widget">Add widget</string> <string name="widget_add_widget">Add widget</string>

View File

@@ -14,7 +14,7 @@ data class FavoritesWidgetConfig(
val tagList: List<String> = emptyList() val tagList: List<String> = emptyList()
) )
data class FavoritesWidget( data class AppsWidget(
override val id: UUID, override val id: UUID,
val config: FavoritesWidgetConfig = FavoritesWidgetConfig(), val config: FavoritesWidgetConfig = FavoritesWidgetConfig(),
) : Widget() { ) : Widget() {

View File

@@ -43,11 +43,11 @@ sealed class Widget {
?: CalendarWidgetConfig() ?: CalendarWidgetConfig()
CalendarWidget(entity.id, config) CalendarWidget(entity.id, config)
} }
FavoritesWidget.Type -> { AppsWidget.Type -> {
val config: FavoritesWidgetConfig = val config: FavoritesWidgetConfig =
Json.decodeFromStringOrNull(entity.config?.takeIf { it.isNotBlank() }) Json.decodeFromStringOrNull(entity.config?.takeIf { it.isNotBlank() })
?: FavoritesWidgetConfig() ?: FavoritesWidgetConfig()
FavoritesWidget(entity.id, config) AppsWidget(entity.id, config)
} }
AppWidget.Type -> { AppWidget.Type -> {
val config: AppWidgetConfig = val config: AppWidgetConfig =

View File

@@ -7,7 +7,7 @@ import android.content.pm.LauncherApps
import android.os.Build import android.os.Build
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import de.mm20.launcher2.widgets.CalendarWidget import de.mm20.launcher2.widgets.CalendarWidget
import de.mm20.launcher2.widgets.FavoritesWidget import de.mm20.launcher2.widgets.AppsWidget
import de.mm20.launcher2.widgets.MusicWidget import de.mm20.launcher2.widgets.MusicWidget
import de.mm20.launcher2.widgets.NotesWidget import de.mm20.launcher2.widgets.NotesWidget
import de.mm20.launcher2.widgets.WeatherWidget import de.mm20.launcher2.widgets.WeatherWidget
@@ -63,8 +63,8 @@ class WidgetsService(
label = context.getString(R.string.widget_name_calendar), label = context.getString(R.string.widget_name_calendar),
), ),
BuiltInWidgetInfo( BuiltInWidgetInfo(
type = FavoritesWidget.Type, type = AppsWidget.Type,
label = context.getString(R.string.widget_name_favorites), label = context.getString(R.string.widget_name_apps),
), ),
BuiltInWidgetInfo( BuiltInWidgetInfo(
type = NotesWidget.Type, type = NotesWidget.Type,
@@ -85,7 +85,7 @@ class WidgetsService(
fun isFavoritesWidgetFirst(): Flow<Boolean> { fun isFavoritesWidgetFirst(): Flow<Boolean> {
return widgetRepository.get(limit = 1).map { return widgetRepository.get(limit = 1).map {
it.firstOrNull() is FavoritesWidget it.firstOrNull() is AppsWidget
} }
} }