diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0fe7c204c..2adb300a2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -304,6 +304,8 @@ tasks { "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi", "-opt-in=androidx.compose.animation.graphics.ExperimentalAnimationGraphicsApi", "-opt-in=androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi", + "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi", + "-opt-in=kotlinx.coroutines.FlowPreview", "-opt-in=kotlinx.coroutines.InternalCoroutinesApi", "-opt-in=kotlinx.serialization.ExperimentalSerializationApi", ) diff --git a/app/src/main/java/eu/kanade/domain/category/interactor/CreateCategoryWithName.kt b/app/src/main/java/eu/kanade/domain/category/interactor/CreateCategoryWithName.kt index 56097c93c..5db0a69f2 100644 --- a/app/src/main/java/eu/kanade/domain/category/interactor/CreateCategoryWithName.kt +++ b/app/src/main/java/eu/kanade/domain/category/interactor/CreateCategoryWithName.kt @@ -12,10 +12,10 @@ class CreateCategoryWithName( private val categoryRepository: CategoryRepository, ) { - suspend fun await(name: String): Result = withContext(NonCancellable) await@{ + suspend fun await(name: String): Result = withContext(NonCancellable) { val categories = categoryRepository.getAll() if (categories.anyWithName(name)) { - return@await Result.NameAlreadyExistsError + return@withContext Result.NameAlreadyExistsError } val nextOrder = categories.maxOfOrNull { it.order }?.plus(1) ?: 0 diff --git a/app/src/main/java/eu/kanade/domain/category/interactor/DeleteCategory.kt b/app/src/main/java/eu/kanade/domain/category/interactor/DeleteCategory.kt index 52992fcf5..58e85bb3b 100644 --- a/app/src/main/java/eu/kanade/domain/category/interactor/DeleteCategory.kt +++ b/app/src/main/java/eu/kanade/domain/category/interactor/DeleteCategory.kt @@ -11,12 +11,12 @@ class DeleteCategory( private val categoryRepository: CategoryRepository, ) { - suspend fun await(categoryId: Long) = withContext(NonCancellable) await@{ + suspend fun await(categoryId: Long) = withContext(NonCancellable) { try { categoryRepository.delete(categoryId) } catch (e: Exception) { logcat(LogPriority.ERROR, e) - return@await Result.InternalError(e) + return@withContext Result.InternalError(e) } val categories = categoryRepository.getAll() diff --git a/app/src/main/java/eu/kanade/domain/category/interactor/RenameCategory.kt b/app/src/main/java/eu/kanade/domain/category/interactor/RenameCategory.kt index e2fbc4d7e..1552bd5fc 100644 --- a/app/src/main/java/eu/kanade/domain/category/interactor/RenameCategory.kt +++ b/app/src/main/java/eu/kanade/domain/category/interactor/RenameCategory.kt @@ -13,10 +13,10 @@ class RenameCategory( private val categoryRepository: CategoryRepository, ) { - suspend fun await(categoryId: Long, name: String) = withContext(NonCancellable) await@{ + suspend fun await(categoryId: Long, name: String) = withContext(NonCancellable) { val categories = categoryRepository.getAll() if (categories.anyWithName(name)) { - return@await Result.NameAlreadyExistsError + return@withContext Result.NameAlreadyExistsError } val update = CategoryUpdate( diff --git a/app/src/main/java/eu/kanade/domain/category/interactor/ReorderCategory.kt b/app/src/main/java/eu/kanade/domain/category/interactor/ReorderCategory.kt index a286103a6..1afeecdf4 100644 --- a/app/src/main/java/eu/kanade/domain/category/interactor/ReorderCategory.kt +++ b/app/src/main/java/eu/kanade/domain/category/interactor/ReorderCategory.kt @@ -12,12 +12,12 @@ class ReorderCategory( private val categoryRepository: CategoryRepository, ) { - suspend fun await(categoryId: Long, newPosition: Int) = withContext(NonCancellable) await@{ + suspend fun await(categoryId: Long, newPosition: Int) = withContext(NonCancellable) { val categories = categoryRepository.getAll().filterNot(Category::isSystemCategory) val currentIndex = categories.indexOfFirst { it.id == categoryId } if (currentIndex == newPosition) { - return@await Result.Unchanged + return@withContext Result.Unchanged } val reorderedCategories = categories.toMutableList() diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt index 7fcdc0ef5..9cbe5b49c 100644 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt +++ b/app/src/main/java/eu/kanade/domain/chapter/interactor/SetReadStatus.kt @@ -31,11 +31,11 @@ class SetReadStatus( ) } - suspend fun await(read: Boolean, vararg values: Chapter): Result = withContext(NonCancellable) f@{ + suspend fun await(read: Boolean, vararg values: Chapter): Result = withContext(NonCancellable) { val chapters = values.filterNot { it.read == read } if (chapters.isEmpty()) { - return@f Result.NoChapters + return@withContext Result.NoChapters } val manga = chapters.fold(mutableSetOf()) { acc, chapter -> @@ -53,15 +53,15 @@ class SetReadStatus( ) } catch (e: Exception) { logcat(LogPriority.ERROR, e) - return@f Result.InternalError(e) + return@withContext Result.InternalError(e) } if (read && preferences.removeAfterMarkedAsRead()) { - manga.forEach { manga -> + manga.forEach { deleteDownload.awaitAll( - manga = manga, + manga = it, values = chapters - .filter { manga.id == it.mangaId } + .filter { chapter -> it.id == chapter.mangaId } .toTypedArray(), ) } @@ -70,8 +70,8 @@ class SetReadStatus( Result.Success } - suspend fun await(mangaId: Long, read: Boolean): Result = withContext(NonCancellable) f@{ - return@f await( + suspend fun await(mangaId: Long, read: Boolean): Result = withContext(NonCancellable) { + await( read = read, values = chapterRepository .getChapterByMangaId(mangaId) diff --git a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt index dd8536023..2973bb3b2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/Migrations.kt @@ -200,6 +200,7 @@ object Migrations { val oldSortingMode = prefs.getInt(PreferenceKeys.librarySortingMode, 0) val oldSortingDirection = prefs.getBoolean(PreferenceKeys.librarySortingDirection, true) + @Suppress("DEPRECATION") val newSortingMode = when (oldSortingMode) { 0 -> SortModeSetting.ALPHABETICAL 1 -> SortModeSetting.LAST_READ diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt index 53b2e7f56..e0cf8f2e6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/BackupRestoreService.kt @@ -10,6 +10,7 @@ import androidx.core.content.ContextCompat import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.util.system.acquireWakeLock +import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat import eu.kanade.tachiyomi.util.system.isServiceRunning import eu.kanade.tachiyomi.util.system.logcat import kotlinx.coroutines.CoroutineExceptionHandler @@ -114,7 +115,7 @@ class BackupRestoreService : Service() { * @return the start value of the command. */ override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - val uri = intent?.getParcelableExtra(BackupConst.EXTRA_URI) ?: return START_NOT_STICKY + val uri = intent?.getParcelableExtraCompat(BackupConst.EXTRA_URI) ?: return START_NOT_STICKY // Cancel any previous job if needed. restorer?.job?.cancel() diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupTracking.kt b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupTracking.kt index 80c7d28a5..8a04f8796 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupTracking.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/backup/models/BackupTracking.kt @@ -31,6 +31,7 @@ data class BackupTracking( fun getTrackingImpl(): TrackImpl { return TrackImpl().apply { sync_id = this@BackupTracking.syncId + @Suppress("DEPRECATION") media_id = if (this@BackupTracking.mediaIdInt != 0) { this@BackupTracking.mediaIdInt.toLong() } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadPendingDeleter.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadPendingDeleter.kt index b2aed6597..bb07e90e9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadPendingDeleter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadPendingDeleter.kt @@ -49,7 +49,7 @@ class DownloadPendingDeleter(context: Context) { // Last entry matches the manga, reuse it to avoid decoding json from preferences lastEntry.copy(chapters = newChapters) } else { - val existingEntry = preferences.getString(manga.id!!.toString(), null) + val existingEntry = preferences.getString(manga.id.toString(), null) if (existingEntry != null) { // Existing entry found on preferences, decode json and add the new chapter val savedEntry = json.decodeFromString(existingEntry) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadStore.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadStore.kt index 19a4f45c9..a275a1d4f 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadStore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadStore.kt @@ -114,7 +114,7 @@ class DownloadStore( * @param download the download to serialize. */ private fun serialize(download: Download): String { - val obj = DownloadObject(download.manga.id!!, download.chapter.id!!, counter++) + val obj = DownloadObject(download.manga.id, download.chapter.id!!, counter++) return json.encodeToString(obj) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt index 24987bff5..ac4f6d450 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/library/LibraryUpdateService.kt @@ -63,6 +63,7 @@ import eu.kanade.tachiyomi.util.shouldDownloadNewChapters import eu.kanade.tachiyomi.util.storage.getUriCompat import eu.kanade.tachiyomi.util.system.acquireWakeLock import eu.kanade.tachiyomi.util.system.createFileInCacheDir +import eu.kanade.tachiyomi.util.system.getSerializableExtraCompat import eu.kanade.tachiyomi.util.system.isServiceRunning import eu.kanade.tachiyomi.util.system.logcat import exh.log.xLogE @@ -264,7 +265,7 @@ class LibraryUpdateService( */ override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { if (intent == null) return START_NOT_STICKY - val target = intent.getSerializableExtra(KEY_TARGET) as? Target + val target = intent.getSerializableExtraCompat(KEY_TARGET) ?: return START_NOT_STICKY instance = this diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt index 71c565b7c..db5bd65da 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt @@ -29,6 +29,7 @@ import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.storage.DiskUtil import eu.kanade.tachiyomi.util.storage.getUriCompat +import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat import eu.kanade.tachiyomi.util.system.notificationManager import eu.kanade.tachiyomi.util.system.toShareIntent import eu.kanade.tachiyomi.util.system.toast @@ -82,7 +83,7 @@ class NotificationReceiver : BroadcastReceiver() { ACTION_SHARE_BACKUP -> shareFile( context, - intent.getParcelableExtra(EXTRA_URI)!!, + intent.getParcelableExtraCompat(EXTRA_URI)!!, "application/x-protobuf+gzip", intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1), ) @@ -130,7 +131,7 @@ class NotificationReceiver : BroadcastReceiver() { ACTION_SHARE_CRASH_LOG -> shareFile( context, - intent.getParcelableExtra(EXTRA_URI)!!, + intent.getParcelableExtraCompat(EXTRA_URI)!!, "text/plain", intent.getIntExtra(EXTRA_NOTIFICATION_ID, -1), ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt index ecaedf10c..c8ee92aab 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt @@ -10,6 +10,7 @@ import android.content.pm.PackageInstaller import android.os.Build import eu.kanade.tachiyomi.extension.model.InstallStep import eu.kanade.tachiyomi.util.lang.use +import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat import eu.kanade.tachiyomi.util.system.getUriSize import eu.kanade.tachiyomi.util.system.logcat import logcat.LogPriority @@ -22,7 +23,7 @@ class PackageInstallerInstaller(private val service: Service) : Installer(servic override fun onReceive(context: Context, intent: Intent) { when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE)) { PackageInstaller.STATUS_PENDING_USER_ACTION -> { - val userAction = intent.getParcelableExtra(Intent.EXTRA_INTENT) + val userAction = intent.getParcelableExtraCompat(Intent.EXTRA_INTENT) if (userAction == null) { logcat(LogPriority.ERROR) { "Fatal error for $intent" } continueQueue(InstallStep.Error) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt index 2b8301fe9..8a787b548 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt @@ -12,6 +12,7 @@ import eu.kanade.tachiyomi.extension.installer.Installer import eu.kanade.tachiyomi.extension.installer.PackageInstallerInstaller import eu.kanade.tachiyomi.extension.installer.ShizukuInstaller import eu.kanade.tachiyomi.extension.util.ExtensionInstaller.Companion.EXTRA_DOWNLOAD_ID +import eu.kanade.tachiyomi.util.system.getSerializableExtraCompat import eu.kanade.tachiyomi.util.system.logcat import eu.kanade.tachiyomi.util.system.notificationBuilder import logcat.LogPriority @@ -36,7 +37,7 @@ class ExtensionInstallService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val uri = intent?.data val id = intent?.getLongExtra(EXTRA_DOWNLOAD_ID, -1)?.takeIf { it != -1L } - val installerUsed = intent?.getSerializableExtra(EXTRA_INSTALLER) as? PreferenceValues.ExtensionInstaller + val installerUsed = intent?.getSerializableExtraCompat(EXTRA_INSTALLER) if (uri == null || id == null || installerUsed == null) { stopSelf() return START_NOT_STICKY diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt index 9be252ce9..eace1d58b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/advanced/process/MigrationListController.kt @@ -38,6 +38,7 @@ import eu.kanade.tachiyomi.ui.browse.migration.advanced.design.PreMigrationContr import eu.kanade.tachiyomi.ui.browse.migration.search.SearchController import eu.kanade.tachiyomi.ui.manga.MangaController import eu.kanade.tachiyomi.util.lang.launchUI +import eu.kanade.tachiyomi.util.system.getParcelableCompat import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.logcat import eu.kanade.tachiyomi.util.system.toast @@ -67,7 +68,7 @@ class MigrationListController(bundle: Bundle? = null) : private var adapter: MigrationProcessAdapter? = null - val config: MigrationProcedureConfig? = args.getParcelable(CONFIG_EXTRA) + val config = args.getParcelableCompat(CONFIG_EXTRA) private val preferences: PreferencesHelper by injectLazy() private val sourceManager: SourceManager by injectLazy() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesController.kt index 3358fb47f..d4d194841 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesController.kt @@ -23,6 +23,7 @@ import eu.kanade.tachiyomi.ui.browse.source.feed.SourceFeedController import eu.kanade.tachiyomi.ui.browse.source.globalsearch.GlobalSearchController import eu.kanade.tachiyomi.ui.browse.source.latest.LatestUpdatesController import eu.kanade.tachiyomi.ui.main.MainActivity +import eu.kanade.tachiyomi.util.system.getParcelableCompat import exh.ui.smartsearch.SmartSearchController import kotlinx.parcelize.Parcelize import uy.kohesive.injekt.injectLazy @@ -32,7 +33,7 @@ class SourcesController(bundle: Bundle? = null) : SearchableComposeController - private val smartSearchConfig: SmartSearchConfig? = args.getParcelable(SMART_SEARCH_CONFIG) + private val smartSearchConfig = args.getParcelableCompat(SMART_SEARCH_CONFIG) private val mode = if (smartSearchConfig == null) Mode.CATALOGUE else Mode.SMART_SEARCH // EXH <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt index 6fe3aa6a8..8f20c9c48 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt @@ -52,6 +52,7 @@ import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.lang.withUIContext import eu.kanade.tachiyomi.util.preference.asHotFlow import eu.kanade.tachiyomi.util.system.connectivityManager +import eu.kanade.tachiyomi.util.system.getParcelableCompat import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.view.inflate @@ -765,7 +766,7 @@ open class BrowseSourceController(bundle: Bundle) : MangaController( item.manga.id, true, - args.getParcelable(MangaController.SMART_SEARCH_CONFIG_EXTRA), + args.getParcelableCompat(MangaController.SMART_SEARCH_CONFIG_EXTRA), ), ) return false diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt index d0fcdb2af..681e2865c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceItem.kt @@ -74,12 +74,12 @@ class SourceItem(val manga: Manga, private val displayMode: Preference dismissDialog() - router.pushController(MangaController(libraryManga.id!!)) + router.pushController(MangaController(libraryManga.id)) } .setCancelable(true) .create() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt index bf9d00084..41da4f136 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaController.kt @@ -65,6 +65,7 @@ import eu.kanade.tachiyomi.ui.webview.WebViewActivity import eu.kanade.tachiyomi.util.lang.launchIO import eu.kanade.tachiyomi.util.lang.launchUI import eu.kanade.tachiyomi.util.lang.withUIContext +import eu.kanade.tachiyomi.util.system.getParcelableCompat import eu.kanade.tachiyomi.util.system.logcat import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.widget.materialdialogs.QuadStateTextView @@ -122,7 +123,7 @@ class MangaController : get() = presenter.isFromSource // SY --> - val smartSearchConfig: SourcesController.SmartSearchConfig? = args.getParcelable( + val smartSearchConfig = args.getParcelableCompat( SMART_SEARCH_CONFIG_EXTRA, ) // SY <-- diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/SetChapterSettingsDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/SetChapterSettingsDialog.kt index 2b82892d6..7403d2134 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/SetChapterSettingsDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/SetChapterSettingsDialog.kt @@ -8,6 +8,7 @@ import eu.kanade.domain.manga.model.Manga import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.ui.base.controller.DialogController import eu.kanade.tachiyomi.util.chapter.ChapterSettingsHelper +import eu.kanade.tachiyomi.util.system.getSerializableCompat import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.widget.DialogCheckboxView @@ -27,7 +28,7 @@ class SetChapterSettingsDialog(bundle: Bundle? = null) : DialogController(bundle .setTitle(R.string.chapter_settings) .setView(view) .setPositiveButton(android.R.string.ok) { _, _ -> - ChapterSettingsHelper.setGlobalSettings(args.getSerializable(MANGA_KEY)!! as Manga) + ChapterSettingsHelper.setGlobalSettings(args.getSerializableCompat(MANGA_KEY)!!) if (view.isChecked()) { ChapterSettingsHelper.updateAllMangasWithGlobalDefaults() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackChaptersDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackChaptersDialog.kt index 51407cb4a..bb21d7906 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackChaptersDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackChaptersDialog.kt @@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.databinding.TrackChaptersDialogBinding import eu.kanade.tachiyomi.ui.base.controller.DialogController +import eu.kanade.tachiyomi.util.system.getSerializableCompat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -31,7 +32,7 @@ class SetTrackChaptersDialog : DialogController @Suppress("unused") constructor(bundle: Bundle) : super(bundle) { - val track = bundle.getSerializable(KEY_ITEM_TRACK) as Track + val track = bundle.getSerializableCompat(KEY_ITEM_TRACK)!! val service = Injekt.get().getService(track.sync_id.toLong())!! item = TrackItem(track, service) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackScoreDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackScoreDialog.kt index cf7cf426f..341c2befa 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackScoreDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackScoreDialog.kt @@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.databinding.TrackScoreDialogBinding import eu.kanade.tachiyomi.ui.base.controller.DialogController +import eu.kanade.tachiyomi.util.system.getSerializableCompat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -31,7 +32,7 @@ class SetTrackScoreDialog : DialogController @Suppress("unused") constructor(bundle: Bundle) : super(bundle) { - val track = bundle.getSerializable(KEY_ITEM_TRACK) as Track + val track = bundle.getSerializableCompat(KEY_ITEM_TRACK)!! val service = Injekt.get().getService(track.sync_id.toLong())!! item = TrackItem(track, service) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackStatusDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackStatusDialog.kt index 128dc3b7f..3bc439fc6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackStatusDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/track/SetTrackStatusDialog.kt @@ -9,6 +9,7 @@ import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.ui.base.controller.DialogController +import eu.kanade.tachiyomi.util.system.getSerializableCompat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -29,7 +30,7 @@ class SetTrackStatusDialog : DialogController @Suppress("unused") constructor(bundle: Bundle) : super(bundle) { - val track = bundle.getSerializable(KEY_ITEM_TRACK) as Track + val track = bundle.getSerializableCompat(KEY_ITEM_TRACK)!! val service = Injekt.get().getService(track.sync_id.toLong())!! item = TrackItem(track, service) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt index c0b639d99..b669d11d0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/pager/PagerViewer.kt @@ -108,7 +108,7 @@ abstract class PagerViewer(val activity: ReaderActivity) : BaseViewer { pagerListener, // SY <-- ) - pager.tapListener = f@{ event -> + pager.tapListener = { event -> val pos = PointF(event.rawX / pager.width, event.rawY / pager.height) val navigator = config.navigator diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt index 53ed73b07..3c1ec0ddc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/viewer/webtoon/WebtoonViewer.kt @@ -117,7 +117,7 @@ class WebtoonViewer(val activity: ReaderActivity, val isContinuous: Boolean = tr } }, ) - recycler.tapListener = f@{ event -> + recycler.tapListener = { event -> val pos = PointF(event.rawX / recycler.width, event.rawY / recycler.height) val navigator = config.navigator diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt index 437edc312..934588649 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsBackupController.kt @@ -37,6 +37,7 @@ import eu.kanade.tachiyomi.util.preference.preferenceCategory import eu.kanade.tachiyomi.util.preference.summaryRes import eu.kanade.tachiyomi.util.preference.titleRes import eu.kanade.tachiyomi.util.system.DeviceUtil +import eu.kanade.tachiyomi.util.system.getParcelableCompat import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.launchIn @@ -274,7 +275,7 @@ class SettingsBackupController : SettingsController() { override fun onCreateDialog(savedViewState: Bundle?): Dialog { val activity = activity!! - val uri: Uri = args.getParcelable(KEY_URI)!! + val uri = args.getParcelableCompat(KEY_URI)!! return try { val results = BackupFileValidator().validate(activity, uri) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt b/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt index 70ce375e1..ef2ed1d91 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/preference/PreferenceDSL.kt @@ -1,3 +1,5 @@ +@file:Suppress("NOTHING_TO_INLINE") + package eu.kanade.tachiyomi.util.preference import androidx.annotation.StringRes diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/IntentExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/IntentExtensions.kt index ca5794479..38261857a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/IntentExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/IntentExtensions.kt @@ -4,7 +4,10 @@ import android.content.ClipData import android.content.Context import android.content.Intent import android.net.Uri +import android.os.Build +import android.os.Bundle import eu.kanade.tachiyomi.R +import java.io.Serializable fun Uri.toShareIntent(context: Context, type: String = "image/*", message: String? = null): Intent { val uri = this @@ -21,3 +24,39 @@ fun Uri.toShareIntent(context: Context, type: String = "image/*", message: Strin flags = Intent.FLAG_ACTIVITY_NEW_TASK } } + +inline fun Intent.getParcelableExtraCompat(name: String): T? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelableExtra(name, T::class.java) + } else { + @Suppress("DEPRECATION") + getParcelableExtra(name) + } +} + +inline fun Intent.getSerializableExtraCompat(name: String): T? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getSerializableExtra(name, T::class.java) + } else { + @Suppress("DEPRECATION") + getSerializableExtra(name) as? T + } +} + +inline fun Bundle.getSerializableCompat(name: String): T? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getSerializable(name, T::class.java) + } else { + @Suppress("DEPRECATION") + getSerializable(name) as? T + } +} + +inline fun Bundle.getParcelableCompat(name: String): T? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelable(name, T::class.java) + } else { + @Suppress("DEPRECATION") + getParcelable(name) + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/InternalResourceHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/InternalResourceHelper.kt index 6570b7ffc..12529a19c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/InternalResourceHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/InternalResourceHelper.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.util.system +import android.annotation.SuppressLint import android.content.Context import android.content.res.Resources @@ -20,6 +21,7 @@ object InternalResourceHelper { * @param type resource type of [resName] to get * @return 0 if not available */ + @SuppressLint("DiscouragedApi") private fun getResourceId(resName: String, type: String): Int { return Resources.getSystem().getIdentifier(resName, type, "android") } diff --git a/app/src/main/java/exh/ui/captcha/BrowserActionActivity.kt b/app/src/main/java/exh/ui/captcha/BrowserActionActivity.kt index 358c6802e..e6d49f93b 100644 --- a/app/src/main/java/exh/ui/captcha/BrowserActionActivity.kt +++ b/app/src/main/java/exh/ui/captcha/BrowserActionActivity.kt @@ -22,6 +22,7 @@ import eu.kanade.tachiyomi.source.Source import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.lang.withUIContext +import eu.kanade.tachiyomi.util.system.getSerializableExtraCompat import eu.kanade.tachiyomi.util.system.setDefaultSettings import exh.log.xLogD import exh.log.xLogE @@ -82,19 +83,18 @@ class BrowserActionActivity : AppCompatActivity() { (source as? HttpSource)?.headers?.toMultimap()?.mapValues { it.value.joinToString(",") } ?: emptyMap() - ) + (intent.getSerializableExtra(HEADERS_EXTRA) as? HashMap ?: emptyMap()) + ) + (intent.getSerializableExtraCompat>(HEADERS_EXTRA) ?: emptyMap()) @Suppress("UNCHECKED_CAST") - val cookies: HashMap? = - intent.getSerializableExtra(COOKIES_EXTRA) as? HashMap + val cookies = intent.getSerializableExtraCompat>(COOKIES_EXTRA) val script: String? = intent.getStringExtra(SCRIPT_EXTRA) val url: String? = intent.getStringExtra(URL_EXTRA) val actionName = intent.getStringExtra(ACTION_NAME_EXTRA) @Suppress("NOT_NULL_ASSERTION_ON_CALLABLE_REFERENCE", "UNCHECKED_CAST") - val verifyComplete = if (source != null) { + val verifyComplete: ((String) -> Boolean)? = if (source != null) { source::verifyComplete!! - } else intent.getSerializableExtra(VERIFY_LAMBDA_EXTRA) as? (String) -> Boolean + } else intent.getSerializableExtraCompat(VERIFY_LAMBDA_EXTRA) if (verifyComplete == null || url == null) { finish() diff --git a/app/src/main/java/exh/ui/smartsearch/SmartSearchController.kt b/app/src/main/java/exh/ui/smartsearch/SmartSearchController.kt index b79057ac3..4e5cbbfab 100644 --- a/app/src/main/java/exh/ui/smartsearch/SmartSearchController.kt +++ b/app/src/main/java/exh/ui/smartsearch/SmartSearchController.kt @@ -13,6 +13,7 @@ import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction import eu.kanade.tachiyomi.ui.browse.source.SourcesController import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceController import eu.kanade.tachiyomi.ui.manga.MangaController +import eu.kanade.tachiyomi.util.system.getParcelableCompat import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -22,7 +23,7 @@ class SmartSearchController(bundle: Bundle) : NucleusController(ARG_SMART_SEARCH_CONFIG)!! constructor(sourceId: Long, smartSearchConfig: SourcesController.SmartSearchConfig) : this( bundleOf(