Przeglądaj źródła

feat: 漫画返回键直接退出阅读

HapeLee 1 miesiąc temu
rodzic
commit
531f1c8a7e

+ 1 - 0
app/src/main/java/io/legado/app/ui/book/manga/MangaReaderContract.kt

@@ -217,6 +217,7 @@ sealed interface MangaReaderIntent {
     data object OpenSourceEdit : MangaReaderIntent
     data class SourceCustomButton(val longClick: Boolean) : MangaReaderIntent
     data object BackPressed : MangaReaderIntent
+    data object CloseReader : MangaReaderIntent
     data object ToggleMenu : MangaReaderIntent
     data object HideMenu : MangaReaderIntent
     data object Retry : MangaReaderIntent

+ 21 - 0
app/src/main/java/io/legado/app/ui/book/manga/MangaReaderInteraction.kt

@@ -211,3 +211,24 @@ internal class MangaWebtoonResizeQueue {
         if (changes.isNotEmpty()) apply { changes.forEach { it() } }
     }
 }
+
+internal enum class MangaBackAction {
+    DISMISS_DIALOG,
+    DISMISS_SHEET,
+    CLOSE_SETTINGS,
+    HIDE_MENU,
+    CLOSE_READER,
+}
+
+internal fun resolveMangaBackAction(
+    hasActiveDialog: Boolean,
+    hasActiveSheet: Boolean,
+    hasSettingsCategory: Boolean,
+    menuVisible: Boolean,
+): MangaBackAction = when {
+    hasActiveDialog -> MangaBackAction.DISMISS_DIALOG
+    hasActiveSheet -> MangaBackAction.DISMISS_SHEET
+    hasSettingsCategory -> MangaBackAction.CLOSE_SETTINGS
+    menuVisible -> MangaBackAction.HIDE_MENU
+    else -> MangaBackAction.CLOSE_READER
+}

+ 1 - 1
app/src/main/java/io/legado/app/ui/book/manga/MangaReaderOverlays.kt

