Skip to content

Commit a1e0a1c

Browse files
AntsyLichcuong-tran
authored andcommitted
Move archive related code to :core:archive
(cherry picked from commit bd7b354)
1 parent f7b9f37 commit a1e0a1c

File tree

26 files changed

+80
-62
lines changed

26 files changed

+80
-62
lines changed

app/build.gradle.kts

+2-1
Original file line numberDiff line numberDiff line change
@@ -169,11 +169,11 @@ dependencies {
169169
implementation(projects.i18n)
170170
// KMK -->
171171
implementation(projects.i18nKmk)
172-
implementation(projects.flagkit)
173172
// KMK <--
174173
// SY -->
175174
implementation(projects.i18nSy)
176175
// SY <--
176+
implementation(projects.core.archive)
177177
implementation(projects.core.common)
178178
implementation(projects.coreMetadata)
179179
implementation(projects.sourceApi)
@@ -280,6 +280,7 @@ dependencies {
280280
implementation(libs.material.kolor)
281281
implementation(libs.haze)
282282
implementation(compose.colorpicker)
283+
implementation(projects.flagkit)
283284
// KMK <--
284285

285286
// Logging

app/src/main/java/eu/kanade/domain/manga/model/Manga.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import eu.kanade.tachiyomi.data.cache.CoverCache
55
import eu.kanade.tachiyomi.source.model.SManga
66
import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation
77
import eu.kanade.tachiyomi.ui.reader.setting.ReadingMode
8-
import eu.kanade.tachiyomi.util.storage.CbzCrypto
8+
import mihon.core.archive.CbzCrypto
99
import tachiyomi.core.common.preference.TriState
1010
import tachiyomi.core.metadata.comicinfo.ComicInfo
1111
import tachiyomi.core.metadata.comicinfo.ComicInfoPublishingStatus

app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsSecurityScreen.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ import eu.kanade.presentation.more.settings.Preference
4848
import eu.kanade.tachiyomi.core.security.SecurityPreferences
4949
import eu.kanade.tachiyomi.ui.base.delegate.SecureActivityDelegate
5050
import eu.kanade.tachiyomi.ui.category.biometric.BiometricTimesScreen
51-
import eu.kanade.tachiyomi.util.storage.CbzCrypto
5251
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.authenticate
5352
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported
5453
import kotlinx.collections.immutable.persistentListOf
5554
import kotlinx.collections.immutable.toImmutableMap
55+
import mihon.core.archive.CbzCrypto
5656
import tachiyomi.core.common.i18n.stringResource
5757
import tachiyomi.i18n.MR
5858
import tachiyomi.i18n.sy.SYMR

app/src/main/java/eu/kanade/tachiyomi/data/coil/TachiyomiImageDecoder.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ import coil3.fetch.SourceFetchResult
1212
import coil3.request.Options
1313
import coil3.request.bitmapConfig
1414
import com.hippo.unifile.UniFile
15-
import eu.kanade.tachiyomi.util.storage.CbzCrypto
16-
import eu.kanade.tachiyomi.util.storage.CbzCrypto.getCoverStream
1715
import eu.kanade.tachiyomi.util.system.GLUtil
18-
import mihon.core.common.archive.archiveReader
16+
import mihon.core.archive.CbzCrypto
17+
import mihon.core.archive.CbzCrypto.getCoverStream
18+
import mihon.core.archive.archiveReader
1919
import okio.BufferedSource
2020
import tachiyomi.core.common.util.system.ImageUtil
2121
import tachiyomi.decoder.ImageDecoder

app/src/main/java/eu/kanade/tachiyomi/data/download/Downloader.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import eu.kanade.tachiyomi.data.notification.NotificationHandler
1212
import eu.kanade.tachiyomi.source.UnmeteredSource
1313
import eu.kanade.tachiyomi.source.model.Page
1414
import eu.kanade.tachiyomi.source.online.HttpSource
15-
import eu.kanade.tachiyomi.util.storage.CbzCrypto
1615
import eu.kanade.tachiyomi.util.storage.DiskUtil
1716
import eu.kanade.tachiyomi.util.storage.DiskUtil.NOMEDIA_FILE
1817
import eu.kanade.tachiyomi.util.storage.saveTo
@@ -44,7 +43,8 @@ import kotlinx.coroutines.flow.update
4443
import kotlinx.coroutines.launch
4544
import kotlinx.coroutines.supervisorScope
4645
import logcat.LogPriority
47-
import mihon.core.common.archive.ZipWriter
46+
import mihon.core.archive.CbzCrypto
47+
import mihon.core.archive.ZipWriter
4848
import nl.adaptivity.xmlutil.serialization.XML
4949
import okhttp3.Response
5050
import tachiyomi.core.common.i18n.stringResource

app/src/main/java/eu/kanade/tachiyomi/di/AppModule.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ import eu.kanade.tachiyomi.extension.ExtensionManager
2626
import eu.kanade.tachiyomi.network.JavaScriptEngine
2727
import eu.kanade.tachiyomi.network.NetworkHelper
2828
import eu.kanade.tachiyomi.source.AndroidSourceManager
29-
import eu.kanade.tachiyomi.util.storage.CbzCrypto
3029
import exh.eh.EHentaiUpdateHelper
3130
import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory
3231
import kotlinx.serialization.json.Json
3332
import kotlinx.serialization.protobuf.ProtoBuf
33+
import mihon.core.archive.CbzCrypto
3434
import net.zetetic.database.sqlcipher.SupportOpenHelperFactory
3535
import nl.adaptivity.xmlutil.XmlDeclMode
3636
import nl.adaptivity.xmlutil.core.XmlVersion

app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ArchivePageLoader.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import kotlinx.coroutines.async
1313
import kotlinx.coroutines.runBlocking
1414
import kotlinx.coroutines.sync.Mutex
1515
import kotlinx.coroutines.sync.withLock
16-
import mihon.core.common.archive.ArchiveReader
16+
import mihon.core.archive.ArchiveReader
1717
import tachiyomi.core.common.util.system.ImageUtil
1818
import uy.kohesive.injekt.injectLazy
1919
import java.io.File

app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/ChapterLoader.kt

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import eu.kanade.tachiyomi.source.online.HttpSource
88
import eu.kanade.tachiyomi.source.online.all.MergedSource
99
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
1010
import eu.kanade.tachiyomi.ui.reader.setting.ReaderPreferences
11-
import mihon.core.common.archive.archiveReader
11+
import mihon.core.archive.archiveReader
12+
import mihon.core.archive.epubReader
1213
import tachiyomi.core.common.i18n.stringResource
1314
import tachiyomi.core.common.util.lang.withIOContext
1415
import tachiyomi.core.common.util.system.logcat
@@ -127,7 +128,7 @@ class ChapterLoader(
127128
when (format) {
128129
is Format.Directory -> DirectoryPageLoader(format.file)
129130
is Format.Archive -> ArchivePageLoader(format.file.archiveReader(context))
130-
is Format.Epub -> EpubPageLoader(format.file.archiveReader(context))
131+
is Format.Epub -> EpubPageLoader(format.file.epubReader(context))
131132
}
132133
}
133134
else -> error(context.stringResource(MR.strings.loader_not_implemented_error))
@@ -145,7 +146,7 @@ class ChapterLoader(
145146
when (format) {
146147
is Format.Directory -> DirectoryPageLoader(format.file)
147148
is Format.Archive -> ArchivePageLoader(format.file.archiveReader(context))
148-
is Format.Epub -> EpubPageLoader(format.file.archiveReader(context))
149+
is Format.Epub -> EpubPageLoader(format.file.epubReader(context))
149150
}
150151
}
151152
source is HttpSource -> HttpPageLoader(chapter, source)

app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/DownloadPageLoader.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.source.Source
1010
import eu.kanade.tachiyomi.source.model.Page
1111
import eu.kanade.tachiyomi.ui.reader.model.ReaderChapter
1212
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
13-
import mihon.core.common.archive.archiveReader
13+
import mihon.core.archive.archiveReader
1414
import tachiyomi.domain.manga.model.Manga
1515
import uy.kohesive.injekt.injectLazy
1616

app/src/main/java/eu/kanade/tachiyomi/ui/reader/loader/EpubPageLoader.kt

+8-13
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,22 @@ package eu.kanade.tachiyomi.ui.reader.loader
22

33
import eu.kanade.tachiyomi.source.model.Page
44
import eu.kanade.tachiyomi.ui.reader.model.ReaderPage
5-
import eu.kanade.tachiyomi.util.storage.EpubFile
6-
import mihon.core.common.archive.ArchiveReader
5+
import mihon.core.archive.EpubReader
76

87
/**
98
* Loader used to load a chapter from a .epub file.
109
*/
11-
internal class EpubPageLoader(reader: ArchiveReader) : PageLoader() {
12-
13-
private val epub = EpubFile(reader)
10+
internal class EpubPageLoader(private val reader: EpubReader) : PageLoader() {
1411

1512
override var isLocal: Boolean = true
1613

1714
override suspend fun getPages(): List<ReaderPage> {
18-
return epub.getImagesFromPages()
19-
.mapIndexed { i, path ->
20-
val streamFn = { epub.getInputStream(path)!! }
21-
ReaderPage(i).apply {
22-
stream = streamFn
23-
status = Page.State.READY
24-
}
15+
return reader.getImagesFromPages().mapIndexed { i, path ->
16+
ReaderPage(i).apply {
17+
stream = { reader.getInputStream(path)!! }
18+
status = Page.State.READY
2519
}
20+
}
2621
}
2722

2823
override suspend fun loadPage(page: ReaderPage) {
@@ -31,6 +26,6 @@ internal class EpubPageLoader(reader: ArchiveReader) : PageLoader() {
3126

3227
override fun recycle() {
3328
super.recycle()
34-
epub.close()
29+
reader.close()
3530
}
3631
}

core/archive/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

core/archive/build.gradle.kts

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
plugins {
2+
id("mihon.library")
3+
kotlin("android")
4+
kotlin("plugin.serialization")
5+
}
6+
7+
android {
8+
namespace = "mihon.core.archive"
9+
}
10+
11+
dependencies {
12+
implementation(libs.jsoup)
13+
implementation(libs.libarchive)
14+
implementation(libs.unifile)
15+
// KMK -->
16+
implementation(projects.core.common)
17+
implementation(libs.injekt.core)
18+
// KMK <--
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest />

core/common/src/main/kotlin/mihon/core/common/archive/ArchiveEntry.kt core/archive/src/main/kotlin/mihon/core/archive/ArchiveEntry.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package mihon.core.common.archive
1+
package mihon.core.archive
22

33
class ArchiveEntry(
44
val name: String,

core/common/src/main/kotlin/mihon/core/common/archive/ArchiveInputStream.kt core/archive/src/main/kotlin/mihon/core/archive/ArchiveInputStream.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
package mihon.core.common.archive
1+
package mihon.core.archive
22

3-
import eu.kanade.tachiyomi.util.storage.CbzCrypto
43
import me.zhanghai.android.libarchive.Archive
54
import me.zhanghai.android.libarchive.ArchiveEntry
65
import me.zhanghai.android.libarchive.ArchiveException

core/common/src/main/kotlin/mihon/core/common/archive/ArchiveReader.kt core/archive/src/main/kotlin/mihon/core/archive/ArchiveReader.kt

+1-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
package mihon.core.common.archive
1+
package mihon.core.archive
22

3-
import android.content.Context
43
import android.os.ParcelFileDescriptor
54
import android.system.Os
65
import android.system.OsConstants
7-
import com.hippo.unifile.UniFile
86
import me.zhanghai.android.libarchive.ArchiveException
9-
import tachiyomi.core.common.storage.openFileDescriptor
107
import java.io.Closeable
118
import java.io.InputStream
129

@@ -90,5 +87,3 @@ class ArchiveReader(pfd: ParcelFileDescriptor) : Closeable {
9087
Os.munmap(address, size)
9188
}
9289
}
93-
94-
fun UniFile.archiveReader(context: Context) = openFileDescriptor(context, "r").use { ArchiveReader(it) }

core/common/src/main/kotlin/eu/kanade/tachiyomi/util/storage/CbzCrypto.kt core/archive/src/main/kotlin/mihon/core/archive/CbzCrypto.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package eu.kanade.tachiyomi.util.storage
1+
package mihon.core.archive
22

33
import android.security.keystore.KeyGenParameterSpec
44
import android.security.keystore.KeyProperties
@@ -9,7 +9,6 @@ import kotlinx.coroutines.flow.SharingStarted
99
import kotlinx.coroutines.flow.StateFlow
1010
import kotlinx.coroutines.flow.map
1111
import kotlinx.coroutines.flow.stateIn
12-
import mihon.core.common.archive.ArchiveReader
1312
import tachiyomi.core.common.util.system.ImageUtil
1413
import uy.kohesive.injekt.injectLazy
1514
import java.io.BufferedInputStream

core/common/src/main/kotlin/eu/kanade/tachiyomi/util/storage/EpubFile.kt core/archive/src/main/kotlin/mihon/core/archive/EpubReader.kt

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
package eu.kanade.tachiyomi.util.storage
1+
package mihon.core.archive
22

3-
import mihon.core.common.archive.ArchiveReader
43
import org.jsoup.Jsoup
54
import org.jsoup.nodes.Document
65
import java.io.Closeable
76
import java.io.File
87
import java.io.InputStream
98

109
/**
11-
* Wrapper over ZipFile to load files in epub format.
10+
* Wrapper over ArchiveReader to load files in epub format.
1211
*/
13-
class EpubFile(private val reader: ArchiveReader) : Closeable by reader {
12+
class EpubReader(private val reader: ArchiveReader) : Closeable by reader {
1413

1514
/**
1615
* Path separator used by this epub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package mihon.core.archive
2+
3+
import android.content.Context
4+
import android.os.ParcelFileDescriptor
5+
import com.hippo.unifile.UniFile
6+
7+
internal fun UniFile.openFileDescriptor(context: Context, mode: String): ParcelFileDescriptor =
8+
context.contentResolver.openFileDescriptor(uri, mode) ?: error("Failed to open file descriptor: ${filePath ?: uri}")
9+
10+
fun UniFile.archiveReader(context: Context) = openFileDescriptor(context, "r").use { ArchiveReader(it) }
11+
12+
fun UniFile.epubReader(context: Context) = EpubReader(archiveReader(context))

core/common/src/main/kotlin/mihon/core/common/archive/ZipWriter.kt core/archive/src/main/kotlin/mihon/core/archive/ZipWriter.kt

+5-7
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
package mihon.core.common.archive
1+
package mihon.core.archive
22

33
import android.content.Context
44
import android.system.Os
55
import android.system.StructStat
66
import com.hippo.unifile.UniFile
7-
import eu.kanade.tachiyomi.util.storage.CbzCrypto
87
import me.zhanghai.android.libarchive.Archive
98
import me.zhanghai.android.libarchive.ArchiveEntry
109
import me.zhanghai.android.libarchive.ArchiveEntry.AE_IFREG
1110
import me.zhanghai.android.libarchive.ArchiveException
12-
import tachiyomi.core.common.storage.openFileDescriptor
1311
import java.io.Closeable
1412
import java.nio.ByteBuffer
1513

@@ -110,10 +108,10 @@ private fun StructStat.toArchiveStat() = ArchiveEntry.StructStat().apply {
110108
stSize = st_size
111109
stBlksize = st_blksize
112110
stBlocks = st_blocks
113-
stAtim = timespec(st_atime)
114-
stMtim = timespec(st_mtime)
115-
stCtim = timespec(st_ctime)
111+
stAtim = st_atime.toTimespec()
112+
stMtim = st_mtime.toTimespec()
113+
stCtim = st_ctime.toTimespec()
116114
stIno = st_ino
117115
}
118116

119-
private fun timespec(tvSec: Long) = ArchiveEntry.StructTimespec().also { it.tvSec = tvSec }
117+
private fun Long.toTimespec() = ArchiveEntry.StructTimespec().also { it.tvSec = this }
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package tachiyomi.core.common.storage
22

3-
import android.content.Context
4-
import android.os.ParcelFileDescriptor
53
import com.hippo.unifile.UniFile
64

75
val UniFile.extension: String?
@@ -12,6 +10,3 @@ val UniFile.nameWithoutExtension: String?
1210

1311
val UniFile.displayablePath: String
1412
get() = filePath ?: uri.toString()
15-
16-
fun UniFile.openFileDescriptor(context: Context, mode: String): ParcelFileDescriptor =
17-
context.contentResolver.openFileDescriptor(uri, mode) ?: error("Failed to open file descriptor: $displayablePath")

settings.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
4343
rootProject.name = "Komikku"
4444
include(":app")
4545
include(":core-metadata")
46+
include(":core:archive")
4647
include(":core:common")
4748
include(":data")
4849
include(":domain")

source-local/build.gradle.kts

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ kotlin {
1919
}
2020
val androidMain by getting {
2121
dependencies {
22+
implementation(projects.core.archive)
2223
implementation(projects.core.common)
2324
implementation(projects.coreMetadata)
2425

source-local/src/androidMain/kotlin/tachiyomi/source/local/LocalSource.kt

+5-5
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ import eu.kanade.tachiyomi.source.model.Page
1111
import eu.kanade.tachiyomi.source.model.SChapter
1212
import eu.kanade.tachiyomi.source.model.SManga
1313
import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder
14-
import eu.kanade.tachiyomi.util.storage.EpubFile
1514
import kotlinx.coroutines.async
1615
import kotlinx.coroutines.awaitAll
1716
import kotlinx.serialization.json.Json
1817
import kotlinx.serialization.json.decodeFromStream
1918
import logcat.LogPriority
20-
import mihon.core.common.archive.ZipWriter
21-
import mihon.core.common.archive.archiveReader
19+
import mihon.core.archive.ZipWriter
20+
import mihon.core.archive.archiveReader
21+
import mihon.core.archive.epubReader
2222
import nl.adaptivity.xmlutil.AndroidXmlReader
2323
import nl.adaptivity.xmlutil.serialization.XML
2424
import tachiyomi.core.common.i18n.stringResource
@@ -344,7 +344,7 @@ actual class LocalSource(
344344

345345
val format = Format.valueOf(chapterFile)
346346
if (format is Format.Epub) {
347-
EpubFile(format.file.archiveReader(context)).use { epub ->
347+
format.file.epubReader(context).use { epub ->
348348
epub.fillMetadata(manga, this)
349349
}
350350
}
@@ -414,7 +414,7 @@ actual class LocalSource(
414414
}
415415
}
416416
is Format.Epub -> {
417-
EpubFile(format.file.archiveReader(context)).use { epub ->
417+
format.file.epubReader(context).use { epub ->
418418
val entry = epub.getImagesFromPages().firstOrNull()
419419

420420
entry?.let { coverManager.update(manga, epub.getInputStream(it)!!) }

source-local/src/androidMain/kotlin/tachiyomi/source/local/image/LocalCoverManager.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import android.content.Context
44
import com.hippo.unifile.UniFile
55
import eu.kanade.tachiyomi.source.model.SManga
66
import eu.kanade.tachiyomi.util.storage.DiskUtil
7-
import mihon.core.common.archive.ZipWriter
7+
import mihon.core.archive.ZipWriter
88
import tachiyomi.core.common.storage.nameWithoutExtension
99
import tachiyomi.core.common.util.system.ImageUtil
1010
import tachiyomi.source.local.io.LocalSourceFileSystem

0 commit comments

Comments
 (0)