Bringup notes widget

This commit is contained in:
MM20
2023-04-23 22:34:20 +02:00
parent e17c8d0f63
commit d98dcdf286
9 changed files with 155 additions and 0 deletions
@@ -74,6 +74,7 @@ import de.mm20.launcher2.widgets.AppWidget
import de.mm20.launcher2.widgets.CalendarWidget
import de.mm20.launcher2.widgets.FavoritesWidget
import de.mm20.launcher2.widgets.MusicWidget
import de.mm20.launcher2.widgets.NotesWidget
import de.mm20.launcher2.widgets.WeatherWidget
import de.mm20.launcher2.widgets.Widget
import org.koin.androidx.compose.get
@@ -110,6 +111,7 @@ fun ConfigureWidgetSheet(
is CalendarWidget -> ConfigureCalendarWidget(widget, onWidgetUpdated)
is FavoritesWidget -> ConfigureFavoritesWidget(widget, onWidgetUpdated)
is MusicWidget -> ConfigureMusicWidget()
is NotesWidget -> ConfigureNotesWidget(widget, onWidgetUpdated)
}
}
@@ -304,6 +306,7 @@ fun ColumnScope.ConfigureAppWidget(
is MusicWidget -> it.copy(id = widget.id)
is CalendarWidget -> it.copy(id = widget.id)
is FavoritesWidget -> it.copy(id = widget.id)
is NotesWidget -> it.copy(id = widget.id)
}
onWidgetUpdated(updatedWidget)
replaceWidget = false
@@ -537,4 +540,12 @@ fun ColumnScope.ConfigureCalendarWidget(
text = stringResource(R.string.widget_config_calendar_no_calendars)
)
}
}
@Composable
fun ConfigureNotesWidget(
widget: NotesWidget,
onWidgetUpdated: (NotesWidget) -> Unit
) {
}
@@ -30,6 +30,7 @@ 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
@@ -64,6 +65,7 @@ import de.mm20.launcher2.widgets.AppWidget
import de.mm20.launcher2.widgets.AppWidgetConfig
import de.mm20.launcher2.widgets.FavoritesWidget
import de.mm20.launcher2.widgets.MusicWidget
import de.mm20.launcher2.widgets.NotesWidget
import de.mm20.launcher2.widgets.WeatherWidget
import de.mm20.launcher2.widgets.Widget
import java.util.UUID
@@ -287,6 +289,7 @@ fun WidgetPickerSheet(
CalendarWidget.Type -> CalendarWidget(id)
MusicWidget.Type -> MusicWidget(id)
FavoritesWidget.Type -> FavoritesWidget(id)
NotesWidget.Type -> NotesWidget(id)
else -> return@OutlinedCard
}
onWidgetSelected(widget)
@@ -302,6 +305,7 @@ fun WidgetPickerSheet(
CalendarWidget.Type -> Icons.Rounded.Today
MusicWidget.Type -> Icons.Rounded.MusicNote
FavoritesWidget.Type -> Icons.Rounded.Star
NotesWidget.Type -> Icons.Rounded.StickyNote2
else -> Icons.Rounded.Widgets
},
contentDescription = null,
@@ -45,11 +45,13 @@ import de.mm20.launcher2.ui.launcher.widgets.calendar.CalendarWidget
import de.mm20.launcher2.ui.launcher.widgets.external.ExternalWidget
import de.mm20.launcher2.ui.launcher.widgets.favorites.FavoritesWidget
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.weather.WeatherWidget
import de.mm20.launcher2.widgets.AppWidget
import de.mm20.launcher2.widgets.CalendarWidget
import de.mm20.launcher2.widgets.FavoritesWidget
import de.mm20.launcher2.widgets.MusicWidget
import de.mm20.launcher2.widgets.NotesWidget
import de.mm20.launcher2.widgets.WeatherWidget
import de.mm20.launcher2.widgets.Widget
@@ -107,6 +109,7 @@ fun WidgetItem(
is MusicWidget -> stringResource(R.string.widget_name_music)
is CalendarWidget -> stringResource(R.string.widget_name_calendar)
is FavoritesWidget -> stringResource(R.string.widget_name_favorites)
is NotesWidget -> stringResource(R.string.widget_name_notes)
is AppWidget -> remember(widget.config.widgetId) {
appWidget?.loadLabel(
context.packageManager
@@ -155,6 +158,10 @@ fun WidgetItem(
FavoritesWidget(widget)
}
is NotesWidget -> {
NotesWidget(widget)
}
is AppWidget -> {
val widgetInfo = remember(widget.config.widgetId) {
AppWidgetManager.getInstance(context)
@@ -193,6 +200,7 @@ fun WidgetItem(
is MusicWidget -> it.copy(id = widget.id)
is CalendarWidget -> it.copy(id = widget.id)
is FavoritesWidget -> it.copy(id = widget.id)
is NotesWidget -> it.copy(id = widget.id)
}
onWidgetUpdate(updatedWidget)
replaceWidget = false
@@ -0,0 +1,37 @@
package de.mm20.launcher2.ui.launcher.widgets.notes
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.SolidColor
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.widgets.NotesWidget
@Composable
fun NotesWidget(widget: NotesWidget) {
val viewModel: NotesWidgetVM = viewModel(key = "notes-widget-${widget.id}", factory = NotesWidgetVM.Factory)
LaunchedEffect(widget) {
viewModel.updateWidget(widget)
}
val text by viewModel.noteText
BasicTextField(
value = text,
onValueChange = { viewModel.setText(it) },
modifier = Modifier.fillMaxWidth().padding(16.dp),
textStyle = MaterialTheme.typography.bodyMedium.copy(
color = LocalContentColor.current,
),
cursorBrush = SolidColor(MaterialTheme.colorScheme.primary),
)
}
@@ -0,0 +1,48 @@
package de.mm20.launcher2.ui.launcher.widgets.notes
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.viewmodel.initializer
import androidx.lifecycle.viewmodel.viewModelFactory
import de.mm20.launcher2.services.widgets.WidgetsService
import de.mm20.launcher2.widgets.NotesWidget
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent
import org.koin.core.component.get
class NotesWidgetVM(
private val widgetsService: WidgetsService,
) : ViewModel() {
private val widget = MutableStateFlow<NotesWidget?>(null)
val noteText = mutableStateOf(widget.value?.config?.storedText ?: "")
fun updateWidget(widget: NotesWidget) {
val oldId = this.widget.value?.id
this.widget.value = widget
if (widget.id != oldId) noteText.value = widget.config.storedText
}
private var updateJob: Job? = null
fun setText(text: String) {
noteText.value = text
updateJob?.cancel()
val widget = widget.value ?: return
updateJob = viewModelScope.launch {
delay(1000)
widgetsService.updateWidget(widget.copy(config = widget.config.copy(storedText = text)))
}
}
companion object: KoinComponent {
val Factory = viewModelFactory {
initializer {
NotesWidgetVM(get())
}
}
}
}