@@ -235,7 +235,7 @@ private fun MangaMenuTopBar(
                 description = stringResource(R.string.back),
                 glassEnabled = topBarGlass,
                 backdrop = backdrop,
-                onClick = { onIntent(MangaReaderIntent.BackPressed) },
+                onClick = { onIntent(MangaReaderIntent.CloseReader) },
             )
             MangaTitleCapsule(state, onIntent, glassEnabled = topBarGlass, backdrop = backdrop)
             if (compact) {

+ 44 - 15
app/src/main/java/io/legado/app/ui/book/manga/MangaReaderViewModel.kt

@@ -197,27 +197,29 @@ class MangaReaderViewModel(
                 )
             }
             MangaReaderIntent.BackPressed -> {
-                when {
-                    _uiState.value.activeDialog != null -> {
+                when (
+                    resolveMangaBackAction(
+                        hasActiveDialog = _uiState.value.activeDialog != null,
+                        hasActiveSheet = _uiState.value.activeSheet != null,
+                        hasSettingsCategory = _uiState.value.settingsCategory != null,
+                        menuVisible = _uiState.value.menuVisible,
+                    )
+                ) {
+                    MangaBackAction.DISMISS_DIALOG -> {
                         _uiState.update { it.copy(activeDialog = null) }
                     }
-                    _uiState.value.activeSheet != null -> {
+
+                    MangaBackAction.DISMISS_SHEET -> {
                         _uiState.update { it.copy(activeSheet = null) }
                     }
-                    _uiState.value.settingsCategory != null -> closeSettings()
-                    _uiState.value.menuVisible -> setMenuVisible(false)
-                    readerSession.state.value.book != null &&
-                            readerSession.state.value.book?.inBookshelf == false &&
-                            _uiState.value.confirmAddToShelf -> {
-                        _uiState.update { it.copy(activeDialog = MangaReaderDialog.AddToShelf) }
-                    }
-                    readerSession.state.value.book != null &&
-                            readerSession.state.value.book?.inBookshelf == false -> onIntent(
-                        MangaReaderIntent.DiscardCurrentBookAndExit
-                    )
-                    else -> _effects.tryEmit(MangaReaderEffect.Finish())
+
+                    MangaBackAction.CLOSE_SETTINGS -> closeSettings()
+                    MangaBackAction.HIDE_MENU -> setMenuVisible(false)
+                    MangaBackAction.CLOSE_READER -> closeReader()
                 }
             }
+
+            MangaReaderIntent.CloseReader -> closeReader()
             MangaReaderIntent.ToggleMenu -> setMenuVisible(!_uiState.value.menuVisible)
             MangaReaderIntent.HideMenu -> setMenuVisible(false)
             MangaReaderIntent.Retry -> launchAction {
@@ -761,6 +763,33 @@ class MangaReaderViewModel(
         _effects.tryEmit(effect)
     }
 
+    private fun closeReader() {
+        when {
+            readerSession.state.value.book != null &&
+                    readerSession.state.value.book?.inBookshelf == false &&
+                    _uiState.value.confirmAddToShelf -> {
+                setMenuVisible(false)
+                _uiState.update {
+                    it.copy(
+                        activeDialog = MangaReaderDialog.AddToShelf,
+                        activeSheet = null,
+                    )
+                }
+            }
+
+            readerSession.state.value.book != null &&
+                    readerSession.state.value.book?.inBookshelf == false -> {
+                setMenuVisible(false)
+                onIntent(MangaReaderIntent.DiscardCurrentBookAndExit)
+            }
+
+            else -> {
+                setMenuVisible(false)
+                _effects.tryEmit(MangaReaderEffect.Finish())
+            }
+        }
+    }
+
     private fun showSheet(sheet: MangaReaderSheet) {
         setMenuVisible(false)
         _uiState.update { it.copy(activeSheet = sheet) }

+ 49 - 0
app/src/test/java/io/legado/app/ui/book/manga/MangaReaderInteractionTest.kt

@@ -610,4 +610,53 @@ class MangaReaderInteractionTest {
         assertTrue(isDoublePageActive(MangaDoublePageMode.LANDSCAPE, IntSize(1000, 600)))
         assertFalse(isDoublePageActive(MangaDoublePageMode.LANDSCAPE, IntSize(600, 1000)))
     }
+
+    @Test
+    fun `back action prioritizes dialog then sheet then settings then menu then close reader`() {
+        assertEquals(
+            MangaBackAction.DISMISS_DIALOG,
+            resolveMangaBackAction(
+                hasActiveDialog = true,
+                hasActiveSheet = true,
+                hasSettingsCategory = true,
+                menuVisible = true,
+            ),
+        )
+        assertEquals(
+            MangaBackAction.DISMISS_SHEET,
+            resolveMangaBackAction(
+                hasActiveDialog = false,
+                hasActiveSheet = true,
+                hasSettingsCategory = true,
+                menuVisible = true,
+            ),
+        )
+        assertEquals(
+            MangaBackAction.CLOSE_SETTINGS,
+            resolveMangaBackAction(
+                hasActiveDialog = false,
+                hasActiveSheet = false,
+                hasSettingsCategory = true,
+                menuVisible = true,
+            ),
+        )
+        assertEquals(
+            MangaBackAction.HIDE_MENU,
+            resolveMangaBackAction(
+                hasActiveDialog = false,
+                hasActiveSheet = false,
+                hasSettingsCategory = false,
+                menuVisible = true,
+            ),
+        )
+        assertEquals(
+            MangaBackAction.CLOSE_READER,
+            resolveMangaBackAction(
+                hasActiveDialog = false,
+                hasActiveSheet = false,
+                hasSettingsCategory = false,
+                menuVisible = false,
+            ),
+        )
+    }
 }