diff --git a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeFragment.kt b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeFragment.kt index 3a67d98e..3e25b326 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeFragment.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeFragment.kt @@ -180,7 +180,9 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { return view } - @OptIn(UnstableApi::class) private fun grid(){ + + @OptIn(UnstableApi::class) + private fun grid() { gridView.setOnItemClickListener { parent, view, position, id -> // Get the OfflineAnimeModel that was clicked val item = adapter.getItem(position) as OfflineAnimeModel @@ -211,7 +213,10 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { builder.setMessage("Are you sure you want to delete ${item.title}?") builder.setPositiveButton("Yes") { _, _ -> downloadManager.removeMedia(item.title, type) - val mediaIds = requireContext().getSharedPreferences(getString(R.string.anime_downloads), Context.MODE_PRIVATE) + val mediaIds = requireContext().getSharedPreferences( + getString(R.string.anime_downloads), + Context.MODE_PRIVATE + ) ?.all?.filter { it.key.contains(item.title) }?.values ?: emptySet() if (mediaIds.isEmpty()) { snackString("No media found") // if this happens, terrible things have happened @@ -231,6 +236,7 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { true } } + override fun onSearchQuery(query: String) { adapter.onSearchQuery(query) } @@ -254,7 +260,8 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { } } val scrollTop = view.findViewById(R.id.mangaPageScrollTop) - scrollTop.translationY = -(navBarHeight + bottomBar.height + bottomBar.marginBottom).toFloat() + scrollTop.translationY = + -(navBarHeight + bottomBar.height + bottomBar.marginBottom).toFloat() val visible = false fun animate() { @@ -401,9 +408,13 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { mediaModel.status == currActivity()!!.getString(R.string.status_releasing) val isUserScored = mediaModel.userScore != 0 val watchedEpisodes = (mediaModel.userProgress ?: "~").toString() - val totalEpisode = if (mediaModel.anime?.nextAiringEpisode != null) (mediaModel.anime.nextAiringEpisode.toString() + " | " + (mediaModel.anime.totalEpisodes ?: "~").toString()) else (mediaModel.anime?.totalEpisodes ?: "~").toString() + val totalEpisode = + if (mediaModel.anime?.nextAiringEpisode != null) (mediaModel.anime.nextAiringEpisode.toString() + " | " + (mediaModel.anime.totalEpisodes + ?: "~").toString()) else (mediaModel.anime?.totalEpisodes ?: "~").toString() val chapters = " Chapters" - val totalEpisodesList = if (mediaModel.anime?.nextAiringEpisode != null) (mediaModel.anime.nextAiringEpisode.toString()) else (mediaModel.anime?.totalEpisodes ?: "~").toString() + val totalEpisodesList = + if (mediaModel.anime?.nextAiringEpisode != null) (mediaModel.anime.nextAiringEpisode.toString()) else (mediaModel.anime?.totalEpisodes + ?: "~").toString() return OfflineAnimeModel( title, score, diff --git a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeModel.kt b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeModel.kt index b5047b97..4823e2af 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeModel.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeModel.kt @@ -1,7 +1,8 @@ package ani.dantotsu.download.anime import android.net.Uri -data class OfflineAnimeModel ( + +data class OfflineAnimeModel( val title: String, val score: String, val totalEpisode: String, diff --git a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaFragment.kt b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaFragment.kt index 593746b3..ba3a3a1d 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaFragment.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaFragment.kt @@ -171,11 +171,13 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener { gridView.scheduleLayoutAnimation() grid() val total = view.findViewById(R.id.total) - total.text = if (gridView.count > 0) "Manga and Novels (${gridView.count})" else "Empty List" + total.text = + if (gridView.count > 0) "Manga and Novels (${gridView.count})" else "Empty List" return view } - private fun grid(){ + + private fun grid() { gridView.setOnItemClickListener { parent, view, position, id -> // Get the OfflineMangaModel that was clicked val item = adapter.getItem(position) as OfflineMangaModel @@ -220,6 +222,7 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener { true } } + override fun onSearchQuery(query: String) { adapter.onSearchQuery(query) } @@ -243,7 +246,8 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener { } } val scrollTop = view.findViewById(R.id.mangaPageScrollTop) - scrollTop.translationY = -(navBarHeight + bottomBar.height + bottomBar.marginBottom).toFloat() + scrollTop.translationY = + -(navBarHeight + bottomBar.height + bottomBar.marginBottom).toFloat() val visible = false fun animate() { diff --git a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt index 57873031..a2ee6593 100644 --- a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt @@ -1,7 +1,6 @@ package ani.dantotsu.home import android.animation.ObjectAnimator -import android.content.Context import android.content.Intent import android.graphics.drawable.Animatable import android.os.Build diff --git a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt index 6830ab9f..17c0bf06 100644 --- a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt @@ -140,6 +140,7 @@ class MangaPageAdapter : RecyclerView.Adapter= Build.VERSION_CODES.O && context.packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) + fun deviceHasPip() = + Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && context.packageManager.hasSystemFeature( + PackageManager.FEATURE_PICTURE_IN_PICTURE + ) enum class ExtensionInstaller(val titleResId: String) { LEGACY("Legacy"), diff --git a/app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt b/app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt index 14dbe10e..e9a5c3a7 100644 --- a/app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt +++ b/app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt @@ -1,8 +1,8 @@ package eu.kanade.domain.base import android.content.Context -import eu.kanade.tachiyomi.util.system.hasMiuiPackageInstaller import eu.kanade.domain.base.BasePreferences.ExtensionInstaller +import eu.kanade.tachiyomi.util.system.hasMiuiPackageInstaller import eu.kanade.tachiyomi.util.system.isShizukuInstalled import kotlinx.coroutines.CoroutineScope import tachiyomi.core.preference.Preference @@ -19,14 +19,14 @@ class ExtensionInstallerPreference( override fun key() = "extension_installer" - - val entries get() = BasePreferences.ExtensionInstaller.values().run { - if (context.hasMiuiPackageInstaller) { - filter { it != BasePreferences.ExtensionInstaller.PACKAGEINSTALLER } - } else { - toList() + val entries + get() = ExtensionInstaller.values().run { + if (context.hasMiuiPackageInstaller) { + filter { it != ExtensionInstaller.PACKAGEINSTALLER } + } else { + toList() + } } - } override fun defaultValue() = if (context.hasMiuiPackageInstaller) { ExtensionInstaller.LEGACY @@ -39,9 +39,11 @@ class ExtensionInstallerPreference( ExtensionInstaller.PACKAGEINSTALLER -> { if (context.hasMiuiPackageInstaller) return ExtensionInstaller.LEGACY } + ExtensionInstaller.SHIZUKU -> { if (!context.isShizukuInstalled) return defaultValue() } + else -> {} } return value diff --git a/app/src/main/java/eu/kanade/tachiyomi/NOTICE.md b/app/src/main/java/eu/kanade/tachiyomi/NOTICE.md index 5a81820b..2669a790 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/NOTICE.md +++ b/app/src/main/java/eu/kanade/tachiyomi/NOTICE.md @@ -1,3 +1,4 @@ NOTICE -This software includes code modified from Aniyomi, available at https://github.com/aniyomiorg/aniyomi/. \ No newline at end of file +This software includes code modified from Aniyomi, available +at https://github.com/aniyomiorg/aniyomi/. \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/animesource/model/Video.kt b/app/src/main/java/eu/kanade/tachiyomi/animesource/model/Video.kt index fcb9603c..66dde1c0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/animesource/model/Video.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/animesource/model/Video.kt @@ -38,9 +38,6 @@ open class Video( @Transient @Volatile var status: State = State.QUEUE - set(value) { - field = value - } @Transient private val _progressFlow = MutableStateFlow(0) diff --git a/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreference.kt b/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreference.kt index a62f16d7..33eaf26d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreference.kt @@ -69,7 +69,11 @@ sealed class AndroidPreference( key: String, defaultValue: String, ) : AndroidPreference(preferences, keyFlow, key, defaultValue) { - override fun read(preferences: SharedPreferences, key: String, defaultValue: String): String { + override fun read( + preferences: SharedPreferences, + key: String, + defaultValue: String + ): String { return try { preferences.getString(key, defaultValue) ?: defaultValue } catch (e: ClassCastException) { @@ -145,7 +149,11 @@ sealed class AndroidPreference( key: String, defaultValue: Boolean, ) : AndroidPreference(preferences, keyFlow, key, defaultValue) { - override fun read(preferences: SharedPreferences, key: String, defaultValue: Boolean): Boolean { + override fun read( + preferences: SharedPreferences, + key: String, + defaultValue: Boolean + ): Boolean { return try { preferences.getBoolean(key, defaultValue) } catch (e: ClassCastException) { @@ -164,7 +172,11 @@ sealed class AndroidPreference( key: String, defaultValue: Set, ) : AndroidPreference>(preferences, keyFlow, key, defaultValue) { - override fun read(preferences: SharedPreferences, key: String, defaultValue: Set): Set { + override fun read( + preferences: SharedPreferences, + key: String, + defaultValue: Set + ): Set { return try { preferences.getStringSet(key, defaultValue) ?: defaultValue } catch (e: ClassCastException) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreferenceStore.kt b/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreferenceStore.kt index 61c2e2e0..72ab0ea3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreferenceStore.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/core/preference/AndroidPreferenceStore.kt @@ -68,7 +68,8 @@ class AndroidPreferenceStore( @OptIn(ExperimentalCoroutinesApi::class) private val SharedPreferences.keyFlow get() = callbackFlow { - val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key: String? -> trySend(key) } + val listener = + SharedPreferences.OnSharedPreferenceChangeListener { _, key: String? -> trySend(key) } registerOnSharedPreferenceChangeListener(listener) awaitClose { unregisterOnSharedPreferenceChangeListener(listener) diff --git a/app/src/main/java/eu/kanade/tachiyomi/core/util/system/ImageUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/core/util/system/ImageUtil.kt index b88f017b..2b2dac4c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/core/util/system/ImageUtil.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/core/util/system/ImageUtil.kt @@ -1,37 +1,16 @@ package tachiyomi.core.util.system -import android.content.Context -import android.content.res.Configuration import android.content.res.Resources import android.graphics.Bitmap import android.graphics.BitmapFactory -import android.graphics.BitmapRegionDecoder -import android.graphics.Color import android.graphics.Matrix import android.graphics.Rect -import android.graphics.drawable.ColorDrawable -import android.graphics.drawable.Drawable -import android.graphics.drawable.GradientDrawable -import android.os.Build -import android.webkit.MimeTypeMap -import androidx.annotation.ColorInt -import androidx.core.graphics.alpha import androidx.core.graphics.applyCanvas -import androidx.core.graphics.blue import androidx.core.graphics.createBitmap -import androidx.core.graphics.get -import androidx.core.graphics.green -import androidx.core.graphics.red -import com.hippo.unifile.UniFile -import logcat.LogPriority -import java.io.BufferedInputStream import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.InputStream -import java.net.URLConnection -import kotlin.math.abs import kotlin.math.max -import kotlin.math.min object ImageUtil { 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 e4e9f0e6..6063e14b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/notification/NotificationReceiver.kt @@ -6,6 +6,7 @@ import android.content.Context import android.content.Intent import ani.dantotsu.MainActivity import eu.kanade.tachiyomi.core.Constants + /** * Global [BroadcastReceiver] that runs on UI thread * Pending Broadcasts should be made from here. @@ -28,7 +29,12 @@ class NotificationReceiver { action = Constants.SHORTCUT_EXTENSIONS addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) } - return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + return PendingIntent.getActivity( + context, + 0, + intent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt index 277afa71..82588463 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt @@ -13,7 +13,6 @@ import eu.kanade.tachiyomi.extension.anime.util.AnimeExtensionInstallReceiver import eu.kanade.tachiyomi.extension.anime.util.AnimeExtensionInstaller import eu.kanade.tachiyomi.extension.anime.util.AnimeExtensionLoader import eu.kanade.tachiyomi.util.preference.plusAssign -import eu.kanade.tachiyomi.util.system.toast import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -57,20 +56,24 @@ class AnimeExtensionManager( private val iconMap = mutableMapOf() - private val _installedAnimeExtensionsFlow = MutableStateFlow(emptyList()) + private val _installedAnimeExtensionsFlow = + MutableStateFlow(emptyList()) val installedExtensionsFlow = _installedAnimeExtensionsFlow.asStateFlow() private var subLanguagesEnabledOnFirstRun = preferences.enabledLanguages().isSet() fun getAppIconForSource(sourceId: Long): Drawable? { - val pkgName = _installedAnimeExtensionsFlow.value.find { ext -> ext.sources.any { it.id == sourceId } }?.pkgName + val pkgName = + _installedAnimeExtensionsFlow.value.find { ext -> ext.sources.any { it.id == sourceId } }?.pkgName if (pkgName != null) { - return iconMap[pkgName] ?: iconMap.getOrPut(pkgName) { context.packageManager.getApplicationIcon(pkgName) } + return iconMap[pkgName] + ?: iconMap.getOrPut(pkgName) { context.packageManager.getApplicationIcon(pkgName) } } return null } - private val _availableAnimeExtensionsFlow = MutableStateFlow(emptyList()) + private val _availableAnimeExtensionsFlow = + MutableStateFlow(emptyList()) val availableExtensionsFlow = _availableAnimeExtensionsFlow.asStateFlow() private var availableAnimeExtensionsSourcesData: Map = emptyMap() @@ -84,7 +87,8 @@ class AnimeExtensionManager( fun getSourceData(id: Long) = availableAnimeExtensionsSourcesData[id] - private val _untrustedAnimeExtensionsFlow = MutableStateFlow(emptyList()) + private val _untrustedAnimeExtensionsFlow = + MutableStateFlow(emptyList()) val untrustedExtensionsFlow = _untrustedAnimeExtensionsFlow.asStateFlow() init { @@ -213,8 +217,9 @@ class AnimeExtensionManager( * @param extension The anime extension to be updated. */ fun updateExtension(extension: AnimeExtension.Installed): Observable { - val availableExt = _availableAnimeExtensionsFlow.value.find { it.pkgName == extension.pkgName } - ?: return Observable.empty() + val availableExt = + _availableAnimeExtensionsFlow.value.find { it.pkgName == extension.pkgName } + ?: return Observable.empty() return installExtension(availableExt) } @@ -251,20 +256,27 @@ class AnimeExtensionManager( * @param signature The signature to whitelist. */ fun trustSignature(signature: String) { - val untrustedSignatures = _untrustedAnimeExtensionsFlow.value.map { it.signatureHash }.toSet() + val untrustedSignatures = + _untrustedAnimeExtensionsFlow.value.map { it.signatureHash }.toSet() if (signature !in untrustedSignatures) return AnimeExtensionLoader.trustedSignatures += signature preferences.trustedSignatures() += signature - val nowTrustedAnimeExtensions = _untrustedAnimeExtensionsFlow.value.filter { it.signatureHash == signature } + val nowTrustedAnimeExtensions = + _untrustedAnimeExtensionsFlow.value.filter { it.signatureHash == signature } _untrustedAnimeExtensionsFlow.value -= nowTrustedAnimeExtensions val ctx = context launchNow { nowTrustedAnimeExtensions .map { animeextension -> - async { AnimeExtensionLoader.loadExtensionFromPkgName(ctx, animeextension.pkgName) } + async { + AnimeExtensionLoader.loadExtensionFromPkgName( + ctx, + animeextension.pkgName + ) + } } .map { it.await() } .forEach { result -> @@ -307,11 +319,13 @@ class AnimeExtensionManager( * @param pkgName The package name of the uninstalled application. */ private fun unregisterAnimeExtension(pkgName: String) { - val installedAnimeExtension = _installedAnimeExtensionsFlow.value.find { it.pkgName == pkgName } + val installedAnimeExtension = + _installedAnimeExtensionsFlow.value.find { it.pkgName == pkgName } if (installedAnimeExtension != null) { _installedAnimeExtensionsFlow.value -= installedAnimeExtension } - val untrustedAnimeExtension = _untrustedAnimeExtensionsFlow.value.find { it.pkgName == pkgName } + val untrustedAnimeExtension = + _untrustedAnimeExtensionsFlow.value.find { it.pkgName == pkgName } if (untrustedAnimeExtension != null) { _untrustedAnimeExtensionsFlow.value -= untrustedAnimeExtension } @@ -354,13 +368,15 @@ class AnimeExtensionManager( } private fun AnimeExtension.Installed.updateExists(availableAnimeExtension: AnimeExtension.Available? = null): Boolean { - val availableExt = availableAnimeExtension ?: _availableAnimeExtensionsFlow.value.find { it.pkgName == pkgName } + val availableExt = availableAnimeExtension + ?: _availableAnimeExtensionsFlow.value.find { it.pkgName == pkgName } if (isUnofficial || availableExt == null) return false return (availableExt.versionCode > versionCode || availableExt.libVersion > libVersion) } private fun updatePendingUpdatesCount() { - preferences.animeExtensionUpdatesCount().set(_installedAnimeExtensionsFlow.value.count { it.hasUpdate }) + preferences.animeExtensionUpdatesCount() + .set(_installedAnimeExtensionsFlow.value.count { it.hasUpdate }) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/api/AnimeExtensionGithubApi.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/api/AnimeExtensionGithubApi.kt index 8a6ffbfa..93820fcd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/api/AnimeExtensionGithubApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/api/AnimeExtensionGithubApi.kt @@ -73,7 +73,10 @@ internal class AnimeExtensionGithubApi { } } - suspend fun checkForUpdates(context: Context, fromAvailableExtensionList: Boolean = false): List? { + suspend fun checkForUpdates( + context: Context, + fromAvailableExtensionList: Boolean = false + ): List? { // Limit checks to once a day at most if (fromAvailableExtensionList && Date().time < lastExtCheck.get() + 1.days.inWholeMilliseconds) { return null @@ -161,8 +164,10 @@ private fun AnimeExtensionJsonObject.extractLibVersion(): Double { return version.substringBeforeLast('.').toDouble() } -private const val REPO_URL_PREFIX = "https://raw.githubusercontent.com/aniyomiorg/aniyomi-extensions/repo/" -private const val FALLBACK_REPO_URL_PREFIX = "https://gcore.jsdelivr.net/gh/aniyomiorg/aniyomi-extensions@repo/" +private const val REPO_URL_PREFIX = + "https://raw.githubusercontent.com/aniyomiorg/aniyomi-extensions/repo/" +private const val FALLBACK_REPO_URL_PREFIX = + "https://gcore.jsdelivr.net/gh/aniyomiorg/aniyomi-extensions@repo/" @Serializable private data class AnimeExtensionJsonObject( diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallActivity.kt index edb528a8..38e4d791 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallActivity.kt @@ -3,8 +3,8 @@ package eu.kanade.tachiyomi.extension.anime.util import android.app.Activity import android.content.Intent import android.os.Bundle -import ani.dantotsu.themes.ThemeManager import ani.dantotsu.others.LangSet +import ani.dantotsu.themes.ThemeManager import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.util.system.hasMiuiPackageInstaller @@ -27,7 +27,7 @@ class AnimeExtensionInstallActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) LangSet.setLocale(this) -ThemeManager(this).applyTheme() + ThemeManager(this).applyTheme() val installIntent = Intent(Intent.ACTION_INSTALL_PACKAGE) .setDataAndType(intent.data, intent.type) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt index ed1f4e60..0dd3302d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt @@ -62,6 +62,7 @@ internal class AnimeExtensionInstallReceiver(private val listener: Listener) : } } } + Intent.ACTION_PACKAGE_REPLACED -> { launchNow { when (val result = getExtensionFromIntent(context, intent)) { @@ -72,6 +73,7 @@ internal class AnimeExtensionInstallReceiver(private val listener: Listener) : } } } + Intent.ACTION_PACKAGE_REMOVED -> { if (isReplacing(intent)) return diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstaller.kt index 96802b5c..41bfdd9b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstaller.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstaller.kt @@ -77,7 +77,11 @@ internal class AnimeExtensionInstaller(private val context: Context) { val request = DownloadManager.Request(downloadUri) .setTitle(extension.name) .setMimeType(APK_MIME) - .setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, downloadUri.lastPathSegment) + .setDestinationInExternalFilesDir( + context, + Environment.DIRECTORY_DOWNLOADS, + downloadUri.lastPathSegment + ) .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) val id = downloadManager.enqueue(request) @@ -144,6 +148,7 @@ internal class AnimeExtensionInstaller(private val context: Context) { context.startActivity(intent) } + else -> { val intent = AnimeExtensionInstallService.getIntent(context, downloadId, uri, installer) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/api/MangaExtensionGithubApi.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/api/MangaExtensionGithubApi.kt index 440a86f1..ad21741f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/api/MangaExtensionGithubApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/api/MangaExtensionGithubApi.kt @@ -73,7 +73,10 @@ internal class MangaExtensionGithubApi { } } - suspend fun checkForUpdates(context: Context, fromAvailableExtensionList: Boolean = false): List? { + suspend fun checkForUpdates( + context: Context, + fromAvailableExtensionList: Boolean = false + ): List? { // Limit checks to once a day at most if (fromAvailableExtensionList && Date().time < lastExtCheck.get() + 1.days.inWholeMilliseconds) { return null @@ -161,7 +164,8 @@ internal class MangaExtensionGithubApi { } private const val REPO_URL_PREFIX = "https://raw.githubusercontent.com/keiyoushi/extensions/main/" -private const val FALLBACK_REPO_URL_PREFIX = "https://gcore.jsdelivr.net/gh/keiyoushi/extensions@main/" +private const val FALLBACK_REPO_URL_PREFIX = + "https://gcore.jsdelivr.net/gh/keiyoushi/extensions@main/" @Serializable private data class ExtensionJsonObject( diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt index 78686e82..3802be8f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt @@ -23,7 +23,10 @@ class PackageInstallerInstallerManga(private val service: Service) : InstallerMa private val packageActionReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { - when (intent.getIntExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_FAILURE)) { + when (intent.getIntExtra( + PackageInstaller.EXTRA_STATUS, + PackageInstaller.STATUS_FAILURE + )) { PackageInstaller.STATUS_PENDING_USER_ACTION -> { val userAction = intent.getParcelableExtraCompat(Intent.EXTRA_INTENT) if (userAction == null) { @@ -34,9 +37,11 @@ class PackageInstallerInstallerManga(private val service: Service) : InstallerMa userAction.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) service.startActivity(userAction) } + PackageInstaller.STATUS_FAILURE_ABORTED -> { continueQueue(InstallStep.Idle) } + PackageInstaller.STATUS_SUCCESS -> continueQueue(InstallStep.Installed) else -> continueQueue(InstallStep.Error) } @@ -52,7 +57,8 @@ class PackageInstallerInstallerManga(private val service: Service) : InstallerMa super.processEntry(entry) activeSession = null try { - val installParams = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) + val installParams = + PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { installParams.setRequireUserAction(PackageInstaller.SessionParams.USER_ACTION_NOT_REQUIRED) } @@ -60,7 +66,8 @@ class PackageInstallerInstallerManga(private val service: Service) : InstallerMa val fileSize = service.getUriSize(entry.uri) ?: throw IllegalStateException() installParams.setSize(fileSize) - val inputStream = service.contentResolver.openInputStream(entry.uri) ?: throw IllegalStateException() + val inputStream = + service.contentResolver.openInputStream(entry.uri) ?: throw IllegalStateException() val session = packageInstaller.openSession(activeSession!!.second) val outputStream = session.openWrite(entry.downloadId.toString(), 0, fileSize) session.use { @@ -108,7 +115,12 @@ class PackageInstallerInstallerManga(private val service: Service) : InstallerMa } init { - ContextCompat.registerReceiver(service, packageActionReceiver, IntentFilter(INSTALL_ACTION), ContextCompat.RECEIVER_EXPORTED) + ContextCompat.registerReceiver( + service, + packageActionReceiver, + IntentFilter(INSTALL_ACTION), + ContextCompat.RECEIVER_EXPORTED + ) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallActivity.kt index 67e1ad1c..0ba16d84 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallActivity.kt @@ -3,8 +3,8 @@ package eu.kanade.tachiyomi.extension.manga.util import android.app.Activity import android.content.Intent import android.os.Bundle -import ani.dantotsu.themes.ThemeManager import ani.dantotsu.others.LangSet +import ani.dantotsu.themes.ThemeManager import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.util.system.hasMiuiPackageInstaller @@ -27,7 +27,7 @@ class MangaExtensionInstallActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) LangSet.setLocale(this) -ThemeManager(this).applyTheme() + ThemeManager(this).applyTheme() val installIntent = Intent(Intent.ACTION_INSTALL_PACKAGE) .setDataAndType(intent.data, intent.type) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt index b8688007..ad3c7053 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt @@ -62,6 +62,7 @@ internal class MangaExtensionInstallReceiver(private val listener: Listener) : } } } + Intent.ACTION_PACKAGE_REPLACED -> { launchNow { when (val result = getExtensionFromIntent(context, intent)) { @@ -72,6 +73,7 @@ internal class MangaExtensionInstallReceiver(private val listener: Listener) : } } } + Intent.ACTION_PACKAGE_REMOVED -> { if (isReplacing(intent)) return diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallService.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallService.kt index 61e5bb74..bab18930 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallService.kt @@ -3,9 +3,7 @@ package eu.kanade.tachiyomi.extension.manga.util import android.app.Service import android.content.Context import android.content.Intent -import android.content.pm.PackageManager import android.content.pm.ServiceInfo -import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC import android.net.Uri import android.os.Build import android.os.IBinder @@ -34,8 +32,12 @@ class MangaExtensionInstallService : Service() { setProgress(100, 100, true) }.build() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - startForeground(Notifications.ID_EXTENSION_INSTALLER, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC) - }else{ + startForeground( + Notifications.ID_EXTENSION_INSTALLER, + notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC + ) + } else { startForeground(Notifications.ID_EXTENSION_INSTALLER, notification) } } @@ -53,7 +55,10 @@ class MangaExtensionInstallService : Service() { if (installer == null) { installer = when (installerUsed) { - BasePreferences.ExtensionInstaller.PACKAGEINSTALLER -> PackageInstallerInstallerManga(this) + BasePreferences.ExtensionInstaller.PACKAGEINSTALLER -> PackageInstallerInstallerManga( + this + ) + else -> { logcat(LogPriority.ERROR) { "Not implemented for installer $installerUsed" } stopSelf() diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt index b2eed543..c76bd0bb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionLoader.kt @@ -41,15 +41,18 @@ internal object MangaExtensionLoader { const val LIB_VERSION_MIN = 1.2 const val LIB_VERSION_MAX = 1.5 - private const val PACKAGE_FLAGS = PackageManager.GET_CONFIGURATIONS or PackageManager.GET_SIGNATURES + private const val PACKAGE_FLAGS = + PackageManager.GET_CONFIGURATIONS or PackageManager.GET_SIGNATURES // inorichi's key - private const val officialSignature = "7ce04da7773d41b489f4693a366c36bcd0a11fc39b547168553c285bd7348e23" + private const val officialSignature = + "7ce04da7773d41b489f4693a366c36bcd0a11fc39b547168553c285bd7348e23" /** * List of the trusted signatures. */ - var trustedSignatures = mutableSetOf() + preferences.trustedSignatures().get() + officialSignature + var trustedSignatures = + mutableSetOf() + preferences.trustedSignatures().get() + officialSignature /** * Return a list of all the installed extensions initialized concurrently. @@ -105,7 +108,11 @@ internal object MangaExtensionLoader { * @param pkgName The package name of the extension to load. * @param pkgInfo The package info of the extension. */ - private fun loadMangaExtension(context: Context, pkgName: String, pkgInfo: PackageInfo): MangaLoadResult { + private fun loadMangaExtension( + context: Context, + pkgName: String, + pkgInfo: PackageInfo + ): MangaLoadResult { val pkgManager = context.packageManager val appInfo = try { @@ -116,7 +123,8 @@ internal object MangaExtensionLoader { return MangaLoadResult.Error } - val extName = pkgManager.getApplicationLabel(appInfo).toString().substringAfter("Tachiyomi: ") + val extName = + pkgManager.getApplicationLabel(appInfo).toString().substringAfter("Tachiyomi: ") val versionName = pkgInfo.versionName val versionCode = PackageInfoCompat.getLongVersionCode(pkgInfo) @@ -130,7 +138,7 @@ internal object MangaExtensionLoader { if (libVersion == null || libVersion < LIB_VERSION_MIN || libVersion > LIB_VERSION_MAX) { logcat(LogPriority.WARN) { "Lib version is $libVersion, while only versions " + - "$LIB_VERSION_MIN to $LIB_VERSION_MAX are allowed" + "$LIB_VERSION_MIN to $LIB_VERSION_MAX are allowed" } return MangaLoadResult.Error } diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt index fa56778b..e73b97d2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt @@ -3,7 +3,6 @@ package eu.kanade.tachiyomi.network import android.content.Context import android.os.Build import ani.dantotsu.Mapper -import ani.dantotsu.defaultHeaders import com.lagradost.nicehttp.Requests import eu.kanade.tachiyomi.network.interceptor.CloudflareInterceptor import eu.kanade.tachiyomi.network.interceptor.UncaughtExceptionInterceptor @@ -31,42 +30,40 @@ class NetworkHelper( CloudflareInterceptor(context, cookieJar, ::defaultUserAgentProvider) } - private fun baseClientBuilder(callTimout: Int = 2): OkHttpClient.Builder - { - val builder = OkHttpClient.Builder() - .cookieJar(cookieJar) - .connectTimeout(30, TimeUnit.SECONDS) - .readTimeout(30, TimeUnit.SECONDS) - .callTimeout(callTimout.toLong(), TimeUnit.MINUTES) - .addInterceptor(UncaughtExceptionInterceptor()) - .addInterceptor(userAgentInterceptor) + private fun baseClientBuilder(callTimout: Int = 2): OkHttpClient.Builder { + val builder = OkHttpClient.Builder() + .cookieJar(cookieJar) + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) + .callTimeout(callTimout.toLong(), TimeUnit.MINUTES) + .addInterceptor(UncaughtExceptionInterceptor()) + .addInterceptor(userAgentInterceptor) - if (preferences.verboseLogging().get()) { - val httpLoggingInterceptor = HttpLoggingInterceptor().apply { - level = HttpLoggingInterceptor.Level.HEADERS - } - builder.addNetworkInterceptor(httpLoggingInterceptor) + if (preferences.verboseLogging().get()) { + val httpLoggingInterceptor = HttpLoggingInterceptor().apply { + level = HttpLoggingInterceptor.Level.HEADERS } - - when (preferences.dohProvider().get()) { - PREF_DOH_CLOUDFLARE -> builder.dohCloudflare() - PREF_DOH_GOOGLE -> builder.dohGoogle() - PREF_DOH_ADGUARD -> builder.dohAdGuard() - PREF_DOH_QUAD9 -> builder.dohQuad9() - PREF_DOH_ALIDNS -> builder.dohAliDNS() - PREF_DOH_DNSPOD -> builder.dohDNSPod() - PREF_DOH_360 -> builder.doh360() - PREF_DOH_QUAD101 -> builder.dohQuad101() - PREF_DOH_MULLVAD -> builder.dohMullvad() - PREF_DOH_CONTROLD -> builder.dohControlD() - PREF_DOH_NJALLA -> builder.dohNajalla() - PREF_DOH_SHECAN -> builder.dohShecan() - PREF_DOH_LIBREDNS -> builder.dohLibreDNS() - } - - return builder + builder.addNetworkInterceptor(httpLoggingInterceptor) } + when (preferences.dohProvider().get()) { + PREF_DOH_CLOUDFLARE -> builder.dohCloudflare() + PREF_DOH_GOOGLE -> builder.dohGoogle() + PREF_DOH_ADGUARD -> builder.dohAdGuard() + PREF_DOH_QUAD9 -> builder.dohQuad9() + PREF_DOH_ALIDNS -> builder.dohAliDNS() + PREF_DOH_DNSPOD -> builder.dohDNSPod() + PREF_DOH_360 -> builder.doh360() + PREF_DOH_QUAD101 -> builder.dohQuad101() + PREF_DOH_MULLVAD -> builder.dohMullvad() + PREF_DOH_CONTROLD -> builder.dohControlD() + PREF_DOH_NJALLA -> builder.dohNajalla() + PREF_DOH_SHECAN -> builder.dohShecan() + PREF_DOH_LIBREDNS -> builder.dohLibreDNS() + } + + return builder + } val client by lazy { baseClientBuilder().cache(Cache(cacheDir, cacheSize)).build() } @@ -80,15 +77,15 @@ class NetworkHelper( } val requestClient = Requests( - client, - mapOf( - "User-Agent" to - defaultUserAgentProvider() - .format(Build.VERSION.RELEASE, Build.MODEL) - ), - defaultCacheTime = 6, - defaultCacheTimeUnit = TimeUnit.HOURS, - responseParser = Mapper + client, + mapOf( + "User-Agent" to + defaultUserAgentProvider() + .format(Build.VERSION.RELEASE, Build.MODEL) + ), + defaultCacheTime = 6, + defaultCacheTimeUnit = TimeUnit.HOURS, + responseParser = Mapper ) fun defaultUserAgentProvider() = preferences.defaultUserAgent().get().trim() diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt index aa523e87..2b5dbe63 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt @@ -1,7 +1,5 @@ package eu.kanade.tachiyomi.network -import eu.kanade.tachiyomi.network.ProgressListener -import eu.kanade.tachiyomi.network.ProgressResponseBody import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.serialization.DeserializationStrategy diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/ProgressResponseBody.kt b/app/src/main/java/eu/kanade/tachiyomi/network/ProgressResponseBody.kt index 72248f17..3006cf0a 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/ProgressResponseBody.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/ProgressResponseBody.kt @@ -9,7 +9,10 @@ import okio.Source import okio.buffer import java.io.IOException -class ProgressResponseBody(private val responseBody: ResponseBody, private val progressListener: ProgressListener) : ResponseBody() { +class ProgressResponseBody( + private val responseBody: ResponseBody, + private val progressListener: ProgressListener +) : ResponseBody() { private val bufferedSource: BufferedSource by lazy { source(responseBody.source()).buffer() @@ -36,7 +39,11 @@ class ProgressResponseBody(private val responseBody: ResponseBody, private val p val bytesRead = super.read(sink, byteCount) // read() returns the number of bytes read, or -1 if this source is exhausted. totalBytesRead += if (bytesRead != -1L) bytesRead else 0 - progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1L) + progressListener.update( + totalBytesRead, + responseBody.contentLength(), + bytesRead == -1L + ) return bytesRead } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt index 5629f016..c6e40a91 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/WebViewInterceptor.kt @@ -95,7 +95,17 @@ private fun isRequestHeaderSafe(_name: String, _value: String): Boolean { val name = _name.lowercase(Locale.ENGLISH) val value = _value.lowercase(Locale.ENGLISH) if (name in unsafeHeaderNames || name.startsWith("proxy-")) return false - if (name == "connection" && value == "upgrade") return false - return true + return !(name == "connection" && value == "upgrade") } -private val unsafeHeaderNames = listOf("content-length", "host", "trailer", "te", "upgrade", "cookie2", "keep-alive", "transfer-encoding", "set-cookie") + +private val unsafeHeaderNames = listOf( + "content-length", + "host", + "trailer", + "te", + "upgrade", + "cookie2", + "keep-alive", + "transfer-encoding", + "set-cookie" +) diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/MangaSource.kt b/app/src/main/java/eu/kanade/tachiyomi/source/MangaSource.kt index fabc4590..d4da042e 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/MangaSource.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/MangaSource.kt @@ -33,7 +33,8 @@ interface MangaSource { "Use the 1.x API instead", ReplaceWith("getMangaDetails"), ) - fun fetchMangaDetails(manga: SManga): Observable = throw IllegalStateException("Not used") + fun fetchMangaDetails(manga: SManga): Observable = + throw IllegalStateException("Not used") /** * Returns an observable with all the available chapters for a manga. @@ -44,7 +45,8 @@ interface MangaSource { "Use the 1.x API instead", ReplaceWith("getChapterList"), ) - fun fetchChapterList(manga: SManga): Observable> = throw IllegalStateException("Not used") + fun fetchChapterList(manga: SManga): Observable> = + throw IllegalStateException("Not used") /** * Returns an observable with the list of pages a chapter has. Pages should be returned diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/anime/AndroidAnimeSourceManager.kt b/app/src/main/java/eu/kanade/tachiyomi/source/anime/AndroidAnimeSourceManager.kt index 79b30b9e..c2250038 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/anime/AndroidAnimeSourceManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/anime/AndroidAnimeSourceManager.kt @@ -31,7 +31,8 @@ class AndroidAnimeSourceManager( private val stubSourcesMap = ConcurrentHashMap() - override val catalogueSources: Flow> = sourcesMapFlow.map { it.values.filterIsInstance() } + override val catalogueSources: Flow> = + sourcesMapFlow.map { it.values.filterIsInstance() } init { scope.launch { @@ -66,9 +67,11 @@ class AndroidAnimeSourceManager( } } - override fun getOnlineSources() = sourcesMapFlow.value.values.filterIsInstance() + override fun getOnlineSources() = + sourcesMapFlow.value.values.filterIsInstance() - override fun getCatalogueSources() = sourcesMapFlow.value.values.filterIsInstance() + override fun getCatalogueSources() = + sourcesMapFlow.value.values.filterIsInstance() override fun getStubSources(): List { val onlineSourceIds = getOnlineSources().map { it.id } diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/manga/AndroidMangaSourceManager.kt b/app/src/main/java/eu/kanade/tachiyomi/source/manga/AndroidMangaSourceManager.kt index 08bd2b61..97227231 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/manga/AndroidMangaSourceManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/manga/AndroidMangaSourceManager.kt @@ -31,7 +31,8 @@ class AndroidMangaSourceManager( private val stubSourcesMap = ConcurrentHashMap() - override val catalogueSources: Flow> = sourcesMapFlow.map { it.values.filterIsInstance() } + override val catalogueSources: Flow> = + sourcesMapFlow.map { it.values.filterIsInstance() } init { scope.launch { @@ -67,7 +68,8 @@ class AndroidMangaSourceManager( override fun getOnlineSources() = sourcesMapFlow.value.values.filterIsInstance() - override fun getCatalogueSources() = sourcesMapFlow.value.values.filterIsInstance() + override fun getCatalogueSources() = + sourcesMapFlow.value.values.filterIsInstance() override fun getStubSources(): List { val onlineSourceIds = getOnlineSources().map { it.id } diff --git a/app/src/main/java/eu/kanade/tachiyomi/source/model/Filter.kt b/app/src/main/java/eu/kanade/tachiyomi/source/model/Filter.kt index f30b2f52..14955db2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/source/model/Filter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/source/model/Filter.kt @@ -3,7 +3,9 @@ package eu.kanade.tachiyomi.source.model sealed class Filter(val name: String, var state: T) { open class Header(name: String) : Filter(name, 0) open class Separator(name: String = "") : Filter(name, 0) - abstract class Select(name: String, val values: Array, state: Int = 0) : Filter(name, state) + abstract class Select(name: String, val values: Array, state: Int = 0) : + Filter(name, state) + abstract class Text(name: String, state: String = "") : Filter(name, state) abstract class CheckBox(name: String, state: Boolean = false) : Filter(name, state) abstract class TriState(name: String, state: Int = STATE_IGNORE) : Filter(name, state) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt index 773c8c12..d7cacb64 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt @@ -21,11 +21,10 @@ import androidx.core.graphics.blue import androidx.core.graphics.green import androidx.core.graphics.red import androidx.core.net.toUri +import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.util.lang.truncateCenter import logcat.LogPriority import tachiyomi.core.util.system.logcat -import ani.dantotsu.toast -import com.hippo.unifile.UniFile import java.io.File import kotlin.math.roundToInt @@ -59,7 +58,8 @@ fun Context.copyToClipboard(label: String, content: String) { * @param permission the permission to check. * @return true if it has permissions. */ -fun Context.hasPermission(permission: String) = PermissionChecker.checkSelfPermission(this, permission) == PermissionChecker.PERMISSION_GRANTED +fun Context.hasPermission(permission: String) = + PermissionChecker.checkSelfPermission(this, permission) == PermissionChecker.PERMISSION_GRANTED /** * Returns the color for the given attribute. @@ -67,7 +67,8 @@ fun Context.hasPermission(permission: String) = PermissionChecker.checkSelfPermi * @param resource the attribute. * @param alphaFactor the alpha number [0,1]. */ -@ColorInt fun Context.getResourceColor(@AttrRes resource: Int, alphaFactor: Float = 1f): Int { +@ColorInt +fun Context.getResourceColor(@AttrRes resource: Int, alphaFactor: Float = 1f): Int { val typedArray = obtainStyledAttributes(intArrayOf(resource)) val color = typedArray.getColor(0, 0) typedArray.recycle() @@ -80,7 +81,8 @@ fun Context.hasPermission(permission: String) = PermissionChecker.checkSelfPermi return color } -@ColorInt fun Context.getThemeColor(attr: Int): Int { +@ColorInt +fun Context.getThemeColor(attr: Int): Int { val tv = TypedValue() return if (this.theme.resolveAttribute(attr, tv, true)) { if (tv.resourceId != 0) { @@ -137,7 +139,10 @@ fun Context.openInBrowser(uri: Uri, forceDefaultBrowser: Boolean = false) { private fun Context.defaultBrowserPackageName(): String? { val browserIntent = Intent(Intent.ACTION_VIEW, "http://".toUri()) val resolveInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - packageManager.resolveActivity(browserIntent, PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY.toLong())) + packageManager.resolveActivity( + browserIntent, + PackageManager.ResolveInfoFlags.of(PackageManager.MATCH_DEFAULT_ONLY.toLong()) + ) } else { @Suppress("DEPRECATION") packageManager.resolveActivity(browserIntent, PackageManager.MATCH_DEFAULT_ONLY) @@ -184,7 +189,6 @@ val Context.hasMiuiPackageInstaller get() = isPackageInstalled("com.miui.package val Context.isShizukuInstalled get() = false - fun Context.getApplicationIcon(pkgName: String): Drawable? { return try { packageManager.getApplicationIcon(pkgName) 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 5adba5d9..e929b862 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 @@ -16,6 +16,7 @@ fun Uri.toShareIntent(context: Context, type: String = "image/*", message: Strin "http", "https" -> { putExtra(Intent.EXTRA_TEXT, uri.toString()) } + "content" -> { message?.let { putExtra(Intent.EXTRA_TEXT, it) } putExtra(Intent.EXTRA_STREAM, uri) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ToastExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ToastExtensions.kt index 4901e746..5e2e903b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ToastExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ToastExtensions.kt @@ -10,7 +10,11 @@ import androidx.annotation.StringRes * @param resource the text resource. * @param duration the duration of the toast. Defaults to short. */ -fun Context.toast(@StringRes resource: Int, duration: Int = Toast.LENGTH_SHORT, block: (Toast) -> Unit = {}): Toast { +fun Context.toast( + @StringRes resource: Int, + duration: Int = Toast.LENGTH_SHORT, + block: (Toast) -> Unit = {} +): Toast { return toast(getString(resource), duration, block) } @@ -20,7 +24,11 @@ fun Context.toast(@StringRes resource: Int, duration: Int = Toast.LENGTH_SHORT, * @param text the text to display. * @param duration the duration of the toast. Defaults to short. */ -fun Context.toast(text: String?, duration: Int = Toast.LENGTH_SHORT, block: (Toast) -> Unit = {}): Toast { +fun Context.toast( + text: String?, + duration: Int = Toast.LENGTH_SHORT, + block: (Toast) -> Unit = {} +): Toast { return Toast.makeText(applicationContext, text.orEmpty(), duration).also { block(it) it.show() diff --git a/app/src/main/java/tachiyomi/domain/items/episode/service/EpisodeRecognition.kt b/app/src/main/java/tachiyomi/domain/items/episode/service/EpisodeRecognition.kt index c40410a3..65db5018 100644 --- a/app/src/main/java/tachiyomi/domain/items/episode/service/EpisodeRecognition.kt +++ b/app/src/main/java/tachiyomi/domain/items/episode/service/EpisodeRecognition.kt @@ -30,7 +30,11 @@ object EpisodeRecognition { */ private val unwantedWhiteSpace = Regex("""\s(?=extra|special|omake)""") - fun parseEpisodeNumber(animeTitle: String, episodeName: String, episodeNumber: Float? = null): Float { + fun parseEpisodeNumber( + animeTitle: String, + episodeName: String, + episodeNumber: Float? = null + ): Float { // If episode number is known return. if (episodeNumber != null && (episodeNumber == -2f || episodeNumber > -1f)) { return episodeNumber diff --git a/app/src/main/java/tachiyomi/source/local/entries/anime/LocalAnimeSource.kt b/app/src/main/java/tachiyomi/source/local/entries/anime/LocalAnimeSource.kt index d145c95a..ec6dd735 100644 --- a/app/src/main/java/tachiyomi/source/local/entries/anime/LocalAnimeSource.kt +++ b/app/src/main/java/tachiyomi/source/local/entries/anime/LocalAnimeSource.kt @@ -1,5 +1,6 @@ package tachiyomi.source.local.entries.anime +//import eu.kanade.tachiyomi.util.storage.toFFmpegString import android.content.Context import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource import eu.kanade.tachiyomi.animesource.AnimeSource @@ -8,15 +9,11 @@ import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.AnimesPage import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.animesource.model.SEpisode -import eu.kanade.tachiyomi.util.lang.compareToCaseInsensitiveNaturalOrder import eu.kanade.tachiyomi.util.storage.DiskUtil -//import eu.kanade.tachiyomi.util.storage.toFFmpegString -import kotlinx.serialization.json.Json import rx.Observable import tachiyomi.core.util.lang.withIOContext import tachiyomi.domain.entries.anime.model.Anime import tachiyomi.source.local.filter.anime.AnimeOrderBy -import uy.kohesive.injekt.injectLazy import java.io.File import java.util.concurrent.TimeUnit @@ -27,7 +24,7 @@ class LocalAnimeSource( private val POPULAR_FILTERS = AnimeFilterList(AnimeOrderBy.Popular(context)) private val LATEST_FILTERS = AnimeFilterList(AnimeOrderBy.Latest(context)) - override val name ="Local anime source" + override val name = "Local anime source" override val id: Long = ID @@ -42,7 +39,11 @@ class LocalAnimeSource( override fun fetchLatestUpdates(page: Int) = fetchSearchAnime(page, "", LATEST_FILTERS) - override fun fetchSearchAnime(page: Int, query: String, filters: AnimeFilterList): Observable { + override fun fetchSearchAnime( + page: Int, + query: String, + filters: AnimeFilterList + ): Observable { //return emptyObservable() return Observable.just(AnimesPage(emptyList(), false)) } @@ -63,7 +64,8 @@ class LocalAnimeSource( override fun getFilterList() = AnimeFilterList(AnimeOrderBy.Popular(context)) // Unused stuff - override suspend fun getVideoList(episode: SEpisode) = throw UnsupportedOperationException("Unused") + override suspend fun getVideoList(episode: SEpisode) = + throw UnsupportedOperationException("Unused") companion object { const val ID = 0L diff --git a/app/src/main/java/tachiyomi/source/local/entries/manga/LocalMangaSource.kt b/app/src/main/java/tachiyomi/source/local/entries/manga/LocalMangaSource.kt index b0ae8f9d..b6c0bd75 100644 --- a/app/src/main/java/tachiyomi/source/local/entries/manga/LocalMangaSource.kt +++ b/app/src/main/java/tachiyomi/source/local/entries/manga/LocalMangaSource.kt @@ -37,7 +37,11 @@ class LocalMangaSource( override fun fetchLatestUpdates(page: Int) = fetchSearchManga(page, "", LATEST_FILTERS) - override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + override fun fetchSearchManga( + page: Int, + query: String, + filters: FilterList + ): Observable { return Observable.just(MangasPage(emptyList(), false)) } @@ -55,7 +59,8 @@ class LocalMangaSource( override fun getFilterList() = FilterList(MangaOrderBy.Popular(context)) // Unused stuff - override suspend fun getPageList(chapter: SChapter) = throw UnsupportedOperationException("Unused") + override suspend fun getPageList(chapter: SChapter) = + throw UnsupportedOperationException("Unused") companion object { const val ID = 0L