NoteWidget: ensure that linked file is properly reloaded on resume

This commit is contained in:
MM20 2023-06-14 21:31:21 +02:00
parent 9f0d441538
commit 3fada7ae97
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
2 changed files with 64 additions and 45 deletions

View File

@ -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

View File

@ -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