From 73478d6a81324ef9823362c73623cc4ad0b77d58 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 19 Sep 2022 10:06:43 +0300 Subject: [PATCH] Fix getParcelableCompat extensions --- .../koitharu/kotatsu/base/ui/BaseActivity.kt | 3 +- .../core/model/parcelable/Parcelable.kt | 23 ++++++----- .../core/model/parcelable/ParcelableManga.kt | 2 +- .../download/ui/service/DownloadService.kt | 11 ++--- .../local/ui/LocalChaptersRemoveService.kt | 5 ++- .../settings/utils/RingtonePickContract.kt | 3 +- .../kotatsu/sync/ui/SyncAuthActivity.kt | 5 ++- .../koitharu/kotatsu/utils/ext/AndroidExt.kt | 2 +- .../org/koitharu/kotatsu/utils/ext/Bundle.kt | 40 ++++++++----------- 9 files changed, 50 insertions(+), 44 deletions(-) diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt index 8f92acc31..08964f6bd 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt @@ -20,7 +20,6 @@ import androidx.core.view.WindowInsetsCompat import androidx.core.view.updateLayoutParams import androidx.viewbinding.ViewBinding import dagger.hilt.android.EntryPointAccessors -import javax.inject.Inject import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.util.ActionModeDelegate @@ -30,6 +29,7 @@ import org.koitharu.kotatsu.base.ui.util.inject import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.utils.ext.getThemeColor +import javax.inject.Inject abstract class BaseActivity : AppCompatActivity(), @@ -134,6 +134,7 @@ abstract class BaseActivity : window.statusBarColor = getThemeColor(android.R.attr.statusBarColor) } + @Suppress("OVERRIDE_DEPRECATION", "DEPRECATION") override fun onBackPressed() { if ( // https://issuetracker.google.com/issues/139738913 Build.VERSION.SDK_INT == Build.VERSION_CODES.Q && diff --git a/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt b/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt index 67bb80044..1732a0fb2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/Parcelable.kt @@ -2,7 +2,12 @@ package org.koitharu.kotatsu.core.model.parcelable import android.os.Parcel import androidx.core.os.ParcelCompat -import org.koitharu.kotatsu.parsers.model.* +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 +import org.koitharu.kotatsu.utils.ext.readParcelableCompat +import org.koitharu.kotatsu.utils.ext.readSerializableCompat fun Manga.writeToParcel(out: Parcel, flags: Int, withChapters: Boolean) { out.writeLong(id) @@ -37,11 +42,11 @@ fun Parcel.readManga() = Manga( coverUrl = requireNotNull(readString()), largeCoverUrl = readString(), description = readString(), - tags = requireNotNull(readParcelable(ParcelableMangaTags::class.java.classLoader)).tags, - state = readSerializable() as MangaState?, + tags = requireNotNull(readParcelableCompat()).tags, + state = readSerializableCompat(), author = readString(), - chapters = readParcelable(ParcelableMangaChapters::class.java.classLoader)?.chapters, - source = readSerializable() as MangaSource, + chapters = readParcelableCompat()?.chapters, + source = checkNotNull(readSerializableCompat()), ) fun MangaPage.writeToParcel(out: Parcel) { @@ -57,7 +62,7 @@ fun Parcel.readMangaPage() = MangaPage( url = requireNotNull(readString()), referer = requireNotNull(readString()), preview = readString(), - source = readSerializable() as MangaSource, + source = checkNotNull(readSerializableCompat()), ) fun MangaChapter.writeToParcel(out: Parcel) { @@ -79,7 +84,7 @@ fun Parcel.readMangaChapter() = MangaChapter( scanlator = readString(), uploadDate = readLong(), branch = readString(), - source = readSerializable() as MangaSource, + source = checkNotNull(readSerializableCompat()), ) fun MangaTag.writeToParcel(out: Parcel) { @@ -91,5 +96,5 @@ fun MangaTag.writeToParcel(out: Parcel) { fun Parcel.readMangaTag() = MangaTag( title = requireNotNull(readString()), key = requireNotNull(readString()), - source = readSerializable() as MangaSource, -) \ No newline at end of file + source = checkNotNull(readSerializableCompat()), +) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/ParcelableManga.kt b/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/ParcelableManga.kt index 2a6d766c3..f8e25f4b8 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/ParcelableManga.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/model/parcelable/ParcelableManga.kt @@ -50,4 +50,4 @@ class ParcelableManga( return arrayOfNulls(size) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt index 0328ccab1..873171ef0 100644 --- a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadService.kt @@ -16,9 +16,6 @@ import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint -import java.util.concurrent.TimeUnit -import javax.inject.Inject -import kotlin.collections.set import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch import org.koitharu.kotatsu.BuildConfig @@ -28,10 +25,14 @@ import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga import org.koitharu.kotatsu.download.domain.DownloadManager import org.koitharu.kotatsu.download.domain.DownloadState import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat import org.koitharu.kotatsu.utils.ext.throttle import org.koitharu.kotatsu.utils.progress.PausingProgressJob import org.koitharu.kotatsu.utils.progress.ProgressJob import org.koitharu.kotatsu.utils.progress.TimeLeftEstimator +import java.util.concurrent.TimeUnit +import javax.inject.Inject +import kotlin.collections.set @AndroidEntryPoint class DownloadService : BaseService() { @@ -65,7 +66,7 @@ class DownloadService : BaseService() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { super.onStartCommand(intent, flags, startId) - val manga = intent?.getParcelableExtra(EXTRA_MANGA)?.manga + val manga = intent?.getParcelableExtraCompat(EXTRA_MANGA)?.manga val chapters = intent?.getLongArrayExtra(EXTRA_CHAPTERS_IDS) return if (manga != null) { jobs[startId] = downloadManga(startId, manga, chapters) @@ -254,7 +255,7 @@ class DownloadService : BaseService() { fun getDownloadedManga(intent: Intent?): Manga? { if (intent?.action == ACTION_DOWNLOAD_COMPLETE) { - return intent.getParcelableExtra(EXTRA_MANGA)?.manga + return intent.getParcelableExtraCompat(EXTRA_MANGA)?.manga } return null } diff --git a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalChaptersRemoveService.kt b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalChaptersRemoveService.kt index 0a97bb99d..e469fccae 100644 --- a/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalChaptersRemoveService.kt +++ b/app/src/main/java/org/koitharu/kotatsu/local/ui/LocalChaptersRemoveService.kt @@ -9,13 +9,14 @@ import androidx.core.app.NotificationCompat import androidx.core.app.ServiceCompat import androidx.core.content.ContextCompat import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.CoroutineIntentService import org.koitharu.kotatsu.core.model.parcelable.ParcelableManga import org.koitharu.kotatsu.download.ui.service.DownloadService import org.koitharu.kotatsu.local.domain.LocalMangaRepository import org.koitharu.kotatsu.parsers.model.Manga +import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat +import javax.inject.Inject @AndroidEntryPoint class LocalChaptersRemoveService : CoroutineIntentService() { @@ -34,7 +35,7 @@ class LocalChaptersRemoveService : CoroutineIntentService() { } override suspend fun processIntent(intent: Intent?) { - val manga = intent?.getParcelableExtra(EXTRA_MANGA)?.manga ?: return + val manga = intent?.getParcelableExtraCompat(EXTRA_MANGA)?.manga ?: return val chaptersIds = intent.getLongArrayExtra(EXTRA_CHAPTERS_IDS)?.toSet() ?: return startForeground() val mangaWithChapters = localMangaRepository.getDetails(manga) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt b/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt index dee96c004..e1f88b59c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/utils/RingtonePickContract.kt @@ -7,6 +7,7 @@ import android.net.Uri import android.provider.Settings import androidx.activity.result.contract.ActivityResultContract import androidx.annotation.StringRes +import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat class RingtonePickContract(@StringRes private val titleResId: Int) : ActivityResultContract() { @@ -30,6 +31,6 @@ class RingtonePickContract(@StringRes private val titleResId: Int) : ActivityRes } override fun parseResult(resultCode: Int, intent: Intent?): Uri? { - return intent?.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) + return intent?.getParcelableExtraCompat(RingtoneManager.EXTRA_RINGTONE_PICKED_URI) } } diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthActivity.kt b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthActivity.kt index 2148ec70f..f4236fae1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncAuthActivity.kt @@ -21,6 +21,7 @@ import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.databinding.ActivitySyncAuthBinding import org.koitharu.kotatsu.sync.domain.SyncAuthResult import org.koitharu.kotatsu.utils.ext.getDisplayMessage +import org.koitharu.kotatsu.utils.ext.getParcelableExtraCompat @AndroidEntryPoint class SyncAuthActivity : BaseActivity(), View.OnClickListener { @@ -33,7 +34,8 @@ class SyncAuthActivity : BaseActivity(), View.OnClickLi override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(ActivitySyncAuthBinding.inflate(layoutInflater)) - accountAuthenticatorResponse = intent.getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE) + accountAuthenticatorResponse = + intent.getParcelableExtraCompat(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE) accountAuthenticatorResponse?.onRequestContinued() binding.buttonCancel.setOnClickListener(this) binding.buttonNext.setOnClickListener(this) @@ -57,6 +59,7 @@ class SyncAuthActivity : BaseActivity(), View.OnClickLi ) } + @Suppress("DEPRECATION", "OVERRIDE_DEPRECATION") override fun onBackPressed() { if (binding.switcher.isVisible && binding.switcher.displayedChild > 0) { binding.switcher.showPrevious() diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt index ba5063fd8..ba3b02e93 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt @@ -24,7 +24,6 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.coroutineScope import androidx.work.CoroutineWorker import com.google.android.material.elevation.ElevationOverlayProvider -import kotlin.math.roundToLong import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.trySendBlocking import kotlinx.coroutines.delay @@ -37,6 +36,7 @@ import okio.IOException import org.json.JSONException import org.koitharu.kotatsu.BuildConfig import org.koitharu.kotatsu.utils.InternalResourceHelper +import kotlin.math.roundToLong val Context.activityManager: ActivityManager? get() = getSystemService(ACTIVITY_SERVICE) as? ActivityManager diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/Bundle.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/Bundle.kt index c9ecf6694..27ed10082 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/Bundle.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/Bundle.kt @@ -1,47 +1,41 @@ +@file:Suppress("DEPRECATION") + package org.koitharu.kotatsu.utils.ext import android.content.Intent import android.os.Build import android.os.Bundle +import android.os.Parcel import android.os.Parcelable +import org.koitharu.kotatsu.core.model.parcelable.ParcelableMangaTags import java.io.Serializable -@Suppress("DEPRECATION") +// https://issuetracker.google.com/issues/240585930 + inline fun Bundle.getParcelableCompat(key: String): T? { - if (!containsKey(key)) { - return null - } - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - getParcelable(key, T::class.java) - } else { - getParcelable(key) as? T - } + return getParcelable(key) as T? } -@Suppress("DEPRECATION") inline fun Intent.getParcelableExtraCompat(key: String): T? { - if (!hasExtra(key)) { - return null - } - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - getParcelableExtra(key, T::class.java) - } else { - getParcelableExtra(key) as? T - } + return getParcelableExtra(key) as T? } -@Suppress("DEPRECATION") inline fun Bundle.getSerializableCompat(key: String): T? { - if (!containsKey(key)) { - return null - } return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { getSerializable(key, T::class.java) } else { - getSerializable(key) as? T + getSerializable(key) as T? } } +inline fun Parcel.readParcelableCompat(): T? { + return readParcelable(ParcelableMangaTags::class.java.classLoader) as T? +} + +inline fun Parcel.readSerializableCompat(): T? { + return readSerializable() as T? +} + inline fun Bundle.requireSerializable(key: String): T { return checkNotNull(getSerializableCompat(key)) { "Serializable of type \"${T::class.java.name}\" not found at \"$key\""