diff --git a/app/src/main/java/ani/dantotsu/Functions.kt b/app/src/main/java/ani/dantotsu/Functions.kt index bb790ad3..5dd9dbc3 100644 --- a/app/src/main/java/ani/dantotsu/Functions.kt +++ b/app/src/main/java/ani/dantotsu/Functions.kt @@ -367,7 +367,7 @@ class DatePickerFragment(activity: Activity, var date: FuzzyDate = FuzzyDate().g dialog.setButton( DialogInterface.BUTTON_NEUTRAL, activity.getString(R.string.remove) - ) { dialog, which -> + ) { _, which -> if (which == DialogInterface.BUTTON_NEUTRAL) { date = FuzzyDate() } @@ -1025,7 +1025,7 @@ class EmptyAdapter(private val count: Int) : RecyclerView.Adapter= Build.VERSION_CODES.O) { val serviceChannel = NotificationChannel( @@ -265,7 +266,7 @@ class DiscordService : Service() { retryAttempts++ if (retryAttempts >= maxRetryAttempts) { log("WebSocket: Error, onFailure() reason: Max Retry Attempts") - errorNotification("Could not set the presence", "Max Retry Attempts") + errorNotification("Timeout setting presence", "Max Retry Attempts") return } } @@ -344,13 +345,13 @@ class DiscordService : Service() { Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { - //TODO: Request permission return } notificationManager.notify(2, builder.build()) log("Error Notified") } + @Suppress("unused") fun saveSimpleTestPresence() { val file = File(baseContext.cacheDir, "payload") //fill with test payload @@ -377,7 +378,9 @@ class DiscordService : Service() { } fun log(string: String) { - //Logger.log(string) + if (shouldLog) { + Logger.log(string) + } } fun resume() { 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 fc498743..322c29d4 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt @@ -357,6 +357,7 @@ class AnimeDownloaderService : Service() { return false } + @OptIn(DelicateCoroutinesApi::class) private fun saveMediaInfo(task: AnimeDownloadTask) { launchIO { val directory = File( 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 3ab53d55..ebeeb93c 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/OfflineAnimeAdapter.kt @@ -49,10 +49,9 @@ class OfflineAnimeAdapter( val imageView = view.findViewById(R.id.itemCompactImage) val titleTextView = view.findViewById(R.id.itemCompactTitle) val itemScore = view.findViewById(R.id.itemCompactScore) - val itemScoreBG = view.findViewById(R.id.itemCompactScoreBG) val ongoing = view.findViewById(R.id.itemCompactOngoing) - val totalepisodes = view.findViewById(R.id.itemCompactTotal) - val typeimage = view.findViewById(R.id.itemCompactTypeImage) + val totalEpisodes = view.findViewById(R.id.itemCompactTotal) + val typeImage = view.findViewById(R.id.itemCompactTypeImage) val type = view.findViewById(R.id.itemCompactRelation) val typeView = view.findViewById(R.id.itemCompactType) @@ -61,16 +60,16 @@ class OfflineAnimeAdapter( val episodes = view.findViewById(R.id.itemTotal) episodes.text = context.getString(R.string.episodes) bannerView.setImageURI(item.banner ?: item.image) - totalepisodes.text = item.totalEpisodeList + totalEpisodes.text = item.totalEpisodeList } else if (style == 1) { val watchedEpisodes = view.findViewById(R.id.itemCompactUserProgress) // for compact view watchedEpisodes.text = item.watchedEpisode - totalepisodes.text = context.getString(R.string.total_divider, item.totalEpisode) + totalEpisodes.text = context.getString(R.string.total_divider, item.totalEpisode) } // Bind item data to the views - typeimage.setImageResource(R.drawable.ic_round_movie_filter_24) + typeImage.setImageResource(R.drawable.ic_round_movie_filter_24) type.text = item.type typeView.visibility = View.VISIBLE imageView.setImageURI(item.image) 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 8c6aef99..c25bb204 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/OfflineMangaAdapter.kt @@ -49,7 +49,6 @@ class OfflineMangaAdapter( val imageView = view.findViewById(R.id.itemCompactImage) val titleTextView = view.findViewById(R.id.itemCompactTitle) val itemScore = view.findViewById(R.id.itemCompactScore) - val itemScoreBG = view.findViewById(R.id.itemCompactScoreBG) val ongoing = view.findViewById(R.id.itemCompactOngoing) val totalChapter = view.findViewById(R.id.itemCompactTotal) val typeImage = view.findViewById(R.id.itemCompactTypeImage) 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 9cb46d31..fc432313 100644 --- a/app/src/main/java/ani/dantotsu/download/novel/NovelDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/novel/NovelDownloaderService.kt @@ -34,7 +34,6 @@ import eu.kanade.tachiyomi.source.model.SChapterImpl import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch @@ -65,7 +64,7 @@ class NovelDownloaderService : Service() { private val mutex = Mutex() private var isCurrentlyProcessing = false - val networkHelper = Injekt.get() + private val networkHelper = Injekt.get() override fun onBind(intent: Intent?): IBinder? { // This is only required for bound services. @@ -248,7 +247,7 @@ class NovelDownloaderService : Service() { networkHelper.downloadClient.newCall(request).execute().use { response -> // Ensure the response is successful and has a body - if (!response.isSuccessful || response.body == null) { + if (!response.isSuccessful) { throw IOException("Failed to download file: ${response.message}") } @@ -474,7 +473,6 @@ class NovelDownloaderService : Service() { } object NovelServiceDataSingleton { - var sourceMedia: Media? = null var downloadQueue: Queue = ConcurrentLinkedQueue() @Volatile 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 6cb688fa..258c123a 100644 --- a/app/src/main/java/ani/dantotsu/download/video/Helper.kt +++ b/app/src/main/java/ani/dantotsu/download/video/Helper.kt @@ -126,7 +126,6 @@ object Helper { fun downloadManager(context: Context): DownloadManager { return download ?: let { val database = Injekt.get() - val downloadDirectory = File(getDownloadDirectory(context), DOWNLOAD_CONTENT_DIRECTORY) val dataSourceFactory = DataSource.Factory { //val dataSource: HttpDataSource = OkHttpDataSource.Factory(okHttpClient).createDataSource() val networkHelper = Injekt.get() diff --git a/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt b/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt index 1a9d73e5..4957e4af 100644 --- a/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/CalendarActivity.kt @@ -43,13 +43,6 @@ class CalendarActivity : AppCompatActivity() { val typedValue = TypedValue() theme.resolveAttribute(com.google.android.material.R.attr.colorSurface, typedValue, true) val primaryColor = typedValue.data - val typedValue2 = TypedValue() - theme.resolveAttribute( - com.google.android.material.R.attr.colorOnBackground, - typedValue2, - true - ) - val titleTextColor = typedValue2.data val typedValue3 = TypedValue() theme.resolveAttribute(com.google.android.material.R.attr.colorPrimary, typedValue3, true) val primaryTextColor = typedValue3.data diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index 38ded425..022ebe2d 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -3,7 +3,6 @@ package ani.dantotsu.media import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.content.Intent -import android.graphics.Rect import android.content.res.Configuration import android.os.Bundle import android.text.SpannableStringBuilder @@ -220,20 +219,6 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi R.drawable.ic_round_favorite_24 ) ) - val typedValue = TypedValue() - this.theme.resolveAttribute( - com.google.android.material.R.attr.colorSecondary, - typedValue, - true - ) - val color = typedValue.data - val typedValue2 = TypedValue() - this.theme.resolveAttribute( - com.google.android.material.R.attr.colorSecondary, - typedValue2, - true - ) - val color2 = typedValue.data PopImageButton( scope, @@ -241,7 +226,7 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi R.drawable.ic_round_favorite_24, R.drawable.ic_round_favorite_border_24, R.color.bg_opp, - R.color.violet_400,//TODO: Change to colorSecondary + R.color.violet_400, media.isFav ) { media.isFav = it @@ -487,13 +472,6 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi binding.mediaCover.visibility = if (binding.mediaCover.scaleX == 0f) View.GONE else View.VISIBLE val duration = (200 * (PrefManager.getVal(PrefName.AnimationSpeed) as Float)).toLong() - val typedValue = TypedValue() - this@MediaDetailsActivity.theme.resolveAttribute( - com.google.android.material.R.attr.colorSecondary, - typedValue, - true - ) - val color = typedValue.data if (percentage >= percent && !isCollapsed) { isCollapsed = true ObjectAnimator.ofFloat(binding.mediaTitle, "translationX", 0f).setDuration(duration) diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt index b9d005e3..a69ad852 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt @@ -67,15 +67,6 @@ class MediaDetailsViewModel : ViewModel() { return data } - fun loadSelectedStringLocation(sourceName: String): Int { - //find the location of the source in the list - var location = watchSources?.list?.indexOfFirst { it.name == sourceName } ?: 0 - if (location == -1) { - location = 0 - } - return location - } - var continueMedia: Boolean? = null private var loading = false @@ -295,7 +286,6 @@ class MediaDetailsViewModel : ViewModel() { suspend fun loadMangaChapterImages( chapter: MangaChapter, selected: Selected, - series: String, post: Boolean = true ): Boolean { 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 ea95e077..8d0d1d64 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -54,7 +54,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import androidx.core.math.MathUtils.clamp import androidx.core.view.isVisible -import androidx.core.view.WindowCompat import androidx.core.view.updateLayoutParams import androidx.lifecycle.lifecycleScope import androidx.media3.cast.CastPlayer @@ -226,7 +225,6 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL private var extractor: VideoExtractor? = null private var video: Video? = null private var subtitle: Subtitle? = null - private val player = "player_settings" private var notchHeight: Int = 0 private var currentWindow = 0 @@ -1398,7 +1396,6 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL ext.onVideoPlayed(video) } - val simpleCache = VideoCache.getInstance(this) val httpClient = okHttpClient.newBuilder().apply { ignoreAllSSLErrors() followRedirects(true) @@ -1814,7 +1811,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL } if (PrefManager.getVal(PrefName.ShowTimeStampButton)) { - if (!functionstarted && !disappeared && PrefManager.getVal(PrefName.AutoHideTimeStamps)) { + if (!functionstarted && !disappeared && PrefManager.getVal(PrefName.AutoHideTimeStamps)) { disappearSkip() } else if (!PrefManager.getVal(PrefName.AutoHideTimeStamps)){ skipTimeButton.visibility = View.VISIBLE @@ -2161,11 +2158,6 @@ class CustomCastButton : MediaRouteButton { constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) - constructor(context: Context, attrs: AttributeSet, castCallback: () -> Unit) : super(context, attrs) { - this.castCallback = castCallback - } - - override fun performClick(): Boolean { return if (PrefManager.getVal(PrefName.UseInternalCast)) { super.performClick() 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 22a7e097..fc3f15cd 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt @@ -336,7 +336,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/anime/SubtitleDialogFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/SubtitleDialogFragment.kt index 8b172fe1..bc6e8546 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/SubtitleDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/SubtitleDialogFragment.kt @@ -113,7 +113,6 @@ class SubtitleDialogFragment : BottomSheetDialogFragment() { binding.root.setCardBackgroundColor(TRANSPARENT) } } - val activity: Activity = requireActivity() as ExoplayerView binding.root.setOnClickListener { episode.selectedSubtitle = position - 1 model.setEpisode(episode, "Subtitle") diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt index 039d3f05..4bedaecc 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt @@ -449,7 +449,7 @@ open class MangaReadFragment : Fragment(), ScanlatorSelectionListener { model.mangaReadSources?.get(media.selected!!.sourceIndex) as? DynamicMangaParser parser?.let { CoroutineScope(Dispatchers.IO).launch { - val images = parser.imageList("", chapter.sChapter) + val images = parser.imageList(chapter.sChapter) // Create a download task val downloadTask = MangaDownloaderService.DownloadTask( diff --git a/app/src/main/java/ani/dantotsu/media/manga/mangareader/BaseImageAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/mangareader/BaseImageAdapter.kt index 6db754dc..67f5048c 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/mangareader/BaseImageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/mangareader/BaseImageAdapter.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas -import android.net.Uri import android.view.HapticFeedbackConstants import android.view.MotionEvent import android.view.View @@ -26,7 +25,6 @@ import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.resource.bitmap.BitmapTransformation -import eu.kanade.tachiyomi.source.model.Page import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -162,7 +160,6 @@ abstract class BaseImageAdapter( Glide.with(this@loadBitmap) .asBitmap() .let { - val fileUri = Uri.fromFile(File(link.url)).toString() val localFile = File(link.url) if (localFile.exists()) { it.load(localFile.absoluteFile) @@ -211,8 +208,4 @@ abstract class BaseImageAdapter( } } -} - -interface ImageFetcher { - suspend fun fetchImage(page: Page): Bitmap? } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/media/manga/mangareader/ChapterLoaderDialog.kt b/app/src/main/java/ani/dantotsu/media/manga/mangareader/ChapterLoaderDialog.kt index e1bebb83..6c5233b7 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/mangareader/ChapterLoaderDialog.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/mangareader/ChapterLoaderDialog.kt @@ -49,8 +49,7 @@ class ChapterLoaderDialog : BottomSheetDialogFragment() { lifecycleScope.launch(Dispatchers.IO) { if (model.loadMangaChapterImages( chp, - m.selected!!, - m.mainName() + m.selected!! ) ) { val activity = currActivity() 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 747bb8dd..6f00adb4 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 @@ -415,8 +415,7 @@ class MangaReaderActivity : AppCompatActivity() { scope.launch(Dispatchers.IO) { model.loadMangaChapterImages( chapter, - media.selected!!, - media.mainName() + media.selected!! ) } } @@ -938,7 +937,6 @@ class MangaReaderActivity : AppCompatActivity() { model.loadMangaChapterImages( chapters[chaptersArr.getOrNull(currentChapterIndex + 1) ?: return@launch]!!, media.selected!!, - media.mainName(), false ) loading = false 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 81a80cfa..0d07d8ac 100644 --- a/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt @@ -1,6 +1,5 @@ package ani.dantotsu.media.user -import android.annotation.SuppressLint import android.os.Bundle import android.util.TypedValue import android.view.View @@ -41,13 +40,6 @@ class ListActivity : AppCompatActivity() { val typedValue = TypedValue() theme.resolveAttribute(com.google.android.material.R.attr.colorSurface, typedValue, true) val primaryColor = typedValue.data - val typedValue2 = TypedValue() - theme.resolveAttribute( - com.google.android.material.R.attr.colorOnBackground, - typedValue2, - true - ) - val titleTextColor = typedValue2.data val typedValue3 = TypedValue() theme.resolveAttribute(com.google.android.material.R.attr.colorPrimary, typedValue3, true) val primaryTextColor = typedValue3.data @@ -184,7 +176,6 @@ class ListActivity : AppCompatActivity() { //get the current tab val currentTab = binding.listTabLayout.getTabAt(binding.listTabLayout.selectedTabPosition) - val currentViewePager = binding.listViewPager.getChildAt(0) val currentFragment = supportFragmentManager.findFragmentByTag("f" + currentTab?.position.toString()) as? ListFragment currentFragment?.randomOptionClick() diff --git a/app/src/main/java/ani/dantotsu/notifications/TaskScheduler.kt b/app/src/main/java/ani/dantotsu/notifications/TaskScheduler.kt index 572c6258..04e431db 100644 --- a/app/src/main/java/ani/dantotsu/notifications/TaskScheduler.kt +++ b/app/src/main/java/ani/dantotsu/notifications/TaskScheduler.kt @@ -1,7 +1,6 @@ package ani.dantotsu.notifications import android.content.Context -import androidx.work.OutOfQuotaPolicy import ani.dantotsu.notifications.anilist.AnilistNotificationWorker import ani.dantotsu.notifications.comment.CommentNotificationWorker import ani.dantotsu.notifications.subscription.SubscriptionNotificationWorker diff --git a/app/src/main/java/ani/dantotsu/notifications/comment/CommentNotificationTask.kt b/app/src/main/java/ani/dantotsu/notifications/comment/CommentNotificationTask.kt index ec6b2361..b8cf6f7f 100644 --- a/app/src/main/java/ani/dantotsu/notifications/comment/CommentNotificationTask.kt +++ b/app/src/main/java/ani/dantotsu/notifications/comment/CommentNotificationTask.kt @@ -57,8 +57,7 @@ class CommentNotificationTask : Task { if (notifications.isNullOrEmpty()) return@withContext PrefManager.setVal( PrefName.UnreadCommentNotifications, - PrefManager.getVal(PrefName.UnreadCommentNotifications) + (notifications.size - ?: 0) + PrefManager.getVal(PrefName.UnreadCommentNotifications) + (notifications.size) ) notifications.forEach { @@ -293,6 +292,7 @@ class CommentNotificationTask : Task { return notification } + @Suppress("unused") private fun getBitmapFromVectorDrawable(context: Context, drawableId: Int): Bitmap? { val drawable = ContextCompat.getDrawable(context, drawableId) ?: return null val bitmap = Bitmap.createBitmap( diff --git a/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt b/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt index fc271de6..623eae33 100644 --- a/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt +++ b/app/src/main/java/ani/dantotsu/parsers/AniyomiAdapter.kt @@ -1,14 +1,6 @@ package ani.dantotsu.parsers -import android.content.ContentResolver -import android.content.ContentValues import android.content.Context -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import android.net.Uri -import android.os.Build -import android.os.Environment -import android.provider.MediaStore import ani.dantotsu.FileUrl import ani.dantotsu.currContext import ani.dantotsu.media.anime.AnimeNameAdapter @@ -35,12 +27,10 @@ import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.lang.awaitSingle -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit @@ -48,18 +38,9 @@ import kotlinx.coroutines.withContext import okhttp3.Request import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -import java.io.File -import java.io.FileOutputStream import java.io.UnsupportedEncodingException import java.net.URL import java.net.URLDecoder -import java.util.regex.Pattern - -class AniyomiAdapter { - fun aniyomiToAnimeParser(extension: AnimeExtension.Installed): DynamicAnimeParser { - return DynamicAnimeParser(extension) - } -} class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { val extension: AnimeExtension.Installed @@ -103,7 +84,7 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { return false } - fun setDub(setDub: Boolean) { + private fun setDub(setDub: Boolean) { if (sourceLanguage >= extension.sources.size) { sourceLanguage = extension.sources.size - 1 } @@ -285,9 +266,6 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { val name = sAnime.title val link = sAnime.url val coverUrl = sAnime.thumbnail_url ?: "" - val otherNames = emptyList() // Populate as needed - val total = 1 - val extra: Map? = null // Populate as needed // Create a new ShowResponse ShowResponse(name, link, coverUrl, sAnime) @@ -333,7 +311,7 @@ class DynamicAnimeParser(extension: AnimeExtension.Installed) : AnimeParser() { } class DynamicMangaParser(extension: MangaExtension.Installed) : MangaParser() { - val mangaCache = Injekt.get() + private val mangaCache = Injekt.get() val extension: MangaExtension.Installed var sourceLanguage = 0 @@ -408,7 +386,7 @@ class DynamicMangaParser(extension: MangaExtension.Installed) : MangaParser() { return ret } - suspend fun imageList(chapterLink: String, sChapter: SChapter): List { + suspend fun imageList(sChapter: SChapter): List { val source = try { extension.sources[sourceLanguage] } catch (e: Exception) { @@ -441,121 +419,6 @@ class DynamicMangaParser(extension: MangaExtension.Installed) : MangaParser() { } } - suspend fun fetchAndProcessImage( - page: Page, - httpSource: HttpSource, - context: Context - ): Bitmap? { - return withContext(Dispatchers.IO) { - try { - // Fetch the image - val response = httpSource.getImage(page) - Logger.log("Response: ${response.code}") - Logger.log("Response: ${response.message}") - - // Convert the Response to an InputStream - val inputStream = response.body.byteStream() - - // Convert InputStream to Bitmap - val bitmap = BitmapFactory.decodeStream(inputStream) - - inputStream.close() - ani.dantotsu.media.manga.saveImage( - bitmap, - context.contentResolver, - page.imageUrl!!, - Bitmap.CompressFormat.JPEG, - 100 - ) - - return@withContext bitmap - } catch (e: Exception) { - // Handle any exceptions - Logger.log("An error occurred: ${e.message}") - return@withContext null - } - } - } - - - fun fetchAndSaveImage(page: Page, httpSource: HttpSource, contentResolver: ContentResolver) { - CoroutineScope(Dispatchers.IO).launch { - try { - // Fetch the image - val response = httpSource.getImage(page) - - // Convert the Response to an InputStream - val inputStream = response.body.byteStream() - - // Convert InputStream to Bitmap - val bitmap = BitmapFactory.decodeStream(inputStream) - - withContext(Dispatchers.IO) { - // Save the Bitmap using MediaStore API - saveImage( - bitmap, - contentResolver, - "image_${System.currentTimeMillis()}.jpg", - Bitmap.CompressFormat.JPEG, - 100 - ) - } - - inputStream.close() - } catch (e: Exception) { - // Handle any exceptions - Logger.log("An error occurred: ${e.message}") - } - } - } - - fun saveImage( - bitmap: Bitmap, - contentResolver: ContentResolver, - filename: String, - format: Bitmap.CompressFormat, - quality: Int - ) { - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - val contentValues = ContentValues().apply { - put(MediaStore.MediaColumns.DISPLAY_NAME, filename) - put(MediaStore.MediaColumns.MIME_TYPE, "image/${format.name.lowercase()}") - put( - MediaStore.MediaColumns.RELATIVE_PATH, - "${Environment.DIRECTORY_DOWNLOADS}/Dantotsu/Anime" - ) - } - - val uri: Uri? = contentResolver.insert( - MediaStore.Images.Media.EXTERNAL_CONTENT_URI, - contentValues - ) - - uri?.let { - contentResolver.openOutputStream(it)?.use { os -> - bitmap.compress(format, quality, os) - } - } - } else { - val directory = - File("${Environment.getExternalStorageDirectory()}${File.separator}Dantotsu${File.separator}Anime") - if (!directory.exists()) { - directory.mkdirs() - } - - val file = File(directory, filename) - FileOutputStream(file).use { outputStream -> - bitmap.compress(format, quality, outputStream) - } - } - } catch (e: Exception) { - // Handle exception here - Logger.log("Exception while saving image: ${e.message}") - } - } - - override suspend fun search(query: String): List { val source = try { extension.sources[sourceLanguage] @@ -587,9 +450,6 @@ class DynamicMangaParser(extension: MangaExtension.Installed) : MangaParser() { val name = sManga.title val link = sManga.url val coverUrl = sManga.thumbnail_url ?: "" - val otherNames = emptyList() // Populate as needed - val total = 1 - val extra: Map? = null // Populate as needed // Create a new ShowResponse ShowResponse(name, link, coverUrl, sManga) @@ -598,12 +458,10 @@ class DynamicMangaParser(extension: MangaExtension.Installed) : MangaParser() { private fun pageToMangaImage(page: Page): MangaImage { var headersMap = mapOf() - var urlWithoutHeaders = "" var url = "" page.imageUrl?.let { val splitUrl = it.split("&") - urlWithoutHeaders = splitUrl.getOrNull(0) ?: "" url = it headersMap = splitUrl.mapNotNull { part -> @@ -641,35 +499,9 @@ class DynamicMangaParser(extension: MangaExtension.Installed) : MangaParser() { sChapter.date_upload ) } - - fun parseChapterTitle(title: String): Triple { - val volumePattern = - Pattern.compile("(?:vol\\.?|v|volume\\s?)(\\d+)", Pattern.CASE_INSENSITIVE) - val chapterPattern = - Pattern.compile("(?:ch\\.?|chapter\\s?)(\\d+)", Pattern.CASE_INSENSITIVE) - - val volumeMatcher = volumePattern.matcher(title) - val chapterMatcher = chapterPattern.matcher(title) - - val volumeNumber = if (volumeMatcher.find()) volumeMatcher.group(1) else null - val chapterNumber = if (chapterMatcher.find()) chapterMatcher.group(1) else null - - var remainingTitle = title - if (volumeNumber != null) { - remainingTitle = - volumeMatcher.group(0)?.let { remainingTitle.replace(it, "") }.toString() - } - if (chapterNumber != null) { - remainingTitle = - chapterMatcher.group(0)?.let { remainingTitle.replace(it, "") }.toString() - } - - return Triple(volumeNumber, chapterNumber, remainingTitle.trim()) - } - } -class VideoServerPassthrough(val videoServer: VideoServer) : VideoExtractor() { +class VideoServerPassthrough(private val videoServer: VideoServer) : VideoExtractor() { override val server: VideoServer get() = videoServer @@ -748,6 +580,7 @@ class VideoServerPassthrough(val videoServer: VideoServer) : VideoExtractor() { return type } + @Suppress("unused") private fun headRequest(fileName: String, networkHelper: NetworkHelper): VideoType? { return try { Logger.log("attempting head request for $fileName") diff --git a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionFileObserver.kt b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionFileObserver.kt index b69cea44..30ad7548 100644 --- a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionFileObserver.kt +++ b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionFileObserver.kt @@ -45,15 +45,6 @@ class NovelExtensionFileObserver(private val listener: Listener, private val pat } } - /** - * Loads the extension from the file. - * - * @param file The file name of the extension. - */ - //private suspend fun loadExtensionFromFile(file: String): String { - // return file - //} - interface Listener { fun onExtensionFileCreated(file: File) fun onExtensionFileDeleted(file: File) 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 818713c2..809f4a5f 100644 --- a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstaller.kt +++ b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstaller.kt @@ -152,13 +152,8 @@ internal class NovelExtensionInstaller(private val context: Context) { val destinationPath = context.getExternalFilesDir(null)?.absolutePath + "/extensions/novel/$pkgName.apk" - val destinationPathDirectory = - context.getExternalFilesDir(null)?.absolutePath + "/extensions/novel/" - val destinationPathDirectoryFile = File(destinationPathDirectory) - - // Check if source path is obtained correctly - if (sourcePath == null) { + if (!sourcePath.startsWith(FILE_SCHEME)) { Logger.log("Source APK path not found.") downloadsRelay.call(downloadId to InstallStep.Error) return InstallStep.Error @@ -263,6 +258,7 @@ internal class NovelExtensionInstaller(private val context: Context) { Logger.log("File copied to internal storage.") } + @Suppress("unused") private fun getRealPathFromURI(context: Context, contentUri: Uri): String? { var cursor: Cursor? = null try { @@ -376,7 +372,6 @@ internal class NovelExtensionInstaller(private val context: Context) { companion object { const val APK_MIME = "application/vnd.android.package-archive" - const val EXTRA_DOWNLOAD_ID = "NovelExtensionInstaller.extra.DOWNLOAD_ID" const val FILE_SCHEME = "file://" } } 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 d4c94da5..7c814880 100644 --- a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionLoader.kt +++ b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionLoader.kt @@ -48,6 +48,7 @@ internal object NovelExtensionLoader { * Attempts to load an extension from the given package name. It checks if the extension * contains the required feature flag before trying to load it. */ + @Suppress("unused") fun loadExtensionFromPkgName(context: Context, pkgName: String): NovelLoadResult { val path = context.getExternalFilesDir(null)?.absolutePath + "/extensions/novel/$pkgName.apk" @@ -56,7 +57,7 @@ internal object NovelExtensionLoader { File(it).setWritable(false) File(it).setReadable(true) } - val pkgInfo = try { + try { context.packageManager.getPackageArchiveInfo(path, 0) } catch (error: Exception) { // Unlikely, but the package may have been uninstalled at this point diff --git a/app/src/main/java/ani/dantotsu/profile/ChartBuilder.kt b/app/src/main/java/ani/dantotsu/profile/ChartBuilder.kt index 1fcce464..0a03dae8 100644 --- a/app/src/main/java/ani/dantotsu/profile/ChartBuilder.kt +++ b/app/src/main/java/ani/dantotsu/profile/ChartBuilder.kt @@ -235,7 +235,7 @@ class ChartBuilder { aaYaxis.tickInterval(tickInterval) aaOptions.yAxis(aaYaxis) - setColors(aaOptions, context, primaryColor) + setColors(aaOptions, context) return aaOptions } @@ -308,7 +308,7 @@ class ChartBuilder { return data.map { (it.toDouble() / max) * 100 } } - private fun setColors(aaOptions: AAOptions, context: Context, primaryColor: Int) { + private fun setColors(aaOptions: AAOptions, context: Context) { val backgroundColor = TypedValue() context.theme.resolveAttribute( com.google.android.material.R.attr.colorSurfaceVariant, diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt index 5dac823a..c754059b 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt @@ -1,11 +1,9 @@ package ani.dantotsu.profile import android.animation.ObjectAnimator -import android.annotation.SuppressLint import android.content.Intent import android.content.res.Configuration import android.os.Bundle -import android.util.TypedValue import android.view.View import android.view.ViewGroup import android.widget.PopupMenu @@ -267,13 +265,6 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene binding.profileUserAvatarContainer.visibility = if (binding.profileUserAvatarContainer.scaleX == 0f) View.GONE else View.VISIBLE val duration = (200 * (PrefManager.getVal(PrefName.AnimationSpeed) as Float)).toLong() - val typedValue = TypedValue() - this@ProfileActivity.theme.resolveAttribute( - com.google.android.material.R.attr.colorSecondary, - typedValue, - true - ) - val color = typedValue.data if (percentage >= percent && !isCollapsed) { isCollapsed = true ObjectAnimator.ofFloat(binding.profileUserDataContainer, "translationX", screenWidth) 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 1d7d5f92..3cf099e7 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/AnimePagingSource.kt @@ -1,6 +1,5 @@ package ani.dantotsu.settings.paging -import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.ViewGroup import android.view.animation.LinearInterpolator @@ -38,7 +37,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext - +@Suppress("UNCHECKED_CAST") class AnimeExtensionsViewModelFactory( private val animeExtensionManager: AnimeExtensionManager ) : ViewModelProvider.Factory { @@ -49,7 +48,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 1227d667..d73700f0 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/MangaPagingSource.kt @@ -1,6 +1,5 @@ package ani.dantotsu.settings.paging -import android.annotation.SuppressLint import android.view.LayoutInflater import android.view.ViewGroup import android.view.animation.LinearInterpolator @@ -38,6 +37,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +@Suppress("UNCHECKED_CAST") class MangaExtensionsViewModelFactory( private val mangaExtensionManager: MangaExtensionManager ) : ViewModelProvider.Factory { @@ -47,7 +47,7 @@ class MangaExtensionsViewModelFactory( } 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 fa2bf1ae..2fefeeb3 100644 --- a/app/src/main/java/ani/dantotsu/settings/paging/NovelPagingSource.kt +++ b/app/src/main/java/ani/dantotsu/settings/paging/NovelPagingSource.kt @@ -97,7 +97,6 @@ class NovelExtensionPagingSource( val availableExtensions = availableExtensionsFlow.filterNot { it.pkgName in installedExtensions } val query = searchQuery - val isNsfwEnabled: Boolean = PrefManager.getVal(PrefName.NSFWExtension) val filteredExtensions = if (query.isEmpty()) { availableExtensions } else { 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..365cb4bd 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) } @@ -78,9 +78,11 @@ class SharedPreferenceStringSetLiveData( sharedPrefs.getStringSet(key, defValue)?.toSet() ?: defValue } +@Suppress("unused") fun SharedPreferences.intLiveData(key: String, defValue: Int): SharedPreferenceLiveData { return SharedPreferenceIntLiveData(this, key, defValue) } +@Suppress("unused") fun SharedPreferences.stringLiveData( key: String, @@ -89,6 +91,7 @@ fun SharedPreferences.stringLiveData( return SharedPreferenceStringLiveData(this, key, defValue) } +@Suppress("unused") fun SharedPreferences.booleanLiveData( key: String, defValue: Boolean @@ -96,14 +99,17 @@ fun SharedPreferences.booleanLiveData( return SharedPreferenceBooleanLiveData(this, key, defValue) } +@Suppress("unused") fun SharedPreferences.floatLiveData(key: String, defValue: Float): SharedPreferenceLiveData { return SharedPreferenceFloatLiveData(this, key, defValue) } +@Suppress("unused") fun SharedPreferences.longLiveData(key: String, defValue: Long): SharedPreferenceLiveData { return SharedPreferenceLongLiveData(this, key, defValue) } +@Suppress("unused") fun SharedPreferences.stringSetLiveData( key: String, defValue: Set diff --git a/app/src/main/java/eu/kanade/tachiyomi/animesource/model/Video.kt b/app/src/main/java/eu/kanade/tachiyomi/animesource/model/Video.kt index 66dde1c0..e9d38bdd 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/animesource/model/Video.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/animesource/model/Video.kt @@ -101,6 +101,7 @@ open class Video( out.writeObject(headersMap) } + @Suppress("UNCHECKED_CAST") @Throws(IOException::class, ClassNotFoundException::class) private fun readObject(input: ObjectInputStream) { input.defaultReadObject()