NoteWidget: ensure that linked file is properly reloaded on resume
This commit is contained in:
parent
9f0d441538
commit
3fada7ae97
@ -100,8 +100,11 @@ fun NotesWidget(
|
|||||||
val isLastWidget by viewModel.isLastNoteWidget.collectAsState(null)
|
val isLastWidget by viewModel.isLastNoteWidget.collectAsState(null)
|
||||||
|
|
||||||
LaunchedEffect(widget) {
|
LaunchedEffect(widget) {
|
||||||
|
viewModel.updateWidget(context, widget)
|
||||||
|
}
|
||||||
|
LaunchedEffect(Unit) {
|
||||||
lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
lifecycleOwner.lifecycle.repeatOnLifecycle(Lifecycle.State.RESUMED) {
|
||||||
viewModel.updateWidget(context, widget)
|
viewModel.onResume(context)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,7 +492,9 @@ fun SelectableNoteContent(
|
|||||||
onClick = onSelect,
|
onClick = onSelect,
|
||||||
onLongClick = { expanded = !expanded },
|
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(
|
MarkdownText(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package de.mm20.launcher2.ui.launcher.widgets.notes
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
|
import android.util.Log
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.ui.text.input.TextFieldValue
|
import androidx.compose.ui.text.input.TextFieldValue
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
@ -51,55 +52,68 @@ class NotesWidgetVM(
|
|||||||
linkedFileReadError.value = false
|
linkedFileReadError.value = false
|
||||||
linkedFileSavingState.value = LinkedFileSavingState.Saved
|
linkedFileSavingState.value = LinkedFileSavingState.Saved
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
val uri = Uri.parse(file)
|
reloadLinkedFile(context)
|
||||||
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
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
noteText.value = TextFieldValue(widget.config.storedText)
|
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
|
private var updateJob: Job? = null
|
||||||
fun setText(context: Context, text: TextFieldValue) {
|
fun setText(context: Context, text: TextFieldValue) {
|
||||||
noteText.value = text
|
noteText.value = text
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user