Skip to content

Commit f839334

Browse files
Animeboynzcuong-tran
authored andcommitted
Add option to backup non-library read entries (mihonapp/mihon#1324)
Co-authored-by: jobobby04 <[email protected]> Co-authored-by: AntsyLich <[email protected]> (cherry picked from commit de36357) (cherry picked from commit 943555c0af49b48abaa18a47395e5516f3357bae)
1 parent 221508b commit f839334

File tree

9 files changed

+44
-36
lines changed

9 files changed

+44
-36
lines changed

app/src/main/java/eu/kanade/domain/SYDomainModule.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import tachiyomi.domain.manga.interactor.GetMergedManga
4343
import tachiyomi.domain.manga.interactor.GetMergedMangaById
4444
import tachiyomi.domain.manga.interactor.GetMergedMangaForDownloading
4545
import tachiyomi.domain.manga.interactor.GetMergedReferencesById
46-
import tachiyomi.domain.manga.interactor.GetReadMangaNotInLibrary
46+
import tachiyomi.domain.manga.interactor.GetReadMangaNotInLibraryView
4747
import tachiyomi.domain.manga.interactor.GetSearchMetadata
4848
import tachiyomi.domain.manga.interactor.GetSearchTags
4949
import tachiyomi.domain.manga.interactor.GetSearchTitles
@@ -104,7 +104,7 @@ class SYDomainModule : InjektModule {
104104
addFactory { GetPagePreviews(get(), get()) }
105105
addFactory { SearchEngine() }
106106
addFactory { IsTrackUnfollowed() }
107-
addFactory { GetReadMangaNotInLibrary(get()) }
107+
addFactory { GetReadMangaNotInLibraryView(get()) }
108108

109109
// Required for [MetadataSource]
110110
addFactory<MetadataSource.GetMangaId> { GetManga(get()) }

app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupCreator.kt

+9-10
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,11 @@ import okio.gzip
2828
import okio.sink
2929
import tachiyomi.core.common.i18n.stringResource
3030
import tachiyomi.core.common.util.system.logcat
31-
import tachiyomi.data.DatabaseHandler
32-
import tachiyomi.data.manga.MangaMapper
3331
import tachiyomi.domain.backup.service.BackupPreferences
3432
import tachiyomi.domain.manga.interactor.GetFavorites
3533
import tachiyomi.domain.manga.interactor.GetMergedManga
3634
import tachiyomi.domain.manga.model.Manga
35+
import tachiyomi.domain.manga.repository.MangaRepository
3736
import tachiyomi.i18n.MR
3837
import uy.kohesive.injekt.Injekt
3938
import uy.kohesive.injekt.api.get
@@ -50,6 +49,7 @@ class BackupCreator(
5049
private val parser: ProtoBuf = Injekt.get(),
5150
private val getFavorites: GetFavorites = Injekt.get(),
5251
private val backupPreferences: BackupPreferences = Injekt.get(),
52+
private val mangaRepository: MangaRepository = Injekt.get(),
5353

5454
private val categoriesBackupCreator: CategoriesBackupCreator = CategoriesBackupCreator(),
5555
private val mangaBackupCreator: MangaBackupCreator = MangaBackupCreator(),
@@ -62,7 +62,6 @@ class BackupCreator(
6262
// SY -->
6363
private val savedSearchBackupCreator: SavedSearchBackupCreator = SavedSearchBackupCreator(),
6464
private val getMergedManga: GetMergedManga = Injekt.get(),
65-
private val handler: DatabaseHandler = Injekt.get(),
6665
// SY <--
6766
) {
6867

@@ -90,13 +89,13 @@ class BackupCreator(
9089
throw IllegalStateException(context.stringResource(MR.strings.create_backup_file_error))
9190
}
9291

93-
val databaseManga = getFavorites.await() /* SY --> */ +
94-
if (options.readEntries) {
95-
handler.awaitList { mangasQueries.getReadMangaNotInLibrary(MangaMapper::mapManga) }
96-
} else {
97-
emptyList()
98-
} + getMergedManga.await() // SY <--
99-
val backupManga = backupMangas(databaseManga, options)
92+
val nonFavoriteManga = if (options.readEntries) mangaRepository.getReadMangaNotInLibrary() else emptyList()
93+
// SY -->
94+
val mergedManga = getMergedManga.await()
95+
// SY <--
96+
val backupManga =
97+
backupMangas(getFavorites.await() + nonFavoriteManga /* SY --> */ + mergedManga /* SY <-- */, options)
98+
10099
val backup = Backup(
101100
backupManga = backupManga,
102101
backupCategories = backupCategories(options),

app/src/main/java/eu/kanade/tachiyomi/data/backup/create/BackupOptions.kt

+14-14
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ data class BackupOptions(
1212
val chapters: Boolean = true,
1313
val tracking: Boolean = true,
1414
val history: Boolean = true,
15+
val readEntries: Boolean = true,
1516
val appSettings: Boolean = true,
1617
val extensionRepoSettings: Boolean = true,
1718
val sourceSettings: Boolean = true,
1819
val privateSettings: Boolean = false,
1920
// SY -->
2021
val customInfo: Boolean = true,
21-
val readEntries: Boolean = true,
2222
val savedSearchesFeeds: Boolean = true,
2323
// SY <--
2424
) {
@@ -29,13 +29,13 @@ data class BackupOptions(
2929
chapters,
3030
tracking,
3131
history,
32+
readEntries,
3233
appSettings,
3334
extensionRepoSettings,
3435
sourceSettings,
3536
privateSettings,
3637
// SY -->
3738
customInfo,
38-
readEntries,
3939
savedSearchesFeeds,
4040
// SY <--
4141
)
@@ -73,19 +73,19 @@ data class BackupOptions(
7373
getter = BackupOptions::categories,
7474
setter = { options, enabled -> options.copy(categories = enabled) },
7575
),
76+
Entry(
77+
label = MR.strings.non_library_settings,
78+
getter = BackupOptions::readEntries,
79+
setter = { options, enabled -> options.copy(readEntries = enabled) },
80+
enabled = { it.libraryEntries },
81+
),
7682
// SY -->
7783
Entry(
7884
label = SYMR.strings.custom_entry_info,
7985
getter = BackupOptions::customInfo,
8086
setter = { options, enabled -> options.copy(customInfo = enabled) },
8187
enabled = { it.libraryEntries },
8288
),
83-
Entry(
84-
label = SYMR.strings.all_read_entries,
85-
getter = BackupOptions::readEntries,
86-
setter = { options, enabled -> options.copy(readEntries = enabled) },
87-
enabled = { it.libraryEntries },
88-
),
8989
Entry(
9090
// KMK-->
9191
label = KMR.strings.saved_searches_feeds,
@@ -126,13 +126,13 @@ data class BackupOptions(
126126
chapters = array[2],
127127
tracking = array[3],
128128
history = array[4],
129-
appSettings = array[5],
130-
extensionRepoSettings = array[6],
131-
sourceSettings = array[7],
132-
privateSettings = array[8],
129+
readEntries = array[5],
130+
appSettings = array[6],
131+
extensionRepoSettings = array[7],
132+
sourceSettings = array[8],
133+
privateSettings = array[9],
133134
// SY -->
134-
customInfo = array[9],
135-
readEntries = array[10],
135+
customInfo = array[10],
136136
savedSearchesFeeds = array[11],
137137
// SY <--
138138
)

app/src/main/java/eu/kanade/tachiyomi/ui/stats/StatsScreenModel.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_HAS_U
2424
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_COMPLETED
2525
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_READ
2626
import tachiyomi.domain.manga.interactor.GetLibraryManga
27-
import tachiyomi.domain.manga.interactor.GetReadMangaNotInLibrary
27+
import tachiyomi.domain.manga.interactor.GetReadMangaNotInLibraryView
2828
import tachiyomi.domain.track.interactor.GetTracks
2929
import tachiyomi.domain.track.model.Track
3030
import tachiyomi.source.local.isLocal
@@ -39,7 +39,7 @@ class StatsScreenModel(
3939
private val preferences: LibraryPreferences = Injekt.get(),
4040
private val trackerManager: TrackerManager = Injekt.get(),
4141
// SY -->
42-
private val getReadMangaNotInLibrary: GetReadMangaNotInLibrary = Injekt.get(),
42+
private val getReadMangaNotInLibraryView: GetReadMangaNotInLibraryView = Injekt.get(),
4343
// SY <--
4444
) : StateScreenModel<StatsScreenState>(StatsScreenState.Loading) {
4545

@@ -55,7 +55,7 @@ class StatsScreenModel(
5555
_allRead.onEach { allRead ->
5656
mutableState.update { StatsScreenState.Loading }
5757
val libraryManga = getLibraryManga.await() + if (allRead) {
58-
getReadMangaNotInLibrary.await()
58+
getReadMangaNotInLibraryView.await()
5959
} else {
6060
emptyList()
6161
}

data/src/main/java/tachiyomi/data/manga/MangaRepositoryImpl.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ class MangaRepositoryImpl(
5151
return handler.awaitList { mangasQueries.getFavorites(MangaMapper::mapManga) }
5252
}
5353

54+
override suspend fun getReadMangaNotInLibrary(): List<Manga> {
55+
return handler.awaitList { mangasQueries.getReadMangaNotInLibrary(MangaMapper::mapManga) }
56+
}
57+
5458
override suspend fun getLibraryManga(): List<LibraryManga> {
5559
return handler.awaitListExecutable {
5660
(handler as AndroidDatabaseHandler).getLibraryQuery()
@@ -198,7 +202,7 @@ class MangaRepositoryImpl(
198202
handler.await { mangasQueries.deleteById(mangaId) }
199203
}
200204

201-
override suspend fun getReadMangaNotInLibrary(): List<LibraryManga> {
205+
override suspend fun getReadMangaNotInLibraryView(): List<LibraryManga> {
202206
return handler.awaitListExecutable {
203207
(handler as AndroidDatabaseHandler).getLibraryQuery("M.favorite = 0 AND C.readCount != 0")
204208
}.map(MangaMapper::mapLibraryView)

data/src/main/sqldelight/tachiyomi/data/mangas.sq

+5-3
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,12 @@ FROM mangas
8080
WHERE favorite = 1;
8181

8282
getReadMangaNotInLibrary:
83-
SELECT mangas.*
83+
SELECT *
8484
FROM mangas
85-
WHERE favorite = 0 AND _id IN(
86-
SELECT chapters.manga_id FROM chapters WHERE read = 1 OR last_page_read != 0
85+
WHERE favorite = 0 AND _id IN (
86+
SELECT DISTINCT chapters.manga_id
87+
FROM chapters
88+
WHERE read = 1 OR last_page_read != 0
8789
);
8890

8991
getAllManga:

domain/src/main/java/tachiyomi/domain/manga/interactor/GetReadMangaNotInLibrary.kt domain/src/main/java/tachiyomi/domain/manga/interactor/GetReadMangaNotInLibraryView.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ package tachiyomi.domain.manga.interactor
33
import tachiyomi.domain.library.model.LibraryManga
44
import tachiyomi.domain.manga.repository.MangaRepository
55

6-
class GetReadMangaNotInLibrary(
6+
class GetReadMangaNotInLibraryView(
77
private val mangaRepository: MangaRepository,
88
) {
99

1010
suspend fun await(): List<LibraryManga> {
11-
return mangaRepository.getReadMangaNotInLibrary()
11+
return mangaRepository.getReadMangaNotInLibraryView()
1212
}
1313
}

domain/src/main/java/tachiyomi/domain/manga/repository/MangaRepository.kt

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ interface MangaRepository {
1717

1818
suspend fun getFavorites(): List<Manga>
1919

20+
suspend fun getReadMangaNotInLibrary(): List<Manga>
21+
2022
suspend fun getLibraryManga(): List<LibraryManga>
2123

2224
fun getLibraryMangaAsFlow(): Flow<List<LibraryManga>>
@@ -44,6 +46,6 @@ interface MangaRepository {
4446

4547
suspend fun deleteManga(mangaId: Long)
4648

47-
suspend fun getReadMangaNotInLibrary(): List<LibraryManga>
49+
suspend fun getReadMangaNotInLibraryView(): List<LibraryManga>
4850
// SY <--
4951
}

i18n/src/commonMain/moko-resources/base/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,7 @@
540540
<string name="source_settings">Source settings</string>
541541
<string name="extensionRepo_settings">Extension repos</string>
542542
<string name="private_settings">Include sensitive settings (e.g., tracker login tokens)</string>
543+
<string name="non_library_settings">All read entries</string>
543544
<string name="creating_backup">Creating backup</string>
544545
<string name="creating_backup_error">Backup failed</string>
545546
<string name="missing_storage_permission">Storage permissions not granted</string>

0 commit comments

Comments
 (0)