From 76cc04c8f401393cd7499b97416c6cdbf1984ea1 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Fri, 3 Jul 2026 23:25:29 +0600 Subject: [PATCH] Fix crash when putting app in background while on notes screen (#3515) --- CHANGELOG.md | 1 + .../presentation/manga/MangaNotesScreen.kt | 2 +- .../kanade/tachiyomi/ui/manga/MangaScreen.kt | 10 ++++++- .../ui/manga/notes/MangaNotesScreen.kt | 29 +++++++++++++++---- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ace2e225d..8ff33a36e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co ### Fixed - Fix Shikimori tracking not working ([@MajorTanya](https://github.com/MajorTanya)) ([#3497](https://github.com/mihonapp/mihon/pull/3497)) +- Fix crash when putting app in background while on notes screen ([@AntsyLich](https://github.com/AntsyLich)) ([#3515](https://github.com/mihonapp/mihon/pull/3515)) ## [v0.20.0] - 2026-06-27 ### Added diff --git a/app/src/main/java/eu/kanade/presentation/manga/MangaNotesScreen.kt b/app/src/main/java/eu/kanade/presentation/manga/MangaNotesScreen.kt index 415e7b728..735bf01e8 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/MangaNotesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/MangaNotesScreen.kt @@ -25,7 +25,7 @@ fun MangaNotesScreen( titleContent = { AppBarTitle( title = stringResource(MR.strings.action_edit_notes), - subtitle = state.manga.title, + subtitle = state.mangaTitle, ) }, navigateUp = navigateUp, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt index f9fcc2f32..ddbbef59c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaScreen.kt @@ -161,7 +161,15 @@ class MangaScreen( onMigrateClicked = { navigator.push(MigrationConfigScreen(successState.manga.id)) }.takeIf { successState.manga.favorite }, - onEditNotesClicked = { navigator.push(MangaNotesScreen(manga = successState.manga)) }, + onEditNotesClicked = { + navigator.push( + MangaNotesScreen( + mangaId = successState.manga.id, + mangaTitle = successState.manga.title, + mangaNotes = successState.manga.notes, + ), + ) + }, onMultiBookmarkClicked = screenModel::bookmarkChapters, onMultiMarkAsReadClicked = screenModel::markChaptersRead, onMarkPreviousAsReadClicked = screenModel::markPreviousChapterRead, diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/notes/MangaNotesScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/notes/MangaNotesScreen.kt index 03ee92df1..4582fa8ca 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/notes/MangaNotesScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/notes/MangaNotesScreen.kt @@ -1,9 +1,14 @@ package eu.kanade.tachiyomi.ui.manga.notes import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.Immutable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.ui.platform.AndroidClipboard +import androidx.compose.ui.platform.LocalClipboard +import androidx.compose.ui.platform.nativeClipboardManager import cafe.adriel.voyager.core.model.StateScreenModel import cafe.adriel.voyager.core.model.rememberScreenModel import cafe.adriel.voyager.core.model.screenModelScope @@ -12,6 +17,7 @@ import cafe.adriel.voyager.navigator.currentOrThrow import eu.kanade.presentation.manga.MangaNotesScreen import eu.kanade.presentation.util.Screen import kotlinx.coroutines.flow.update +import kotlinx.serialization.Serializable import tachiyomi.core.common.util.lang.launchNonCancellable import tachiyomi.domain.manga.interactor.UpdateMangaNotes import tachiyomi.domain.manga.model.Manga @@ -19,13 +25,21 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class MangaNotesScreen( - private val manga: Manga, + private val mangaId: Long, + private val mangaTitle: String, + private val mangaNotes: String, ) : Screen() { @Composable override fun Content() { val navigator = LocalNavigator.currentOrThrow - val screenModel = rememberScreenModel { Model(manga) } + val screenModel = rememberScreenModel { + Model( + mangaId = mangaId, + mangaTitle = mangaTitle, + mangaNotes = mangaNotes, + ) + } val state by screenModel.state.collectAsState() MangaNotesScreen( @@ -36,9 +50,11 @@ class MangaNotesScreen( } private class Model( - private val manga: Manga, + mangaTitle: String, + mangaNotes: String, + private val mangaId: Long, private val updateMangaNotes: UpdateMangaNotes = Injekt.get(), - ) : StateScreenModel(State(manga, manga.notes)) { + ) : StateScreenModel(State(mangaId, mangaTitle, mangaNotes)) { fun updateNotes(content: String) { if (content == state.value.notes) return @@ -48,14 +64,15 @@ class MangaNotesScreen( } screenModelScope.launchNonCancellable { - updateMangaNotes(manga.id, content) + updateMangaNotes(mangaId, content) } } } @Immutable data class State( - val manga: Manga, + val mangaId: Long, + val mangaTitle: String, val notes: String, ) }