From 3fada7ae97cdacc5948a6220831c9ccccb4f85f5 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Wed, 14 Jun 2023 21:31:21 +0200 Subject: [PATCH] NoteWidget: ensure that linked file is properly reloaded on resume --- .../ui/launcher/widgets/notes/NotesWidget.kt | 9 +- .../launcher/widgets/notes/NotesWidgetVM.kt | 100 ++++++++++-------- 2 files changed, 64 insertions(+), 45 deletions(-) diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/notes/NotesWidget.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/notes/NotesWidget.kt index 930a9d9b..4491e830 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/notes/NotesWidget.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/notes/NotesWidget.kt @@ -100,8 +100,11 @@ fun NotesWidget( val isLastWidget by viewModel.isLastNoteWidget.collectAsState(null) LaunchedEffect(widget) { + viewModel.updateWidget(context, widget) + } + LaunchedEffect(Unit) { lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) { - viewModel.updateWidget(context, widget) + viewModel.onResume(context) } } @@ -489,7 +492,9 @@ fun SelectableNoteContent( onClick = onSelect, onLongClick = { expanded = !expanded }, ) - .animateContentSize() then if (expanded) Modifier.heightIn(min = 100.dp) else Modifier.height(100.dp), + .animateContentSize() then if (expanded) Modifier.heightIn(min = 100.dp) else Modifier.height( + 100.dp + ), ) { MarkdownText( modifier = Modifier diff --git a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/notes/NotesWidgetVM.kt b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/notes/NotesWidgetVM.kt index 9fdab2e0..0a35c296 100644 --- a/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/notes/NotesWidgetVM.kt +++ b/app/ui/src/main/java/de/mm20/launcher2/ui/launcher/widgets/notes/NotesWidgetVM.kt @@ -3,6 +3,7 @@ package de.mm20.launcher2.ui.launcher.widgets.notes import android.content.Context import android.content.Intent import android.net.Uri +import android.util.Log import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.ViewModel @@ -51,55 +52,68 @@ class NotesWidgetVM( linkedFileReadError.value = false linkedFileSavingState.value = LinkedFileSavingState.Saved if (file != null) { - val uri = Uri.parse(file) - viewModelScope.launch(Dispatchers.IO) { - try { - context.contentResolver.openInputStream(uri).use { - val text = it?.bufferedReader()?.readText() - if (text != widget.config.storedText) { - when { - widget.config.lastSyncSuccessful -> { - setText(context, TextFieldValue(text ?: "")) - } - text?.isNotBlank() == true && widget.config.storedText.isNotBlank() -> { - if (!widget.config.lastSyncSuccessful) { - linkedFileConflict.value = true - noteText.value = TextFieldValue(text) - } else { - setText(context, TextFieldValue(text)) - } - } - text.isNullOrBlank() -> { - setText(context, TextFieldValue(widget.config.storedText)) - } - else -> { - setText(context, TextFieldValue(text)) - } - } - } else { - noteText.value = TextFieldValue(widget.config.storedText) - } - } - } catch (e: Exception) { - // Catch-all because for some reason the content resolver can throw all sorts of exceptions - CrashReporter.logException(e) - noteText.value = TextFieldValue(widget.config.storedText) - linkedFileReadError.value = true - widgetsService.updateWidget( - widget.copy( - config = widget.config.copy( - lastSyncSuccessful = false - ) - ) - ) - } - } + reloadLinkedFile(context) } else { noteText.value = TextFieldValue(widget.config.storedText) } } } + fun onResume(context: Context) { + val widget = widget.value ?: return + if (widget.config.linkedFile != null) { + reloadLinkedFile(context) + } + } + + private fun reloadLinkedFile(context: Context) { + val widget = widget.value ?: return + val file = widget.config.linkedFile ?: return + val uri = Uri.parse(file) + viewModelScope.launch(Dispatchers.IO) { + try { + context.contentResolver.openInputStream(uri).use { + val text = it?.bufferedReader()?.readText() + if (text != widget.config.storedText) { + when { + widget.config.lastSyncSuccessful -> { + setText(context, TextFieldValue(text ?: "")) + } + text?.isNotBlank() == true && widget.config.storedText.isNotBlank() -> { + if (!widget.config.lastSyncSuccessful) { + linkedFileConflict.value = true + noteText.value = TextFieldValue(text) + } else { + setText(context, TextFieldValue(text)) + } + } + text.isNullOrBlank() -> { + setText(context, TextFieldValue(widget.config.storedText)) + } + else -> { + setText(context, TextFieldValue(text)) + } + } + } else { + noteText.value = TextFieldValue(widget.config.storedText) + } + } + } catch (e: Exception) { + // Catch-all because for some reason the content resolver can throw all sorts of exceptions + CrashReporter.logException(e) + noteText.value = TextFieldValue(widget.config.storedText) + linkedFileReadError.value = true + widgetsService.updateWidget( + widget.copy( + config = widget.config.copy( + lastSyncSuccessful = false + ) + ) + ) + } + } + } + private var updateJob: Job? = null fun setText(context: Context, text: TextFieldValue) { noteText.value = text