From 9a815f28fab903d15a3c15f5469bbca46d8d4271 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Thu, 15 Jun 2023 06:09:27 +0530 Subject: [PATCH] Add Parceler implementations for Manga classes. --- .../core/model/parcelable/Parcelable.kt | 98 ---------------- .../core/model/parcelable/ParcelableManga.kt | 107 +++++++++++------- .../parcelable/ParcelableMangaChapters.kt | 56 +++++---- .../model/parcelable/ParcelableMangaPage.kt | 29 +++++ .../model/parcelable/ParcelableMangaPages.kt | 39 ------- .../model/parcelable/ParcelableMangaTags.kt | 47 +++----- .../kotatsu/details/ui/DetailsActivity.kt | 2 +- .../kotatsu/reader/ui/ReaderActivity.kt | 2 +- .../colorfilter/ColorFilterConfigActivity.kt | 4 +- .../colorfilter/ColorFilterConfigViewModel.kt | 4 +- .../ui/thumbnails/PagesThumbnailsSheet.kt | 2 +- 11 files changed, 147 insertions(+), 243 deletions(-) delete mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt create mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaPage.kt delete mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaPages.kt diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt deleted file mode 100644 index e774ce82e..000000000 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt +++ /dev/null @@ -1,98 +0,0 @@ -package org.koitharu.kotatsu.core.model.parcelable - -import android.os.Parcel -import androidx.core.os.ParcelCompat -import org.koitharu.kotatsu.core.util.ext.readParcelableCompat -import org.koitharu.kotatsu.core.util.ext.readSerializableCompat -import org.koitharu.kotatsu.parsers.model.Manga -import org.koitharu.kotatsu.parsers.model.MangaChapter -import org.koitharu.kotatsu.parsers.model.MangaPage -import org.koitharu.kotatsu.parsers.model.MangaTag - -fun Manga.writeToParcel(out: Parcel, flags: Int, withChapters: Boolean) { - out.writeLong(id) - out.writeString(title) - out.writeString(altTitle) - out.writeString(url) - out.writeString(publicUrl) - out.writeFloat(rating) - ParcelCompat.writeBoolean(out, isNsfw) - out.writeString(coverUrl) - out.writeString(largeCoverUrl) - out.writeString(description) - out.writeParcelable(ParcelableMangaTags(tags), flags) - out.writeSerializable(state) - out.writeString(author) - if (withChapters) { - out.writeParcelable(chapters?.let(::ParcelableMangaChapters), flags) - } else { - out.writeString(null) - } - out.writeSerializable(source) -} - -fun Parcel.readManga() = Manga( - id = readLong(), - title = requireNotNull(readString()), - altTitle = readString(), - url = requireNotNull(readString()), - publicUrl = requireNotNull(readString()), - rating = readFloat(), - isNsfw = ParcelCompat.readBoolean(this), - coverUrl = requireNotNull(readString()), - largeCoverUrl = readString(), - description = readString(), - tags = requireNotNull(readParcelableCompat()).tags, - state = readSerializableCompat(), - author = readString(), - chapters = readParcelableCompat()?.chapters, - source = checkNotNull(readSerializableCompat()), -) - -fun MangaPage.writeToParcel(out: Parcel) { - out.writeLong(id) - out.writeString(url) - out.writeString(preview) - out.writeSerializable(source) -} - -fun Parcel.readMangaPage() = MangaPage( - id = readLong(), - url = requireNotNull(readString()), - preview = readString(), - source = checkNotNull(readSerializableCompat()), -) - -fun MangaChapter.writeToParcel(out: Parcel) { - out.writeLong(id) - out.writeString(name) - out.writeInt(number) - out.writeString(url) - out.writeString(scanlator) - out.writeLong(uploadDate) - out.writeString(branch) - out.writeSerializable(source) -} - -fun Parcel.readMangaChapter() = MangaChapter( - id = readLong(), - name = requireNotNull(readString()), - number = readInt(), - url = requireNotNull(readString()), - scanlator = readString(), - uploadDate = readLong(), - branch = readString(), - source = checkNotNull(readSerializableCompat()), -) - -fun MangaTag.writeToParcel(out: Parcel) { - out.writeString(title) - out.writeString(key) - out.writeSerializable(source) -} - -fun Parcel.readMangaTag() = MangaTag( - title = requireNotNull(readString()), - key = requireNotNull(readString()), - source = checkNotNull(readSerializableCompat()), -) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableManga.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableManga.kt index f5b578700..9a9399c94 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableManga.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableManga.kt @@ -2,56 +2,83 @@ package org.koitharu.kotatsu.core.model.parcelable import android.os.Parcel import android.os.Parcelable +import androidx.core.os.ParcelCompat +import kotlinx.parcelize.IgnoredOnParcel +import kotlinx.parcelize.Parceler +import kotlinx.parcelize.Parcelize +import org.koitharu.kotatsu.core.util.ext.readParcelableCompat +import org.koitharu.kotatsu.core.util.ext.readSerializableCompat import org.koitharu.kotatsu.parsers.model.Manga // Limits to avoid TransactionTooLargeException private const val MAX_SAFE_SIZE = 1024 * 100 // Assume that 100 kb is safe parcel size private const val MAX_SAFE_CHAPTERS_COUNT = 24 // this is 100% safe -class ParcelableManga( +@Parcelize +data class ParcelableManga( val manga: Manga, - private val withChapters: Boolean, + @IgnoredOnParcel private val withChapters: Boolean = true, ) : Parcelable { - - constructor(parcel: Parcel) : this(parcel.readManga(), true) - - override fun writeToParcel(parcel: Parcel, flags: Int) { - val chapters = manga.chapters - if (!withChapters || chapters == null) { - manga.writeToParcel(parcel, flags, withChapters = false) - return - } - if (chapters.size <= MAX_SAFE_CHAPTERS_COUNT) { - // fast path - manga.writeToParcel(parcel, flags, withChapters = true) - return - } - val tempParcel = Parcel.obtain() - manga.writeToParcel(tempParcel, flags, withChapters = true) - val size = tempParcel.dataSize() - if (size < MAX_SAFE_SIZE) { - parcel.appendFrom(tempParcel, 0, size) - } else { - manga.writeToParcel(parcel, flags, withChapters = false) - } - tempParcel.recycle() - } - - override fun describeContents(): Int { - return 0 - } - - override fun toString(): String { - return "ParcelableManga(manga=$manga, withChapters=$withChapters)" - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): ParcelableManga { - return ParcelableManga(parcel) + companion object : Parceler { + private fun Manga.writeToParcel(out: Parcel, flags: Int, withChapters: Boolean) { + out.writeLong(id) + out.writeString(title) + out.writeString(altTitle) + out.writeString(url) + out.writeString(publicUrl) + out.writeFloat(rating) + ParcelCompat.writeBoolean(out, isNsfw) + out.writeString(coverUrl) + out.writeString(largeCoverUrl) + out.writeString(description) + out.writeParcelable(ParcelableMangaTags(tags), flags) + out.writeSerializable(state) + out.writeString(author) + val parcelableChapters = if (withChapters) null else chapters?.let(::ParcelableMangaChapters) + out.writeParcelable(parcelableChapters, flags) + out.writeSerializable(source) } - override fun newArray(size: Int): Array { - return arrayOfNulls(size) + override fun ParcelableManga.write(parcel: Parcel, flags: Int) { + val chapters = manga.chapters + if (!withChapters || chapters == null) { + manga.writeToParcel(parcel, flags, withChapters = false) + return + } + if (chapters.size <= MAX_SAFE_CHAPTERS_COUNT) { + // fast path + manga.writeToParcel(parcel, flags, withChapters = true) + return + } + val tempParcel = Parcel.obtain() + manga.writeToParcel(tempParcel, flags, withChapters = true) + val size = tempParcel.dataSize() + if (size < MAX_SAFE_SIZE) { + parcel.appendFrom(tempParcel, 0, size) + } else { + manga.writeToParcel(parcel, flags, withChapters = false) + } + tempParcel.recycle() } + + override fun create(parcel: Parcel) = ParcelableManga( + Manga( + id = parcel.readLong(), + title = parcel.readString()!!, + altTitle = parcel.readString(), + url = parcel.readString()!!, + publicUrl = parcel.readString()!!, + rating = parcel.readFloat(), + isNsfw = ParcelCompat.readBoolean(parcel), + coverUrl = parcel.readString()!!, + largeCoverUrl = parcel.readString(), + description = parcel.readString(), + tags = parcel.readParcelableCompat()!!.tags, + state = parcel.readSerializableCompat(), + author = parcel.readString(), + chapters = parcel.readParcelableCompat()?.chapters, + source = parcel.readSerializableCompat()!!, + ), + ) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaChapters.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaChapters.kt index 6196069ba..3aa622ba6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaChapters.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaChapters.kt @@ -2,38 +2,36 @@ package org.koitharu.kotatsu.core.model.parcelable import android.os.Parcel import android.os.Parcelable +import kotlinx.parcelize.Parceler +import kotlinx.parcelize.Parcelize +import kotlinx.parcelize.TypeParceler +import org.koitharu.kotatsu.core.util.ext.readSerializableCompat import org.koitharu.kotatsu.parsers.model.MangaChapter -class ParcelableMangaChapters( - val chapters: List, -) : Parcelable { - - constructor(parcel: Parcel) : this( - List(parcel.readInt()) { parcel.readMangaChapter() } +object MangaChapterParceler : Parceler { + override fun create(parcel: Parcel) = MangaChapter( + id = parcel.readLong(), + name = parcel.readString()!!, + number = parcel.readInt(), + url = parcel.readString()!!, + scanlator = parcel.readString(), + uploadDate = parcel.readLong(), + branch = parcel.readString(), + source = parcel.readSerializableCompat()!!, ) - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeInt(chapters.size) - for (chapter in chapters) { - chapter.writeToParcel(parcel) - } - } - - override fun describeContents(): Int { - return 0 - } - - override fun toString(): String { - return "ParcelableMangaChapters(chapters=$chapters)" - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): ParcelableMangaChapters { - return ParcelableMangaChapters(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } + override fun MangaChapter.write(parcel: Parcel, flags: Int) { + parcel.writeLong(id) + parcel.writeString(name) + parcel.writeInt(number) + parcel.writeString(url) + parcel.writeString(scanlator) + parcel.writeLong(uploadDate) + parcel.writeString(branch) + parcel.writeSerializable(source) } } + +@Parcelize +@TypeParceler +data class ParcelableMangaChapters(val chapters: List) : Parcelable diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaPage.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaPage.kt new file mode 100644 index 000000000..21b6d671a --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaPage.kt @@ -0,0 +1,29 @@ +package org.koitharu.kotatsu.core.model.parcelable + +import android.os.Parcel +import android.os.Parcelable +import kotlinx.parcelize.Parceler +import kotlinx.parcelize.Parcelize +import kotlinx.parcelize.TypeParceler +import org.koitharu.kotatsu.core.util.ext.readSerializableCompat +import org.koitharu.kotatsu.parsers.model.MangaPage + +object MangaPageParceler : Parceler { + override fun create(parcel: Parcel) = MangaPage( + id = parcel.readLong(), + url = parcel.readString()!!, + preview = parcel.readString(), + source = parcel.readSerializableCompat()!!, + ) + + override fun MangaPage.write(parcel: Parcel, flags: Int) { + parcel.writeLong(id) + parcel.writeString(url) + parcel.writeString(preview) + parcel.writeSerializable(source) + } +} + +@Parcelize +@TypeParceler +class ParcelableMangaPage(val page: MangaPage) : Parcelable diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaPages.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaPages.kt deleted file mode 100644 index 593e01600..000000000 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaPages.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.koitharu.kotatsu.core.model.parcelable - -import android.os.Parcel -import android.os.Parcelable -import org.koitharu.kotatsu.parsers.model.MangaPage - -class ParcelableMangaPages( - val pages: List, -) : Parcelable { - - constructor(parcel: Parcel) : this( - List(parcel.readInt()) { parcel.readMangaPage() } - ) - - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeInt(pages.size) - for (page in pages) { - page.writeToParcel(parcel) - } - } - - override fun describeContents(): Int { - return 0 - } - - override fun toString(): String { - return "ParcelableMangaPages(pages=$pages)" - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): ParcelableMangaPages { - return ParcelableMangaPages(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } - } -} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaTags.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaTags.kt index bcfca9864..1cd12b780 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaTags.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/model/parcelable/ParcelableMangaTags.kt @@ -2,39 +2,26 @@ package org.koitharu.kotatsu.core.model.parcelable import android.os.Parcel import android.os.Parcelable -import org.koitharu.kotatsu.core.util.ext.Set +import kotlinx.parcelize.Parceler +import kotlinx.parcelize.Parcelize +import kotlinx.parcelize.TypeParceler +import org.koitharu.kotatsu.core.util.ext.readSerializableCompat import org.koitharu.kotatsu.parsers.model.MangaTag -class ParcelableMangaTags( - val tags: Set, -) : Parcelable { - - constructor(parcel: Parcel) : this( - Set(parcel.readInt()) { parcel.readMangaTag() }, +object MangaTagParceler : Parceler { + override fun create(parcel: Parcel) = MangaTag( + title = parcel.readString()!!, + key = parcel.readString()!!, + source = parcel.readSerializableCompat()!!, ) - override fun writeToParcel(parcel: Parcel, flags: Int) { - parcel.writeInt(tags.size) - for (tag in tags) { - tag.writeToParcel(parcel) - } - } - - override fun describeContents(): Int { - return 0 - } - - override fun toString(): String { - return "ParcelableMangaTags(tags=$tags)" - } - - companion object CREATOR : Parcelable.Creator { - override fun createFromParcel(parcel: Parcel): ParcelableMangaTags { - return ParcelableMangaTags(parcel) - } - - override fun newArray(size: Int): Array { - return arrayOfNulls(size) - } + override fun MangaTag.write(parcel: Parcel, flags: Int) { + parcel.writeString(title) + parcel.writeString(key) + parcel.writeSerializable(source) } } + +@Parcelize +@TypeParceler +data class ParcelableMangaTags(val tags: Set) : Parcelable diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index e41b998d2..2c04da589 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -362,7 +362,7 @@ class DetailsActivity : fun newIntent(context: Context, manga: Manga): Intent { return Intent(context, DetailsActivity::class.java) - .putExtra(MangaIntent.KEY_MANGA, ParcelableManga(manga, withChapters = true)) + .putExtra(MangaIntent.KEY_MANGA, ParcelableManga(manga)) } fun newIntent(context: Context, mangaId: Long): Intent { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index 63702d529..7d330ff1a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -405,7 +405,7 @@ class ReaderActivity : .setAction(ACTION_MANGA_READ) fun manga(manga: Manga) = apply { - intent.putExtra(MangaIntent.KEY_MANGA, ParcelableManga(manga, withChapters = true)) + intent.putExtra(MangaIntent.KEY_MANGA, ParcelableManga(manga)) } fun mangaId(mangaId: Long) = apply { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt index 8bbe5f972..68eaa3bc5 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigActivity.kt @@ -20,7 +20,7 @@ import com.google.android.material.slider.Slider import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga -import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaPages +import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaPage import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.core.util.ext.decodeRegion import org.koitharu.kotatsu.core.util.ext.enqueueWith @@ -153,6 +153,6 @@ class ColorFilterConfigActivity : fun newIntent(context: Context, manga: Manga, page: MangaPage) = Intent(context, ColorFilterConfigActivity::class.java) .putExtra(EXTRA_MANGA, ParcelableManga(manga, false)) - .putExtra(EXTRA_PAGES, ParcelableMangaPages(listOf(page))) + .putExtra(EXTRA_PAGES, ParcelableMangaPage(page)) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigViewModel.kt index 00ac1a23d..fc7c5e25d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/colorfilter/ColorFilterConfigViewModel.kt @@ -5,7 +5,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga -import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaPages +import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaPage import org.koitharu.kotatsu.core.parser.MangaDataRepository import org.koitharu.kotatsu.core.ui.BaseViewModel import org.koitharu.kotatsu.core.util.ext.MutableEventFlow @@ -26,7 +26,7 @@ class ColorFilterConfigViewModel @Inject constructor( private var initialColorFilter: ReaderColorFilter? = null val colorFilter = MutableStateFlow(null) val onDismiss = MutableEventFlow() - val preview = savedStateHandle.require(ColorFilterConfigActivity.EXTRA_PAGES).pages.first() + val preview = savedStateHandle.require(ColorFilterConfigActivity.EXTRA_PAGES).page val isChanged: Boolean get() = colorFilter.value != initialColorFilter diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt index 0658e52f0..e25b3eed4 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/thumbnails/PagesThumbnailsSheet.kt @@ -192,7 +192,7 @@ class PagesThumbnailsSheet : fun show(fm: FragmentManager, manga: Manga, chapterId: Long, currentPage: Int = -1) { PagesThumbnailsSheet().withArgs(3) { - putParcelable(ARG_MANGA, ParcelableManga(manga, true)) + putParcelable(ARG_MANGA, ParcelableManga(manga)) putLong(ARG_CHAPTER_ID, chapterId) putInt(ARG_CURRENT_PAGE, currentPage) }.showDistinct(fm, TAG)