diff --git a/app/src/google/java/ani/dantotsu/connections/crashlytics/FirebaseCrashlytics.kt b/app/src/google/java/ani/dantotsu/connections/crashlytics/FirebaseCrashlytics.kt index 64ab524f..297242af 100644 --- a/app/src/google/java/ani/dantotsu/connections/crashlytics/FirebaseCrashlytics.kt +++ b/app/src/google/java/ani/dantotsu/connections/crashlytics/FirebaseCrashlytics.kt @@ -5,7 +5,6 @@ import com.google.firebase.FirebaseApp import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.crashlytics.ktx.crashlytics import com.google.firebase.ktx.Firebase -import com.google.firebase.ktx.app class FirebaseCrashlytics : CrashlyticsInterface { override fun initialize(context: Context) { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5883981b..668ad5ab 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -18,7 +18,7 @@ + android:maxSdkVersion="29" /> @@ -52,11 +52,13 @@ android:label="@string/app_name" android:largeHeap="true" android:requestLegacyExternalStorage="true" + android:enableOnBackInvokedCallback="true" android:roundIcon="${icon_placeholder_round}" android:supportsRtl="true" android:theme="@style/Theme.Dantotsu" android:usesCleartextTraffic="true" - tools:ignore="AllowBackup"> + tools:ignore="AllowBackup" + tools:targetApi="tiramisu"> @@ -278,11 +280,7 @@ - @@ -325,11 +323,7 @@ - + ) { _, which -> if (which == DialogInterface.BUTTON_NEUTRAL) { date = FuzzyDate() } @@ -337,7 +336,7 @@ class InputFilterMinMax( } -class ZoomOutPageTransformer() : +class ZoomOutPageTransformer : ViewPager2.PageTransformer { override fun transformPage(view: View, position: Float) { if (position == 0.0f && PrefManager.getVal(PrefName.LayoutAnimations)) { diff --git a/app/src/main/java/ani/dantotsu/MainActivity.kt b/app/src/main/java/ani/dantotsu/MainActivity.kt index 4268aac0..d256cffb 100644 --- a/app/src/main/java/ani/dantotsu/MainActivity.kt +++ b/app/src/main/java/ani/dantotsu/MainActivity.kt @@ -91,16 +91,16 @@ class MainActivity : AppCompatActivity() { binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - val _bottomBar = findViewById(R.id.navbar) + val bottomNavBar = findViewById(R.id.navbar) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - val backgroundDrawable = _bottomBar.background as GradientDrawable + val backgroundDrawable = bottomNavBar.background as GradientDrawable val currentColor = backgroundDrawable.color?.defaultColor ?: 0 val semiTransparentColor = (currentColor and 0x00FFFFFF) or 0xF9000000.toInt() backgroundDrawable.setColor(semiTransparentColor) - _bottomBar.background = backgroundDrawable + bottomNavBar.background = backgroundDrawable } - _bottomBar.background = ContextCompat.getDrawable(this, R.drawable.bottom_nav_gray) + bottomNavBar.background = ContextCompat.getDrawable(this, R.drawable.bottom_nav_gray) val offset = try { val statusBarHeightId = resources.getIdentifier("status_bar_height", "dimen", "android") @@ -269,7 +269,7 @@ class MainActivity : AppCompatActivity() { startActivity(Intent(this, NoInternet::class.java)) } else { val model: AnilistHomeViewModel by viewModels() - model.genres.observe(this) { it -> + model.genres.observe(this) { if (it != null) { if (it) { val navbar = binding.includedNavbar.navbar @@ -294,7 +294,7 @@ class MainActivity : AppCompatActivity() { mainViewPager.setCurrentItem(newIndex, false) } }) - if (mainViewPager.getCurrentItem() != selectedOption) { + if (mainViewPager.currentItem != selectedOption) { navbar.selectTabAt(selectedOption) mainViewPager.post { mainViewPager.setCurrentItem( diff --git a/app/src/main/java/ani/dantotsu/Network.kt b/app/src/main/java/ani/dantotsu/Network.kt index aa71cb48..91840b3e 100644 --- a/app/src/main/java/ani/dantotsu/Network.kt +++ b/app/src/main/java/ani/dantotsu/Network.kt @@ -1,6 +1,5 @@ package ani.dantotsu -import android.content.Context import android.os.Build import androidx.fragment.app.FragmentActivity import ani.dantotsu.others.webview.CloudFlare @@ -35,7 +34,7 @@ lateinit var defaultHeaders: Map lateinit var okHttpClient: OkHttpClient lateinit var client: Requests -fun initializeNetwork(context: Context) { +fun initializeNetwork() { val networkHelper = Injekt.get() diff --git a/app/src/main/java/ani/dantotsu/aniyomi/anime/custom/InjektModules.kt b/app/src/main/java/ani/dantotsu/aniyomi/anime/custom/InjektModules.kt index c3a19008..6a636408 100644 --- a/app/src/main/java/ani/dantotsu/aniyomi/anime/custom/InjektModules.kt +++ b/app/src/main/java/ani/dantotsu/aniyomi/anime/custom/InjektModules.kt @@ -18,6 +18,7 @@ import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.anime.AndroidAnimeSourceManager import eu.kanade.tachiyomi.source.manga.AndroidMangaSourceManager +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.json.Json import tachiyomi.core.preference.PreferenceStore import tachiyomi.domain.source.anime.service.AnimeSourceManager @@ -29,7 +30,7 @@ import uy.kohesive.injekt.api.addSingletonFactory import uy.kohesive.injekt.api.get class AppModule(val app: Application) : InjektModule { - @OptIn(UnstableApi::class) + @OptIn(UnstableApi::class) @kotlin.OptIn(ExperimentalSerializationApi::class) override fun InjektRegistrar.registerInjectables() { addSingleton(app) diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt b/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt index 804343f6..cc8d1441 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt @@ -3,7 +3,6 @@ package ani.dantotsu.connections.anilist import android.content.ActivityNotFoundException import android.content.Context import android.net.Uri -import android.util.Log import androidx.browser.customtabs.CustomTabsIntent import ani.dantotsu.R import ani.dantotsu.client @@ -13,7 +12,6 @@ import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.snackString import ani.dantotsu.toast -import ani.dantotsu.tryWithSuspend import ani.dantotsu.util.Logger import java.util.Calendar diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt index 07090cc9..20aa2ae6 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -337,6 +337,7 @@ class AnilistQueries { returnArray.addAll(map.values) return returnArray } + @Suppress("UNCHECKED_CAST") val list = PrefManager.getNullableCustomVal( "continueAnimeList", listOf(), @@ -494,6 +495,7 @@ class AnilistQueries { returnMap["current$type"] = returnArray return } + @Suppress("UNCHECKED_CAST") val list = PrefManager.getNullableCustomVal( "continueAnimeList", listOf(), @@ -523,6 +525,7 @@ class AnilistQueries { subMap[m.id] = m } } + @Suppress("UNCHECKED_CAST") val list = PrefManager.getNullableCustomVal( "continueAnimeList", listOf(), @@ -684,7 +687,7 @@ class AnilistQueries { } sorted["All"] = all - val listSort: String = if (anime) PrefManager.getVal(PrefName.AnimeListSortOrder) + val listSort: String? = if (anime) PrefManager.getVal(PrefName.AnimeListSortOrder) else PrefManager.getVal(PrefName.MangaListSortOrder) val sort = listSort ?: sortOrder ?: options?.rowOrder for (i in sorted.keys) { diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt index 5eb28a79..a4092b91 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -112,8 +112,8 @@ class AnilistHomeViewModel : ViewModel() { suspend fun loadMain(context: FragmentActivity) { Anilist.getSavedToken() - MAL.getSavedToken(context) - Discord.getSavedToken(context) + MAL.getSavedToken() + Discord.getSavedToken() if (!BuildConfig.FLAVOR.contains("fdroid")) { if (PrefManager.getVal(PrefName.CheckUpdate)) AppUpdater.check(context) } @@ -159,7 +159,7 @@ class AnilistAnimeViewModel : ViewModel() { fun getPopular(): LiveData = animePopular suspend fun loadPopular( type: String, - search_val: String? = null, + searchVal: String? = null, genres: ArrayList? = null, sort: String = Anilist.sortBy[1], onList: Boolean = true, @@ -167,7 +167,7 @@ class AnilistAnimeViewModel : ViewModel() { animePopular.postValue( Anilist.query.search( type, - search = search_val, + search = searchVal, onList = if (onList) null else false, sort = sort, genres = genres @@ -231,7 +231,7 @@ class AnilistMangaViewModel : ViewModel() { fun getPopular(): LiveData = mangaPopular suspend fun loadPopular( type: String, - search_val: String? = null, + searchVal: String? = null, genres: ArrayList? = null, sort: String = Anilist.sortBy[1], onList: Boolean = true, @@ -239,7 +239,7 @@ class AnilistMangaViewModel : ViewModel() { mangaPopular.postValue( Anilist.query.search( type, - search = search_val, + search = searchVal, onList = if (onList) null else false, sort = sort, genres = genres diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/api/Notification.kt b/app/src/main/java/ani/dantotsu/connections/anilist/api/Notification.kt index 073fadc1..59ae91d7 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/api/Notification.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/api/Notification.kt @@ -80,9 +80,9 @@ data class Notification( @SerialName("createdAt") val createdAt: Int, @SerialName("media") - val media: ani.dantotsu.connections.anilist.api.Media?, + val media: Media?, @SerialName("user") - val user: ani.dantotsu.connections.anilist.api.User?, + val user: User?, @SerialName("message") val message: MessageActivity?, @SerialName("activity") diff --git a/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt b/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt index c151850d..440f5d68 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt @@ -20,14 +20,14 @@ object Discord { var avatar: String? = null - fun getSavedToken(context: Context): Boolean { + fun getSavedToken(): Boolean { token = PrefManager.getVal( PrefName.DiscordToken, null as String? ) return token != null } - fun saveToken(context: Context, token: String) { + fun saveToken(token: String) { PrefManager.setVal(PrefName.DiscordToken, token) } @@ -79,7 +79,7 @@ object Discord { "Dantotsu", small_Image ) - buttons.add(RPC.Link("Stream on Dantotsu", "https://github.com/rebelonion/Dantotsu/")) + buttons.add(RPC.Link("Stream on Dantotsu", getString(R.string.github))) } } }*/ diff --git a/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt b/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt index 0a29ab60..7f2c23b0 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt @@ -5,16 +5,12 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.app.Service -import android.content.ContentValues import android.content.Context import android.content.Intent import android.content.pm.PackageManager -import android.net.Uri import android.os.Build -import android.os.Environment import android.os.IBinder import android.os.PowerManager -import android.provider.MediaStore import androidx.core.app.ActivityCompat import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat @@ -37,7 +33,6 @@ import okhttp3.Response import okhttp3.WebSocket import okhttp3.WebSocketListener import java.io.File -import java.io.OutputStreamWriter class DiscordService : Service() { private var heartbeat: Int = 0 @@ -162,8 +157,8 @@ class DiscordService : Service() { inner class DiscordWebSocketListener : WebSocketListener() { - var retryAttempts = 0 - val maxRetryAttempts = 10 + private var retryAttempts = 0 + private val maxRetryAttempts = 10 override fun onOpen(webSocket: WebSocket, response: Response) { super.onOpen(webSocket, response) this@DiscordService.webSocket = webSocket @@ -232,7 +227,7 @@ class DiscordService : Service() { resume() resume = false } else { - identify(webSocket, baseContext) + identify(webSocket) log("WebSocket: Identified") } } @@ -245,13 +240,13 @@ class DiscordService : Service() { } } - fun identify(webSocket: WebSocket, context: Context) { + private fun identify(webSocket: WebSocket) { val properties = JsonObject() properties.addProperty("os", "linux") properties.addProperty("browser", "unknown") properties.addProperty("device", "unknown") val d = JsonObject() - d.addProperty("token", getToken(context)) + d.addProperty("token", getToken()) d.addProperty("intents", 0) d.add("properties", properties) val payload = JsonObject() @@ -311,7 +306,7 @@ class DiscordService : Service() { } } - fun getToken(context: Context): String { + fun getToken(): String { val token = PrefManager.getVal(PrefName.DiscordToken, null as String?) return if (token == null) { log("WebSocket: Token not found") @@ -375,10 +370,10 @@ class DiscordService : Service() { log("WebSocket: Simple Test Presence Saved") } - fun setPresence(String: String) { + fun setPresence(string: String) { log("WebSocket: Sending Presence payload") - log(String) - webSocket.send(String) + log(string) + webSocket.send(string) } fun log(string: String) { @@ -388,7 +383,7 @@ class DiscordService : Service() { fun resume() { log("Sending Resume payload") val d = JsonObject() - d.addProperty("token", getToken(baseContext)) + d.addProperty("token", getToken()) d.addProperty("session_id", sessionId) d.addProperty("seq", sequence) val json = JsonObject() @@ -404,8 +399,7 @@ class DiscordService : Service() { Thread.sleep(heartbeat.toLong()) heartbeatSend(webSocket, sequence) log("WebSocket: Heartbeat Sent") - } catch (e: InterruptedException) { - } + } catch (ignored: InterruptedException) { } } } diff --git a/app/src/main/java/ani/dantotsu/connections/discord/Login.kt b/app/src/main/java/ani/dantotsu/connections/discord/Login.kt index 676f11e2..513da55b 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/Login.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/Login.kt @@ -75,7 +75,7 @@ class Login : AppCompatActivity() { } Toast.makeText(this, "Logged in successfully", Toast.LENGTH_SHORT).show() finish() - saveToken(this, token) + saveToken(token) startMainActivity(this@Login) } diff --git a/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt b/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt index 8a4f314b..9d141e7d 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt @@ -10,7 +10,6 @@ import kotlinx.serialization.json.Json import kotlin.coroutines.CoroutineContext import ani.dantotsu.client as app -@Suppress("MemberVisibilityCanBePrivate") open class RPC(val token: String, val coroutineContext: CoroutineContext) { private val json = Json { diff --git a/app/src/main/java/ani/dantotsu/connections/mal/MAL.kt b/app/src/main/java/ani/dantotsu/connections/mal/MAL.kt index 9eaffdca..770d0e05 100644 --- a/app/src/main/java/ani/dantotsu/connections/mal/MAL.kt +++ b/app/src/main/java/ani/dantotsu/connections/mal/MAL.kt @@ -5,7 +5,6 @@ import android.content.Context import android.net.Uri import android.util.Base64 import androidx.browser.customtabs.CustomTabsIntent -import androidx.fragment.app.FragmentActivity import ani.dantotsu.R import ani.dantotsu.client import ani.dantotsu.currContext @@ -64,7 +63,7 @@ object MAL { } - suspend fun getSavedToken(context: FragmentActivity): Boolean { + suspend fun getSavedToken(): Boolean { return tryWithSuspend(false) { var res: ResponseToken = PrefManager.getNullableVal(PrefName.MALToken, null) @@ -77,7 +76,7 @@ object MAL { } ?: false } - fun removeSavedToken(context: Context) { + fun removeSavedToken() { token = null username = null userid = null diff --git a/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt b/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt index 0cbfa1bc..4eb7f5a3 100644 --- a/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt +++ b/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt @@ -3,6 +3,7 @@ package ani.dantotsu.download import android.content.Context import android.os.Environment import android.widget.Toast +import ani.dantotsu.media.MediaType import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import com.google.gson.Gson @@ -15,11 +16,11 @@ class DownloadsManager(private val context: Context) { private val downloadsList = loadDownloads().toMutableList() val mangaDownloadedTypes: List - get() = downloadsList.filter { it.type == DownloadedType.Type.MANGA } + get() = downloadsList.filter { it.type == MediaType.MANGA } val animeDownloadedTypes: List - get() = downloadsList.filter { it.type == DownloadedType.Type.ANIME } + get() = downloadsList.filter { it.type == MediaType.ANIME } val novelDownloadedTypes: List - get() = downloadsList.filter { it.type == DownloadedType.Type.NOVEL } + get() = downloadsList.filter { it.type == MediaType.NOVEL } private fun saveDownloads() { val jsonString = gson.toJson(downloadsList) @@ -47,14 +48,8 @@ class DownloadsManager(private val context: Context) { saveDownloads() } - fun removeMedia(title: String, type: DownloadedType.Type) { - val subDirectory = if (type == DownloadedType.Type.MANGA) { - "Manga" - } else if (type == DownloadedType.Type.ANIME) { - "Anime" - } else { - "Novel" - } + fun removeMedia(title: String, type: MediaType) { + val subDirectory = type.asText() val directory = File( context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/$subDirectory/$title" @@ -71,53 +66,45 @@ class DownloadsManager(private val context: Context) { cleanDownloads() } when (type) { - DownloadedType.Type.MANGA -> { - downloadsList.removeAll { it.title == title && it.type == DownloadedType.Type.MANGA } + MediaType.MANGA -> { + downloadsList.removeAll { it.title == title && it.type == MediaType.MANGA } } - DownloadedType.Type.ANIME -> { - downloadsList.removeAll { it.title == title && it.type == DownloadedType.Type.ANIME } + MediaType.ANIME -> { + downloadsList.removeAll { it.title == title && it.type == MediaType.ANIME } } - DownloadedType.Type.NOVEL -> { - downloadsList.removeAll { it.title == title && it.type == DownloadedType.Type.NOVEL } + MediaType.NOVEL -> { + downloadsList.removeAll { it.title == title && it.type == MediaType.NOVEL } } } saveDownloads() } private fun cleanDownloads() { - cleanDownload(DownloadedType.Type.MANGA) - cleanDownload(DownloadedType.Type.ANIME) - cleanDownload(DownloadedType.Type.NOVEL) + cleanDownload(MediaType.MANGA) + cleanDownload(MediaType.ANIME) + cleanDownload(MediaType.NOVEL) } - private fun cleanDownload(type: DownloadedType.Type) { + private fun cleanDownload(type: MediaType) { // remove all folders that are not in the downloads list - val subDirectory = if (type == DownloadedType.Type.MANGA) { - "Manga" - } else if (type == DownloadedType.Type.ANIME) { - "Anime" - } else { - "Novel" - } + val subDirectory = type.asText() val directory = File( context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/$subDirectory" ) - val downloadsSubLists = if (type == DownloadedType.Type.MANGA) { - mangaDownloadedTypes - } else if (type == DownloadedType.Type.ANIME) { - animeDownloadedTypes - } else { - novelDownloadedTypes + val downloadsSubLists = when (type) { + MediaType.MANGA -> mangaDownloadedTypes + MediaType.ANIME -> animeDownloadedTypes + else -> novelDownloadedTypes } if (directory.exists()) { val files = directory.listFiles() if (files != null) { for (file in files) { if (!downloadsSubLists.any { it.title == file.name }) { - val deleted = file.deleteRecursively() + file.deleteRecursively() } } } @@ -153,7 +140,7 @@ class DownloadsManager(private val context: Context) { return downloadsList.contains(downloadedType) } - fun queryDownload(title: String, chapter: String, type: DownloadedType.Type? = null): Boolean { + fun queryDownload(title: String, chapter: String, type: MediaType? = null): Boolean { return if (type == null) { downloadsList.any { it.title == title && it.chapter == chapter } } else { @@ -162,21 +149,25 @@ class DownloadsManager(private val context: Context) { } private fun removeDirectory(downloadedType: DownloadedType) { - val directory = if (downloadedType.type == DownloadedType.Type.MANGA) { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "Dantotsu/Manga/${downloadedType.title}/${downloadedType.chapter}" - ) - } else if (downloadedType.type == DownloadedType.Type.ANIME) { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "Dantotsu/Anime/${downloadedType.title}/${downloadedType.chapter}" - ) - } else { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "Dantotsu/Novel/${downloadedType.title}/${downloadedType.chapter}" - ) + val directory = when (downloadedType.type) { + MediaType.MANGA -> { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "Dantotsu/Manga/${downloadedType.title}/${downloadedType.chapter}" + ) + } + MediaType.ANIME -> { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "Dantotsu/Anime/${downloadedType.title}/${downloadedType.chapter}" + ) + } + else -> { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "Dantotsu/Novel/${downloadedType.title}/${downloadedType.chapter}" + ) + } } // Check if the directory exists and delete it recursively @@ -193,21 +184,25 @@ class DownloadsManager(private val context: Context) { } fun exportDownloads(downloadedType: DownloadedType) { //copies to the downloads folder available to the user - val directory = if (downloadedType.type == DownloadedType.Type.MANGA) { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "Dantotsu/Manga/${downloadedType.title}/${downloadedType.chapter}" - ) - } else if (downloadedType.type == DownloadedType.Type.ANIME) { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "Dantotsu/Anime/${downloadedType.title}/${downloadedType.chapter}" - ) - } else { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "Dantotsu/Novel/${downloadedType.title}/${downloadedType.chapter}" - ) + val directory = when (downloadedType.type) { + MediaType.MANGA -> { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "Dantotsu/Manga/${downloadedType.title}/${downloadedType.chapter}" + ) + } + MediaType.ANIME -> { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "Dantotsu/Anime/${downloadedType.title}/${downloadedType.chapter}" + ) + } + else -> { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "Dantotsu/Novel/${downloadedType.title}/${downloadedType.chapter}" + ) + } } val destination = File( context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), @@ -225,13 +220,17 @@ class DownloadsManager(private val context: Context) { } } - fun purgeDownloads(type: DownloadedType.Type) { - val directory = if (type == DownloadedType.Type.MANGA) { - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/Manga") - } else if (type == DownloadedType.Type.ANIME) { - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/Anime") - } else { - File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/Novel") + fun purgeDownloads(type: MediaType) { + val directory = when (type) { + MediaType.MANGA -> { + File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/Manga") + } + MediaType.ANIME -> { + File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/Anime") + } + else -> { + File(context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/Novel") + } } if (directory.exists()) { val deleted = directory.deleteRecursively() @@ -255,56 +254,53 @@ class DownloadsManager(private val context: Context) { fun getDirectory( context: Context, - type: DownloadedType.Type, + type: MediaType, title: String, chapter: String? = null ): File { - return if (type == DownloadedType.Type.MANGA) { - if (chapter != null) { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "$mangaLocation/$title/$chapter" - ) - } else { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "$mangaLocation/$title" - ) + return when (type) { + MediaType.MANGA -> { + if (chapter != null) { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "$mangaLocation/$title/$chapter" + ) + } else { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "$mangaLocation/$title" + ) + } } - } else if (type == DownloadedType.Type.ANIME) { - if (chapter != null) { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "$animeLocation/$title/$chapter" - ) - } else { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "$animeLocation/$title" - ) + MediaType.ANIME -> { + if (chapter != null) { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "$animeLocation/$title/$chapter" + ) + } else { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "$animeLocation/$title" + ) + } } - } else { - if (chapter != null) { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "$novelLocation/$title/$chapter" - ) - } else { - File( - context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), - "$novelLocation/$title" - ) + else -> { + if (chapter != null) { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "$novelLocation/$title/$chapter" + ) + } else { + File( + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), + "$novelLocation/$title" + ) + } } } } } - } -data class DownloadedType(val title: String, val chapter: String, val type: Type) : Serializable { - enum class Type { - MANGA, - ANIME, - NOVEL - } -} +data class DownloadedType(val title: String, val chapter: String, val type: MediaType) : Serializable diff --git a/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt b/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt index 8b19d9ab..a5ddd2c9 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt @@ -27,14 +27,15 @@ import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.DownloadsManager import ani.dantotsu.download.video.ExoplayerDownloadService import ani.dantotsu.download.video.Helper -import ani.dantotsu.util.Logger import ani.dantotsu.media.Media +import ani.dantotsu.media.MediaType import ani.dantotsu.media.SubtitleDownloader import ani.dantotsu.media.anime.AnimeWatchFragment import ani.dantotsu.parsers.Subtitle import ani.dantotsu.parsers.Video import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import com.google.gson.GsonBuilder import com.google.gson.InstanceCreator import eu.kanade.tachiyomi.animesource.model.SAnime @@ -241,7 +242,7 @@ class AnimeDownloaderService : Service() { DownloadedType( task.title, task.episode, - DownloadedType.Type.ANIME, + MediaType.ANIME, ) ) } @@ -272,7 +273,7 @@ class AnimeDownloaderService : Service() { DownloadedType( task.title, task.episode, - DownloadedType.Type.ANIME, + MediaType.ANIME, ) ) Injekt.get().logException( @@ -301,7 +302,7 @@ class AnimeDownloaderService : Service() { DownloadedType( task.title, task.episode, - DownloadedType.Type.ANIME, + MediaType.ANIME, ) ) currentTasks.removeAll { it.getTaskName() == task.getTaskName() } diff --git a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt index ef0c4148..73089a15 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt @@ -17,7 +17,7 @@ import ani.dantotsu.settings.saving.PrefName class OfflineAnimeAdapter( - private val context: Context, + context: Context, private var items: List, private val searchListener: OfflineAnimeSearchListener ) : BaseAdapter() { 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 4ff5497c..f64d1dfc 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeFragment.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeFragment.kt @@ -33,15 +33,16 @@ import ani.dantotsu.currContext import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.DownloadsManager import ani.dantotsu.initActivity -import ani.dantotsu.util.Logger import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsActivity +import ani.dantotsu.media.MediaType import ani.dantotsu.navBarHeight import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import com.google.android.material.card.MaterialCardView import com.google.android.material.imageview.ShapeableImageView import com.google.android.material.textfield.TextInputLayout @@ -187,8 +188,7 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { gridView.setOnItemLongClickListener { _, _, position, _ -> // Get the OfflineAnimeModel that was clicked val item = adapter.getItem(position) as OfflineAnimeModel - val type: DownloadedType.Type = - DownloadedType.Type.ANIME + val type: MediaType = MediaType.ANIME // Alert dialog to confirm deletion val builder = @@ -292,11 +292,7 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { } private fun getMedia(downloadedType: DownloadedType): Media? { - val type = when (downloadedType.type) { - DownloadedType.Type.MANGA -> "Manga" - DownloadedType.Type.ANIME -> "Anime" - else -> "Novel" - } + val type = downloadedType.type.asText() val directory = File( currContext()?.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/$type/${downloadedType.title}" @@ -326,11 +322,7 @@ class OfflineAnimeFragment : Fragment(), OfflineAnimeSearchListener { } private fun loadOfflineAnimeModel(downloadedType: DownloadedType): OfflineAnimeModel { - val type = when (downloadedType.type) { - DownloadedType.Type.MANGA -> "Manga" - DownloadedType.Type.ANIME -> "Anime" - else -> "Novel" - } + val type = downloadedType.type.asText() val directory = File( currContext()?.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/$type/${downloadedType.title}" diff --git a/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt b/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt index cad2f85e..901d26ed 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt @@ -21,8 +21,8 @@ import ani.dantotsu.R import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.DownloadsManager -import ani.dantotsu.util.Logger import ani.dantotsu.media.Media +import ani.dantotsu.media.MediaType import ani.dantotsu.media.manga.ImageData import ani.dantotsu.media.manga.MangaReadFragment.Companion.ACTION_DOWNLOAD_FAILED import ani.dantotsu.media.manga.MangaReadFragment.Companion.ACTION_DOWNLOAD_FINISHED @@ -30,6 +30,7 @@ import ani.dantotsu.media.manga.MangaReadFragment.Companion.ACTION_DOWNLOAD_PROG import ani.dantotsu.media.manga.MangaReadFragment.Companion.ACTION_DOWNLOAD_STARTED import ani.dantotsu.media.manga.MangaReadFragment.Companion.EXTRA_CHAPTER_NUMBER import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import com.google.gson.GsonBuilder import com.google.gson.InstanceCreator import eu.kanade.tachiyomi.data.notification.Notifications.CHANNEL_DOWNLOADER_PROGRESS @@ -209,8 +210,7 @@ class MangaDownloaderService : Service() { while (bitmap == null && retryCount < task.retries) { bitmap = image.fetchAndProcessImage( image.page, - image.source, - this@MangaDownloaderService + image.source ) retryCount++ } @@ -244,7 +244,7 @@ class MangaDownloaderService : Service() { DownloadedType( task.title, task.chapter, - DownloadedType.Type.MANGA + MediaType.MANGA ) ) broadcastDownloadFinished(task.chapter) diff --git a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt index 4ef12c03..efabfdd8 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt @@ -16,7 +16,7 @@ import ani.dantotsu.settings.saving.PrefName class OfflineMangaAdapter( - private val context: Context, + context: Context, private var items: List, private val searchListener: OfflineMangaSearchListener ) : BaseAdapter() { 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 0c97a8df..256061af 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaFragment.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaFragment.kt @@ -30,15 +30,16 @@ import ani.dantotsu.currContext import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.DownloadsManager import ani.dantotsu.initActivity -import ani.dantotsu.util.Logger import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsActivity +import ani.dantotsu.media.MediaType import ani.dantotsu.navBarHeight import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.settings.SettingsDialogFragment import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import com.google.android.material.card.MaterialCardView import com.google.android.material.imageview.ShapeableImageView import com.google.android.material.textfield.TextInputLayout @@ -178,11 +179,11 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener { gridView.setOnItemLongClickListener { _, _, position, _ -> // Get the OfflineMangaModel that was clicked val item = adapter.getItem(position) as OfflineMangaModel - val type: DownloadedType.Type = + val type: MediaType = if (downloadManager.mangaDownloadedTypes.any { it.title == item.title }) { - DownloadedType.Type.MANGA + MediaType.MANGA } else { - DownloadedType.Type.NOVEL + MediaType.NOVEL } // Alert dialog to confirm deletion val builder = @@ -288,11 +289,7 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener { } private fun getMedia(downloadedType: DownloadedType): Media? { - val type = when (downloadedType.type) { - DownloadedType.Type.MANGA -> "Manga" - DownloadedType.Type.ANIME -> "Anime" - else -> "Novel" - } + val type = downloadedType.type.asText() val directory = File( currContext()?.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/$type/${downloadedType.title}" @@ -316,11 +313,7 @@ class OfflineMangaFragment : Fragment(), OfflineMangaSearchListener { } private fun loadOfflineMangaModel(downloadedType: DownloadedType): OfflineMangaModel { - val type = when (downloadedType.type) { - DownloadedType.Type.MANGA -> "Manga" - DownloadedType.Type.ANIME -> "Anime" - else -> "Novel" - } + val type = downloadedType.type.asText() val directory = File( currContext()?.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "Dantotsu/$type/${downloadedType.title}" diff --git a/app/src/main/java/ani/dantotsu/download/novel/NovelDownloaderService.kt b/app/src/main/java/ani/dantotsu/download/novel/NovelDownloaderService.kt index 06043976..cf53b48f 100644 --- a/app/src/main/java/ani/dantotsu/download/novel/NovelDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/novel/NovelDownloaderService.kt @@ -20,10 +20,11 @@ import ani.dantotsu.R import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.DownloadsManager -import ani.dantotsu.util.Logger import ani.dantotsu.media.Media +import ani.dantotsu.media.MediaType import ani.dantotsu.media.novel.NovelReadFragment import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import com.google.gson.GsonBuilder import com.google.gson.InstanceCreator import eu.kanade.tachiyomi.data.notification.Notifications @@ -333,7 +334,7 @@ class NovelDownloaderService : Service() { DownloadedType( task.title, task.chapter, - DownloadedType.Type.NOVEL + MediaType.NOVEL ) ) broadcastDownloadFinished(task.originalLink) diff --git a/app/src/main/java/ani/dantotsu/download/video/Helper.kt b/app/src/main/java/ani/dantotsu/download/video/Helper.kt index 4e82e76c..6cb688fa 100644 --- a/app/src/main/java/ani/dantotsu/download/video/Helper.kt +++ b/app/src/main/java/ani/dantotsu/download/video/Helper.kt @@ -9,7 +9,6 @@ import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Build -import android.util.Log import androidx.annotation.OptIn import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat @@ -37,6 +36,7 @@ import ani.dantotsu.download.anime.AnimeDownloaderService import ani.dantotsu.download.anime.AnimeServiceDataSingleton import ani.dantotsu.logError import ani.dantotsu.media.Media +import ani.dantotsu.media.MediaType import ani.dantotsu.okHttpClient import ani.dantotsu.parsers.Subtitle import ani.dantotsu.parsers.SubtitleType @@ -49,13 +49,14 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import java.io.File import java.io.IOException -import java.util.concurrent.* +import java.util.concurrent.Executors +@SuppressLint("UnsafeOptInUsageError") object Helper { + private var simpleCache: SimpleCache? = null - @SuppressLint("UnsafeOptInUsageError") fun downloadVideo(context: Context, video: Video, subtitle: Subtitle?) { val dataSourceFactory = DataSource.Factory { val dataSource: HttpDataSource = @@ -157,16 +158,14 @@ object Helper { download: Download, finalException: Exception? ) { - if (download.state == Download.STATE_COMPLETED) { - Logger.log("Download Completed") - } else if (download.state == Download.STATE_FAILED) { - Logger.log("Download Failed") - } else if (download.state == Download.STATE_STOPPED) { - Logger.log("Download Stopped") - } else if (download.state == Download.STATE_QUEUED) { - Logger.log("Download Queued") - } else if (download.state == Download.STATE_DOWNLOADING) { - Logger.log("Download Downloading") + when (download.state) { + Download.STATE_COMPLETED -> Logger.log("Download Completed") + Download.STATE_FAILED -> Logger.log("Download Failed") + Download.STATE_STOPPED -> Logger.log("Download Stopped") + Download.STATE_QUEUED -> Logger.log("Download Queued") + Download.STATE_DOWNLOADING -> Logger.log("Download Downloading") + Download.STATE_REMOVING -> Logger.log("Download Removing") + Download.STATE_RESTARTING -> Logger.log("Download Restarting") } } } @@ -220,7 +219,7 @@ object Helper { val downloadsManger = Injekt.get() val downloadCheck = downloadsManger - .queryDownload(title, episode, DownloadedType.Type.ANIME) + .queryDownload(title, episode, MediaType.ANIME) if (downloadCheck) { AlertDialog.Builder(context, R.style.MyPopup) @@ -243,7 +242,7 @@ object Helper { DownloadedType( title, episode, - DownloadedType.Type.ANIME + MediaType.ANIME ) ) AnimeServiceDataSingleton.downloadQueue.offer(animeDownloadTask) diff --git a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt index 7665ace2..f8a50306 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt @@ -167,8 +167,7 @@ class AnimePageAdapter : RecyclerView.Adapter + passwordAlertDialog { password -> if (password != null) { val salt = jsonString.copyOfRange(0, 16) val encrypted = jsonString.copyOfRange(16, jsonString.size) diff --git a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt index f4b34f7d..d61a46bd 100644 --- a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt @@ -65,8 +65,8 @@ class MangaPageAdapter : RecyclerView.Adapter { topMargin = statusBarHeight } diff --git a/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt b/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt index 8c415e2d..e29b3170 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt @@ -1,8 +1,6 @@ package ani.dantotsu.media import android.annotation.SuppressLint -import android.app.Activity -import android.content.Context import android.content.Intent import android.graphics.Bitmap import android.graphics.Canvas @@ -15,25 +13,24 @@ import android.widget.ImageView import androidx.appcompat.content.res.AppCompatResources import androidx.core.app.ActivityOptionsCompat import androidx.core.content.ContextCompat -import androidx.core.util.Pair import androidx.core.view.ViewCompat import androidx.core.view.updateLayoutParams import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 -import ani.dantotsu.* +import ani.dantotsu.R +import ani.dantotsu.blurImage +import ani.dantotsu.currActivity import ani.dantotsu.databinding.ItemMediaCompactBinding import ani.dantotsu.databinding.ItemMediaLargeBinding import ani.dantotsu.databinding.ItemMediaPageBinding import ani.dantotsu.databinding.ItemMediaPageSmallBinding +import ani.dantotsu.loadImage +import ani.dantotsu.setAnimation +import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName -import com.bumptech.glide.Glide -import com.bumptech.glide.load.engine.DiskCacheStrategy -import com.bumptech.glide.load.model.GlideUrl -import com.bumptech.glide.request.RequestOptions import com.flaviofaria.kenburnsview.RandomTransitionGenerator -import jp.wasabeef.glide.transformations.BlurTransformation import java.io.Serializable diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index 9a528b80..25abaa68 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -2,9 +2,7 @@ package ani.dantotsu.media import android.animation.ObjectAnimator import android.annotation.SuppressLint -import android.app.Activity import android.content.Intent -import android.graphics.Rect import android.os.Bundle import android.text.SpannableStringBuilder import android.util.TypedValue @@ -12,9 +10,7 @@ import android.view.GestureDetector import android.view.MotionEvent import android.view.View import android.view.ViewGroup -import android.view.WindowManager import android.view.animation.AccelerateDecelerateInterpolator -import android.widget.FrameLayout import android.widget.ImageView import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -246,13 +242,13 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi @SuppressLint("ResourceType") fun total() { val text = SpannableStringBuilder().apply { - val typedValue = TypedValue() + val mediaTypedValue = TypedValue() this@MediaDetailsActivity.theme.resolveAttribute( com.google.android.material.R.attr.colorOnBackground, - typedValue, + mediaTypedValue, true ) - val white = typedValue.data + val white = mediaTypedValue.data if (media.userStatus != null) { append(if (media.anime != null) getString(R.string.watched_num) else getString(R.string.read_num)) val typedValue = TypedValue() diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt index 650e722d..b9d005e3 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt @@ -52,12 +52,16 @@ class MediaDetailsViewModel : ViewModel() { it } if (isDownload) { - data.sourceIndex = if (media.anime != null) { - AnimeSources.list.size - 1 - } else if (media.format == "MANGA" || media.format == "ONE_SHOT") { - MangaSources.list.size - 1 - } else { - NovelSources.list.size - 1 + data.sourceIndex = when { + media.anime != null -> { + AnimeSources.list.size - 1 + } + media.format == "MANGA" || media.format == "ONE_SHOT" -> { + MangaSources.list.size - 1 + } + else -> { + NovelSources.list.size - 1 + } } } return data @@ -152,10 +156,10 @@ class MediaDetailsViewModel : ViewModel() { watchSources?.get(i)?.apply { if (!post && !allowsPreloading) return@apply ep.sEpisode?.let { - loadByVideoServers(link, ep.extra, it) { - if (it.videos.isNotEmpty()) { - list.add(it) - ep.extractorCallback?.invoke(it) + loadByVideoServers(link, ep.extra, it) { extractor -> + if (extractor.videos.isNotEmpty()) { + list.add(extractor) + ep.extractorCallback?.invoke(extractor) } } } diff --git a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt index 06fb3aa9..67103efe 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt @@ -3,8 +3,6 @@ package ani.dantotsu.media import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.content.Intent -import android.net.Uri -import android.os.Build import android.os.Bundle import android.os.CountDownTimer import android.view.LayoutInflater @@ -22,10 +20,24 @@ import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager -import ani.dantotsu.* +import ani.dantotsu.R import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.GenresViewModel -import ani.dantotsu.databinding.* +import ani.dantotsu.copyToClipboard +import ani.dantotsu.countDown +import ani.dantotsu.currActivity +import ani.dantotsu.databinding.ActivityGenreBinding +import ani.dantotsu.databinding.FragmentMediaInfoBinding +import ani.dantotsu.databinding.ItemChipBinding +import ani.dantotsu.databinding.ItemQuelsBinding +import ani.dantotsu.databinding.ItemTitleChipgroupBinding +import ani.dantotsu.databinding.ItemTitleRecyclerBinding +import ani.dantotsu.databinding.ItemTitleTextBinding +import ani.dantotsu.databinding.ItemTitleTrailerBinding +import ani.dantotsu.loadImage +import ani.dantotsu.navBarHeight +import ani.dantotsu.px +import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import io.noties.markwon.Markwon @@ -524,23 +536,21 @@ class MediaInfoFragment : Fragment() { } } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val cornerTop = ObjectAnimator.ofFloat(binding.root, "radius", 0f, 32f).setDuration(200) - val cornerNotTop = - ObjectAnimator.ofFloat(binding.root, "radius", 32f, 0f).setDuration(200) - var cornered = true - cornerTop.start() - binding.mediaInfoScroll.setOnScrollChangeListener { v, _, _, _, _ -> - if (!v.canScrollVertically(-1)) { - if (!cornered) { - cornered = true - cornerTop.start() - } - } else { - if (cornered) { - cornered = false - cornerNotTop.start() - } + val cornerTop = ObjectAnimator.ofFloat(binding.root, "radius", 0f, 32f).setDuration(200) + val cornerNotTop = + ObjectAnimator.ofFloat(binding.root, "radius", 32f, 0f).setDuration(200) + var cornered = true + cornerTop.start() + binding.mediaInfoScroll.setOnScrollChangeListener { v, _, _, _, _ -> + if (!v.canScrollVertically(-1)) { + if (!cornered) { + cornered = true + cornerTop.start() + } + } else { + if (cornered) { + cornered = false + cornerNotTop.start() } } } diff --git a/app/src/main/java/ani/dantotsu/media/MediaType.kt b/app/src/main/java/ani/dantotsu/media/MediaType.kt new file mode 100644 index 00000000..6762d98e --- /dev/null +++ b/app/src/main/java/ani/dantotsu/media/MediaType.kt @@ -0,0 +1,26 @@ +package ani.dantotsu.media + +enum class MediaType { + ANIME, + MANGA, + NOVEL; + + fun asText(): String { + return when (this) { + ANIME -> "Anime" + MANGA -> "Manga" + NOVEL -> "Novel" + } + } + + companion object { + fun fromText(string : String): MediaType { + return when (string) { + "Anime" -> ANIME + "Manga" -> MANGA + "Novel" -> NOVEL + else -> { ANIME } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/media/SearchActivity.kt b/app/src/main/java/ani/dantotsu/media/SearchActivity.kt index 33403915..81184041 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchActivity.kt @@ -11,17 +11,21 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView -import ani.dantotsu.* import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.AnilistSearch import ani.dantotsu.connections.anilist.SearchResults import ani.dantotsu.databinding.ActivitySearchBinding +import ani.dantotsu.initActivity +import ani.dantotsu.navBarHeight +import ani.dantotsu.px import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import java.util.* +import java.util.Timer +import java.util.TimerTask class SearchActivity : AppCompatActivity() { private lateinit var binding: ActivitySearchBinding diff --git a/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt b/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt index 2bfec418..cb590e3a 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt @@ -15,7 +15,6 @@ import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources -import androidx.core.content.ContextCompat.startActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.HORIZONTAL @@ -28,7 +27,9 @@ import ani.dantotsu.openLinkInBrowser import ani.dantotsu.others.imagesearch.ImageSearchActivity import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName -import com.google.android.material.checkbox.MaterialCheckBox.* +import com.google.android.material.checkbox.MaterialCheckBox.STATE_CHECKED +import com.google.android.material.checkbox.MaterialCheckBox.STATE_INDETERMINATE +import com.google.android.material.checkbox.MaterialCheckBox.STATE_UNCHECKED import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay diff --git a/app/src/main/java/ani/dantotsu/media/SearchHistoryAdapter.kt b/app/src/main/java/ani/dantotsu/media/SearchHistoryAdapter.kt index f1519e2b..850df51f 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchHistoryAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchHistoryAdapter.kt @@ -14,7 +14,7 @@ import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.settings.saving.SharedPreferenceStringSetLiveData import java.util.Locale -class SearchHistoryAdapter(private val type: String, private val searchClicked: (String) -> Unit) : +class SearchHistoryAdapter(type: String, private val searchClicked: (String) -> Unit) : ListAdapter( DIFF_CALLBACK_INSTALLED ) { diff --git a/app/src/main/java/ani/dantotsu/media/SourceSearchDialogFragment.kt b/app/src/main/java/ani/dantotsu/media/SourceSearchDialogFragment.kt index 3925bcce..06b784e8 100644 --- a/app/src/main/java/ani/dantotsu/media/SourceSearchDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/SourceSearchDialogFragment.kt @@ -65,7 +65,7 @@ class SourceSearchDialogFragment : BottomSheetDialogFragment() { i = media!!.selected!!.sourceIndex val source = if (media!!.anime != null) { - (if (!media!!.isAdult) AnimeSources else HAnimeSources)[i!!] + (if (media!!.isAdult) HAnimeSources else AnimeSources)[i!!] } else { anime = false (if (media!!.isAdult) HMangaSources else MangaSources)[i!!] diff --git a/app/src/main/java/ani/dantotsu/media/SubtitleDownloader.kt b/app/src/main/java/ani/dantotsu/media/SubtitleDownloader.kt index e5ebd81b..6672f37d 100644 --- a/app/src/main/java/ani/dantotsu/media/SubtitleDownloader.kt +++ b/app/src/main/java/ani/dantotsu/media/SubtitleDownloader.kt @@ -17,7 +17,7 @@ class SubtitleDownloader { companion object { //doesn't really download the subtitles -\_(o_o)_/- - suspend fun loadSubtitleType(context: Context, url: String): SubtitleType = + suspend fun loadSubtitleType(url: String): SubtitleType = withContext(Dispatchers.IO) { // Initialize the NetworkHelper instance. Replace this line based on how you usually initialize it val networkHelper = Injekt.get() @@ -60,7 +60,7 @@ class SubtitleDownloader { if (!directory.exists()) { //just in case directory.mkdirs() } - val type = loadSubtitleType(context, url) + val type = loadSubtitleType(url) val subtiteFile = File(directory, "subtitle.${type}") if (subtiteFile.exists()) { subtiteFile.delete() diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeNameAdapter.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeNameAdapter.kt index a30da85f..564f2836 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeNameAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeNameAdapter.kt @@ -7,7 +7,7 @@ import java.util.regex.Pattern class AnimeNameAdapter { companion object { const val episodeRegex = - "(episode|ep|e)[\\s:.\\-]*([\\d]+\\.?[\\d]*)[\\s:.\\-]*\\(?\\s*(sub|subbed|dub|dubbed)*\\s*\\)?\\s*" + "(episode|ep|e)[\\s:.\\-]*(\\d+\\.?\\d*)[\\s:.\\-]*\\(?\\s*(sub|subbed|dub|dubbed)*\\s*\\)?\\s*" const val failedEpisodeNumberRegex = "(? mr.value.replaceFirst(mr.groupValues[1], "") diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt index 07550739..d7b247c0 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt @@ -5,7 +5,6 @@ import android.content.Intent import android.net.Uri import android.view.LayoutInflater import android.view.View -import ani.dantotsu.settings.FAQActivity import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.ImageButton @@ -15,11 +14,15 @@ import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat.startActivity import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView -import ani.dantotsu.* -import ani.dantotsu.connections.comments.CommentsAPI +import ani.dantotsu.FileUrl +import ani.dantotsu.R +import ani.dantotsu.countDown +import ani.dantotsu.currActivity import ani.dantotsu.databinding.DialogLayoutBinding import ani.dantotsu.databinding.ItemAnimeWatchBinding import ani.dantotsu.databinding.ItemChipBinding +import ani.dantotsu.isOnline +import ani.dantotsu.loadImage import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.media.SourceSearchDialogFragment @@ -28,10 +31,13 @@ import ani.dantotsu.others.webview.CookieCatcher import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.parsers.DynamicAnimeParser import ani.dantotsu.parsers.WatchSources +import ani.dantotsu.px +import ani.dantotsu.settings.FAQActivity import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.subcriptions.Notifications.Companion.openSettings import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId +import ani.dantotsu.toast import com.google.android.material.chip.Chip import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource import eu.kanade.tachiyomi.util.system.WebViewUtil diff --git a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt index fc8141e2..426eb4aa 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt @@ -27,29 +27,34 @@ import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 -import ani.dantotsu.* +import ani.dantotsu.FileUrl +import ani.dantotsu.R import ani.dantotsu.databinding.FragmentAnimeWatchBinding import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.DownloadsManager import ani.dantotsu.download.anime.AnimeDownloaderService import ani.dantotsu.download.video.ExoplayerDownloadService +import ani.dantotsu.dp import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.media.MediaDetailsViewModel +import ani.dantotsu.media.MediaType +import ani.dantotsu.navBarHeight import ani.dantotsu.others.LanguageMapper import ani.dantotsu.parsers.AnimeParser import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.parsers.HAnimeSources +import ani.dantotsu.setNavigationTheme import ani.dantotsu.settings.extensionprefs.AnimeSourcePreferencesFragment import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.snackString import ani.dantotsu.subcriptions.Notifications import ani.dantotsu.subcriptions.Notifications.Group.ANIME_GROUP import ani.dantotsu.subcriptions.Subscription.Companion.getChannelId import ani.dantotsu.subcriptions.SubscriptionHelper import ani.dantotsu.subcriptions.SubscriptionHelper.Companion.saveSubscription import com.google.android.material.appbar.AppBarLayout -import com.google.android.material.navigationrail.NavigationRailView import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import kotlinx.coroutines.Dispatchers @@ -448,7 +453,7 @@ class AnimeWatchFragment : Fragment() { DownloadedType( media.mainName(), i, - DownloadedType.Type.ANIME + MediaType.ANIME ) ) episodeAdapter.purgeDownload(i) @@ -460,7 +465,7 @@ class AnimeWatchFragment : Fragment() { DownloadedType( media.mainName(), i, - DownloadedType.Type.ANIME + MediaType.ANIME ) ) val taskName = AnimeDownloaderService.AnimeDownloadTask.getTaskName(media.mainName(), i) diff --git a/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt b/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt index 7a3d8aec..c616d479 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/EpisodeAdapters.kt @@ -12,14 +12,16 @@ import androidx.lifecycle.coroutineScope import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.offline.DownloadIndex import androidx.recyclerview.widget.RecyclerView -import ani.dantotsu.* +import ani.dantotsu.R import ani.dantotsu.connections.updateProgress +import ani.dantotsu.currContext import ani.dantotsu.databinding.ItemEpisodeCompactBinding import ani.dantotsu.databinding.ItemEpisodeGridBinding import ani.dantotsu.databinding.ItemEpisodeListBinding import ani.dantotsu.download.anime.AnimeDownloaderService import ani.dantotsu.download.video.Helper import ani.dantotsu.media.Media +import ani.dantotsu.setAnimation import ani.dantotsu.settings.saving.PrefManager import com.bumptech.glide.Glide import com.bumptech.glide.load.model.GlideUrl @@ -429,7 +431,7 @@ class EpisodeAdapter( if (bytes < 0) return null val unit = 1000 if (bytes < unit) return "$bytes B" - val exp = (Math.log(bytes.toDouble()) / ln(unit.toDouble())).toInt() + val exp = (ln(bytes.toDouble()) / ln(unit.toDouble())).toInt() val pre = ("KMGTPE")[exp - 1] return String.format("%.1f %sB", bytes / unit.toDouble().pow(exp.toDouble()), pre) } diff --git a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt index 2ee044b2..2d923e68 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -16,7 +16,10 @@ import android.graphics.Color import android.graphics.drawable.Animatable import android.hardware.SensorManager import android.media.AudioManager -import android.media.AudioManager.* +import android.media.AudioManager.AUDIOFOCUS_GAIN +import android.media.AudioManager.AUDIOFOCUS_LOSS +import android.media.AudioManager.AUDIOFOCUS_LOSS_TRANSIENT +import android.media.AudioManager.STREAM_MUSIC import android.net.Uri import android.os.Build import android.os.Bundle @@ -27,8 +30,18 @@ import android.provider.Settings.System import android.util.AttributeSet import android.util.Rational import android.util.TypedValue -import android.view.* -import android.view.KeyEvent.* +import android.view.GestureDetector +import android.view.KeyEvent +import android.view.KeyEvent.ACTION_UP +import android.view.KeyEvent.KEYCODE_B +import android.view.KeyEvent.KEYCODE_DPAD_LEFT +import android.view.KeyEvent.KEYCODE_DPAD_RIGHT +import android.view.KeyEvent.KEYCODE_N +import android.view.KeyEvent.KEYCODE_SPACE +import android.view.MotionEvent +import android.view.OrientationEventListener +import android.view.View +import android.view.ViewGroup import android.view.animation.AnimationUtils import android.widget.AdapterView import android.widget.ImageButton @@ -46,27 +59,43 @@ import androidx.core.view.updateLayoutParams import androidx.lifecycle.lifecycleScope import androidx.media3.cast.CastPlayer import androidx.media3.cast.SessionAvailabilityListener -import androidx.media3.common.* +import androidx.media3.common.C import androidx.media3.common.C.AUDIO_CONTENT_TYPE_MOVIE import androidx.media3.common.C.TRACK_TYPE_VIDEO +import androidx.media3.common.MediaItem +import androidx.media3.common.MimeTypes +import androidx.media3.common.PlaybackException +import androidx.media3.common.PlaybackParameters +import androidx.media3.common.Player +import androidx.media3.common.TrackSelectionOverride +import androidx.media3.common.Tracks import androidx.media3.common.util.UnstableApi -import androidx.media3.common.util.Util import androidx.media3.datasource.DataSource -import androidx.media3.datasource.DefaultDataSourceFactory +import androidx.media3.datasource.DefaultDataSource import androidx.media3.datasource.HttpDataSource import androidx.media3.datasource.cache.CacheDataSource import androidx.media3.datasource.okhttp.OkHttpDataSource +import androidx.media3.exoplayer.DefaultLoadControl import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.source.DefaultMediaSourceFactory import androidx.media3.exoplayer.trackselection.DefaultTrackSelector import androidx.media3.exoplayer.util.EventLogger import androidx.media3.session.MediaSession -import androidx.media3.ui.* -import androidx.media3.ui.CaptionStyleCompat.* -import androidx.media3.exoplayer.DefaultLoadControl +import androidx.media3.ui.AspectRatioFrameLayout +import androidx.media3.ui.CaptionStyleCompat +import androidx.media3.ui.CaptionStyleCompat.EDGE_TYPE_DEPRESSED +import androidx.media3.ui.CaptionStyleCompat.EDGE_TYPE_DROP_SHADOW +import androidx.media3.ui.CaptionStyleCompat.EDGE_TYPE_NONE +import androidx.media3.ui.CaptionStyleCompat.EDGE_TYPE_OUTLINE +import androidx.media3.ui.DefaultTimeBar +import androidx.media3.ui.PlayerView +import androidx.media3.ui.SubtitleView import androidx.mediarouter.app.MediaRouteButton -import ani.dantotsu.* +import ani.dantotsu.GesturesListener +import ani.dantotsu.NoPaddingArrayAdapter import ani.dantotsu.R +import ani.dantotsu.brightnessConverter +import ani.dantotsu.circularReveal import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.connections.discord.Discord @@ -75,19 +104,38 @@ import ani.dantotsu.connections.discord.DiscordServiceRunningSingleton import ani.dantotsu.connections.discord.RPC import ani.dantotsu.connections.updateProgress import ani.dantotsu.databinding.ActivityExoplayerBinding +import ani.dantotsu.defaultHeaders import ani.dantotsu.download.video.Helper +import ani.dantotsu.dp +import ani.dantotsu.getCurrentBrightnessValue +import ani.dantotsu.hideSystemBars +import ani.dantotsu.hideSystemBarsExtendView +import ani.dantotsu.isOnline +import ani.dantotsu.logError import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsViewModel import ani.dantotsu.media.SubtitleDownloader +import ani.dantotsu.okHttpClient import ani.dantotsu.others.AniSkip import ani.dantotsu.others.AniSkip.getType import ani.dantotsu.others.ResettableTimer import ani.dantotsu.others.getSerialized -import ani.dantotsu.parsers.* +import ani.dantotsu.parsers.AnimeSources +import ani.dantotsu.parsers.HAnimeSources +import ani.dantotsu.parsers.Subtitle +import ani.dantotsu.parsers.SubtitleType +import ani.dantotsu.parsers.Video +import ani.dantotsu.parsers.VideoExtractor +import ani.dantotsu.parsers.VideoType +import ani.dantotsu.px import ani.dantotsu.settings.PlayerSettingsActivity import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.snackString +import ani.dantotsu.startMainActivity import ani.dantotsu.themes.ThemeManager +import ani.dantotsu.toast +import ani.dantotsu.tryWithSuspend import ani.dantotsu.util.Logger import com.bumptech.glide.Glide import com.google.android.gms.cast.framework.CastButtonFactory @@ -103,8 +151,11 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -import java.util.* -import java.util.concurrent.* +import java.util.Calendar +import java.util.Timer +import java.util.TimerTask +import java.util.concurrent.Executors +import java.util.concurrent.TimeUnit import kotlin.math.max import kotlin.math.min import kotlin.math.roundToInt @@ -344,15 +395,14 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL isCastApiAvailable = GoogleApiAvailability.getInstance() .isGooglePlayServicesAvailable(this) == ConnectionResult.SUCCESS try { - castContext = CastContext.getSharedInstance(this) + castContext = CastContext.getSharedInstance(this, Executors.newSingleThreadExecutor()).result castPlayer = CastPlayer(castContext!!) castPlayer!!.setSessionAvailabilityListener(this) } catch (e: Exception) { isCastApiAvailable = false } - WindowCompat.setDecorFitsSystemWindows(window, false) - hideSystemBars() + hideSystemBarsExtendView() onBackPressedDispatcher.addCallback(this) { finishAndRemoveTask() @@ -397,21 +447,25 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL orientationListener = object : OrientationEventListener(this, SensorManager.SENSOR_DELAY_UI) { override fun onOrientationChanged(orientation: Int) { - if (orientation in 45..135) { - if (rotation != ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE) { - exoRotate.visibility = View.VISIBLE + when (orientation) { + in 45..135 -> { + if (rotation != ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE) { + exoRotate.visibility = View.VISIBLE + } + rotation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE } - rotation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE - } else if (orientation in 225..315) { - if (rotation != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { - exoRotate.visibility = View.VISIBLE + in 225..315 -> { + if (rotation != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { + exoRotate.visibility = View.VISIBLE + } + rotation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE } - rotation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE - } else if (orientation in 315..360 || orientation in 0..45) { - if (rotation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { - exoRotate.visibility = View.VISIBLE + in 315..360, in 0..45 -> { + if (rotation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { + exoRotate.visibility = View.VISIBLE + } + rotation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } - rotation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT } } } @@ -941,7 +995,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL episodeArr = episodes.keys.toList() currentEpisodeIndex = episodeArr.indexOf(media.anime!!.selectedEpisode!!) - episodeTitleArr = arrayListOf() + episodeTitleArr = arrayListOf() episodes.forEach { val episode = it.value val cleanedTitle = AnimeNameAdapter.removeEpisodeNumberCompletely(episode.title ?: "") @@ -1052,7 +1106,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL RPC.Link(getString(R.string.view_anime), media.shareLink ?: ""), RPC.Link( "Stream on Dantotsu", - "https://github.com/rebelonion/Dantotsu/" + getString(R.string.github) ) ) ) @@ -1264,6 +1318,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL media.anime!!.selectedEpisode!! ) + @Suppress("UNCHECKED_CAST") val list = (PrefManager.getNullableCustomVal("continueAnimeList", listOf(), List::class.java) as List).toMutableList() if (list.contains(media.id)) list.remove(media.id) list.add(media.id) @@ -1301,9 +1356,8 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL if (subtitle != null) { //var localFile: String? = null if (subtitle?.type == SubtitleType.UNKNOWN) { - val context = this runBlocking { - val type = SubtitleDownloader.loadSubtitleType(context, subtitle!!.file.url) + val type = SubtitleDownloader.loadSubtitleType(subtitle!!.file.url) val fileUri = Uri.parse(subtitle!!.file.url) sub = MediaItem.SubtitleConfiguration .Builder(fileUri) @@ -1358,8 +1412,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL } dataSource } - val dafuckDataSourceFactory = - DefaultDataSourceFactory(this, Util.getUserAgent(this, R.string.app_name.toString())) + val dafuckDataSourceFactory = DefaultDataSource.Factory(this) cacheFactory = CacheDataSource.Factory().apply { setCache(Helper.getSimpleCache(this@ExoplayerView)) if (ext.server.offline) { @@ -1735,28 +1788,26 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL timer = null return } - if (timer == null) { - timer = object : CountDownTimer(5000, 1000) { - override fun onTick(millisUntilFinished: Long) { - if (new == null){ - skipTimeButton.visibility = View.GONE - exoSkip.visibility = View.VISIBLE - disappeared = false - functionstarted = false - cancelTimer() - } - } - - override fun onFinish() { + timer = object : CountDownTimer(5000, 1000) { + override fun onTick(millisUntilFinished: Long) { + if (new == null) { skipTimeButton.visibility = View.GONE exoSkip.visibility = View.VISIBLE - disappeared = true + disappeared = false functionstarted = false cancelTimer() } } - timer?.start() + + override fun onFinish() { + skipTimeButton.visibility = View.GONE + exoSkip.visibility = View.VISIBLE + disappeared = true + functionstarted = false + cancelTimer() + } } + timer?.start() } if (PrefManager.getVal(PrefName.ShowTimeStampButton)) { diff --git a/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt index f83b22ad..1be0ff47 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt @@ -17,20 +17,28 @@ import androidx.fragment.app.activityViewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import ani.dantotsu.* +import ani.dantotsu.BottomSheetDialogFragment +import ani.dantotsu.R import ani.dantotsu.connections.crashlytics.CrashlyticsInterface +import ani.dantotsu.copyToClipboard +import ani.dantotsu.currActivity import ani.dantotsu.databinding.BottomSheetSelectorBinding import ani.dantotsu.databinding.ItemStreamBinding import ani.dantotsu.databinding.ItemUrlBinding import ani.dantotsu.download.video.Helper +import ani.dantotsu.hideSystemBars import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsViewModel +import ani.dantotsu.navBarHeight import ani.dantotsu.others.Download.download import ani.dantotsu.parsers.Subtitle import ani.dantotsu.parsers.VideoExtractor import ani.dantotsu.parsers.VideoType +import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.snackString +import ani.dantotsu.tryWith import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -336,7 +344,7 @@ class SelectorDialogFragment : BottomSheetDialogFragment() { .setSingleChoiceItems( subtitleNames.toTypedArray(), -1 - ) { dialog, which -> + ) { _, which -> subtitleToDownload = subtitles[which] } .setPositiveButton("Download") { _, _ -> diff --git a/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt b/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt index b800d009..f97951ad 100644 --- a/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt +++ b/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt @@ -28,9 +28,9 @@ import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch import java.text.SimpleDateFormat import java.util.Date +import java.util.Locale import java.util.TimeZone import kotlin.math.abs -import kotlin.math.pow import kotlin.math.sqrt class CommentItem(val comment: Comment, @@ -242,6 +242,7 @@ class CommentItem(val comment: Comment, private fun removeSubCommentIds(){ subCommentIds.forEach { id -> + @Suppress("UNCHECKED_CAST") val parentComments = parentSection.groups as? List ?: emptyList() val commentToRemove = parentComments.find { it.comment.commentId == id } commentToRemove?.let { @@ -273,7 +274,7 @@ class CommentItem(val comment: Comment, private fun formatTimestamp(timestamp: String): String { return try { - val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT) dateFormat.timeZone = TimeZone.getTimeZone("UTC") val parsedDate = dateFormat.parse(timestamp) val currentDate = Date() @@ -297,7 +298,7 @@ class CommentItem(val comment: Comment, companion object { fun timestampToMillis(timestamp: String): Long { - val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") + val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ROOT) dateFormat.timeZone = TimeZone.getTimeZone("UTC") val parsedDate = dateFormat.parse(timestamp) return parsedDate?.time ?: 0 diff --git a/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt b/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt index 8be902df..15bdcca5 100644 --- a/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt @@ -13,7 +13,6 @@ import android.view.View import android.view.ViewGroup import android.view.inputmethod.InputMethodManager import android.widget.EditText -import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.PopupMenu import androidx.core.animation.doOnEnd import androidx.core.content.res.ResourcesCompat @@ -274,7 +273,7 @@ class CommentsFragment : Fragment() { activity.binding.commentLabel.setOnClickListener { //alert dialog to enter a number, with a cancel and ok button - val alertDialog = android.app.AlertDialog.Builder(activity, R.style.MyPopup) + val alertDialog = AlertDialog.Builder(activity, R.style.MyPopup) .setTitle("Enter a chapter/episode number tag") .setView(R.layout.dialog_edittext) .setPositiveButton("OK") { dialog, _ -> @@ -542,7 +541,7 @@ class CommentsFragment : Fragment() { * Called when the user tries to comment for the first time */ private fun showCommentRulesDialog() { - val alertDialog = android.app.AlertDialog.Builder(activity, R.style.MyPopup) + val alertDialog = AlertDialog.Builder(activity, R.style.MyPopup) .setTitle("Commenting Rules") .setMessage( "I WILL BAN YOU WITHOUT HESITATION\n" + diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaCache.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaCache.kt index ebf1c57f..6302a6c9 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaCache.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaCache.kt @@ -2,7 +2,6 @@ package ani.dantotsu.media.manga import android.content.ContentResolver import android.content.ContentValues -import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri @@ -10,8 +9,8 @@ import android.os.Build import android.os.Environment import android.provider.MediaStore import android.util.LruCache -import ani.dantotsu.util.Logger import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.online.HttpSource import kotlinx.coroutines.Dispatchers @@ -25,8 +24,7 @@ data class ImageData( ) { suspend fun fetchAndProcessImage( page: Page, - httpSource: HttpSource, - context: Context + httpSource: HttpSource ): Bitmap? { return withContext(Dispatchers.IO) { try { diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt index d19aa011..80b21e76 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt @@ -17,11 +17,11 @@ import ani.dantotsu.databinding.ItemChapterListBinding import ani.dantotsu.databinding.ItemEpisodeCompactBinding import ani.dantotsu.media.Media import ani.dantotsu.setAnimation +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import java.text.SimpleDateFormat import java.util.Date import java.util.Locale -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch class MangaChapterAdapter( private var type: Int, diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaNameAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaNameAdapter.kt index ae755faa..d265b69a 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaNameAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaNameAdapter.kt @@ -5,8 +5,8 @@ import java.util.regex.Pattern class MangaNameAdapter { companion object { - const val chapterRegex = "(chapter|chap|ch|c)[\\s:.\\-]*([\\d]+\\.?[\\d]*)[\\s:.\\-]*" - const val filedChapterNumberRegex = "(? ): Bitmap? { //still used in some places return tryWithSuspend { withContext(Dispatchers.IO) { - Glide.with(this@loadBitmap_old) + Glide.with(this@loadBitmapOld) .asBitmap() .let { if (link.url.startsWith("file://")) { @@ -168,8 +172,7 @@ abstract class BaseImageAdapter( mangaCache.get(link.url)?.let { imageData -> val bitmap = imageData.fetchAndProcessImage( imageData.page, - imageData.source, - context = this@loadBitmap + imageData.source ) it.load(bitmap) .skipMemoryCache(true) diff --git a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt index 1265d8be..685ab0f6 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt @@ -10,8 +10,19 @@ import android.content.res.Resources import android.graphics.Bitmap import android.os.Build import android.os.Bundle -import android.view.* -import android.view.KeyEvent.* +import android.view.HapticFeedbackConstants +import android.view.KeyEvent +import android.view.KeyEvent.ACTION_DOWN +import android.view.KeyEvent.KEYCODE_DPAD_DOWN +import android.view.KeyEvent.KEYCODE_DPAD_UP +import android.view.KeyEvent.KEYCODE_PAGE_DOWN +import android.view.KeyEvent.KEYCODE_PAGE_UP +import android.view.KeyEvent.KEYCODE_VOLUME_DOWN +import android.view.KeyEvent.KEYCODE_VOLUME_UP +import android.view.MotionEvent +import android.view.View +import android.view.ViewGroup +import android.view.WindowManager import android.view.animation.OvershootInterpolator import android.widget.AdapterView import android.widget.CheckBox @@ -26,7 +37,9 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.PagerSnapHelper import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 -import ani.dantotsu.* +import ani.dantotsu.GesturesListener +import ani.dantotsu.NoPaddingArrayAdapter +import ani.dantotsu.R import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.connections.discord.Discord @@ -34,7 +47,12 @@ import ani.dantotsu.connections.discord.DiscordService import ani.dantotsu.connections.discord.DiscordServiceRunningSingleton import ani.dantotsu.connections.discord.RPC import ani.dantotsu.connections.updateProgress +import ani.dantotsu.currContext import ani.dantotsu.databinding.ActivityMangaReaderBinding +import ani.dantotsu.dp +import ani.dantotsu.hideSystemBarsExtendView +import ani.dantotsu.isOnline +import ani.dantotsu.logError import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsViewModel import ani.dantotsu.media.MediaSingleton @@ -45,14 +63,25 @@ import ani.dantotsu.others.ImageViewDialog import ani.dantotsu.parsers.HMangaSources import ani.dantotsu.parsers.MangaImage import ani.dantotsu.parsers.MangaSources +import ani.dantotsu.px +import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.settings.CurrentReaderSettings import ani.dantotsu.settings.CurrentReaderSettings.Companion.applyWebtoon -import ani.dantotsu.settings.CurrentReaderSettings.Directions.* -import ani.dantotsu.settings.CurrentReaderSettings.DualPageModes.* -import ani.dantotsu.settings.CurrentReaderSettings.Layouts.* +import ani.dantotsu.settings.CurrentReaderSettings.Directions.BOTTOM_TO_TOP +import ani.dantotsu.settings.CurrentReaderSettings.Directions.LEFT_TO_RIGHT +import ani.dantotsu.settings.CurrentReaderSettings.Directions.RIGHT_TO_LEFT +import ani.dantotsu.settings.CurrentReaderSettings.Directions.TOP_TO_BOTTOM +import ani.dantotsu.settings.CurrentReaderSettings.DualPageModes.Automatic +import ani.dantotsu.settings.CurrentReaderSettings.DualPageModes.Force +import ani.dantotsu.settings.CurrentReaderSettings.DualPageModes.No +import ani.dantotsu.settings.CurrentReaderSettings.Layouts.CONTINUOUS_PAGED +import ani.dantotsu.settings.CurrentReaderSettings.Layouts.PAGED import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.showSystemBarsRetractView +import ani.dantotsu.snackString import ani.dantotsu.themes.ThemeManager +import ani.dantotsu.tryWith import com.alexvasilkov.gestures.views.GestureFrameLayout import com.bumptech.glide.load.resource.bitmap.BitmapTransformation import com.davemorrissey.labs.subscaleview.SubsamplingScaleImageView @@ -65,7 +94,8 @@ import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream -import java.util.* +import java.util.Timer +import java.util.TimerTask import kotlin.math.min import kotlin.properties.Delegates @@ -88,7 +118,6 @@ class MangaReaderActivity : AppCompatActivity() { private var isContVisible = false private var showProgressDialog = true - private var hidescrollbar = false private var maxChapterPage = 0L private var currentChapterPage = 0L @@ -123,7 +152,7 @@ class MangaReaderActivity : AppCompatActivity() { } private fun hideSystemBars() { - if (PrefManager.getVal(PrefName.ShowSystemBars)) + if (PrefManager.getVal(PrefName.ShowSystemBars)) showSystemBarsRetractView() else hideSystemBarsExtendView() @@ -355,7 +384,7 @@ class MangaReaderActivity : AppCompatActivity() { RPC.Link(getString(R.string.view_manga), media.shareLink ?: ""), RPC.Link( "Stream on Dantotsu", - "https://github.com/rebelonion/Dantotsu/" + getString(R.string.github) ) ) ) @@ -727,12 +756,12 @@ class MangaReaderActivity : AppCompatActivity() { goneTimer.schedule(timerTask, controllerDuration) } - enum class pressPos { + enum class PressPos { LEFT, RIGHT, CENTER } fun handleController(shouldShow: Boolean? = null, event: MotionEvent? = null) { - var pressLocation = pressPos.CENTER + var pressLocation = PressPos.CENTER if (!sliding) { if (event != null && defaultSettings.layout == PAGED) { if (event.action != MotionEvent.ACTION_UP) return @@ -742,23 +771,23 @@ class MangaReaderActivity : AppCompatActivity() { //if in the 1st 1/5th of the screen width, left and lower than 1/5th of the screen height, left if (screenWidth / 5 in x + 1.. screenWidth - screenWidth / 5 && y > screenWidth / 5) { pressLocation = if (defaultSettings.direction == RIGHT_TO_LEFT || defaultSettings.direction == BOTTOM_TO_TOP) { - pressPos.LEFT + PressPos.LEFT } else { - pressPos.RIGHT + PressPos.RIGHT } } } // if pressLocation is left or right go to previous or next page (paged mode only) - if (pressLocation == pressPos.LEFT) { + if (pressLocation == PressPos.LEFT) { if (binding.mangaReaderPager.currentItem > 0) { //if the current images zoomed in, go back to normal before going to previous page @@ -769,7 +798,7 @@ class MangaReaderActivity : AppCompatActivity() { return } - } else if (pressLocation == pressPos.RIGHT) { + } else if (pressLocation == PressPos.RIGHT) { if (binding.mangaReaderPager.currentItem < maxChapterPage - 1) { //if the current images zoomed in, go back to normal before going to next page if (imageAdapter?.isZoomed() == true) { @@ -947,7 +976,7 @@ class MangaReaderActivity : AppCompatActivity() { if (!incognito && PrefManager.getCustomVal( "${media.id}_save_progress", true - ) && if (media.isAdult) PrefManager.getVal(PrefName.UpdateForHReader) else true + ) && if (media.isAdult) PrefManager.getVal(PrefName.UpdateForHReader) else true ) updateProgress( media, diff --git a/app/src/main/java/ani/dantotsu/media/novel/NovelReadFragment.kt b/app/src/main/java/ani/dantotsu/media/novel/NovelReadFragment.kt index 859dfdac..867912a7 100644 --- a/app/src/main/java/ani/dantotsu/media/novel/NovelReadFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/novel/NovelReadFragment.kt @@ -9,7 +9,6 @@ import android.os.Environment import android.os.Handler import android.os.Looper import android.os.Parcelable -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -28,6 +27,7 @@ import ani.dantotsu.download.novel.NovelDownloaderService import ani.dantotsu.download.novel.NovelServiceDataSingleton import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsViewModel +import ani.dantotsu.media.MediaType import ani.dantotsu.media.novel.novelreader.NovelReaderActivity import ani.dantotsu.navBarHeight import ani.dantotsu.parsers.ShowResponse @@ -90,7 +90,7 @@ class NovelReadFragment : Fragment(), DownloadedType( media.mainName(), novel.name, - DownloadedType.Type.NOVEL + MediaType.NOVEL ) ) ) { @@ -122,7 +122,7 @@ class NovelReadFragment : Fragment(), DownloadedType( media.mainName(), novel.name, - DownloadedType.Type.NOVEL + MediaType.NOVEL ) ) } @@ -133,7 +133,7 @@ class NovelReadFragment : Fragment(), DownloadedType( media.mainName(), novel.name, - DownloadedType.Type.NOVEL + MediaType.NOVEL ) ) } diff --git a/app/src/main/java/ani/dantotsu/media/novel/NovelResponseAdapter.kt b/app/src/main/java/ani/dantotsu/media/novel/NovelResponseAdapter.kt index 9cbffc50..68945398 100644 --- a/app/src/main/java/ani/dantotsu/media/novel/NovelResponseAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/novel/NovelResponseAdapter.kt @@ -1,6 +1,5 @@ package ani.dantotsu.media.novel -import android.util.Log import android.util.TypedValue import android.view.LayoutInflater import android.view.View diff --git a/app/src/main/java/ani/dantotsu/media/novel/novelreader/NovelReaderActivity.kt b/app/src/main/java/ani/dantotsu/media/novel/novelreader/NovelReaderActivity.kt index 13712c21..7e21e14d 100644 --- a/app/src/main/java/ani/dantotsu/media/novel/novelreader/NovelReaderActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/novel/novelreader/NovelReaderActivity.kt @@ -59,7 +59,8 @@ import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream -import java.util.* +import java.util.Timer +import java.util.TimerTask import kotlin.math.min import kotlin.properties.Delegates diff --git a/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt b/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt index 7ce2f136..f53e6cbe 100644 --- a/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt @@ -6,7 +6,6 @@ import android.util.TypedValue import android.view.View import android.view.ViewGroup import android.view.Window -import android.view.WindowManager import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.PopupMenu @@ -17,7 +16,7 @@ import androidx.lifecycle.lifecycleScope import ani.dantotsu.R import ani.dantotsu.Refresh import ani.dantotsu.databinding.ActivityListBinding -import ani.dantotsu.navBarHeight +import ani.dantotsu.hideSystemBarsExtendView import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.statusBarHeight @@ -72,10 +71,7 @@ class ListActivity : AppCompatActivity() { } else { binding.root.fitsSystemWindows = false requestWindowFeature(Window.FEATURE_NO_TITLE) - window.setFlags( - WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN - ) + hideSystemBarsExtendView() binding.settingsContainer.updateLayoutParams { topMargin = statusBarHeight } diff --git a/app/src/main/java/ani/dantotsu/others/AndroidBug5497Workaround.kt b/app/src/main/java/ani/dantotsu/others/AndroidBug5497Workaround.kt index 46e8a297..7e46880d 100644 --- a/app/src/main/java/ani/dantotsu/others/AndroidBug5497Workaround.kt +++ b/app/src/main/java/ani/dantotsu/others/AndroidBug5497Workaround.kt @@ -11,7 +11,7 @@ class AndroidBug5497Workaround private constructor(activity: Activity, private v private val frameLayoutParams: FrameLayout.LayoutParams init { - val content = activity.findViewById(android.R.id.content) as FrameLayout + val content: FrameLayout = activity.findViewById(android.R.id.content) mChildOfContent = content.getChildAt(0) mChildOfContent.viewTreeObserver.addOnGlobalLayoutListener { possiblyResizeChildOfContent() } frameLayoutParams = mChildOfContent.layoutParams as FrameLayout.LayoutParams diff --git a/app/src/main/java/ani/dantotsu/others/AniSkip.kt b/app/src/main/java/ani/dantotsu/others/AniSkip.kt index 84448f09..b1fef0f1 100644 --- a/app/src/main/java/ani/dantotsu/others/AniSkip.kt +++ b/app/src/main/java/ani/dantotsu/others/AniSkip.kt @@ -7,7 +7,6 @@ import java.net.URLEncoder object AniSkip { - @Suppress("BlockingMethodInNonBlockingContext") suspend fun getResult( malId: Int, episodeNumber: Int, diff --git a/app/src/main/java/ani/dantotsu/others/Download.kt b/app/src/main/java/ani/dantotsu/others/Download.kt index 3a266af4..0b4b22dd 100644 --- a/app/src/main/java/ani/dantotsu/others/Download.kt +++ b/app/src/main/java/ani/dantotsu/others/Download.kt @@ -25,7 +25,6 @@ import kotlinx.coroutines.launch import java.io.File object Download { - @Suppress("DEPRECATION") private fun isPackageInstalled(packageName: String, packageManager: PackageManager): Boolean { return try { packageManager.getPackageInfo(packageName, 0) diff --git a/app/src/main/java/ani/dantotsu/others/Idiosyncrasy.kt b/app/src/main/java/ani/dantotsu/others/Idiosyncrasy.kt index 926862b5..3a2ca64b 100644 --- a/app/src/main/java/ani/dantotsu/others/Idiosyncrasy.kt +++ b/app/src/main/java/ani/dantotsu/others/Idiosyncrasy.kt @@ -1,4 +1,4 @@ -@file:Suppress("UNCHECKED_CAST", "DEPRECATION") +@file:Suppress("DEPRECATION") package ani.dantotsu.others diff --git a/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt b/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt index e11715c7..346bd592 100644 --- a/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt +++ b/app/src/main/java/ani/dantotsu/others/ImageViewDialog.kt @@ -14,7 +14,7 @@ import ani.dantotsu.R import ani.dantotsu.databinding.BottomSheetImageBinding import ani.dantotsu.downloadsPermission import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.loadBitmap -import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.loadBitmap_old +import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.loadBitmapOld import ani.dantotsu.media.manga.mangareader.BaseImageAdapter.Companion.mergeBitmap import ani.dantotsu.openLinkInBrowser import ani.dantotsu.saveImageToDownloads @@ -84,9 +84,9 @@ class ImageViewDialog : BottomSheetDialogFragment() { viewLifecycleOwner.lifecycleScope.launch { val binding = _binding ?: return@launch - var bitmap = context.loadBitmap_old(image, trans1 ?: listOf()) + var bitmap = context.loadBitmapOld(image, trans1 ?: listOf()) var bitmap2 = - if (image2 != null) context.loadBitmap_old(image2, trans2 ?: listOf()) else null + if (image2 != null) context.loadBitmapOld(image2, trans2 ?: listOf()) else null if (bitmap == null) { bitmap = context.loadBitmap(image, trans1 ?: listOf()) bitmap2 = diff --git a/app/src/main/java/ani/dantotsu/others/JsUnpacker.kt b/app/src/main/java/ani/dantotsu/others/JsUnpacker.kt index ecb5f0ce..4b86ae99 100644 --- a/app/src/main/java/ani/dantotsu/others/JsUnpacker.kt +++ b/app/src/main/java/ani/dantotsu/others/JsUnpacker.kt @@ -7,6 +7,7 @@ import kotlin.math.pow // https://github.com/cylonu87/JsUnpacker // https://github.com/recloudstream/cloudstream/blob/master/app/src/main/java/com/lagradost/cloudstream3/utils/JsUnpacker.kt +@Suppress("unused") class JsUnpacker(packedJS: String?) { private var packedJS: String? = null diff --git a/app/src/main/java/ani/dantotsu/others/OutlineTextView.kt b/app/src/main/java/ani/dantotsu/others/OutlineTextView.kt index e2c17cc0..7a0cf925 100644 --- a/app/src/main/java/ani/dantotsu/others/OutlineTextView.kt +++ b/app/src/main/java/ani/dantotsu/others/OutlineTextView.kt @@ -1,9 +1,11 @@ package ani.dantotsu.others import android.content.Context +import android.content.res.Resources import android.graphics.Canvas import android.graphics.Paint import android.util.AttributeSet +import android.util.TypedValue import androidx.appcompat.widget.AppCompatTextView import ani.dantotsu.R @@ -54,14 +56,14 @@ class OutlineTextView : AppCompatTextView { setStrokeWidth(strokeWidth) } + private val Float.toPx get() = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics + ) private fun setStrokeWidth(width: Float) { - strokeWidth = width.toPx(context) + strokeWidth = width.toPx } - private fun Float.toPx(context: Context) = - (this * context.resources.displayMetrics.scaledDensity + 0.5F) - override fun invalidate() { if (isDrawing) return super.invalidate() diff --git a/app/src/main/java/ani/dantotsu/others/webview/CookieCatcher.kt b/app/src/main/java/ani/dantotsu/others/webview/CookieCatcher.kt index 22f11f3f..78747506 100644 --- a/app/src/main/java/ani/dantotsu/others/webview/CookieCatcher.kt +++ b/app/src/main/java/ani/dantotsu/others/webview/CookieCatcher.kt @@ -12,19 +12,19 @@ import androidx.appcompat.app.AppCompatActivity import ani.dantotsu.R import ani.dantotsu.themes.ThemeManager import eu.kanade.tachiyomi.network.NetworkHelper +import eu.kanade.tachiyomi.util.system.getSerializableExtraCompat import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get class CookieCatcher : AppCompatActivity() { @SuppressLint("SetJavaScriptEnabled") - @Suppress("UNCHECKED_CAST") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ThemeManager(this).applyTheme() //get url from intent - val url = intent.getStringExtra("url") ?: "https://www.youtube.com/watch?v=dQw4w9WgXcQ" - val headers: Map = intent.getSerializableExtra("headers") as? Map ?: emptyMap() + val url = intent.getStringExtra("url") ?: getString(R.string.cursed_yt) + val headers: Map = intent.getSerializableExtraCompat("headers") as? Map ?: emptyMap() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val process = Application.getProcessName() diff --git a/app/src/main/java/ani/dantotsu/parsers/AnimeSources.kt b/app/src/main/java/ani/dantotsu/parsers/AnimeSources.kt index 9806767a..7f068747 100644 --- a/app/src/main/java/ani/dantotsu/parsers/AnimeSources.kt +++ b/app/src/main/java/ani/dantotsu/parsers/AnimeSources.kt @@ -37,7 +37,7 @@ object AnimeSources : WatchSources() { } fun performReorderAnimeSources() { - //remove the downloaded source from the list to avoid duplicates + // remove the downloaded source from the list to avoid duplicates list = list.filter { it.name != "Downloaded" } list = sortPinnedAnimeSources(list, pinnedAnimeSources) + Lazier( { OfflineAnimeParser() }, @@ -68,8 +68,6 @@ object AnimeSources : WatchSources() { object HAnimeSources : WatchSources() { - private val aList: List> = lazyList( - ) - + private val aList: List> = lazyList() override val list = listOf(aList, AnimeSources.list).flatten() } diff --git a/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt b/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt index 04b50c54..c9fe0292 100644 --- a/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt +++ b/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt @@ -11,11 +11,11 @@ import android.os.Environment import android.provider.MediaStore import ani.dantotsu.FileUrl import ani.dantotsu.currContext -import ani.dantotsu.util.Logger import ani.dantotsu.media.anime.AnimeNameAdapter import ani.dantotsu.media.manga.ImageData import ani.dantotsu.media.manga.MangaCache import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.animesource.AnimeCatalogueSource import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimesPage @@ -59,8 +59,6 @@ class AniyomiAdapter { fun aniyomiToAnimeParser(extension: AnimeExtension.Installed): DynamicAnimeParser { return DynamicAnimeParser(extension) } - - } class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { @@ -186,7 +184,7 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { // Group by season, sort within each season, and then renumber while keeping episode number 0 as is val seasonGroups = res.groupBy { AnimeNameAdapter.findSeasonNumber(it.name) ?: 0 } - seasonGroups.keys.sortedBy { it.toInt() } + seasonGroups.keys.sortedBy { it } .flatMap { season -> seasonGroups[season]?.sortedBy { it.episode_number }?.map { episode -> if (episode.episode_number != 0f) { // Skip renumbering for episode number 0 @@ -203,7 +201,7 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { } ?: emptyList() } } - return sortedEpisodes.map { SEpisodeToEpisode(it) } + return sortedEpisodes.map { sEpisodeToEpisode(it) } } catch (e: Exception) { Logger.log("Exception: $e") } @@ -238,7 +236,7 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { return try { val videos = source.getVideoList(sEpisode) - videos.map { VideoToVideoServer(it) } + videos.map { videoToVideoServer(it) } } catch (e: Exception) { Logger.log("Exception occurred: ${e.message}") emptyList() @@ -290,7 +288,7 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { } } - private fun SEpisodeToEpisode(sEpisode: SEpisode): Episode { + private fun sEpisodeToEpisode(sEpisode: SEpisode): Episode { //if the float episode number is a whole number, convert it to an int val episodeNumberInt = if (sEpisode.episode_number % 1 == 0f) { @@ -318,7 +316,7 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { ) } - private fun VideoToVideoServer(video: Video): VideoServer { + private fun videoToVideoServer(video: Video): VideoServer { return VideoServer( video.quality, video.url, @@ -357,7 +355,7 @@ class DynamicMangaParser(extension: MangaExtension.Installed) : MangaParser() { return try { val res = source.getChapterList(sManga) val reversedRes = res.reversed() - val chapterList = reversedRes.map { SChapterToMangaChapter(it) } + val chapterList = reversedRes.map { sChapterToMangaChapter(it) } Logger.log("chapterList size: ${chapterList.size}") Logger.log("chapterList: ${chapterList[1].title}") Logger.log("chapterList: ${chapterList[1].description}") @@ -376,7 +374,7 @@ class DynamicMangaParser(extension: MangaExtension.Installed) : MangaParser() { sourceLanguage = 0 extension.sources[sourceLanguage] } as? HttpSource ?: return emptyList() - var imageDataList: List = listOf() + val imageDataList: MutableList = mutableListOf() val ret = coroutineScope { try { Logger.log("source.name " + source.name) @@ -626,7 +624,7 @@ class DynamicMangaParser(extension: MangaExtension.Installed) : MangaParser() { } - private fun SChapterToMangaChapter(sChapter: SChapter): MangaChapter { + private fun sChapterToMangaChapter(sChapter: SChapter): MangaChapter { return MangaChapter( sChapter.name, sChapter.url, @@ -670,8 +668,8 @@ class VideoServerPassthrough(val videoServer: VideoServer) : VideoExtractor() { get() = videoServer override suspend fun extract(): VideoContainer { - val vidList = listOfNotNull(videoServer.video?.let { AniVideoToSaiVideo(it) }) - val subList = videoServer.video?.subtitleTracks?.map { TrackToSubtitle(it) } ?: emptyList() + val vidList = listOfNotNull(videoServer.video?.let { aniVideoToSaiVideo(it) }) + val subList = videoServer.video?.subtitleTracks?.map { trackToSubtitle(it) } ?: emptyList() return if (vidList.isNotEmpty()) { VideoContainer(vidList, subList) @@ -680,7 +678,7 @@ class VideoServerPassthrough(val videoServer: VideoServer) : VideoExtractor() { } } - private fun AniVideoToSaiVideo(aniVideo: Video): ani.dantotsu.parsers.Video { + private fun aniVideoToSaiVideo(aniVideo: Video): ani.dantotsu.parsers.Video { // Find the number value from the .quality string val number = Regex("""\d+""").find(aniVideo.quality)?.value?.toInt() ?: 0 @@ -783,9 +781,9 @@ class VideoServerPassthrough(val videoServer: VideoServer) : VideoExtractor() { } - private fun TrackToSubtitle(track: Track): Subtitle { + private fun trackToSubtitle(track: Track): Subtitle { //use Dispatchers.IO to make a HTTP request to determine the subtitle type - var type: SubtitleType? = null + var type: SubtitleType? runBlocking { type = findSubtitleType(track.url) } diff --git a/app/src/main/java/ani/dantotsu/parsers/BaseSources.kt b/app/src/main/java/ani/dantotsu/parsers/BaseSources.kt index 475d681f..1dd000b8 100644 --- a/app/src/main/java/ani/dantotsu/parsers/BaseSources.kt +++ b/app/src/main/java/ani/dantotsu/parsers/BaseSources.kt @@ -1,11 +1,11 @@ package ani.dantotsu.parsers import ani.dantotsu.Lazier -import ani.dantotsu.util.Logger import ani.dantotsu.media.Media import ani.dantotsu.media.anime.Episode import ani.dantotsu.media.manga.MangaChapter import ani.dantotsu.tryWithSuspend +import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.animesource.model.SAnime import eu.kanade.tachiyomi.source.model.SManga diff --git a/app/src/main/java/ani/dantotsu/parsers/NovelSources.kt b/app/src/main/java/ani/dantotsu/parsers/NovelSources.kt index 9420feb8..ea35a1b3 100644 --- a/app/src/main/java/ani/dantotsu/parsers/NovelSources.kt +++ b/app/src/main/java/ani/dantotsu/parsers/NovelSources.kt @@ -1,6 +1,5 @@ package ani.dantotsu.parsers -import android.util.Log import ani.dantotsu.Lazier import ani.dantotsu.parsers.novel.DynamicNovelParser import ani.dantotsu.parsers.novel.NovelExtension diff --git a/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt b/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt index 1c9c3b6c..57098894 100644 --- a/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt +++ b/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt @@ -4,6 +4,7 @@ import android.net.Uri import android.os.Environment import ani.dantotsu.currContext import ani.dantotsu.download.DownloadsManager +import ani.dantotsu.media.MediaType import ani.dantotsu.media.anime.AnimeNameAdapter import ani.dantotsu.tryWithSuspend import eu.kanade.tachiyomi.animesource.model.SAnime @@ -132,16 +133,16 @@ class OfflineVideoExtractor(val videoServer: VideoServer) : VideoExtractor() { currContext()?.let { DownloadsManager.getDirectory( it, - ani.dantotsu.download.DownloadedType.Type.ANIME, + MediaType.ANIME, title, episode - ).listFiles()?.forEach { - if (it.name.contains("subtitle")) { + ).listFiles()?.forEach { file -> + if (file.name.contains("subtitle")) { return listOf( Subtitle( "Downloaded Subtitle", - Uri.fromFile(it).toString(), - determineSubtitletype(it.absolutePath) + Uri.fromFile(file).toString(), + determineSubtitletype(file.absolutePath) ) ) } diff --git a/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt b/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt index 25099d78..29149873 100644 --- a/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt +++ b/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt @@ -3,8 +3,8 @@ package ani.dantotsu.parsers import android.os.Environment import ani.dantotsu.currContext import ani.dantotsu.download.DownloadsManager -import ani.dantotsu.util.Logger import ani.dantotsu.media.manga.MangaNameAdapter +import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import me.xdrop.fuzzywuzzy.FuzzySearch diff --git a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstallReceiver.kt b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionFileObserver.kt similarity index 98% rename from app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstallReceiver.kt rename to app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionFileObserver.kt index 056118a5..b69cea44 100644 --- a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstallReceiver.kt +++ b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionFileObserver.kt @@ -1,7 +1,6 @@ package ani.dantotsu.parsers.novel import android.os.FileObserver -import android.util.Log import ani.dantotsu.parsers.novel.FileObserver.fileObserver import ani.dantotsu.util.Logger import java.io.File diff --git a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionGithubApi.kt b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionGithubApi.kt index 9867658e..a209881e 100644 --- a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionGithubApi.kt +++ b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionGithubApi.kt @@ -2,9 +2,9 @@ package ani.dantotsu.parsers.novel import android.content.Context -import ani.dantotsu.util.Logger import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.extension.ExtensionUpdateNotifier import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.extension.anime.model.AnimeLoadResult diff --git a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstaller.kt b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstaller.kt index 14d7b75e..818713c2 100644 --- a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstaller.kt +++ b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstaller.kt @@ -10,7 +10,6 @@ import android.net.Uri import android.os.Build import android.os.Environment import android.provider.MediaStore -import android.util.Log import androidx.core.content.ContextCompat import androidx.core.content.getSystemService import androidx.core.net.toUri @@ -63,7 +62,7 @@ internal class NovelExtensionInstaller(private val context: Context) { * @param url The url of the apk. * @param extension The extension to install. */ - fun downloadAndInstall(url: String, extension: NovelExtension) = Observable.defer { + fun downloadAndInstall(url: String, extension: NovelExtension): Observable = Observable.defer { val pkgName = extension.pkgName val oldDownload = activeDownloads[pkgName] diff --git a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionLoader.kt b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionLoader.kt index 78535115..d4c94da5 100644 --- a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionLoader.kt +++ b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionLoader.kt @@ -5,11 +5,10 @@ import android.content.pm.PackageInfo import android.content.pm.PackageManager.GET_SIGNATURES import android.content.pm.PackageManager.GET_SIGNING_CERTIFICATES import android.os.Build -import android.util.Log import ani.dantotsu.connections.crashlytics.CrashlyticsInterface -import ani.dantotsu.util.Logger import ani.dantotsu.parsers.NovelInterface import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import dalvik.system.PathClassLoader import eu.kanade.tachiyomi.util.lang.Hash import uy.kohesive.injekt.Injekt @@ -134,10 +133,10 @@ internal object NovelExtensionLoader { } Logger.log("isFileWritable: ${file.canWrite()}") val classLoader = PathClassLoader(file.absolutePath, null, context.classLoader) - val className = + val extensionClassName = "some.random.novelextensions.${className.lowercase(Locale.getDefault())}.$className" - val loadedClass = classLoader.loadClass(className) - val instance = loadedClass.newInstance() + val loadedClass = classLoader.loadClass(extensionClassName) + val instance = loadedClass.getDeclaredConstructor().newInstance() val novelInterfaceInstance = instance as? NovelInterface listOfNotNull(novelInterfaceInstance) } catch (e: Exception) { diff --git a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionManager.kt b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionManager.kt index d52edd30..e55b238c 100644 --- a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionManager.kt +++ b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionManager.kt @@ -2,8 +2,8 @@ package ani.dantotsu.parsers.novel import android.content.Context import android.graphics.drawable.Drawable -import ani.dantotsu.util.Logger import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.extension.InstallStep import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt b/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt index 6312e3c5..fce8b02f 100644 --- a/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt @@ -1,6 +1,5 @@ package ani.dantotsu.profile - import android.view.View import ani.dantotsu.R import ani.dantotsu.blurImage diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt index 9980bc12..3457224e 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt @@ -28,6 +28,7 @@ import ani.dantotsu.media.user.ListActivity import ani.dantotsu.setSlideIn import ani.dantotsu.setSlideUp import ani.dantotsu.util.AniMarkdown.Companion.getFullAniHTML +import eu.kanade.tachiyomi.util.system.getSerializableCompat import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -52,7 +53,7 @@ class ProfileFragment : Fragment() { super.onViewCreated(view, savedInstanceState) activity = requireActivity() as ProfileActivity - user = arguments?.getSerializable("user") as Query.UserProfile + user = arguments?.getSerializableCompat("user") as Query.UserProfile viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) { model.setData(user.id) } diff --git a/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt b/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt index 1fdeef98..7a552dcb 100644 --- a/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt @@ -20,6 +20,7 @@ import ani.dantotsu.profile.ChartBuilder.Companion.StatType import ani.dantotsu.statusBarHeight import com.github.aachartmodel.aainfographics.aachartcreator.AAChartType import com.xwray.groupie.GroupieAdapter +import eu.kanade.tachiyomi.util.system.getSerializableCompat import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -48,7 +49,7 @@ class StatsFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) activity = requireActivity() as ProfileActivity - user = arguments?.getSerializable("user") as Query.UserProfile + user = arguments?.getSerializableCompat("user") as Query.UserProfile binding.statisticList.adapter = adapter binding.statisticList.setHasFixedSize(true) @@ -95,7 +96,7 @@ class StatsFragment : } } else { stats.removeAll( - stats.filter { it?.id == Anilist.userid } + stats.filter { it?.id == Anilist.userid }.toSet() ) loadStats(type == MediaType.ANIME) } @@ -439,6 +440,7 @@ class StatsFragment : }.toMutableList() chartPackets.clear() chartPackets.addAll(standardizedPackets) + @Suppress("UNCHECKED_CAST") val genreChart = ChartBuilder.buildChart( activity, ChartType.TwoDimensional, @@ -493,6 +495,7 @@ class StatsFragment : }.toMutableList() chartPackets.clear() chartPackets.addAll(standardizedPackets) + @Suppress("UNCHECKED_CAST") val tagChart = ChartBuilder.buildChart( activity, ChartType.TwoDimensional, @@ -547,6 +550,7 @@ class StatsFragment : }.toMutableList() chartPackets.clear() chartPackets.addAll(standardizedPackets) + @Suppress("UNCHECKED_CAST") val countryChart = ChartBuilder.buildChart( activity, ChartType.OneDimensional, @@ -603,6 +607,7 @@ class StatsFragment : }.toMutableList() chartPackets.clear() chartPackets.addAll(standardizedPackets) + @Suppress("UNCHECKED_CAST") val voiceActorsChart = ChartBuilder.buildChart( activity, ChartType.TwoDimensional, @@ -657,6 +662,7 @@ class StatsFragment : }.toMutableList() chartPackets.clear() chartPackets.addAll(standardizedPackets) + @Suppress("UNCHECKED_CAST") val studioChart = ChartBuilder.buildChart( activity, ChartType.TwoDimensional, @@ -714,6 +720,7 @@ class StatsFragment : }.toMutableList() chartPackets.clear() chartPackets.addAll(standardizedPackets) + @Suppress("UNCHECKED_CAST") val staffChart = ChartBuilder.buildChart( activity, ChartType.TwoDimensional, diff --git a/app/src/main/java/ani/dantotsu/profile/UsersDialogFragment.kt b/app/src/main/java/ani/dantotsu/profile/UsersDialogFragment.kt index ae8bc091..ad8f96cc 100644 --- a/app/src/main/java/ani/dantotsu/profile/UsersDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/UsersDialogFragment.kt @@ -8,7 +8,6 @@ import androidx.recyclerview.widget.LinearLayoutManager import ani.dantotsu.BottomSheetDialogFragment import ani.dantotsu.databinding.BottomSheetUsersBinding import ani.dantotsu.profile.activity.UsersAdapter -import ani.dantotsu.settings.DevelopersAdapter class UsersDialogFragment : BottomSheetDialogFragment() { diff --git a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt index c55e6a82..4073ab5e 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt @@ -17,13 +17,8 @@ import ani.dantotsu.profile.UsersDialogFragment import ani.dantotsu.setAnimation import ani.dantotsu.snackString import ani.dantotsu.util.AniMarkdown.Companion.getBasicAniHTML -import com.bumptech.glide.Glide -import com.bumptech.glide.load.engine.DiskCacheStrategy -import com.bumptech.glide.load.model.GlideUrl -import com.bumptech.glide.request.RequestOptions import com.xwray.groupie.GroupieAdapter import com.xwray.groupie.viewbinding.BindableItem -import jp.wasabeef.glide.transformations.BlurTransformation import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob diff --git a/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt b/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt index 98f0492b..b7ad48ba 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt @@ -57,7 +57,7 @@ class FeedActivity : AppCompatActivity() { } }) binding.listBack.setOnClickListener { - onBackPressed() + onBackPressedDispatcher.onBackPressed() } } diff --git a/app/src/main/java/ani/dantotsu/profile/activity/NotificationActivity.kt b/app/src/main/java/ani/dantotsu/profile/activity/NotificationActivity.kt index 01dac01f..9e67767d 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/NotificationActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/NotificationActivity.kt @@ -56,7 +56,7 @@ class NotificationActivity : AppCompatActivity() { binding.followerGrid.visibility = ViewGroup.GONE binding.followerList.visibility = ViewGroup.GONE binding.listBack.setOnClickListener { - onBackPressed() + onBackPressedDispatcher.onBackPressed() } binding.listProgressBar.visibility = ViewGroup.VISIBLE val activityId = intent.getIntExtra("activityId", -1) diff --git a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt index a97a644d..3cb4c7cf 100644 --- a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt @@ -2,26 +2,27 @@ package ani.dantotsu.settings import android.annotation.SuppressLint import android.app.AlertDialog -import android.os.Build.* -import android.os.Build.VERSION.* import android.os.Bundle import android.text.Editable import android.text.TextWatcher import android.view.View import android.view.ViewGroup -import android.view.WindowManager import android.widget.AutoCompleteTextView import androidx.appcompat.app.AppCompatActivity import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 -import ani.dantotsu.* +import ani.dantotsu.R +import ani.dantotsu.currContext import ani.dantotsu.databinding.ActivityExtensionsBinding +import ani.dantotsu.initActivity +import ani.dantotsu.navBarHeight import ani.dantotsu.others.AndroidBug5497Workaround import ani.dantotsu.others.LanguageMapper import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt index f7108bc7..b4fe05b5 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledAnimeExtensionsFragment.kt @@ -5,7 +5,6 @@ import android.app.AlertDialog import android.app.NotificationManager import android.content.Context import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -25,13 +24,13 @@ import androidx.viewpager2.widget.ViewPager2 import ani.dantotsu.R import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.databinding.FragmentAnimeExtensionsBinding -import ani.dantotsu.util.Logger import ani.dantotsu.others.LanguageMapper import ani.dantotsu.parsers.AnimeSources import ani.dantotsu.settings.extensionprefs.AnimeSourcePreferencesFragment import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import com.google.android.material.tabs.TabLayout import com.google.android.material.textfield.TextInputLayout import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource @@ -45,7 +44,6 @@ import uy.kohesive.injekt.api.get import java.util.Collections import java.util.Locale - class InstalledAnimeExtensionsFragment : Fragment(), SearchQueryHandler { diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt index 2da2a777..1b6c9155 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledMangaExtensionsFragment.kt @@ -6,7 +6,6 @@ import android.app.AlertDialog import android.app.NotificationManager import android.content.Context import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup diff --git a/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt index 5c46a5c9..4e0c0df2 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstalledNovelExtensionsFragment.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import android.app.NotificationManager import android.content.Context import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup diff --git a/app/src/main/java/ani/dantotsu/settings/NovelExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/NovelExtensionsFragment.kt index 83b93c9c..05ab9c18 100644 --- a/app/src/main/java/ani/dantotsu/settings/NovelExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/NovelExtensionsFragment.kt @@ -3,7 +3,6 @@ package ani.dantotsu.settings import android.app.NotificationManager import android.content.Context import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup diff --git a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt index 7cb5521b..a648b435 100644 --- a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt @@ -255,7 +255,7 @@ class PlayerSettingsActivity : AppCompatActivity() { binding.playerResizeMode.setOnClickListener { val dialog = resizeDialog.setSingleChoiceItems( resizeModes, - PrefManager.getVal(PrefName.Resize) + PrefManager.getVal(PrefName.Resize) ) { dialog, count -> PrefManager.setVal(PrefName.Resize, count) dialog.dismiss() diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index 1df64f08..38c91358 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -39,13 +39,12 @@ import ani.dantotsu.connections.mal.MAL import ani.dantotsu.copyToClipboard import ani.dantotsu.currContext import ani.dantotsu.databinding.ActivitySettingsBinding -import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.DownloadsManager import ani.dantotsu.download.video.ExoplayerDownloadService import ani.dantotsu.downloadsPermission import ani.dantotsu.initActivity import ani.dantotsu.loadImage -import ani.dantotsu.util.Logger +import ani.dantotsu.media.MediaType import ani.dantotsu.navBarHeight import ani.dantotsu.notifications.CommentNotificationWorker import ani.dantotsu.notifications.anilist.AnilistNotificationWorker @@ -70,6 +69,7 @@ import ani.dantotsu.subcriptions.Subscription.Companion.startSubscription import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes import ani.dantotsu.themes.ThemeManager import ani.dantotsu.toast +import ani.dantotsu.util.Logger import com.google.android.material.snackbar.Snackbar import com.google.android.material.textfield.TextInputEditText import eltos.simpledialogfragment.SimpleDialog @@ -124,13 +124,13 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene salt ) } catch (e: Exception) { - toast("Incorrect password") + toast(getString(R.string.incorrect_password)) return@passwordAlertDialog } if (PreferencePackager.unpack(decryptedJson)) restartApp() } else { - toast("Password cannot be empty") + toast(getString(R.string.password_cannot_be_empty)) } } } else if (name.endsWith(".ani")) { @@ -138,11 +138,11 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene if (PreferencePackager.unpack(decryptedJson)) restartApp() } else { - toast("Unknown file type") + toast(getString(R.string.unknown_file_type)) } } catch (e: Exception) { e.printStackTrace() - toast("Error importing settings") + toast(getString(R.string.error_importing_settings)) } } } @@ -227,7 +227,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene } val tag = "colorPicker" - CustomColorDialog().title("Custom Theme") + CustomColorDialog().title(R.string.custom_theme) .colorPreset(originalColor) .colors(this, SimpleColorDialog.MATERIAL_COLOR_PALLET) .allowCustom(true) @@ -244,7 +244,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene val managers = arrayOf("Default", "1DM", "ADM") val downloadManagerDialog = - AlertDialog.Builder(this, R.style.MyPopup).setTitle("Download Manager") + AlertDialog.Builder(this, R.style.MyPopup).setTitle(R.string.download_manager) var downloadManager: Int = PrefManager.getVal(PrefName.DownloadManager) binding.settingsDownloadManager.setOnClickListener { val dialog = downloadManagerDialog.setSingleChoiceItems( @@ -264,7 +264,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene val filteredLocations = Location.entries.filter { it.exportable } selectedArray.addAll(List(filteredLocations.size - 1) { false }) val dialog = AlertDialog.Builder(this, R.style.MyPopup) - .setTitle("Import/Export Settings") + .setTitle(R.string.import_export_settings) .setMultiChoiceItems( filteredLocations.map { it.name }.toTypedArray(), selectedArray.toBooleanArray() @@ -315,11 +315,11 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene binding.purgeAnimeDownloads.setOnClickListener { val dialog = AlertDialog.Builder(this, R.style.MyPopup) - .setTitle("Purge Anime Downloads") - .setMessage("Are you sure you want to purge all anime downloads?") - .setPositiveButton("Yes") { dialog, _ -> + .setTitle(R.string.purge_anime_downloads) + .setMessage(getString(R.string.purge_anime_confirm)) + .setPositiveButton(R.string.yes) { dialog, _ -> val downloadsManager = Injekt.get() - downloadsManager.purgeDownloads(DownloadedType.Type.ANIME) + downloadsManager.purgeDownloads(MediaType.ANIME) DownloadService.sendRemoveAllDownloads( this, ExoplayerDownloadService::class.java, @@ -327,7 +327,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene ) dialog.dismiss() } - .setNegativeButton("No") { dialog, _ -> + .setNegativeButton(R.string.no) { dialog, _ -> dialog.dismiss() } .create() @@ -337,14 +337,14 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene binding.purgeMangaDownloads.setOnClickListener { val dialog = AlertDialog.Builder(this, R.style.MyPopup) - .setTitle("Purge Manga Downloads") - .setMessage("Are you sure you want to purge all manga downloads?") - .setPositiveButton("Yes") { dialog, _ -> + .setTitle(R.string.purge_manga_downloads) + .setMessage(getString(R.string.purge_manga_confirm)) + .setPositiveButton(R.string.yes) { dialog, _ -> val downloadsManager = Injekt.get() - downloadsManager.purgeDownloads(DownloadedType.Type.MANGA) + downloadsManager.purgeDownloads(MediaType.MANGA) dialog.dismiss() } - .setNegativeButton("No") { dialog, _ -> + .setNegativeButton(R.string.no) { dialog, _ -> dialog.dismiss() } .create() @@ -354,14 +354,14 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene binding.purgeNovelDownloads.setOnClickListener { val dialog = AlertDialog.Builder(this, R.style.MyPopup) - .setTitle("Purge Novel Downloads") - .setMessage("Are you sure you want to purge all novel downloads?") - .setPositiveButton("Yes") { dialog, _ -> + .setTitle(R.string.purge_novel_downloads) + .setMessage(getString(R.string.purge_novel_confirm)) + .setPositiveButton(R.string.yes) { dialog, _ -> val downloadsManager = Injekt.get() - downloadsManager.purgeDownloads(DownloadedType.Type.NOVEL) + downloadsManager.purgeDownloads(MediaType.NOVEL) dialog.dismiss() } - .setNegativeButton("No") { dialog, _ -> + .setNegativeButton(R.string.no) { dialog, _ -> dialog.dismiss() } .create() @@ -396,16 +396,16 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene val alertDialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle("User Agent") .setView(dialogView) - .setPositiveButton("OK") { dialog, _ -> + .setPositiveButton(getString(R.string.ok)) { dialog, _ -> PrefManager.setVal(PrefName.DefaultUserAgent, editText.text.toString()) dialog.dismiss() } - .setNeutralButton("Reset") { dialog, _ -> + .setNeutralButton(getString(R.string.reset)) { dialog, _ -> PrefManager.removeVal(PrefName.DefaultUserAgent) editText.setText("") dialog.dismiss() } - .setNegativeButton("Cancel") { dialog, _ -> + .setNegativeButton(getString(R.string.cancel)) { dialog, _ -> dialog.dismiss() } .create() @@ -436,7 +436,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene binding.settingsExtensionDns.setOnItemClickListener { _, _, i, _ -> PrefManager.setVal(PrefName.DohProvider, i) binding.settingsExtensionDns.clearFocus() - Toast.makeText(this, "Restart app to apply changes", Toast.LENGTH_LONG).show() + restartApp() } binding.settingsDownloadInSd.isChecked = PrefManager.getVal(PrefName.SdDl) @@ -586,7 +586,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene lifecycleScope.launch { it.pop() } - openLinkInBrowser("https://www.buymeacoffee.com/rebelonion") + openLinkInBrowser(getString(R.string.coffee)) } lifecycleScope.launch { binding.settingBuyMeCoffee.pop() @@ -617,7 +617,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene (binding.settingsLogo.drawable as Animatable).start() if (cursedCounter % 7 == 0) { Toast.makeText(this, "youwu have been cuwsed :pwayge:", Toast.LENGTH_LONG).show() - val url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ" + val url = getString(R.string.cursed_yt) openLinkInBrowser(url) //PrefManager.setVal(PrefName.ImageUrl, !PrefManager.getVal(PrefName.ImageUrl, false)) } else { @@ -845,7 +845,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene if (MAL.token != null) { binding.settingsMALLogin.setText(R.string.logout) binding.settingsMALLogin.setOnClickListener { - MAL.removeSavedToken(it.context) + MAL.removeSavedToken() restartMainActivity.isEnabled = true reload() } @@ -1000,7 +1000,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene box?.setSingleLine() val dialog = AlertDialog.Builder(this, R.style.MyPopup) - .setTitle("Enter Password") + .setTitle(getString(R.string.enter_password)) .setView(dialogView) .setPositiveButton("OK", null) .setNegativeButton("Cancel") { dialog, _ -> @@ -1016,7 +1016,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene dialog.dismiss() callback(password) } else { - toast("Password cannot be empty") + toast(getString(R.string.password_cannot_be_empty)) } } box?.setOnEditorActionListener { _, actionId, _ -> @@ -1030,7 +1030,7 @@ class SettingsActivity : AppCompatActivity(), SimpleDialog.OnDialogResultListene val subtitleTextView = dialogView.findViewById(R.id.subtitle) subtitleTextView?.visibility = View.VISIBLE if (!isExporting) - subtitleTextView?.text = "Enter your password to decrypt the file" + subtitleTextView?.text = getString(R.string.enter_password_to_decrypt_file) dialog.window?.setDimAmount(0.8f) diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt b/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt index b2aa43e6..da16f1fa 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt @@ -10,7 +10,6 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat import ani.dantotsu.BottomSheetDialogFragment import ani.dantotsu.MainActivity -import ani.dantotsu.profile.ProfileActivity import ani.dantotsu.R import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.databinding.BottomSheetSettingsBinding @@ -23,13 +22,15 @@ import ani.dantotsu.home.MangaFragment import ani.dantotsu.home.NoInternet import ani.dantotsu.incognitoNotification import ani.dantotsu.loadImage -import ani.dantotsu.profile.activity.NotificationActivity import ani.dantotsu.offline.OfflineFragment +import ani.dantotsu.profile.ProfileActivity import ani.dantotsu.profile.activity.FeedActivity +import ani.dantotsu.profile.activity.NotificationActivity import ani.dantotsu.setSafeOnClickListener import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.startMainActivity +import eu.kanade.tachiyomi.util.system.getSerializableCompat import java.util.Timer import kotlin.concurrent.schedule @@ -40,7 +41,7 @@ class SettingsDialogFragment : BottomSheetDialogFragment() { private lateinit var pageType: PageType override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - pageType = arguments?.getSerializable("pageType") as? PageType ?: PageType.HOME + pageType = arguments?.getSerializableCompat("pageType") as? PageType ?: PageType.HOME } override fun onCreateView( diff --git a/app/src/main/java/ani/dantotsu/settings/extensionprefs/AnimePreferenceFragmentCompat.kt b/app/src/main/java/ani/dantotsu/settings/extensionprefs/AnimePreferenceFragmentCompat.kt index 0751454e..53130ccd 100644 --- a/app/src/main/java/ani/dantotsu/settings/extensionprefs/AnimePreferenceFragmentCompat.kt +++ b/app/src/main/java/ani/dantotsu/settings/extensionprefs/AnimePreferenceFragmentCompat.kt @@ -92,7 +92,7 @@ class AnimeSourcePreferencesFragment : PreferenceFragmentCompat() { } class InitialAnimeSourcePreferencesFragment( - val sharedPreferences: SharedPreferences, + private val sharedPreferences: SharedPreferences, val source: ConfigurableAnimeSource, val currContext: Context ) : PreferenceFragmentCompat() { diff --git a/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt b/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt index 53fe43cb..889d90a0 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt @@ -42,6 +42,7 @@ import kotlinx.coroutines.withContext class AnimeExtensionsViewModelFactory( private val animeExtensionManager: AnimeExtensionManager ) : ViewModelProvider.Factory { + @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { return AnimeExtensionsViewModel(animeExtensionManager) as T } @@ -49,7 +50,7 @@ class AnimeExtensionsViewModelFactory( class AnimeExtensionsViewModel( - private val animeExtensionManager: AnimeExtensionManager + animeExtensionManager: AnimeExtensionManager ) : ViewModel() { private val searchQuery = MutableStateFlow("") private var currentPagingSource: AnimeExtensionPagingSource? = null diff --git a/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt b/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt index 140eb549..fe54be5f 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt @@ -41,13 +41,14 @@ import kotlinx.coroutines.withContext class MangaExtensionsViewModelFactory( private val mangaExtensionManager: MangaExtensionManager ) : ViewModelProvider.Factory { + @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { return MangaExtensionsViewModel(mangaExtensionManager) as T } } class MangaExtensionsViewModel( - private val mangaExtensionManager: MangaExtensionManager + mangaExtensionManager: MangaExtensionManager ) : ViewModel() { private val searchQuery = MutableStateFlow("") private var currentPagingSource: MangaExtensionPagingSource? = null diff --git a/app/src/main/java/ani/dantotsu/settings/paging/NovelPagingSource.kt b/app/src/main/java/ani/dantotsu/settings/paging/NovelPagingSource.kt index 46379b76..fa2bf1ae 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/NovelPagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/NovelPagingSource.kt @@ -41,13 +41,14 @@ import kotlinx.coroutines.withContext class NovelExtensionsViewModelFactory( private val novelExtensionManager: NovelExtensionManager ) : ViewModelProvider.Factory { + @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { return NovelExtensionsViewModel(novelExtensionManager) as T } } class NovelExtensionsViewModel( - private val novelExtensionManager: NovelExtensionManager + novelExtensionManager: NovelExtensionManager ) : ViewModel() { private val searchQuery = MutableStateFlow("") private var currentPagingSource: NovelExtensionPagingSource? = null @@ -102,21 +103,20 @@ class NovelExtensionPagingSource( } else { availableExtensions.filter { it.name.contains(query, ignoreCase = true) } } - val filternfsw = filteredExtensions /*val filternfsw = if(isNsfwEnabled) { currently not implemented filteredExtensions } else { filteredExtensions.filterNot { it.isNsfw } }*/ return try { - val sublist = filternfsw.subList( + val sublist = filteredExtensions.subList( fromIndex = position, - toIndex = (position + params.loadSize).coerceAtMost(filternfsw.size) + toIndex = (position + params.loadSize).coerceAtMost(filteredExtensions.size) ) LoadResult.Page( data = sublist, prevKey = if (position == 0) null else position - params.loadSize, - nextKey = if (position + params.loadSize >= filternfsw.size) null else position + params.loadSize + nextKey = if (position + params.loadSize >= filteredExtensions.size) null else position + params.loadSize ) } catch (e: Exception) { LoadResult.Error(e) diff --git a/app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt b/app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt index 037fe6f6..30a29783 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt @@ -10,7 +10,7 @@ abstract class SharedPreferenceLiveData( ) : LiveData() { private val preferenceChangeListener = - SharedPreferences.OnSharedPreferenceChangeListener { sharedPreferences, key -> + SharedPreferences.OnSharedPreferenceChangeListener { _, key -> if (key == this.key) { value = getValueFromPreferences(key, defValue) } diff --git a/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt b/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt index c9c59c09..355975fb 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/AlarmReceiver.kt @@ -7,13 +7,13 @@ import android.content.Context import android.content.Intent import ani.dantotsu.currContext import ani.dantotsu.isOnline -import ani.dantotsu.util.Logger import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.subcriptions.Subscription.Companion.defaultTime import ani.dantotsu.subcriptions.Subscription.Companion.startSubscription import ani.dantotsu.subcriptions.Subscription.Companion.timeMinutes import ani.dantotsu.tryWith +import ani.dantotsu.util.Logger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/app/src/main/java/ani/dantotsu/subcriptions/Notifications.kt b/app/src/main/java/ani/dantotsu/subcriptions/Notifications.kt index 0599a5be..4aab8715 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/Notifications.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/Notifications.kt @@ -18,7 +18,7 @@ import com.bumptech.glide.load.model.GlideUrl import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -@Suppress("MemberVisibilityCanBePrivate", "unused") +@Suppress("MemberVisibilityCanBePrivate") class Notifications { enum class Group(val title: String, val icon: Int) { ANIME_GROUP("New Episodes", R.drawable.ic_round_movie_filter_24), @@ -50,11 +50,7 @@ class Notifications { } return PendingIntent.getActivity( context, 0, notifyIntent, - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT - } else { - PendingIntent.FLAG_ONE_SHOT - } + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_ONE_SHOT ) } diff --git a/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt b/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt index fb4e529d..f10ff04c 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/Subscription.kt @@ -5,11 +5,16 @@ import android.app.Notification import android.content.Context import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat -import ani.dantotsu.* +import ani.dantotsu.App +import ani.dantotsu.FileUrl +import ani.dantotsu.R +import ani.dantotsu.currActivity +import ani.dantotsu.currContext import ani.dantotsu.parsers.Episode import ani.dantotsu.parsers.MangaChapter import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.tryWithSuspend import ani.dantotsu.util.Logger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -74,7 +79,7 @@ class Subscription { val media = it.second val text = if (media.isAnime) { val parser = - SubscriptionHelper.getAnimeParser(context, media.isAdult, media.id) + SubscriptionHelper.getAnimeParser(media.isAdult, media.id) progress(index[it.first]!!, parser.name, media.name) val ep: Episode? = SubscriptionHelper.getEpisode(context, parser, media.id, media.isAdult) @@ -86,10 +91,10 @@ class Subscription { else null } else { val parser = - SubscriptionHelper.getMangaParser(context, media.isAdult, media.id) + SubscriptionHelper.getMangaParser(media.isAdult, media.id) progress(index[it.first]!!, parser.name, media.name) val ep: MangaChapter? = - SubscriptionHelper.getChapter(context, parser, media.id, media.isAdult) + SubscriptionHelper.getChapter(parser, media.id, media.isAdult) if (ep != null) ep.number + " " + currActivity()!!.getString(R.string.just_released) to null else null } ?: return@map diff --git a/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionHelper.kt b/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionHelper.kt index 1929ce3c..4ae66806 100644 --- a/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionHelper.kt +++ b/app/src/main/java/ani/dantotsu/subcriptions/SubscriptionHelper.kt @@ -22,7 +22,6 @@ import kotlinx.coroutines.withTimeoutOrNull class SubscriptionHelper { companion object { private fun loadSelected( - context: Context, mediaId: Int, isAdult: Boolean, isAnime: Boolean @@ -37,13 +36,13 @@ class SubscriptionHelper { return data } - private fun saveSelected(context: Context, mediaId: Int, data: Selected) { + private fun saveSelected(mediaId: Int, data: Selected) { PrefManager.setCustomVal("${mediaId}-select", data) } - fun getAnimeParser(context: Context, isAdult: Boolean, id: Int): AnimeParser { + fun getAnimeParser(isAdult: Boolean, id: Int): AnimeParser { val sources = if (isAdult) HAnimeSources else AnimeSources - val selected = loadSelected(context, id, isAdult, true) + val selected = loadSelected(id, isAdult, true) val parser = sources[selected.sourceIndex] parser.selectDub = selected.preferDub return parser @@ -56,7 +55,7 @@ class SubscriptionHelper { isAdult: Boolean ): Episode? { - val selected = loadSelected(context, id, isAdult, true) + val selected = loadSelected(id, isAdult, true) val ep = withTimeoutOrNull(10 * 1000) { tryWithSuspend { val show = parser.loadSavedShowResponse(id) ?: throw Exception( @@ -76,23 +75,22 @@ class SubscriptionHelper { return ep?.apply { selected.latest = number.toFloat() - saveSelected(context, id, selected) + saveSelected(id, selected) } } - fun getMangaParser(context: Context, isAdult: Boolean, id: Int): MangaParser { + fun getMangaParser(isAdult: Boolean, id: Int): MangaParser { val sources = if (isAdult) HMangaSources else MangaSources - val selected = loadSelected(context, id, isAdult, false) + val selected = loadSelected(id, isAdult, false) return sources[selected.sourceIndex] } suspend fun getChapter( - context: Context, parser: MangaParser, id: Int, isAdult: Boolean ): MangaChapter? { - val selected = loadSelected(context, id, isAdult, true) + val selected = loadSelected(id, isAdult, true) val chp = withTimeoutOrNull(10 * 1000) { tryWithSuspend { val show = parser.loadSavedShowResponse(id) ?: throw Exception( @@ -112,7 +110,7 @@ class SubscriptionHelper { return chp?.apply { selected.latest = MangaNameAdapter.findChapterNumber(number) ?: 0f - saveSelected(context, id, selected) + saveSelected(id, selected) } } diff --git a/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt b/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt index 1c346ab2..2d280f05 100644 --- a/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt +++ b/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt @@ -5,7 +5,7 @@ import ani.dantotsu.util.ColorEditor.Companion.toCssColor class AniMarkdown { //istg anilist has the worst api companion object { private fun convertNestedImageToHtml(markdown: String): String { - val regex = """\[\!\[(.*?)\]\((.*?)\)\]\((.*?)\)""".toRegex() + val regex = """\[!\[(.*?)]\((.*?)\)]\((.*?)\)""".toRegex() return regex.replace(markdown) { matchResult -> val altText = matchResult.groupValues[1] val imageUrl = matchResult.groupValues[2] @@ -15,7 +15,7 @@ class AniMarkdown { //istg anilist has the worst api } private fun convertImageToHtml(markdown: String): String { - val regex = """\!\[(.*?)\]\((.*?)\)""".toRegex() + val regex = """!\[(.*?)]\((.*?)\)""".toRegex() return regex.replace(markdown) { matchResult -> val altText = matchResult.groupValues[1] val imageUrl = matchResult.groupValues[2] @@ -24,7 +24,7 @@ class AniMarkdown { //istg anilist has the worst api } private fun convertLinkToHtml(markdown: String): String { - val regex = """\[(.*?)\]\((.*?)\)""".toRegex() + val regex = """\[(.*?)]\((.*?)\)""".toRegex() return regex.replace(markdown) { matchResult -> val linkText = matchResult.groupValues[1] val linkUrl = matchResult.groupValues[2] @@ -49,7 +49,7 @@ class AniMarkdown { //istg anilist has the worst api private fun underlineToHtml(html: String): String { return html.replace("(?s)___(.*?)___".toRegex(), "
$1
") .replace("(?s)__(.*?)__".toRegex(), "
$1
") - .replace("(?s)[\\s]+_([^_]+)_[\\s]+".toRegex(), "$1") + .replace("(?s)\\s+_([^_]+)_\\s+".toRegex(), "$1") } fun getBasicAniHTML(html: String): String { diff --git a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsFactory.kt b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsFactory.kt index 75f35588..8cf8029a 100644 --- a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsFactory.kt +++ b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsFactory.kt @@ -1,7 +1,6 @@ package ani.dantotsu.widgets import android.content.Context -import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory import android.widget.RemoteViews @@ -12,7 +11,7 @@ import java.io.InputStream import java.net.HttpURLConnection import java.net.URL -class CurrentlyAiringRemoteViewsFactory(private val context: Context, intent: Intent) : +class CurrentlyAiringRemoteViewsFactory(private val context: Context) : RemoteViewsService.RemoteViewsFactory { private var widgetItems = mutableListOf() diff --git a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsService.kt b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsService.kt index a0ff2efc..4d042b33 100644 --- a/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsService.kt +++ b/app/src/main/java/ani/dantotsu/widgets/CurrentlyAiringRemoteViewsService.kt @@ -7,6 +7,6 @@ import ani.dantotsu.util.Logger class CurrentlyAiringRemoteViewsService : RemoteViewsService() { override fun onGetViewFactory(intent: Intent): RemoteViewsFactory { Logger.log("CurrentlyAiringRemoteViewsFactory onGetViewFactory") - return CurrentlyAiringRemoteViewsFactory(applicationContext, intent) + return CurrentlyAiringRemoteViewsFactory(applicationContext) } } 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 e9a5c3a7..53193be4 100644 --- a/app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt +++ b/app/src/main/java/eu/kanade/domain/base/ExtensionInstallerPreference.kt @@ -20,7 +20,7 @@ class ExtensionInstallerPreference( val entries - get() = ExtensionInstaller.values().run { + get() = ExtensionInstaller.entries.toTypedArray().run { if (context.hasMiuiPackageInstaller) { filter { it != ExtensionInstaller.PACKAGEINSTALLER } } else { @@ -41,7 +41,7 @@ class ExtensionInstallerPreference( } ExtensionInstaller.SHIZUKU -> { - if (!context.isShizukuInstalled) return defaultValue() + if (!isShizukuInstalled) return defaultValue() } else -> {} diff --git a/app/src/main/java/eu/kanade/tachiyomi/animesource/AnimeSource.kt b/app/src/main/java/eu/kanade/tachiyomi/animesource/AnimeSource.kt index 53da5305..171b07b2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/animesource/AnimeSource.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/animesource/AnimeSource.kt @@ -58,8 +58,7 @@ interface AnimeSource { */ @Suppress("DEPRECATION") suspend fun getVideoList(episode: SEpisode): List