diff --git a/app/src/main/java/ani/dantotsu/App.kt b/app/src/main/java/ani/dantotsu/App.kt index 4748d1fe..d010404c 100644 --- a/app/src/main/java/ani/dantotsu/App.kt +++ b/app/src/main/java/ani/dantotsu/App.kt @@ -7,11 +7,11 @@ import android.os.Bundle import androidx.multidex.MultiDex import androidx.multidex.MultiDexApplication import ani.dantotsu.addons.download.DownloadAddonManager +import ani.dantotsu.addons.torrent.TorrentAddonManager import ani.dantotsu.aniyomi.anime.custom.AppModule import ani.dantotsu.aniyomi.anime.custom.PreferenceModule import ani.dantotsu.connections.comments.CommentsAPI import ani.dantotsu.connections.crashlytics.CrashlyticsInterface -import ani.dantotsu.addons.torrent.TorrentAddonManager import ani.dantotsu.notifications.TaskScheduler import ani.dantotsu.others.DisabledReports import ani.dantotsu.parsers.AnimeSources diff --git a/app/src/main/java/ani/dantotsu/Functions.kt b/app/src/main/java/ani/dantotsu/Functions.kt index fc9112ba..84a5378c 100644 --- a/app/src/main/java/ani/dantotsu/Functions.kt +++ b/app/src/main/java/ani/dantotsu/Functions.kt @@ -190,7 +190,7 @@ var loadMedia: Int? = null var loadIsMAL = false val Int.toPx get() = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics + TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), getSystem().displayMetrics ).toInt() fun initActivity(a: Activity) { @@ -464,7 +464,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/addons/AddonDownloader.kt b/app/src/main/java/ani/dantotsu/addons/AddonDownloader.kt index 0f679bec..ddd57abd 100644 --- a/app/src/main/java/ani/dantotsu/addons/AddonDownloader.kt +++ b/app/src/main/java/ani/dantotsu/addons/AddonDownloader.kt @@ -1,38 +1,23 @@ package ani.dantotsu.addons -import android.annotation.SuppressLint import android.app.Activity -import android.app.DownloadManager import android.app.NotificationManager -import android.content.BroadcastReceiver import android.content.Context -import android.content.Intent -import android.content.IntentFilter -import android.net.Uri import android.os.Build -import android.os.Environment -import androidx.core.content.ContextCompat -import androidx.core.content.getSystemService -import androidx.core.net.toUri -import ani.dantotsu.BuildConfig import ani.dantotsu.Mapper import ani.dantotsu.R import ani.dantotsu.client import ani.dantotsu.logError -import ani.dantotsu.media.MediaType import ani.dantotsu.openLinkInBrowser import ani.dantotsu.others.AppUpdater import ani.dantotsu.settings.InstallerSteps import ani.dantotsu.toast import ani.dantotsu.util.Logger -import eu.kanade.tachiyomi.extension.InstallStep -import eu.kanade.tachiyomi.extension.util.ExtensionInstaller import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.decodeFromJsonElement -import rx.Observable import rx.android.schedulers.AndroidSchedulers class AddonDownloader { @@ -44,8 +29,8 @@ class AddonDownloader { Mapper.json.decodeFromJsonElement(it) } val r = res.maxByOrNull { - it.timeStamp() - } ?: throw Exception("No Pre Release Found") + it.timeStamp() + } ?: throw Exception("No Pre Release Found") val v = r.tagName.substringAfter("v", "") val md = r.body ?: "" val version = v.ifEmpty { throw Exception("Weird Version : ${r.tagName}") } @@ -101,8 +86,7 @@ class AddonDownloader { { error -> installerSteps.onError(error) {} }, { installerSteps.onComplete {} } ) - } - else openLinkInBrowser("https://github.com/repos/$repo/releases/tag/v$version") + } else openLinkInBrowser("https://github.com/repos/$repo/releases/tag/v$version") } } catch (e: Exception) { logError(e) diff --git a/app/src/main/java/ani/dantotsu/addons/AddonLoader.kt b/app/src/main/java/ani/dantotsu/addons/AddonLoader.kt index c44338d9..a6da3011 100644 --- a/app/src/main/java/ani/dantotsu/addons/AddonLoader.kt +++ b/app/src/main/java/ani/dantotsu/addons/AddonLoader.kt @@ -9,8 +9,8 @@ import ani.dantotsu.addons.download.DownloadAddon import ani.dantotsu.addons.download.DownloadAddonApi import ani.dantotsu.addons.download.DownloadAddonManager import ani.dantotsu.addons.download.DownloadLoadResult -import ani.dantotsu.addons.torrent.TorrentAddonApi import ani.dantotsu.addons.torrent.TorrentAddon +import ani.dantotsu.addons.torrent.TorrentAddonApi import ani.dantotsu.addons.torrent.TorrentAddonManager import ani.dantotsu.addons.torrent.TorrentLoadResult import ani.dantotsu.media.AddonType @@ -56,7 +56,8 @@ class AddonLoader { throw error } - val extName = pkgManager.getApplicationLabel(appInfo).toString().substringAfter("Dantotsu: ") + val extName = + pkgManager.getApplicationLabel(appInfo).toString().substringAfter("Dantotsu: ") val versionName = pkgInfo.versionName val versionCode = PackageInfoCompat.getLongVersionCode(pkgInfo) @@ -64,7 +65,8 @@ class AddonLoader { Logger.log("Missing versionName for extension $extName") throw IllegalStateException("Missing versionName for extension $extName") } - val classLoader = PathClassLoader(appInfo.sourceDir, appInfo.nativeLibraryDir, context.classLoader) + val classLoader = + PathClassLoader(appInfo.sourceDir, appInfo.nativeLibraryDir, context.classLoader) val loadedClass = try { Class.forName(className, false, classLoader) } catch (e: ClassNotFoundException) { @@ -75,7 +77,7 @@ class AddonLoader { Logger.log("Extension load error: $extName ($className)") Logger.log(e) throw e - }catch (e: Exception) { + } catch (e: Exception) { Logger.log("Extension load error: $extName ($className)") Logger.log(e) throw e @@ -84,7 +86,8 @@ class AddonLoader { return when (type) { AddonType.TORRENT -> { - val extension = instance as? TorrentAddonApi ?: throw IllegalStateException("Extension is not a TorrentAddonApi") + val extension = instance as? TorrentAddonApi + ?: throw IllegalStateException("Extension is not a TorrentAddonApi") TorrentLoadResult.Success( TorrentAddon.Installed( name = extName, @@ -96,8 +99,10 @@ class AddonLoader { ) ) } + AddonType.DOWNLOAD -> { - val extension = instance as? DownloadAddonApi ?: throw IllegalStateException("Extension is not a DownloadAddonApi") + val extension = instance as? DownloadAddonApi + ?: throw IllegalStateException("Extension is not a DownloadAddonApi") DownloadLoadResult.Success( DownloadAddon.Installed( name = extName, @@ -120,6 +125,7 @@ class AddonLoader { TorrentAddonManager.TORRENT_CLASS, type ) + AddonType.DOWNLOAD -> loadExtension( context, packageName, diff --git a/app/src/main/java/ani/dantotsu/addons/AddonManager.kt b/app/src/main/java/ani/dantotsu/addons/AddonManager.kt index 19d9cd26..951c2f0c 100644 --- a/app/src/main/java/ani/dantotsu/addons/AddonManager.kt +++ b/app/src/main/java/ani/dantotsu/addons/AddonManager.kt @@ -6,7 +6,7 @@ import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.extension.util.ExtensionInstaller import rx.Observable -abstract class AddonManager( +abstract class AddonManager( private val context: Context ) { abstract var extension: T? @@ -31,14 +31,16 @@ abstract class AddonManager( installer.uninstallApk(it) } } + fun addListenerAction(action: (AddonListener.ListenerAction) -> Unit) { onListenerAction = action } + fun removeListenerAction() { onListenerAction = null } fun install(url: String): Observable { - return installer.downloadAndInstall(url, getPackageName()?: "", name, type) + return installer.downloadAndInstall(url, getPackageName() ?: "", name, type) } } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/addons/download/AddonInstallReceiver.kt b/app/src/main/java/ani/dantotsu/addons/download/AddonInstallReceiver.kt index f08f375a..95ab27de 100644 --- a/app/src/main/java/ani/dantotsu/addons/download/AddonInstallReceiver.kt +++ b/app/src/main/java/ani/dantotsu/addons/download/AddonInstallReceiver.kt @@ -3,7 +3,6 @@ package ani.dantotsu.addons.download import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.content.IntentFilter import androidx.core.content.ContextCompat import ani.dantotsu.addons.AddonListener import ani.dantotsu.addons.AddonLoader @@ -26,7 +25,7 @@ internal class AddonInstallReceiver : BroadcastReceiver() { ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_EXPORTED) } - fun setListener(listener: AddonListener, type: AddonType) : AddonInstallReceiver { + fun setListener(listener: AddonListener, type: AddonType): AddonInstallReceiver { this.listener = listener this.type = type return this diff --git a/app/src/main/java/ani/dantotsu/addons/download/DownloadLoadResult.kt b/app/src/main/java/ani/dantotsu/addons/download/DownloadLoadResult.kt index 62038d13..da8e7cdd 100644 --- a/app/src/main/java/ani/dantotsu/addons/download/DownloadLoadResult.kt +++ b/app/src/main/java/ani/dantotsu/addons/download/DownloadLoadResult.kt @@ -2,6 +2,6 @@ package ani.dantotsu.addons.download import ani.dantotsu.addons.LoadResult -open class DownloadLoadResult: LoadResult() { +open class DownloadLoadResult : LoadResult() { class Success(val extension: DownloadAddon.Installed) : DownloadLoadResult() } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/addons/torrent/TorrentAddonManager.kt b/app/src/main/java/ani/dantotsu/addons/torrent/TorrentAddonManager.kt index 184663c5..b716b7ba 100644 --- a/app/src/main/java/ani/dantotsu/addons/torrent/TorrentAddonManager.kt +++ b/app/src/main/java/ani/dantotsu/addons/torrent/TorrentAddonManager.kt @@ -14,10 +14,7 @@ import ani.dantotsu.addons.download.AddonInstallReceiver import ani.dantotsu.media.AddonType import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.extension.InstallStep -import eu.kanade.tachiyomi.extension.util.ExtensionInstaller -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import kotlinx.coroutines.withContext class TorrentAddonManager( @@ -98,7 +95,7 @@ class TorrentAddonManager( } } - private inner class InstallationListener : AddonListener { + private inner class InstallationListener : AddonListener { override fun onAddonInstalled(result: LoadResult?) { if (result is TorrentLoadResult.Success) { extension = result.extension diff --git a/app/src/main/java/ani/dantotsu/addons/torrent/TorrentLoadResult.kt b/app/src/main/java/ani/dantotsu/addons/torrent/TorrentLoadResult.kt index 8cffb928..dfba2009 100644 --- a/app/src/main/java/ani/dantotsu/addons/torrent/TorrentLoadResult.kt +++ b/app/src/main/java/ani/dantotsu/addons/torrent/TorrentLoadResult.kt @@ -2,6 +2,6 @@ package ani.dantotsu.addons.torrent import ani.dantotsu.addons.LoadResult -open class TorrentLoadResult: LoadResult() { +open class TorrentLoadResult : LoadResult() { class Success(val extension: TorrentAddon.Installed) : TorrentLoadResult() } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/addons/torrent/TorrentService.kt b/app/src/main/java/ani/dantotsu/addons/torrent/TorrentService.kt index 6d7f1101..414df069 100644 --- a/app/src/main/java/ani/dantotsu/addons/torrent/TorrentService.kt +++ b/app/src/main/java/ani/dantotsu/addons/torrent/TorrentService.kt @@ -22,7 +22,7 @@ import uy.kohesive.injekt.api.get import kotlin.coroutines.EmptyCoroutineContext -class ServerService: Service() { +class ServerService : Service() { private val serviceScope = CoroutineScope(EmptyCoroutineContext) private val applicationContext = Injekt.get() private val extension = Injekt.get().extension!!.extension @@ -42,6 +42,7 @@ class ServerService: Service() { notification(applicationContext) return START_STICKY } + ACTION_STOP -> { stopServer() return START_NOT_STICKY @@ -109,7 +110,7 @@ class ServerService: Service() { const val ACTION_STOP = "stop_torrent_server" fun isRunning(): Boolean { - with (Injekt.get().getSystemService(ACTIVITY_SERVICE) as ActivityManager) { + with(Injekt.get().getSystemService(ACTIVITY_SERVICE) as ActivityManager) { @Suppress("DEPRECATION") // We only need our services getRunningServices(Int.MAX_VALUE).forEach { if (ServerService::class.java.name.equals(it.service.className)) { 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 188565b5..0f92966b 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 @@ -7,9 +7,9 @@ import androidx.core.content.ContextCompat import androidx.media3.common.util.UnstableApi import androidx.media3.database.StandaloneDatabaseProvider import ani.dantotsu.addons.download.DownloadAddonManager +import ani.dantotsu.addons.torrent.TorrentAddonManager import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.download.DownloadsManager -import ani.dantotsu.addons.torrent.TorrentAddonManager import ani.dantotsu.media.manga.MangaCache import ani.dantotsu.parsers.novel.NovelExtensionManager import eu.kanade.domain.base.BasePreferences 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 d6638cff..bddedf3f 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -1188,7 +1188,7 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: suspend fun recentlyUpdated( greater: Long = 0, lesser: Long = System.currentTimeMillis() / 1000 - 10000 - ): MutableList? { + ): MutableList { suspend fun execute(page: Int = 1): Page? { val query = """{ Page(page:$page,perPage:50) { 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 b7d1cf0c..1288cff9 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 @@ -84,9 +84,9 @@ data class Notification( @SerialName("createdAt") val createdAt: Int, @SerialName("media") - val media: ani.dantotsu.connections.anilist.api.Media? = null, + val media: Media? = null, @SerialName("user") - val user: ani.dantotsu.connections.anilist.api.User? = null, + val user: User? = null, @SerialName("message") val message: MessageActivity? = null, @SerialName("activity") 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 1e036eab..ce8acb7a 100644 --- a/app/src/main/java/ani/dantotsu/download/novel/NovelDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/novel/NovelDownloaderService.kt @@ -355,7 +355,7 @@ class NovelDownloaderService : Service() { private fun saveMediaInfo(task: DownloadTask) { launchIO { val directory = - DownloadsManager.getSubDirectory( + getSubDirectory( this@NovelDownloaderService, MediaType.NOVEL, false, diff --git a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt index 9861113a..862c08c3 100644 --- a/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/AnimePageAdapter.kt @@ -101,7 +101,7 @@ class AnimePageAdapter : RecyclerView.Adapter 0) View.VISIBLE else View.GONE + trendingBinding.notificationCount.visibility = + if (Anilist.unreadNotificationCount > 0) View.VISIBLE else View.GONE trendingBinding.notificationCount.text = Anilist.unreadNotificationCount.toString() listOf( @@ -167,7 +168,8 @@ class AnimePageAdapter : RecyclerView.Adapter 0 binding.homeNotificationCount.text = Anilist.unreadNotificationCount.toString() @@ -128,7 +131,7 @@ class HomeFragment : Fragment() { it.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) ContextCompat.startActivity( requireContext(), Intent(requireContext(), ProfileActivity::class.java) - .putExtra("userId", Anilist.userid),null + .putExtra("userId", Anilist.userid), null ) false } @@ -376,6 +379,7 @@ class HomeFragment : Fragment() { } } } + override fun onResume() { if (!model.loaded) Refresh.activity[1]!!.postValue(true) if (_binding != null) { diff --git a/app/src/main/java/ani/dantotsu/home/MangaFragment.kt b/app/src/main/java/ani/dantotsu/home/MangaFragment.kt index 17c4dec8..e2801817 100644 --- a/app/src/main/java/ani/dantotsu/home/MangaFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/MangaFragment.kt @@ -172,7 +172,13 @@ class MangaFragment : Fragment() { } model.getPopularManhwa().observe(viewLifecycleOwner) { if (it != null) { - mangaPageAdapter.updateTrendingManhwa(MediaAdaptor(0, it, requireActivity())) + mangaPageAdapter.updateTrendingManhwa( + MediaAdaptor( + 0, + it, + requireActivity() + ) + ) } } model.getTopRated().observe(viewLifecycleOwner) { diff --git a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt index 27f4c8ea..4fe604d6 100644 --- a/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt +++ b/app/src/main/java/ani/dantotsu/home/MangaPageAdapter.kt @@ -101,7 +101,7 @@ class MangaPageAdapter : RecyclerView.Adapter currActivity()!!.getString(R.string.male) - currActivity()!!.getString(R.string.female) -> currActivity()!!.getString(R.string.female) - else -> character.gender - } else "") + "\n" + character.description + currActivity()!!.getString(R.string.male) -> currActivity()!!.getString( + R.string.male + ) + + currActivity()!!.getString(R.string.female) -> currActivity()!!.getString( + R.string.female + ) + + else -> character.gender + } else "") + "\n" + character.description binding.characterDesc.isTextSelectable val markWon = Markwon.builder(activity).usePlugin(SoftBreakAddsNewLinePlugin.create()) diff --git a/app/src/main/java/ani/dantotsu/media/Media.kt b/app/src/main/java/ani/dantotsu/media/Media.kt index 7f2150c9..92847073 100644 --- a/app/src/main/java/ani/dantotsu/media/Media.kt +++ b/app/src/main/java/ani/dantotsu/media/Media.kt @@ -100,7 +100,7 @@ data class Media( startDate = apiMedia.startDate, endDate = apiMedia.endDate, favourites = apiMedia.favourites, - timeUntilAiring = apiMedia.nextAiringEpisode?.timeUntilAiring?.let { it.toLong() * 1000}, + timeUntilAiring = apiMedia.nextAiringEpisode?.timeUntilAiring?.let { it.toLong() * 1000 }, anime = if (apiMedia.type == MediaType.ANIME) Anime( totalEpisodes = apiMedia.episodes, nextAiringEpisode = apiMedia.nextAiringEpisode?.episode?.minus(1) @@ -115,7 +115,8 @@ data class Media( this.userScore = mediaList.score?.toInt() ?: 0 this.userStatus = mediaList.status?.toString() this.userUpdatedAt = mediaList.updatedAt?.toLong() - this.genres = mediaList.media?.genres?.toMutableList() as? ArrayList? ?: arrayListOf() + this.genres = + mediaList.media?.genres?.toMutableList() as? ArrayList? ?: arrayListOf() } constructor(mediaEdge: MediaEdge) : this(mediaEdge.node!!) { diff --git a/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt b/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt index 8fa4e1fa..d31473c6 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaAdaptor.kt @@ -149,14 +149,22 @@ class MediaAdaptor( (if (media.userScore != 0) R.drawable.item_user_score else R.drawable.item_score) ) if (media.anime != null) { - val itemTotal = " " + if ((media.anime.totalEpisodes ?: 0) != 1) currActivity()!!.getString(R.string.episode_plural) else currActivity()!!.getString(R.string.episode_singular) + val itemTotal = " " + if ((media.anime.totalEpisodes + ?: 0) != 1 + ) currActivity()!!.getString(R.string.episode_plural) else currActivity()!!.getString( + R.string.episode_singular + ) b.itemTotal.text = itemTotal b.itemCompactTotal.text = if (media.anime.nextAiringEpisode != null) (media.anime.nextAiringEpisode.toString() + " / " + (media.anime.totalEpisodes ?: "??").toString()) else (media.anime.totalEpisodes ?: "??").toString() } else if (media.manga != null) { - val itemTotal = " " + if ((media.manga.totalChapters ?: 0) != 1) currActivity()!!.getString(R.string.chapter_plural) else currActivity()!!.getString(R.string.chapter_singular) + val itemTotal = " " + if ((media.manga.totalChapters + ?: 0) != 1 + ) currActivity()!!.getString(R.string.chapter_plural) else currActivity()!!.getString( + R.string.chapter_singular + ) b.itemTotal.text = itemTotal b.itemCompactTotal.text = "${media.manga.totalChapters ?: "??"}" } @@ -183,7 +191,10 @@ class MediaAdaptor( AccelerateDecelerateInterpolator() ) ) - blurImage(if (bannerAnimations) b.itemCompactBanner else b.itemCompactBannerNoKen , media.banner ?: media.cover) + blurImage( + if (bannerAnimations) b.itemCompactBanner else b.itemCompactBannerNoKen, + media.banner ?: media.cover + ) b.itemCompactOngoing.isVisible = media.status == currActivity()!!.getString(R.string.status_releasing) b.itemCompactTitle.text = media.userPreferredName @@ -232,7 +243,10 @@ class MediaAdaptor( AccelerateDecelerateInterpolator() ) ) - blurImage(if (bannerAnimations) b.itemCompactBanner else b.itemCompactBannerNoKen , media.banner ?: media.cover) + blurImage( + if (bannerAnimations) b.itemCompactBanner else b.itemCompactBannerNoKen, + media.banner ?: media.cover + ) b.itemCompactOngoing.isVisible = media.status == currActivity()!!.getString(R.string.status_releasing) b.itemCompactTitle.text = media.userPreferredName diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index 4f93cdde..a490721d 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -109,7 +109,9 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi // Ui init initActivity(this) - binding.mediaViewPager.updateLayoutParams { bottomMargin = navBarHeight } + binding.mediaViewPager.updateLayoutParams { + bottomMargin = navBarHeight + } val oldMargin = binding.mediaViewPager.marginBottom AndroidBug5497Workaround.assistActivity(this) { if (it) { @@ -125,9 +127,11 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi } } val navBarRightMargin = if (resources.configuration.orientation == - Configuration.ORIENTATION_LANDSCAPE) navBarHeight else 0 + Configuration.ORIENTATION_LANDSCAPE + ) navBarHeight else 0 val navBarBottomMargin = if (resources.configuration.orientation == - Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight + Configuration.ORIENTATION_LANDSCAPE + ) 0 else navBarHeight navBar.updateLayoutParams { rightMargin = navBarRightMargin bottomMargin = navBarBottomMargin @@ -345,7 +349,13 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi adult = media.isAdult if (media.anime != null) { viewPager.adapter = - ViewPagerAdapter(supportFragmentManager, lifecycle, SupportedMedia.ANIME, media, intent.getIntExtra("commentId", -1)) + ViewPagerAdapter( + supportFragmentManager, + lifecycle, + SupportedMedia.ANIME, + media, + intent.getIntExtra("commentId", -1) + ) } else if (media.manga != null) { viewPager.adapter = ViewPagerAdapter( supportFragmentManager, @@ -368,7 +378,8 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi } else { navBar.createTab(R.drawable.ic_round_import_contacts_24, R.string.read, R.id.read) } - val commentTab = navBar.createTab(R.drawable.ic_round_comment_24, R.string.comments, R.id.comment) + val commentTab = + navBar.createTab(R.drawable.ic_round_comment_24, R.string.comments, R.id.comment) navBar.addTab(infoTab) navBar.addTab(watchTab) navBar.addTab(commentTab) @@ -412,10 +423,12 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) val rightMargin = if (resources.configuration.orientation == - Configuration.ORIENTATION_LANDSCAPE) navBarHeight else 0 + Configuration.ORIENTATION_LANDSCAPE + ) navBarHeight else 0 val bottomMargin = if (resources.configuration.orientation == - Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight - val params : ViewGroup.MarginLayoutParams = + Configuration.ORIENTATION_LANDSCAPE + ) 0 else navBarHeight + val params: ViewGroup.MarginLayoutParams = navBar.layoutParams as ViewGroup.MarginLayoutParams params.updateMargins(right = rightMargin, bottom = bottomMargin) } @@ -448,6 +461,7 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi SupportedMedia.MANGA -> MangaReadFragment() SupportedMedia.NOVEL -> NovelReadFragment() } + 2 -> { val fragment = CommentsFragment() val bundle = Bundle() diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt index 184f32bd..cfd9c736 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsViewModel.kt @@ -56,9 +56,11 @@ class MediaDetailsViewModel : ViewModel() { media.anime != null -> { AnimeSources.list.size - 1 } + media.format == "MANGA" || media.format == "ONE_SHOT" -> { MangaSources.list.size - 1 } + else -> { NovelSources.list.size - 1 } diff --git a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt index c9f365be..1a4a9050 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaInfoFragment.kt @@ -145,7 +145,8 @@ class MediaInfoFragment : Fragment() { } binding.mediaInfoDurationContainer.visibility = View.VISIBLE binding.mediaInfoSeasonContainer.visibility = View.VISIBLE - val seasonInfo = "${(media.anime.season ?: "??")} ${(media.anime.seasonYear ?: "??")}" + val seasonInfo = + "${(media.anime.season ?: "??")} ${(media.anime.seasonYear ?: "??")}" binding.mediaInfoSeason.text = seasonInfo if (media.anime.mainStudio != null) { @@ -182,9 +183,9 @@ class MediaInfoFragment : Fragment() { } binding.mediaInfoTotalTitle.setText(R.string.total_eps) val infoTotal = if (media.anime.nextAiringEpisode != null) - "${media.anime.nextAiringEpisode} | ${media.anime.totalEpisodes ?: "~"}" + "${media.anime.nextAiringEpisode} | ${media.anime.totalEpisodes ?: "~"}" else - (media.anime.totalEpisodes ?: "~").toString() + (media.anime.totalEpisodes ?: "~").toString() binding.mediaInfoTotal.text = infoTotal } else if (media.manga != null) { @@ -213,7 +214,8 @@ class MediaInfoFragment : Fragment() { (media.description ?: "null").replace("\\n", "
").replace("\\\"", "\""), HtmlCompat.FROM_HTML_MODE_LEGACY ) - val infoDesc = tripleTab + if (desc.toString() != "null") desc else getString(R.string.no_description_available) + val infoDesc = + tripleTab + if (desc.toString() != "null") desc else getString(R.string.no_description_available) binding.mediaInfoDescription.text = infoDesc binding.mediaInfoDescription.setOnClickListener { @@ -570,7 +572,7 @@ class MediaInfoFragment : Fragment() { parent.addView(root) } } - if(!media.users.isNullOrEmpty() && !offline){ + if (!media.users.isNullOrEmpty() && !offline) { ItemTitleRecyclerBinding.inflate( LayoutInflater.from(context), parent, diff --git a/app/src/main/java/ani/dantotsu/media/MediaSocialAdapter.kt b/app/src/main/java/ani/dantotsu/media/MediaSocialAdapter.kt index e8be5019..a32aa2ea 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaSocialAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaSocialAdapter.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.view.LayoutInflater import android.view.View diff --git a/app/src/main/java/ani/dantotsu/media/MediaType.kt b/app/src/main/java/ani/dantotsu/media/MediaType.kt index dde4e286..61cb2239 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaType.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaType.kt @@ -4,7 +4,7 @@ interface Type { fun asText(): String } -enum class MediaType: Type { +enum class MediaType : Type { ANIME, MANGA, NOVEL; @@ -18,18 +18,20 @@ enum class MediaType: Type { } companion object { - fun fromText(string : String): MediaType? { + fun fromText(string: String): MediaType? { return when (string) { "Anime" -> ANIME "Manga" -> MANGA "Novel" -> NOVEL - else -> { null } + else -> { + null + } } } } } -enum class AddonType: Type { +enum class AddonType : Type { TORRENT, DOWNLOAD; @@ -41,11 +43,13 @@ enum class AddonType: Type { } companion object { - fun fromText(string : String): AddonType? { + fun fromText(string: String): AddonType? { return when (string) { "Torrent" -> TORRENT "Download" -> DOWNLOAD - else -> { null } + else -> { + null + } } } } diff --git a/app/src/main/java/ani/dantotsu/media/SearchActivity.kt b/app/src/main/java/ani/dantotsu/media/SearchActivity.kt index fb685fe9..358c9700 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchActivity.kt @@ -78,8 +78,10 @@ class SearchActivity : AppCompatActivity() { source = intent.getStringExtra("source"), countryOfOrigin = intent.getStringExtra("country"), season = intent.getStringExtra("season"), - seasonYear = if (intent.getStringExtra("type") == "ANIME") intent.getStringExtra("seasonYear")?.toIntOrNull() else null, - startYear = if (intent.getStringExtra("type") == "MANGA") intent.getStringExtra("seasonYear")?.toIntOrNull() else null, + seasonYear = if (intent.getStringExtra("type") == "ANIME") intent.getStringExtra("seasonYear") + ?.toIntOrNull() else null, + startYear = if (intent.getStringExtra("type") == "MANGA") intent.getStringExtra("seasonYear") + ?.toIntOrNull() else null, results = mutableListOf(), hasNextPage = false ) diff --git a/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt b/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt index f04cee00..90778272 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchAdapter.kt @@ -13,7 +13,6 @@ import android.view.animation.AlphaAnimation import android.view.animation.Animation import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager -import android.widget.ImageView import android.widget.PopupMenu import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.content.res.AppCompatResources @@ -60,6 +59,7 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri } binding.filterTextView.setCompoundDrawablesWithIntrinsicBounds(filterDrawable, 0, 0, 0) } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchHeaderViewHolder { val binding = ItemSearchHeaderBinding.inflate(LayoutInflater.from(parent.context), parent, false) @@ -129,36 +129,42 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri activity.search() updateFilterTextViewDrawable() } + R.id.sort_by_popular -> { activity.result.sort = Anilist.sortBy[1] activity.updateChips.invoke() activity.search() updateFilterTextViewDrawable() } + R.id.sort_by_trending -> { activity.result.sort = Anilist.sortBy[2] activity.updateChips.invoke() activity.search() updateFilterTextViewDrawable() } + R.id.sort_by_recent -> { activity.result.sort = Anilist.sortBy[3] activity.updateChips.invoke() activity.search() updateFilterTextViewDrawable() } + R.id.sort_by_a_z -> { activity.result.sort = Anilist.sortBy[4] activity.updateChips.invoke() activity.search() updateFilterTextViewDrawable() } + R.id.sort_by_z_a -> { activity.result.sort = Anilist.sortBy[5] activity.updateChips.invoke() activity.search() updateFilterTextViewDrawable() } + R.id.sort_by_pure_pain -> { activity.result.sort = Anilist.sortBy[6] activity.updateChips.invoke() @@ -325,7 +331,10 @@ class SearchAdapter(private val activity: SearchActivity, private val type: Stri } - class SearchChipAdapter(val activity: SearchActivity, private val searchAdapter: SearchAdapter) : + class SearchChipAdapter( + val activity: SearchActivity, + private val searchAdapter: SearchAdapter + ) : RecyclerView.Adapter() { private var chips = activity.result.toChipList() diff --git a/app/src/main/java/ani/dantotsu/media/SearchFilterBottomDialog.kt b/app/src/main/java/ani/dantotsu/media/SearchFilterBottomDialog.kt index 53ee263f..6658532c 100644 --- a/app/src/main/java/ani/dantotsu/media/SearchFilterBottomDialog.kt +++ b/app/src/main/java/ani/dantotsu/media/SearchFilterBottomDialog.kt @@ -105,7 +105,8 @@ class SearchFilterBottomDialog : BottomSheetDialogFragment() { setSortByFilterImage() binding.resetSearchFilter.setOnClickListener { - val rotateAnimation = ObjectAnimator.ofFloat(binding.resetSearchFilter, "rotation", 180f, 540f) + val rotateAnimation = + ObjectAnimator.ofFloat(binding.resetSearchFilter, "rotation", 180f, 540f) rotateAnimation.duration = 500 rotateAnimation.interpolator = AccelerateDecelerateInterpolator() rotateAnimation.start() @@ -113,7 +114,8 @@ class SearchFilterBottomDialog : BottomSheetDialogFragment() { } binding.resetSearchFilter.setOnLongClickListener { - val rotateAnimation = ObjectAnimator.ofFloat(binding.resetSearchFilter, "rotation", 180f, 540f) + val rotateAnimation = + ObjectAnimator.ofFloat(binding.resetSearchFilter, "rotation", 180f, 540f) rotateAnimation.duration = 500 rotateAnimation.interpolator = AccelerateDecelerateInterpolator() rotateAnimation.start() @@ -125,8 +127,10 @@ class SearchFilterBottomDialog : BottomSheetDialogFragment() { CoroutineScope(Dispatchers.Main).launch { activity.result.apply { - status = binding.searchStatus.text.toString().replace(" ", "_").ifBlank { null } - source = binding.searchSource.text.toString().replace(" ", "_").ifBlank { null } + status = + binding.searchStatus.text.toString().replace(" ", "_").ifBlank { null } + source = + binding.searchSource.text.toString().replace(" ", "_").ifBlank { null } format = binding.searchFormat.text.toString().ifBlank { null } season = binding.searchSeason.text.toString().ifBlank { null } startYear = binding.searchYear.text.toString().toIntOrNull() @@ -206,21 +210,25 @@ class SearchFilterBottomDialog : BottomSheetDialogFragment() { binding.countryFilter.setImageResource(R.drawable.ic_round_globe_search_googlefonts) startBounceZoomAnimation(binding.countryFilter) } + R.id.country_china -> { activity.result.countryOfOrigin = "CN" binding.countryFilter.setImageResource(R.drawable.ic_round_globe_china_googlefonts) startBounceZoomAnimation(binding.countryFilter) } + R.id.country_south_korea -> { activity.result.countryOfOrigin = "KR" binding.countryFilter.setImageResource(R.drawable.ic_round_globe_south_korea_googlefonts) startBounceZoomAnimation(binding.countryFilter) } + R.id.country_japan -> { activity.result.countryOfOrigin = "JP" binding.countryFilter.setImageResource(R.drawable.ic_round_globe_japan_googlefonts) startBounceZoomAnimation(binding.countryFilter) } + R.id.country_taiwan -> { activity.result.countryOfOrigin = "TW" binding.countryFilter.setImageResource(R.drawable.ic_round_globe_taiwan_googlefonts) @@ -257,7 +265,8 @@ class SearchFilterBottomDialog : BottomSheetDialogFragment() { binding.searchFilterCancel.setOnClickListener { dismiss() } - val format = if (activity.result.type == "ANIME") Anilist.animeStatus else Anilist.mangaStatus + val format = + if (activity.result.type == "ANIME") Anilist.animeStatus else Anilist.mangaStatus binding.searchStatus.setText(activity.result.status?.replace("_", " ")) binding.searchStatus.setAdapter( ArrayAdapter( diff --git a/app/src/main/java/ani/dantotsu/media/SubtitleDownloader.kt b/app/src/main/java/ani/dantotsu/media/SubtitleDownloader.kt index 38affa0d..018b506b 100644 --- a/app/src/main/java/ani/dantotsu/media/SubtitleDownloader.kt +++ b/app/src/main/java/ani/dantotsu/media/SubtitleDownloader.kt @@ -12,7 +12,6 @@ import kotlinx.coroutines.withContext import okhttp3.Request import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -import java.io.File class SubtitleDownloader { 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 d5d11b9e..f3fc4fe7 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchAdapter.kt @@ -330,6 +330,7 @@ class AnimeWatchAdapter( 0 ) } + val chipText = "${names[limit * (position)]} - ${names[last - 1]}" chip.text = chipText chip.setTextColor( @@ -412,10 +413,12 @@ class AnimeWatchAdapter( if (ep.filler) binding.itemEpisodeFillerView.visibility = View.VISIBLE binding.animeSourceContinueText.text = - currActivity()!!.getString(R.string.continue_episode, ep.number, if (ep.filler) - currActivity()!!.getString(R.string.filler_tag) - else - "", cleanedTitle) + currActivity()!!.getString( + R.string.continue_episode, ep.number, if (ep.filler) + currActivity()!!.getString(R.string.filler_tag) + else + "", cleanedTitle + ) binding.animeSourceContinue.setOnClickListener { fragment.onEpisodeClick(continueEp) } @@ -441,11 +444,14 @@ class AnimeWatchAdapter( if (!sourceFound && PrefManager.getVal(PrefName.SearchSources) && autoSelect) { if (binding.animeSource.adapter.count > media.selected!!.sourceIndex + 1) { val nextIndex = media.selected!!.sourceIndex + 1 - binding.animeSource.setText(binding.animeSource.adapter - .getItem(nextIndex).toString(), false) + binding.animeSource.setText( + binding.animeSource.adapter + .getItem(nextIndex).toString(), false + ) fragment.onSourceChange(nextIndex).apply { binding.animeSourceTitle.text = showUserText - showUserTextListener = { MainScope().launch { binding.animeSourceTitle.text = it } } + showUserTextListener = + { MainScope().launch { binding.animeSourceTitle.text = it } } binding.animeSourceDubbed.isChecked = selectDub binding.animeSourceDubbedCont.isVisible = isDubAvailableSeparately() setLanguageList(0, nextIndex) 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 bbe0f908..830d47b0 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/AnimeWatchFragment.kt @@ -199,7 +199,8 @@ class AnimeWatchFragment : Fragment() { ConcatAdapter(headerAdapter, episodeAdapter) lifecycleScope.launch(Dispatchers.IO) { - val offline = !isOnline(binding.root.context) || PrefManager.getVal(PrefName.OfflineMode) + val offline = + !isOnline(binding.root.context) || PrefManager.getVal(PrefName.OfflineMode) if (offline) { media.selected!!.sourceIndex = model.watchSources!!.list.lastIndex } else { 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 1ab355c2..f570b6f4 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/ExoplayerView.kt @@ -486,12 +486,14 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL } rotation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE } + in 225..315 -> { if (rotation != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { exoRotate.visibility = View.VISIBLE } rotation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE } + in 315..360, in 0..45 -> { if (rotation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { exoRotate.visibility = View.VISIBLE @@ -1396,7 +1398,8 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL subClick() } } - val sub: MutableList = emptyList().toMutableList() + val sub: MutableList = + emptyList().toMutableList() ext.subtitles.forEach { subtitle -> val subtitleUrl = if (!hasExtSubtitles) video!!.file.url else subtitle.file.url //var localFile: String? = null @@ -1865,7 +1868,10 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL exoPlayer.seekTo((new.interval.endTime * 1000).toLong()) skippedTimeStamps.add(new) } - if (PrefManager.getVal(PrefName.AutoSkipRecap) && new.skipType == "recap" && !skippedTimeStamps.contains(new)) { + if (PrefManager.getVal(PrefName.AutoSkipRecap) && new.skipType == "recap" && !skippedTimeStamps.contains( + new + ) + ) { exoPlayer.seekTo((new.interval.endTime * 1000).toLong()) skippedTimeStamps.add(new) } @@ -1910,12 +1916,15 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL val audioTracks: ArrayList = arrayListOf() val subTracks: ArrayList = arrayListOf(dummyTrack) tracks.groups.forEach { - println("Track__: $it\nTrack__: ${it.length}\nTrack__: ${it.isSelected}\n" + - "Track__: ${it.type}\nTrack__: ${it.mediaTrackGroup.id}") + println( + "Track__: $it\nTrack__: ${it.length}\nTrack__: ${it.isSelected}\n" + + "Track__: ${it.type}\nTrack__: ${it.mediaTrackGroup.id}" + ) when (it.type) { TRACK_TYPE_AUDIO -> { if (it.isSupported(true)) audioTracks.add(it) } + TRACK_TYPE_TEXT -> { if (!hasExtSubtitles) { if (it.isSupported(true)) subTracks.add(it) @@ -1951,7 +1960,8 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL onSetTrackGroupOverride(dummyTrack, TRACK_TYPE_TEXT) } } - else -> { } + + else -> {} } } } @@ -1966,6 +1976,7 @@ class ExoplayerView : AppCompatActivity(), Player.Listener, SessionAvailabilityL isPlayerPlaying = true sourceClick() } + else -> { toast("Player Error ${error.errorCode} (${error.errorCodeName}) : ${error.message}") Injekt.get().logException(error) 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 59e22c4b..063be62e 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/SelectorDialogFragment.kt @@ -24,6 +24,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import ani.dantotsu.BottomSheetDialogFragment import ani.dantotsu.R +import ani.dantotsu.addons.torrent.TorrentAddonManager import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.copyToClipboard import ani.dantotsu.currActivity @@ -32,7 +33,6 @@ import ani.dantotsu.databinding.ItemStreamBinding import ani.dantotsu.databinding.ItemUrlBinding import ani.dantotsu.download.DownloadedType import ani.dantotsu.download.video.Helper -import ani.dantotsu.addons.torrent.TorrentAddonManager import ani.dantotsu.hideSystemBars import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsViewModel @@ -233,11 +233,12 @@ class SelectorDialogFragment : BottomSheetDialogFragment() { } private val externalPlayerResult = registerForActivityResult( - ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + ActivityResultContracts.StartActivityForResult() + ) { result: ActivityResult -> Logger.log(result.data.toString()) } - private fun exportMagnetIntent(episode: Episode, video: Video) : Intent { + private fun exportMagnetIntent(episode: Episode, video: Video): Intent { val amnis = "com.amnis" return Intent(Intent.ACTION_VIEW).apply { component = ComponentName(amnis, "$amnis.gui.player.PlayerActivity") @@ -445,7 +446,11 @@ class SelectorDialogFragment : BottomSheetDialogFragment() { SubtitleDownloader.downloadSubtitle( requireContext(), subtitleToDownload!!.file.url, - DownloadedType(media!!.mainName(), media!!.anime!!.episodes!![media!!.anime!!.selectedEpisode!!]!!.number, MediaType.ANIME) + DownloadedType( + media!!.mainName(), + media!!.anime!!.episodes!![media!!.anime!!.selectedEpisode!!]!!.number, + MediaType.ANIME + ) ) } } @@ -477,7 +482,7 @@ class SelectorDialogFragment : BottomSheetDialogFragment() { if (extractor.videos.size > episode.selectedVideo) extractor.videos[episode.selectedVideo] else null val subtitleNames = subtitles.map { it.language } var subtitleToDownload: Subtitle? = null - val activity = currActivity()?:requireActivity() + val activity = currActivity() ?: requireActivity() if (subtitles.isNotEmpty()) { val alertDialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle("Download Subtitle") @@ -551,9 +556,13 @@ class SelectorDialogFragment : BottomSheetDialogFragment() { if (video.format == VideoType.CONTAINER) { binding.urlSize.isVisible = video.size != null // if video size is null or 0, show "Unknown Size" else show the size in MB - val sizeText = getString(R.string.mb_size, "${if (video.extraNote != null) " : " else ""}${ - if (video.size == 0.0) getString(R.string.size_unknown) else DecimalFormat("#.##").format(video.size ?: 0) - }") + val sizeText = getString( + R.string.mb_size, "${if (video.extraNote != null) " : " else ""}${ + if (video.size == 0.0) getString(R.string.size_unknown) else DecimalFormat("#.##").format( + video.size ?: 0 + ) + }" + ) binding.urlSize.text = sizeText } binding.urlNote.visibility = View.VISIBLE 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 a268237e..c17b286c 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/SubtitleDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/SubtitleDialogFragment.kt @@ -67,7 +67,11 @@ class SubtitleDialogFragment : BottomSheetDialogFragment() { binding.subtitleTitle.setText(R.string.none) model.getMedia().observe(viewLifecycleOwner) { media -> val mediaID: Int = media.id - val selSubs = PrefManager.getNullableCustomVal("subLang_${mediaID}", null, String::class.java) + val selSubs = PrefManager.getNullableCustomVal( + "subLang_${mediaID}", + null, + String::class.java + ) if (episode.selectedSubtitle != null && selSubs != "None") { binding.root.setCardBackgroundColor(TRANSPARENT) } @@ -107,7 +111,11 @@ class SubtitleDialogFragment : BottomSheetDialogFragment() { model.getMedia().observe(viewLifecycleOwner) { media -> val mediaID: Int = media.id val selSubs: String? = - PrefManager.getNullableCustomVal("subLang_${mediaID}", null, String::class.java) + PrefManager.getNullableCustomVal( + "subLang_${mediaID}", + null, + String::class.java + ) if (episode.selectedSubtitle != position - 1 && selSubs != subtitles[position - 1].language) { binding.root.setCardBackgroundColor(TRANSPARENT) } diff --git a/app/src/main/java/ani/dantotsu/media/anime/TrackGroupDialogFragment.kt b/app/src/main/java/ani/dantotsu/media/anime/TrackGroupDialogFragment.kt index c3aa729a..3ea86097 100644 --- a/app/src/main/java/ani/dantotsu/media/anime/TrackGroupDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/anime/TrackGroupDialogFragment.kt @@ -5,7 +5,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.annotation.OptIn -import androidx.core.view.isVisible import androidx.media3.common.C.TRACK_TYPE_AUDIO import androidx.media3.common.C.TrackType import androidx.media3.common.Tracks @@ -20,7 +19,7 @@ import java.util.Locale @OptIn(UnstableApi::class) class TrackGroupDialogFragment( - instance: ExoplayerView, trackGroups: ArrayList, type : @TrackType Int + instance: ExoplayerView, trackGroups: ArrayList, type: @TrackType Int ) : BottomSheetDialogFragment() { private var _binding: BottomSheetSubtitlesBinding? = null private val binding get() = _binding!! @@ -70,21 +69,28 @@ class TrackGroupDialogFragment( trackGroups[position].let { trackGroup -> when (val language = trackGroup.getTrackFormat(0).language?.lowercase()) { null -> { - binding.subtitleTitle.text = getString(R.string.unknown_track, "Track $position") + binding.subtitleTitle.text = + getString(R.string.unknown_track, "Track $position") } + "none" -> { binding.subtitleTitle.text = getString(R.string.disabled_track) } + else -> { val locale = if (language.contains("-")) { val parts = language.split("-") try { Locale(parts[0], parts[1]) - } catch (ignored: Exception) { null } + } catch (ignored: Exception) { + null + } } else { try { Locale(language) - } catch (ignored: Exception) { null } + } catch (ignored: Exception) { + null + } } binding.subtitleTitle.text = locale?.let { "[${it.language}] ${it.displayName}" 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 5e4596ed..eea9a6b6 100644 --- a/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt +++ b/app/src/main/java/ani/dantotsu/media/comments/CommentItem.kt @@ -60,7 +60,8 @@ class CommentItem( override fun bind(viewBinding: ItemCommentsBinding, position: Int) { binding = viewBinding setAnimation(binding.root.context, binding.root) - viewBinding.commentRepliesList.layoutManager = LinearLayoutManager(commentsFragment.activity) + viewBinding.commentRepliesList.layoutManager = + LinearLayoutManager(commentsFragment.activity) viewBinding.commentRepliesList.adapter = adapter val isUserComment = CommentsAPI.userId == comment.userId val levelColor = getAvatarColor(comment.totalVotes, backgroundColor) @@ -112,16 +113,20 @@ class CommentItem( viewBinding.commentUserName.setOnClickListener { ContextCompat.startActivity( - commentsFragment.activity, Intent(commentsFragment.activity, ProfileActivity::class.java) + commentsFragment.activity, + Intent(commentsFragment.activity, ProfileActivity::class.java) .putExtra("userId", comment.userId.toInt()) - .putExtra("userLVL","[${levelColor.second}]"), null + .putExtra("userLVL", "[${levelColor.second}]"), + null ) } viewBinding.commentUserAvatar.setOnClickListener { ContextCompat.startActivity( - commentsFragment.activity, Intent(commentsFragment.activity, ProfileActivity::class.java) + commentsFragment.activity, + Intent(commentsFragment.activity, ProfileActivity::class.java) .putExtra("userId", comment.userId.toInt()) - .putExtra("userLVL","[${levelColor.second}]"), null + .putExtra("userLVL", "[${levelColor.second}]"), + null ) } viewBinding.commentText.setOnLongClickListener { @@ -143,8 +148,10 @@ class CommentItem( viewBinding.commentInfo.setOnClickListener { val popup = PopupMenu(commentsFragment.requireContext(), viewBinding.commentInfo) popup.menuInflater.inflate(R.menu.profile_details_menu, popup.menu) - popup.menu.findItem(R.id.commentDelete)?.isVisible = isUserComment || CommentsAPI.isAdmin || CommentsAPI.isMod - popup.menu.findItem(R.id.commentBanUser)?.isVisible = (CommentsAPI.isAdmin || CommentsAPI.isMod) && !isUserComment + popup.menu.findItem(R.id.commentDelete)?.isVisible = + isUserComment || CommentsAPI.isAdmin || CommentsAPI.isMod + popup.menu.findItem(R.id.commentBanUser)?.isVisible = + (CommentsAPI.isAdmin || CommentsAPI.isMod) && !isUserComment popup.menu.findItem(R.id.commentReport)?.isVisible = !isUserComment popup.setOnMenuItemClickListener { item -> when (item.itemId) { @@ -273,12 +280,16 @@ class CommentItem( } fun replying(isReplying: Boolean) { - binding.commentReply.text = if (isReplying) commentsFragment.activity.getString(R.string.cancel) else "Reply" + binding.commentReply.text = + if (isReplying) commentsFragment.activity.getString(R.string.cancel) else "Reply" this.isReplying = isReplying } fun editing(isEditing: Boolean) { - binding.commentEdit.text = if (isEditing) commentsFragment.activity.getString(R.string.cancel) else commentsFragment.activity.getString(R.string.edit) + binding.commentEdit.text = + if (isEditing) commentsFragment.activity.getString(R.string.cancel) else commentsFragment.activity.getString( + R.string.edit + ) this.isEditing = isEditing } @@ -286,7 +297,7 @@ class CommentItem( subCommentIds.add(id) } - private fun removeSubCommentIds(){ + private fun removeSubCommentIds() { subCommentIds.forEach { id -> @Suppress("UNCHECKED_CAST") val parentComments = parentSection.groups as? List ?: emptyList() @@ -306,11 +317,13 @@ class CommentItem( viewBinding.commentUpVote.alpha = 1f viewBinding.commentDownVote.setImageResource(R.drawable.ic_round_upvote_inactive_24) } + -1 -> { viewBinding.commentUpVote.setImageResource(R.drawable.ic_round_upvote_inactive_24) viewBinding.commentDownVote.setImageResource(R.drawable.ic_round_upvote_active_24) viewBinding.commentDownVote.alpha = 1f } + else -> { viewBinding.commentUpVote.setImageResource(R.drawable.ic_round_upvote_inactive_24) viewBinding.commentDownVote.setImageResource(R.drawable.ic_round_upvote_inactive_24) @@ -355,7 +368,8 @@ class CommentItem( private fun getAvatarColor(voteCount: Int, backgroundColor: Int): Pair { val level = if (voteCount < 0) 0 else sqrt(abs(voteCount.toDouble()) / 0.8).toInt() - val colorString = if (level > usernameColors.size - 1) usernameColors[usernameColors.size - 1] else usernameColors[level] + val colorString = + if (level > usernameColors.size - 1) usernameColors[usernameColors.size - 1] else usernameColors[level] var color = Color.parseColor(colorString) val ratio = getContrastRatio(color, backgroundColor) if (ratio < 4.5) { @@ -373,16 +387,17 @@ class CommentItem( * @param callback the callback to call when the user clicks yes */ private fun dialogBuilder(title: String, message: String, callback: () -> Unit) { - val alertDialog = android.app.AlertDialog.Builder(commentsFragment.activity, R.style.MyPopup) - .setTitle(title) - .setMessage(message) - .setPositiveButton("Yes") { dialog, _ -> - callback() - dialog.dismiss() - } - .setNegativeButton("No") { dialog, _ -> - dialog.dismiss() - } + val alertDialog = + android.app.AlertDialog.Builder(commentsFragment.activity, R.style.MyPopup) + .setTitle(title) + .setMessage(message) + .setPositiveButton("Yes") { dialog, _ -> + callback() + dialog.dismiss() + } + .setNegativeButton("No") { dialog, _ -> + dialog.dismiss() + } val dialog = alertDialog.show() dialog?.window?.setDimAmount(0.8f) } 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 fec27104..7f4e77b4 100644 --- a/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt @@ -75,7 +75,10 @@ class CommentsFragment : Fragment() { super.onViewCreated(view, savedInstanceState) activity = requireActivity() as MediaDetailsActivity - binding.commentsListContainer.setBaseline(activity.navBar, activity.binding.commentInputLayout) + binding.commentsListContainer.setBaseline( + activity.navBar, + activity.binding.commentInputLayout + ) //get the media id from the intent val mediaId = arguments?.getInt("mediaId") ?: -1 @@ -301,7 +304,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, _ -> @@ -577,7 +580,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/MangaChapterAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt index 393d87b9..b4eee30e 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaChapterAdapter.kt @@ -343,6 +343,7 @@ class MangaChapterAdapter( fun updateType(t: Int) { type = t } + private fun formatDate(timestamp: Long?): String { timestamp ?: return "" // Return empty string if timestamp is null @@ -366,6 +367,7 @@ class MangaChapterAdapter( else -> "Just now" } } + 1L -> "1 day ago" in 2..6 -> "$daysDifference days ago" else -> SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(targetDate) diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt index 353bc1c2..74cd38d5 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadAdapter.kt @@ -229,7 +229,7 @@ class MangaReadAdapter( refresh = true val intent = Intent(fragment.requireContext(), CookieCatcher::class.java) .putExtra("url", url) - ContextCompat.startActivity(fragment.requireContext(), intent, null) + startActivity(fragment.requireContext(), intent, null) } } } @@ -258,8 +258,10 @@ class MangaReadAdapter( dialogBinding.animeScanlatorContainer.isVisible = options.count() > 1 dialogBinding.scanlatorNo.text = "${options.count()}" dialogBinding.animeScanlatorTop.setOnClickListener { - val dialogView2 = LayoutInflater.from(currContext()).inflate(R.layout.custom_dialog_layout, null) - val checkboxContainer = dialogView2.findViewById(R.id.checkboxContainer) + val dialogView2 = + LayoutInflater.from(currContext()).inflate(R.layout.custom_dialog_layout, null) + val checkboxContainer = + dialogView2.findViewById(R.id.checkboxContainer) val tickAllButton = dialogView2.findViewById(R.id.toggleButton) // Function to get the right image resource for the toggle button @@ -441,7 +443,11 @@ class MangaReadAdapter( if (media.manga?.chapters != null) { val chapters = media.manga.chapters!!.keys.toTypedArray() val anilistEp = (media.userProgress ?: 0).plus(1) - val appEp = PrefManager.getNullableCustomVal("${media.id}_current_chp", null, String::class.java) + val appEp = PrefManager.getNullableCustomVal( + "${media.id}_current_chp", + null, + String::class.java + ) ?.toIntOrNull() ?: 1 var continueEp = (if (anilistEp > appEp) anilistEp else appEp).toString() val filteredChapters = chapters.filter { chapterKey -> @@ -470,7 +476,11 @@ class MangaReadAdapter( val ep = media.manga.chapters!![continueEp]!! binding.itemEpisodeImage.loadImage(media.banner ?: media.cover) binding.animeSourceContinueText.text = - currActivity()!!.getString(R.string.continue_chapter, ep.number, if (!ep.title.isNullOrEmpty()) ep.title else "") + currActivity()!!.getString( + R.string.continue_chapter, + ep.number, + if (!ep.title.isNullOrEmpty()) ep.title else "" + ) binding.animeSourceContinue.setOnClickListener { fragment.onMangaChapterClick(continueEp) } @@ -491,11 +501,14 @@ class MangaReadAdapter( if (!sourceFound && PrefManager.getVal(PrefName.SearchSources)) { if (binding.animeSource.adapter.count > media.selected!!.sourceIndex + 1) { val nextIndex = media.selected!!.sourceIndex + 1 - binding.animeSource.setText(binding.animeSource.adapter - .getItem(nextIndex).toString(), false) + binding.animeSource.setText( + binding.animeSource.adapter + .getItem(nextIndex).toString(), false + ) fragment.onSourceChange(nextIndex).apply { binding.animeSourceTitle.text = showUserText - showUserTextListener = { MainScope().launch { binding.animeSourceTitle.text = it } } + showUserTextListener = + { MainScope().launch { binding.animeSourceTitle.text = it } } setLanguageList(0, nextIndex) } subscribeButton(false) 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 9228a3f9..8e9bd757 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt @@ -42,8 +42,8 @@ import ani.dantotsu.isOnline import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.media.MediaDetailsViewModel -import ani.dantotsu.media.MediaType import ani.dantotsu.media.MediaNameAdapter +import ani.dantotsu.media.MediaType import ani.dantotsu.media.manga.mangareader.ChapterLoaderDialog import ani.dantotsu.navBarHeight import ani.dantotsu.notifications.subscription.SubscriptionHelper @@ -203,8 +203,10 @@ open class MangaReadFragment : Fragment(), ScanlatorSelectionListener { ConcatAdapter(headerAdapter, chapterAdapter) lifecycleScope.launch(Dispatchers.IO) { - val offline = !isOnline(binding.root.context) || PrefManager.getVal(PrefName.OfflineMode) - if (offline) media.selected!!.sourceIndex = model.mangaReadSources!!.list.lastIndex + val offline = + !isOnline(binding.root.context) || PrefManager.getVal(PrefName.OfflineMode) + if (offline) media.selected!!.sourceIndex = + model.mangaReadSources!!.list.lastIndex model.loadMangaChapters(media, media.selected!!.sourceIndex) } loaded = true 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 7b91d6f7..cd5fa2b8 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 @@ -42,7 +42,8 @@ abstract class BaseImageAdapter( override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { images = if (settings.layout == CurrentReaderSettings.Layouts.PAGED - && settings.direction == CurrentReaderSettings.Directions.BOTTOM_TO_TOP) { + && settings.direction == CurrentReaderSettings.Directions.BOTTOM_TO_TOP + ) { chapterImages.reversed() } else { chapterImages 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 5cd84736..af664426 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 @@ -56,8 +56,8 @@ import ani.dantotsu.isOnline import ani.dantotsu.logError import ani.dantotsu.media.Media import ani.dantotsu.media.MediaDetailsViewModel -import ani.dantotsu.media.MediaSingleton import ani.dantotsu.media.MediaNameAdapter +import ani.dantotsu.media.MediaSingleton import ani.dantotsu.media.manga.MangaCache import ani.dantotsu.media.manga.MangaChapter import ani.dantotsu.others.ImageViewDialog @@ -129,10 +129,12 @@ class MangaReaderActivity : AppCompatActivity() { var sliding = false var isAnimating = false - private val directionRLBT get() = defaultSettings.direction == RIGHT_TO_LEFT - || defaultSettings.direction == BOTTOM_TO_TOP - private val directionPagedBT get() = defaultSettings.layout == CurrentReaderSettings.Layouts.PAGED - && defaultSettings.direction == CurrentReaderSettings.Directions.BOTTOM_TO_TOP + private val directionRLBT + get() = defaultSettings.direction == RIGHT_TO_LEFT + || defaultSettings.direction == BOTTOM_TO_TOP + private val directionPagedBT + get() = defaultSettings.layout == CurrentReaderSettings.Layouts.PAGED + && defaultSettings.direction == CurrentReaderSettings.Directions.BOTTOM_TO_TOP override fun onAttachedToWindow() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !PrefManager.getVal(PrefName.ShowSystemBars)) { @@ -229,7 +231,7 @@ class MangaReaderActivity : AppCompatActivity() { binding.mangaReaderRecycler.scrollToPosition((value.toInt() - 1) / (dualPage { 2 } ?: 1)) else - if (defaultSettings.direction == CurrentReaderSettings.Directions.BOTTOM_TO_TOP ) { + if (defaultSettings.direction == CurrentReaderSettings.Directions.BOTTOM_TO_TOP) { binding.mangaReaderPager.currentItem = (maxChapterPage.toInt() - value.toInt()) / (dualPage { 2 } ?: 1) } else { @@ -345,7 +347,11 @@ class MangaReaderActivity : AppCompatActivity() { if (currentChapterIndex > 0) change(currentChapterIndex - 1) else snackString(getString(R.string.first_chapter)) } else { - if (chaptersArr.size > currentChapterIndex + 1) progress { change(currentChapterIndex + 1) } + if (chaptersArr.size > currentChapterIndex + 1) progress { + change( + currentChapterIndex + 1 + ) + } else snackString(getString(R.string.next_chapter_not_found)) } } @@ -355,7 +361,11 @@ class MangaReaderActivity : AppCompatActivity() { } binding.mangaReaderPreviousChapter.setOnClickListener { if (directionRLBT) { - if (chaptersArr.size > currentChapterIndex + 1) progress { change(currentChapterIndex + 1) } + if (chaptersArr.size > currentChapterIndex + 1) progress { + change( + currentChapterIndex + 1 + ) + } else snackString(getString(R.string.next_chapter_not_found)) } else { if (currentChapterIndex > 0) change(currentChapterIndex - 1) @@ -372,11 +382,15 @@ class MangaReaderActivity : AppCompatActivity() { currentChapterIndex = chaptersArr.indexOf(chap.number) binding.mangaReaderChapterSelect.setSelection(currentChapterIndex) if (directionRLBT) { - binding.mangaReaderNextChap.text = chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" - binding.mangaReaderPrevChap.text = chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: "" + binding.mangaReaderNextChap.text = + chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" + binding.mangaReaderPrevChap.text = + chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: "" } else { - binding.mangaReaderNextChap.text = chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: "" - binding.mangaReaderPrevChap.text = chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" + binding.mangaReaderNextChap.text = + chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: "" + binding.mangaReaderPrevChap.text = + chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" } applySettings() val context = this @@ -389,10 +403,12 @@ class MangaReaderActivity : AppCompatActivity() { "nothing" -> mutableListOf( RPC.Link(getString(R.string.view_manga), media.shareLink ?: ""), ) + "dantotsu" -> mutableListOf( RPC.Link(getString(R.string.view_manga), media.shareLink ?: ""), RPC.Link("Read on Dantotsu", getString(R.string.dantotsu)) ) + "anilist" -> { val userId = PrefManager.getVal(PrefName.AnilistUserId) val anilistLink = "https://anilist.co/user/$userId/" @@ -401,6 +417,7 @@ class MangaReaderActivity : AppCompatActivity() { RPC.Link("View My AniList", anilistLink) ) } + else -> mutableListOf() } val presence = RPC.createPresence( @@ -411,7 +428,12 @@ class MangaReaderActivity : AppCompatActivity() { details = chap.title?.takeIf { it.isNotEmpty() } ?: getString(R.string.chapter_num, chap.number), state = "${chap.number}/${media.manga?.totalChapters ?: "??"}", - largeImage = media.cover?.let { cover -> RPC.Link(media.userPreferredName, cover) }, + largeImage = media.cover?.let { cover -> + RPC.Link( + media.userPreferredName, + cover + ) + }, buttons = buttons ) ) @@ -918,7 +940,12 @@ class MangaReaderActivity : AppCompatActivity() { isAnimating = true ObjectAnimator.ofFloat(binding.mangaReaderCont, "alpha", 1f, 0f) .setDuration(controllerDuration).start() - ObjectAnimator.ofFloat(binding.mangaReaderBottomLayout, "translationY", 0f, 128f) + ObjectAnimator.ofFloat( + binding.mangaReaderBottomLayout, + "translationY", + 0f, + 128f + ) .apply { interpolator = overshoot;duration = controllerDuration;start() } ObjectAnimator.ofFloat(binding.mangaReaderTopLayout, "translationY", 0f, -128f) .apply { interpolator = overshoot;duration = controllerDuration;start() } 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 e13303bf..0b614564 100644 --- a/app/src/main/java/ani/dantotsu/media/novel/NovelReadFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/novel/NovelReadFragment.kt @@ -113,7 +113,12 @@ class NovelReadFragment : Fragment(), ) { try { val directory = - DownloadsManager.getSubDirectory(context?:currContext()!!, MediaType.NOVEL, false, novel.name) + DownloadsManager.getSubDirectory( + context ?: currContext()!!, + MediaType.NOVEL, + false, + novel.name + ) val file = directory?.findFile(novel.name) if (file?.exists() == false) return false val fileUri = file?.uri ?: return false 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 6633d75c..1f68b224 100644 --- a/app/src/main/java/ani/dantotsu/media/novel/NovelResponseAdapter.kt +++ b/app/src/main/java/ani/dantotsu/media/novel/NovelResponseAdapter.kt @@ -181,7 +181,7 @@ class NovelResponseAdapter( if (position != -1) { list[position].extra?.remove("0") list[position].extra?.set("0", "Downloading: $progress%") - Logger.log( "updateDownloadProgress: $progress, position: $position") + Logger.log("updateDownloadProgress: $progress, position: $position") notifyItemChanged(position) } } 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 7e21e14d..170980bc 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 @@ -292,7 +292,11 @@ class NovelReaderActivity : AppCompatActivity(), EbookReaderEventListener { applySettings() } - val cfi = PrefManager.getNullableCustomVal("${sanitizedBookId}_progress", null, String::class.java) + val cfi = PrefManager.getNullableCustomVal( + "${sanitizedBookId}_progress", + null, + String::class.java + ) cfi?.let { binding.bookReader.goto(it) } binding.progress.visibility = View.GONE 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 0d07d8ac..3fdae952 100644 --- a/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/user/ListActivity.kt @@ -70,8 +70,10 @@ class ListActivity : AppCompatActivity() { setContentView(binding.root) val anime = intent.getBooleanExtra("anime", true) - binding.listTitle.text = getString(R.string.user_list, intent.getStringExtra("username"), - if (anime) getString(R.string.anime) else getString(R.string.manga)) + binding.listTitle.text = getString( + R.string.user_list, intent.getStringExtra("username"), + if (anime) getString(R.string.anime) else getString(R.string.manga) + ) binding.listTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabSelected(tab: TabLayout.Tab?) { this@ListActivity.selectedTabIdx = tab?.position ?: 0 @@ -158,7 +160,8 @@ class ListActivity : AppCompatActivity() { } binding.filter.setOnClickListener { - val genres = PrefManager.getVal>(PrefName.GenresList).toMutableSet().sorted() + val genres = + PrefManager.getVal>(PrefName.GenresList).toMutableSet().sorted() val popup = PopupMenu(this, it) popup.menu.add("All") genres.forEach { genre -> diff --git a/app/src/main/java/ani/dantotsu/others/AndroidBug5497Workaround.kt b/app/src/main/java/ani/dantotsu/others/AndroidBug5497Workaround.kt index b25d10e2..dbe4e7d7 100644 --- a/app/src/main/java/ani/dantotsu/others/AndroidBug5497Workaround.kt +++ b/app/src/main/java/ani/dantotsu/others/AndroidBug5497Workaround.kt @@ -5,7 +5,10 @@ import android.graphics.Rect import android.view.View import android.widget.FrameLayout -class AndroidBug5497Workaround private constructor(activity: Activity, private val callback: (Boolean) -> Unit) { +class AndroidBug5497Workaround private constructor( + activity: Activity, + private val callback: (Boolean) -> Unit +) { private val mChildOfContent: View private var usableHeightPrevious = 0 private val frameLayoutParams: FrameLayout.LayoutParams diff --git a/app/src/main/java/ani/dantotsu/others/Download.kt b/app/src/main/java/ani/dantotsu/others/Download.kt index b80c941d..c25c12aa 100644 --- a/app/src/main/java/ani/dantotsu/others/Download.kt +++ b/app/src/main/java/ani/dantotsu/others/Download.kt @@ -1,6 +1,5 @@ package ani.dantotsu.others -import android.app.DownloadManager import android.content.ComponentName import android.content.Context import android.content.Intent @@ -8,7 +7,6 @@ import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.os.Environment -import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import ani.dantotsu.FileUrl import ani.dantotsu.R @@ -19,9 +17,6 @@ import ani.dantotsu.parsers.Book import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.toast -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch import java.io.File object Download { diff --git a/app/src/main/java/ani/dantotsu/others/Kitsu.kt b/app/src/main/java/ani/dantotsu/others/Kitsu.kt index f548fc31..958c1b46 100644 --- a/app/src/main/java/ani/dantotsu/others/Kitsu.kt +++ b/app/src/main/java/ani/dantotsu/others/Kitsu.kt @@ -2,10 +2,10 @@ package ani.dantotsu.others import ani.dantotsu.FileUrl import ani.dantotsu.client -import ani.dantotsu.util.Logger import ani.dantotsu.media.Media import ani.dantotsu.media.anime.Episode import ani.dantotsu.tryWithSuspend +import ani.dantotsu.util.Logger import com.google.gson.Gson import com.lagradost.nicehttp.NiceResponse import kotlinx.serialization.SerialName diff --git a/app/src/main/java/ani/dantotsu/others/OutlineTextView.kt b/app/src/main/java/ani/dantotsu/others/OutlineTextView.kt index 7a0cf925..105f34a7 100644 --- a/app/src/main/java/ani/dantotsu/others/OutlineTextView.kt +++ b/app/src/main/java/ani/dantotsu/others/OutlineTextView.kt @@ -56,9 +56,10 @@ class OutlineTextView : AppCompatTextView { setStrokeWidth(strokeWidth) } - private val Float.toPx get() = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics - ) + private val Float.toPx + get() = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics + ) private fun setStrokeWidth(width: Float) { strokeWidth = width.toPx diff --git a/app/src/main/java/ani/dantotsu/others/Xpandable.kt b/app/src/main/java/ani/dantotsu/others/Xpandable.kt index 53518b40..1c4fe3bf 100644 --- a/app/src/main/java/ani/dantotsu/others/Xpandable.kt +++ b/app/src/main/java/ani/dantotsu/others/Xpandable.kt @@ -50,7 +50,7 @@ class Xpandable @JvmOverloads constructor( } } postDelayed({ - listeners.forEach{ + listeners.forEach { it.onRetract() } }, 300) @@ -66,7 +66,7 @@ class Xpandable @JvmOverloads constructor( } } postDelayed({ - listeners.forEach{ + listeners.forEach { it.onExpand() } }, 300) 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 e9e171f8..5dffd4fa 100644 --- a/app/src/main/java/ani/dantotsu/others/webview/CookieCatcher.kt +++ b/app/src/main/java/ani/dantotsu/others/webview/CookieCatcher.kt @@ -24,7 +24,8 @@ class CookieCatcher : AppCompatActivity() { //get url from intent val url = intent.getStringExtra("url") ?: getString(R.string.cursed_yt) - val headers: Map = intent.getSerializableExtraCompat("headers") as? Map ?: emptyMap() + 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/OfflineAnimeParser.kt b/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt index 08f62446..2b00b1d3 100644 --- a/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt +++ b/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt @@ -5,8 +5,8 @@ import ani.dantotsu.currContext import ani.dantotsu.download.DownloadsManager import ani.dantotsu.download.DownloadsManager.Companion.getSubDirectory import ani.dantotsu.download.anime.AnimeDownloaderService.AnimeDownloadTask.Companion.getTaskName -import ani.dantotsu.media.MediaType import ani.dantotsu.media.MediaNameAdapter +import ani.dantotsu.media.MediaType import ani.dantotsu.tryWithSuspend import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.animesource.model.SAnime @@ -43,7 +43,7 @@ class OfflineAnimeParser : AnimeParser() { if (it.isDirectory) { val episode = Episode( it.name!!, - getTaskName(animeLink,it.name!!), + getTaskName(animeLink, it.name!!), it.name, null, null, diff --git a/app/src/main/java/ani/dantotsu/parsers/OfflineNovelParser.kt b/app/src/main/java/ani/dantotsu/parsers/OfflineNovelParser.kt index ff326b33..682e8af2 100644 --- a/app/src/main/java/ani/dantotsu/parsers/OfflineNovelParser.kt +++ b/app/src/main/java/ani/dantotsu/parsers/OfflineNovelParser.kt @@ -28,7 +28,7 @@ class OfflineNovelParser : NovelParser() { directory.listFiles().forEach { if (it.isDirectory) { val chapter = Book( - it.name?:"Unknown", + it.name ?: "Unknown", it.uri.toString(), null, listOf(it.uri.toString()) @@ -63,7 +63,7 @@ class OfflineNovelParser : NovelParser() { if (directory?.exists() == true) { directory.listFiles().forEach { if (it.isDirectory) { - names.add(it.name?: "Unknown") + names.add(it.name ?: "Unknown") } } } 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 809f4a5f..1b0a9ad3 100644 --- a/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstaller.kt +++ b/app/src/main/java/ani/dantotsu/parsers/novel/NovelExtensionInstaller.kt @@ -62,55 +62,57 @@ 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 = Observable.defer { - val pkgName = extension.pkgName + fun downloadAndInstall(url: String, extension: NovelExtension): Observable = + Observable.defer { + val pkgName = extension.pkgName - val oldDownload = activeDownloads[pkgName] - if (oldDownload != null) { - deleteDownload(pkgName) - } - - val sourcePath = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)?.absolutePath - //if the file is already downloaded, remove it - val fileToDelete = File("$sourcePath/${url.toUri().lastPathSegment}") - if (fileToDelete.exists()) { - if (fileToDelete.delete()) { - Logger.log("APK file deleted successfully.") - } else { - Logger.log("Failed to delete APK file.") + val oldDownload = activeDownloads[pkgName] + if (oldDownload != null) { + deleteDownload(pkgName) } - } else { - Logger.log("APK file not found.") + + val sourcePath = + context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)?.absolutePath + //if the file is already downloaded, remove it + val fileToDelete = File("$sourcePath/${url.toUri().lastPathSegment}") + if (fileToDelete.exists()) { + if (fileToDelete.delete()) { + Logger.log("APK file deleted successfully.") + } else { + Logger.log("Failed to delete APK file.") + } + } else { + Logger.log("APK file not found.") + } + + // Register the receiver after removing (and unregistering) the previous download + downloadReceiver.register() + + val downloadUri = url.toUri() + val request = DownloadManager.Request(downloadUri) + .setTitle(extension.name) + .setMimeType(APK_MIME) + .setDestinationInExternalFilesDir( + context, + Environment.DIRECTORY_DOWNLOADS, + downloadUri.lastPathSegment + ) + .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) + val id = downloadManager.enqueue(request) + activeDownloads[pkgName] = id + + downloadsRelay.filter { it.first == id } + .map { it.second } + // Poll download status + .mergeWith(pollStatus(id)) + // Stop when the application is installed or errors + .takeUntil { it.isCompleted() } + // Always notify on main thread + .observeOn(AndroidSchedulers.mainThread()) + // Always remove the download when unsubscribed + .doOnUnsubscribe { deleteDownload(pkgName) } } - // Register the receiver after removing (and unregistering) the previous download - downloadReceiver.register() - - val downloadUri = url.toUri() - val request = DownloadManager.Request(downloadUri) - .setTitle(extension.name) - .setMimeType(APK_MIME) - .setDestinationInExternalFilesDir( - context, - Environment.DIRECTORY_DOWNLOADS, - downloadUri.lastPathSegment - ) - .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) - val id = downloadManager.enqueue(request) - activeDownloads[pkgName] = id - - downloadsRelay.filter { it.first == id } - .map { it.second } - // Poll download status - .mergeWith(pollStatus(id)) - // Stop when the application is installed or errors - .takeUntil { it.isCompleted() } - // Always notify on main thread - .observeOn(AndroidSchedulers.mainThread()) - // Always remove the download when unsubscribed - .doOnUnsubscribe { deleteDownload(pkgName) } - } - /** * Returns an observable that polls the given download id for its status every second, as the * manager doesn't have any notification system. It'll stop once the download finishes. diff --git a/app/src/main/java/ani/dantotsu/profile/ChartItem.kt b/app/src/main/java/ani/dantotsu/profile/ChartItem.kt index 98b2889e..c7d6be0c 100644 --- a/app/src/main/java/ani/dantotsu/profile/ChartItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/ChartItem.kt @@ -15,7 +15,8 @@ import com.xwray.groupie.viewbinding.GroupieViewHolder class ChartItem( private val title: String, private val aaOptions: AAOptions, - private val activity: ProfileActivity): BindableItem() { + private val activity: ProfileActivity +) : BindableItem() { private lateinit var binding: ItemChartBinding override fun bind(viewBinding: ItemChartBinding, position: Int) { binding = viewBinding @@ -78,6 +79,7 @@ class ChartItem( viewHolder.setIsRecyclable(false) super.bind(viewHolder, position, payloads, onItemClickListener, onItemLongClickListener) } + override fun getViewType(): Int { return 0 } diff --git a/app/src/main/java/ani/dantotsu/profile/FollowActivity.kt b/app/src/main/java/ani/dantotsu/profile/FollowActivity.kt index 70368ea3..30d99b50 100644 --- a/app/src/main/java/ani/dantotsu/profile/FollowActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/FollowActivity.kt @@ -25,7 +25,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -class FollowActivity : AppCompatActivity(){ +class FollowActivity : AppCompatActivity() { private lateinit var binding: ActivityFollowBinding val adapter = GroupieAdapter() var users: List? = null @@ -37,7 +37,9 @@ class FollowActivity : AppCompatActivity(){ initActivity(this) binding = ActivityFollowBinding.inflate(layoutInflater) binding.listToolbar.updateLayoutParams { topMargin = statusBarHeight } - binding.listFrameLayout.updateLayoutParams { bottomMargin = navBarHeight } + binding.listFrameLayout.updateLayoutParams { + bottomMargin = navBarHeight + } setContentView(binding.root) val layoutType = PrefManager.getVal(PrefName.FollowerLayout) selected = getSelected(layoutType) @@ -54,7 +56,7 @@ class FollowActivity : AppCompatActivity(){ binding.listBack.setOnClickListener { finish() } val title = intent.getStringExtra("title") - val userID= intent.getIntExtra("userId", 0) + val userID = intent.getIntExtra("userId", 0) binding.listTitle.text = title lifecycleScope.launch(Dispatchers.IO) { @@ -93,9 +95,20 @@ class FollowActivity : AppCompatActivity(){ } users?.forEach { user -> if (getLayoutType(selected) == 0) { - adapter.add(FollowerItem(user.id, user.name ?: "Unknown", user.avatar?.medium, user.bannerImage ?: user.avatar?.medium ) { onUserClick(it) }) + adapter.add( + FollowerItem( + user.id, + user.name ?: "Unknown", + user.avatar?.medium, + user.bannerImage ?: user.avatar?.medium + ) { onUserClick(it) }) } else { - adapter.add(GridFollowerItem(user.id, user.name ?: "Unknown", user.avatar?.medium) { onUserClick(it) }) + adapter.add( + GridFollowerItem( + user.id, + user.name ?: "Unknown", + user.avatar?.medium + ) { onUserClick(it) }) } } } diff --git a/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt b/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt index 6312e3c5..9513c29e 100644 --- a/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/FollowerItem.kt @@ -14,7 +14,7 @@ class FollowerItem( private val avatar: String?, private val banner: String?, val clickCallback: (Int) -> Unit -): BindableItem() { +) : BindableItem() { private lateinit var binding: ItemFollowerBinding override fun bind(viewBinding: ItemFollowerBinding, position: Int) { diff --git a/app/src/main/java/ani/dantotsu/profile/GridFollowerItem.kt b/app/src/main/java/ani/dantotsu/profile/GridFollowerItem.kt index f6a61fa3..33d7e66b 100644 --- a/app/src/main/java/ani/dantotsu/profile/GridFollowerItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/GridFollowerItem.kt @@ -6,12 +6,12 @@ import ani.dantotsu.databinding.ItemFollowerGridBinding import ani.dantotsu.loadImage import com.xwray.groupie.viewbinding.BindableItem -class GridFollowerItem ( +class GridFollowerItem( private val id: Int, private val name: String, private val avatar: String?, val clickCallback: (Int) -> Unit -): BindableItem() { +) : BindableItem() { private lateinit var binding: ItemFollowerGridBinding override fun bind(viewBinding: ItemFollowerGridBinding, position: Int) { diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt index 571bc2a5..9e19a5f3 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt @@ -59,9 +59,11 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene screenWidth = resources.displayMetrics.widthPixels.toFloat() navBar = binding.profileNavBar val navBarRightMargin = if (resources.configuration.orientation == - Configuration.ORIENTATION_LANDSCAPE) navBarHeight else 0 + Configuration.ORIENTATION_LANDSCAPE + ) navBarHeight else 0 val navBarBottomMargin = if (resources.configuration.orientation == - Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight + Configuration.ORIENTATION_LANDSCAPE + ) 0 else navBarHeight navBar.updateLayoutParams { rightMargin = navBarRightMargin bottomMargin = navBarBottomMargin @@ -284,7 +286,7 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene if (mMaxScrollSize == 0) mMaxScrollSize = appBar.totalScrollRange val percentage = abs(i) * 100 / mMaxScrollSize - with (bindingProfileAppBar) { + with(bindingProfileAppBar) { profileUserAvatarContainer.visibility = if (profileUserAvatarContainer.scaleX == 0f) View.GONE else View.VISIBLE val duration = (200 * (PrefManager.getVal(PrefName.AnimationSpeed) as Float)).toLong() @@ -315,10 +317,12 @@ class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListene override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) val rightMargin = if (resources.configuration.orientation == - Configuration.ORIENTATION_LANDSCAPE) navBarHeight else 0 + Configuration.ORIENTATION_LANDSCAPE + ) navBarHeight else 0 val bottomMargin = if (resources.configuration.orientation == - Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight - val params : ViewGroup.MarginLayoutParams = + Configuration.ORIENTATION_LANDSCAPE + ) 0 else navBarHeight + val params: ViewGroup.MarginLayoutParams = navBar.layoutParams as ViewGroup.MarginLayoutParams params.updateMargins(right = rightMargin, bottom = bottomMargin) } diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt index f7a04944..1d4b8f72 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt @@ -1,8 +1,6 @@ package ani.dantotsu.profile -import android.content.Intent import android.os.Bundle -import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -22,19 +20,16 @@ import ani.dantotsu.R import ani.dantotsu.connections.anilist.ProfileViewModel import ani.dantotsu.connections.anilist.api.Query import ani.dantotsu.databinding.FragmentProfileBinding -import ani.dantotsu.loadImage import ani.dantotsu.media.Author import ani.dantotsu.media.AuthorAdapter import ani.dantotsu.media.Character import ani.dantotsu.media.CharacterAdapter import ani.dantotsu.media.Media import ani.dantotsu.media.MediaAdaptor -import ani.dantotsu.media.user.ListActivity import ani.dantotsu.setBaseline import ani.dantotsu.setSlideIn import ani.dantotsu.setSlideUp import ani.dantotsu.util.AniMarkdown.Companion.getFullAniHTML -import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.util.system.getSerializableCompat import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -137,7 +132,7 @@ class ProfileFragment : Fragment() { } user.favourites?.staff?.nodes?.forEach { i -> - favStaff.add(Author(i.id, i.name.full, i.image.large , "" )) + favStaff.add(Author(i.id, i.name.full, i.image.large, "")) } setFavPeople() @@ -159,7 +154,8 @@ class ProfileFragment : Fragment() { binding.profileFavStaffRecycler.layoutManager = LinearLayoutManager( activity, LinearLayoutManager.HORIZONTAL, false ) - binding.profileFavStaffRecycler.layoutAnimation = LayoutAnimationController(setSlideIn(), 0.25f) + binding.profileFavStaffRecycler.layoutAnimation = + LayoutAnimationController(setSlideIn(), 0.25f) } if (favCharacter.isEmpty()) { @@ -169,7 +165,8 @@ class ProfileFragment : Fragment() { binding.profileFavCharactersRecycler.layoutManager = LinearLayoutManager( activity, LinearLayoutManager.HORIZONTAL, false ) - binding.profileFavCharactersRecycler.layoutAnimation = LayoutAnimationController(setSlideIn(), 0.25f) + binding.profileFavCharactersRecycler.layoutAnimation = + LayoutAnimationController(setSlideIn(), 0.25f) } } @@ -189,7 +186,7 @@ class ProfileFragment : Fragment() { recyclerView.visibility = View.GONE if (it != null) { if (it.isNotEmpty()) { - recyclerView.adapter = MediaAdaptor(0, it, activity, fav=true) + recyclerView.adapter = MediaAdaptor(0, it, activity, fav = true) recyclerView.layoutManager = LinearLayoutManager( activity, LinearLayoutManager.HORIZONTAL, diff --git a/app/src/main/java/ani/dantotsu/profile/SingleStatActivity.kt b/app/src/main/java/ani/dantotsu/profile/SingleStatActivity.kt index 337d2c86..c038ec2c 100644 --- a/app/src/main/java/ani/dantotsu/profile/SingleStatActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/SingleStatActivity.kt @@ -10,8 +10,7 @@ import ani.dantotsu.themes.ThemeManager import ani.dantotsu.toast import com.github.aachartmodel.aainfographics.aachartcreator.AAOptions -class SingleStatActivity : AppCompatActivity() -{ +class SingleStatActivity : AppCompatActivity() { private lateinit var binding: ActivitySingleStatBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt b/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt index aaf0ed6f..52ba668b 100644 --- a/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt @@ -58,10 +58,13 @@ class StatsFragment : binding.statisticList.adapter = adapter binding.statisticList.recycledViewPool.setMaxRecycledViews(0, 0) binding.statisticList.isNestedScrollingEnabled = true - binding.statisticList.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) + binding.statisticList.layoutManager = + LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) binding.statisticProgressBar.visibility = View.VISIBLE binding.compare.visibility = if (user.id == Anilist.userid) View.GONE else View.VISIBLE - binding.filterContainer.updateLayoutParams { topMargin = statusBarHeight } + binding.filterContainer.updateLayoutParams { + topMargin = statusBarHeight + } binding.sourceType.setAdapter( ArrayAdapter( diff --git a/app/src/main/java/ani/dantotsu/profile/User.kt b/app/src/main/java/ani/dantotsu/profile/User.kt index 15814f44..a16c3329 100644 --- a/app/src/main/java/ani/dantotsu/profile/User.kt +++ b/app/src/main/java/ani/dantotsu/profile/User.kt @@ -12,8 +12,8 @@ data class User( val status: String? = null, val score: Float? = null, val progress: Int? = null, - val totalEpisodes : Int? = null, - val nextAiringEpisode : Int? = null, + val totalEpisodes: Int? = null, + val nextAiringEpisode: Int? = null, ) : java.io.Serializable { companion object { private const val serialVersionUID: Long = 1 diff --git a/app/src/main/java/ani/dantotsu/profile/UsersAdapter.kt b/app/src/main/java/ani/dantotsu/profile/UsersAdapter.kt index 9b4d23a1..90363e76 100644 --- a/app/src/main/java/ani/dantotsu/profile/UsersAdapter.kt +++ b/app/src/main/java/ani/dantotsu/profile/UsersAdapter.kt @@ -5,13 +5,13 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView -import ani.dantotsu.blurImage import ani.dantotsu.databinding.ItemFollowerBinding import ani.dantotsu.loadImage import ani.dantotsu.setAnimation -class UsersAdapter(private val user: ArrayList) : RecyclerView.Adapter() { +class UsersAdapter(private val user: ArrayList) : + RecyclerView.Adapter() { inner class UsersViewHolder(val binding: ItemFollowerBinding) : RecyclerView.ViewHolder(binding.root) { diff --git a/app/src/main/java/ani/dantotsu/profile/UsersDialogFragment.kt b/app/src/main/java/ani/dantotsu/profile/UsersDialogFragment.kt index f9e17321..01284d1f 100644 --- a/app/src/main/java/ani/dantotsu/profile/UsersDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/UsersDialogFragment.kt @@ -14,9 +14,10 @@ class UsersDialogFragment : BottomSheetDialogFragment() { private val binding get() = _binding!! private var userList = arrayListOf() - fun userList(user: ArrayList){ + fun userList(user: ArrayList) { userList = user } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -25,6 +26,7 @@ class UsersDialogFragment : BottomSheetDialogFragment() { _binding = BottomSheetUsersBinding.inflate(inflater, container, false) return binding.root } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) 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 0f9ed865..983fdca8 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt @@ -1,6 +1,5 @@ package ani.dantotsu.profile.activity -import android.annotation.SuppressLint import android.view.View import androidx.core.content.ContextCompat import androidx.core.view.isVisible @@ -18,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 @@ -108,11 +102,12 @@ class ActivityItem( } val context = binding.root.context val userList = arrayListOf() - activity.likes?.forEach{ i -> + activity.likes?.forEach { i -> userList.add(User(i.id, i.name.toString(), i.avatar?.medium, i.bannerImage)) } - binding.activityLike.setOnLongClickListener{ - UsersDialogFragment().apply { userList(userList) + binding.activityLike.setOnLongClickListener { + UsersDialogFragment().apply { + userList(userList) show(fragActivity.supportFragmentManager, "dialog") } true @@ -126,8 +121,10 @@ class ActivityItem( binding.activityContent.visibility = View.GONE binding.activityBannerContainer.visibility = View.VISIBLE binding.activityMediaName.text = activity.media?.title?.userPreferred - val activityText = "${activity.user!!.name} ${activity.status} ${activity.progress - ?: activity.media?.title?.userPreferred}" + val activityText = "${activity.user!!.name} ${activity.status} ${ + activity.progress + ?: activity.media?.title?.userPreferred + }" binding.activityText.text = activityText binding.activityCover.loadImage(cover) blurImage(binding.activityBannerImage, banner ?: cover) diff --git a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItemBuilder.kt b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItemBuilder.kt index ef50027e..3e2289a2 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItemBuilder.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItemBuilder.kt @@ -5,6 +5,7 @@ import ani.dantotsu.connections.anilist.api.NotificationType import java.text.SimpleDateFormat import java.util.Date import java.util.Locale + class ActivityItemBuilder { companion object { @@ -109,6 +110,7 @@ class ActivityItemBuilder { else -> "Just now" } } + 1L -> "1 day ago" in 2..6 -> "$daysDifference days ago" else -> SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(targetDate) 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 42ee6973..df86fe92 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt @@ -31,7 +31,8 @@ class FeedActivity : AppCompatActivity() { setContentView(binding.root) navBar = binding.feedNavBar val navBarMargin = if (resources.configuration.orientation == - Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight + Configuration.ORIENTATION_LANDSCAPE + ) 0 else navBarHeight navBar.updateLayoutParams { bottomMargin = navBarMargin } val personalTab = navBar.createTab(R.drawable.ic_round_person_24, "Following") val globalTab = navBar.createTab(R.drawable.ic_globe_24, "Global") @@ -67,10 +68,12 @@ class FeedActivity : AppCompatActivity() { override fun onConfigurationChanged(newConfig: Configuration) { super.onConfigurationChanged(newConfig) - val margin = if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight - val params : ViewGroup.MarginLayoutParams = + val margin = + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) 0 else navBarHeight + val params: ViewGroup.MarginLayoutParams = binding.feedViewPager.layoutParams as ViewGroup.MarginLayoutParams - val paramsNav : ViewGroup.MarginLayoutParams = navBar.layoutParams as ViewGroup.MarginLayoutParams + val paramsNav: ViewGroup.MarginLayoutParams = + navBar.layoutParams as ViewGroup.MarginLayoutParams params.updateMargins(bottom = margin) paramsNav.updateMargins(bottom = margin) } diff --git a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt index be624b29..0da64157 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt @@ -19,7 +19,6 @@ import ani.dantotsu.databinding.FragmentFeedBinding import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.profile.ProfileActivity import ani.dantotsu.setBaseline -import ani.dantotsu.snackString import ani.dantotsu.util.Logger import com.xwray.groupie.GroupieAdapter import kotlinx.coroutines.Dispatchers @@ -57,7 +56,7 @@ class FeedFragment : Fragment() { val navBar = if (userId != null) { (activity as ProfileActivity).navBar - }else{ + } else { (activity as FeedActivity).navBar } binding.listRecyclerView.setBaseline(navBar) @@ -74,7 +73,7 @@ class FeedFragment : Fragment() { binding.root.requestLayout() val navBar = if (userId != null) { (activity as ProfileActivity).navBar - }else{ + } else { (activity as FeedActivity).navBar } binding.listRecyclerView.setBaseline(navBar) @@ -85,10 +84,17 @@ class FeedFragment : Fragment() { withContext(Dispatchers.Main) { res?.data?.page?.activities?.let { activities -> activityList = activities - val filtered = activityList.filterNot { //filter out messages that are not directed to the user - it.recipient?.id != null && it.recipient.id != Anilist.userid - } - adapter.update(filtered.map { ActivityItem(it, ::onActivityClick,requireActivity()) }) + val filtered = + activityList.filterNot { //filter out messages that are not directed to the user + it.recipient?.id != null && it.recipient.id != Anilist.userid + } + adapter.update(filtered.map { + ActivityItem( + it, + ::onActivityClick, + requireActivity() + ) + }) } binding.listProgressBar.visibility = ViewGroup.GONE val scrollView = binding.listRecyclerView @@ -134,7 +140,13 @@ class FeedFragment : Fragment() { val filtered = activities.filterNot { it.recipient?.id != null && it.recipient.id != Anilist.userid } - adapter.addAll(filtered.map { ActivityItem(it, ::onActivityClick,requireActivity()) }) + adapter.addAll(filtered.map { + ActivityItem( + it, + ::onActivityClick, + requireActivity() + ) + }) } binding.feedSwipeRefresh.isRefreshing = false onFinish() @@ -150,6 +162,7 @@ class FeedFragment : Fragment() { .putExtra("userId", id), null ) } + "MEDIA" -> { ContextCompat.startActivity( activity, Intent(activity, MediaDetailsActivity::class.java) 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 a8214004..a07ee3b3 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/NotificationActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/NotificationActivity.kt @@ -22,7 +22,6 @@ import ani.dantotsu.notifications.comment.CommentStore import ani.dantotsu.profile.ProfileActivity import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName -import ani.dantotsu.snackString import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import ani.dantotsu.util.Logger diff --git a/app/src/main/java/ani/dantotsu/profile/activity/NotificationItem.kt b/app/src/main/java/ani/dantotsu/profile/activity/NotificationItem.kt index 0276e3f7..59edae2f 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/NotificationItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/NotificationItem.kt @@ -1,9 +1,7 @@ package ani.dantotsu.profile.activity -import android.util.TypedValue import android.view.View import android.view.ViewGroup -import androidx.core.view.updateLayoutParams import ani.dantotsu.R import ani.dantotsu.blurImage import ani.dantotsu.connections.anilist.api.Notification @@ -60,7 +58,8 @@ class NotificationItem( } binding.notificationBannerImage.layoutParams.height = userHeight binding.notificationGradiant.layoutParams.height = userHeight - (binding.notificationTextContainer.layoutParams as ViewGroup.MarginLayoutParams).marginStart = userHeight + (binding.notificationTextContainer.layoutParams as ViewGroup.MarginLayoutParams).marginStart = + userHeight } else { binding.notificationCover.visibility = View.VISIBLE binding.notificationCoverUser.visibility = View.VISIBLE @@ -68,7 +67,8 @@ class NotificationItem( binding.notificationCover.loadImage(notification.media?.coverImage?.large) binding.notificationBannerImage.layoutParams.height = defaultHeight binding.notificationGradiant.layoutParams.height = defaultHeight - (binding.notificationTextContainer.layoutParams as ViewGroup.MarginLayoutParams).marginStart = textMarginStart + (binding.notificationTextContainer.layoutParams as ViewGroup.MarginLayoutParams).marginStart = + textMarginStart } } @@ -308,7 +308,9 @@ class NotificationItem( if (notification.commentId != null && notification.mediaId != null) { binding.notificationBannerImage.setOnClickListener { clickCallback( - notification.mediaId, notification.commentId, NotificationClickType.COMMENT + notification.mediaId, + notification.commentId, + NotificationClickType.COMMENT ) } } diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsAdapter.kt b/app/src/main/java/ani/dantotsu/settings/SettingsAdapter.kt index 7fb944eb..1be2557c 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsAdapter.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsAdapter.kt @@ -12,10 +12,10 @@ import ani.dantotsu.setAnimation class SettingsAdapter(private val settings: ArrayList) : RecyclerView.Adapter() { inner class SettingsViewHolder(val binding: ItemSettingsBinding) : - RecyclerView.ViewHolder(binding.root) {} + RecyclerView.ViewHolder(binding.root) inner class SettingsSwitchViewHolder(val binding: ItemSettingsSwitchBinding) : - RecyclerView.ViewHolder(binding.root) {} + RecyclerView.ViewHolder(binding.root) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { @@ -82,7 +82,7 @@ class SettingsAdapter(private val settings: ArrayList) : b.settingsButton.setOnCheckedChangeListener { _, isChecked -> settings.switch?.invoke(isChecked, b) } - b.settingsLayout.setOnLongClickListener() { + b.settingsLayout.setOnLongClickListener { settings.onLongClick?.invoke() true } diff --git a/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt b/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt index 54cd0dff..0228256c 100644 --- a/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt +++ b/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt @@ -1,7 +1,6 @@ package ani.dantotsu.util import ani.dantotsu.util.ColorEditor.Companion.toCssColor -import ani.dantotsu.util.ColorEditor.Companion.toHexColor class AniMarkdown { //istg anilist has the worst api companion object { diff --git a/app/src/main/java/ani/dantotsu/util/Logger.kt b/app/src/main/java/ani/dantotsu/util/Logger.kt index 5820abd8..3714aa01 100644 --- a/app/src/main/java/ani/dantotsu/util/Logger.kt +++ b/app/src/main/java/ani/dantotsu/util/Logger.kt @@ -133,7 +133,11 @@ object Logger { shareIntent.type = "text/plain" shareIntent.putExtra( Intent.EXTRA_STREAM, - FileProvider.getUriForFile(context, "${BuildConfig.APPLICATION_ID}.provider", fileToUse!!) + FileProvider.getUriForFile( + context, + "${BuildConfig.APPLICATION_ID}.provider", + fileToUse!! + ) ) shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Log file") shareIntent.putExtra(Intent.EXTRA_TEXT, "Log file") diff --git a/app/src/main/java/ani/dantotsu/util/StoragePermissions.kt b/app/src/main/java/ani/dantotsu/util/StoragePermissions.kt index 4ef3bf28..8291c567 100644 --- a/app/src/main/java/ani/dantotsu/util/StoragePermissions.kt +++ b/app/src/main/java/ani/dantotsu/util/StoragePermissions.kt @@ -62,9 +62,10 @@ class StoragePermissions { return hasDirAccess(context, path) } - fun AppCompatActivity.accessAlertDialog(launcher: LauncherWrapper, - force: Boolean = false, - complete: (Boolean) -> Unit + fun AppCompatActivity.accessAlertDialog( + launcher: LauncherWrapper, + force: Boolean = false, + complete: (Boolean) -> Unit ) { if (hasDirAccess(this) && !force) { complete(true) @@ -97,11 +98,12 @@ class StoragePermissions { class LauncherWrapper( activity: AppCompatActivity, - contract: ActivityResultContracts.OpenDocumentTree) -{ + contract: ActivityResultContracts.OpenDocumentTree +) { private var launcher: ActivityResultLauncher var complete: (Boolean) -> Unit = {} - init{ + + init { launcher = activity.registerForActivityResult(contract) { uri -> if (uri != null) { activity.contentResolver.takePersistableUriPermission( diff --git a/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt b/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt index cc319524..35f41bd0 100644 --- a/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt +++ b/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsWidget.kt @@ -59,7 +59,8 @@ class ProfileStatsWidget : AppWidgetProvider() { appWidgetId: Int ) { - val prefs = context.getSharedPreferences(getPrefsName(appWidgetId), Context.MODE_PRIVATE) + val prefs = + context.getSharedPreferences(getPrefsName(appWidgetId), Context.MODE_PRIVATE) val backgroundColor = prefs.getInt(PREF_BACKGROUND_COLOR, Color.parseColor("#80000000")) val backgroundFade = prefs.getInt(PREF_BACKGROUND_FADE, Color.parseColor("#00000000")) @@ -87,88 +88,95 @@ class ProfileStatsWidget : AppWidgetProvider() { val respond = Anilist.query.getUserProfile(userPref.toInt()) respond?.data?.user?.let { user -> withContext(Dispatchers.Main) { - val views = RemoteViews(context.packageName, R.layout.statistics_widget).apply { - setImageViewBitmap( - R.id.backgroundView, - gradientDrawable.toBitmap( - width, - height + val views = + RemoteViews(context.packageName, R.layout.statistics_widget).apply { + setImageViewBitmap( + R.id.backgroundView, + gradientDrawable.toBitmap( + width, + height + ) ) - ) - setOnClickPendingIntent( - R.id.userAvatar, - PendingIntent.getActivity( - context, - 1, - Intent(context, ProfileStatsConfigure::class.java).apply { - putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) - data = Uri.parse(toUri(Intent.URI_INTENT_SCHEME)) - }, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + setOnClickPendingIntent( + R.id.userAvatar, + PendingIntent.getActivity( + context, + 1, + Intent( + context, + ProfileStatsConfigure::class.java + ).apply { + putExtra( + AppWidgetManager.EXTRA_APPWIDGET_ID, + appWidgetId + ) + data = Uri.parse(toUri(Intent.URI_INTENT_SCHEME)) + }, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) ) - ) - setTextColor(R.id.userLabel, titleTextColor) - setTextColor(R.id.topLeftItem, titleTextColor) - setTextColor(R.id.topLeftLabel, statsTextColor) - setTextColor(R.id.topRightItem, titleTextColor) - setTextColor(R.id.topRightLabel, statsTextColor) - setTextColor(R.id.bottomLeftItem, titleTextColor) - setTextColor(R.id.bottomLeftLabel, statsTextColor) - setTextColor(R.id.bottomRightItem, titleTextColor) - setTextColor(R.id.bottomRightLabel, statsTextColor) + setTextColor(R.id.userLabel, titleTextColor) + setTextColor(R.id.topLeftItem, titleTextColor) + setTextColor(R.id.topLeftLabel, statsTextColor) + setTextColor(R.id.topRightItem, titleTextColor) + setTextColor(R.id.topRightLabel, statsTextColor) + setTextColor(R.id.bottomLeftItem, titleTextColor) + setTextColor(R.id.bottomLeftLabel, statsTextColor) + setTextColor(R.id.bottomRightItem, titleTextColor) + setTextColor(R.id.bottomRightLabel, statsTextColor) - setImageViewBitmap( - R.id.userAvatar, - user.avatar?.medium?.let { it1 -> downloadImageAsBitmap(it1) } - ) - setTextViewText( - R.id.userLabel, - context.getString(R.string.user_stats, user.name) - ) + setImageViewBitmap( + R.id.userAvatar, + user.avatar?.medium?.let { it1 -> downloadImageAsBitmap(it1) } + ) + setTextViewText( + R.id.userLabel, + context.getString(R.string.user_stats, user.name) + ) - setTextViewText( - R.id.topLeftItem, - user.statistics.anime.count.toString() - ) - setTextViewText( - R.id.topLeftLabel, - context.getString(R.string.anime_watched) - ) + setTextViewText( + R.id.topLeftItem, + user.statistics.anime.count.toString() + ) + setTextViewText( + R.id.topLeftLabel, + context.getString(R.string.anime_watched) + ) - setTextViewText( - R.id.topRightItem, - user.statistics.anime.episodesWatched.toString() - ) - setTextViewText( - R.id.topRightLabel, - context.getString(R.string.episodes_watched_n) - ) + setTextViewText( + R.id.topRightItem, + user.statistics.anime.episodesWatched.toString() + ) + setTextViewText( + R.id.topRightLabel, + context.getString(R.string.episodes_watched_n) + ) - setTextViewText( - R.id.bottomLeftItem, - user.statistics.manga.count.toString() - ) - setTextViewText( - R.id.bottomLeftLabel, - context.getString(R.string.manga_read) - ) + setTextViewText( + R.id.bottomLeftItem, + user.statistics.manga.count.toString() + ) + setTextViewText( + R.id.bottomLeftLabel, + context.getString(R.string.manga_read) + ) - setTextViewText( - R.id.bottomRightItem, - user.statistics.manga.chaptersRead.toString() - ) - setTextViewText( - R.id.bottomRightLabel, - context.getString(R.string.chapters_read_n) - ) + setTextViewText( + R.id.bottomRightItem, + user.statistics.manga.chaptersRead.toString() + ) + setTextViewText( + R.id.bottomRightLabel, + context.getString(R.string.chapters_read_n) + ) - val intent = Intent(context, ProfileActivity::class.java) - .putExtra("userId", userPref.toInt()) - val pendingIntent = PendingIntent.getActivity( - context, 0, intent, PendingIntent.FLAG_IMMUTABLE - ) - setOnClickPendingIntent(R.id.widgetContainer, pendingIntent) - } + val intent = Intent(context, ProfileActivity::class.java) + .putExtra("userId", userPref.toInt()) + val pendingIntent = PendingIntent.getActivity( + context, 0, intent, PendingIntent.FLAG_IMMUTABLE + ) + setOnClickPendingIntent(R.id.widgetContainer, pendingIntent) + } // Instruct the widget manager to update the widget appWidgetManager.updateAppWidget(appWidgetId, views) } @@ -221,6 +229,7 @@ class ProfileStatsWidget : AppWidgetProvider() { fun getPrefsName(appWidgetId: Int): String { return "ani.dantotsu.widgets.Statistics.${appWidgetId}" } + const val PREF_BACKGROUND_COLOR = "background_color" const val PREF_BACKGROUND_FADE = "background_fade" const val PREF_TITLE_TEXT_COLOR = "title_text_color" diff --git a/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingWidgetConfigure.kt b/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingWidgetConfigure.kt index a465a48a..7b237598 100644 --- a/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingWidgetConfigure.kt +++ b/app/src/main/java/ani/dantotsu/widgets/upcoming/UpcomingWidgetConfigure.kt @@ -48,8 +48,10 @@ class UpcomingWidgetConfigure : AppCompatActivity(), binding = UpcomingWidgetConfigureBinding.inflate(layoutInflater) setContentView(binding.root) val prefs = getSharedPreferences(UpcomingWidget.PREFS_NAME, Context.MODE_PRIVATE) - val topBackground = prefs.getInt(UpcomingWidget.PREF_BACKGROUND_COLOR, Color.parseColor("#80000000")) - (binding.topBackgroundButton as MaterialButton).iconTint = ColorStateList.valueOf(topBackground) + val topBackground = + prefs.getInt(UpcomingWidget.PREF_BACKGROUND_COLOR, Color.parseColor("#80000000")) + (binding.topBackgroundButton as MaterialButton).iconTint = + ColorStateList.valueOf(topBackground) binding.topBackgroundButton.setOnClickListener { val tag = UpcomingWidget.PREF_BACKGROUND_COLOR SimpleColorDialog().title(R.string.custom_theme) @@ -66,8 +68,10 @@ class UpcomingWidgetConfigure : AppCompatActivity(), .neg() .show(this@UpcomingWidgetConfigure, tag) } - val bottomBackground = prefs.getInt(UpcomingWidget.PREF_BACKGROUND_FADE, Color.parseColor("#00000000")) - (binding.bottomBackgroundButton as MaterialButton).iconTint = ColorStateList.valueOf(bottomBackground) + val bottomBackground = + prefs.getInt(UpcomingWidget.PREF_BACKGROUND_FADE, Color.parseColor("#00000000")) + (binding.bottomBackgroundButton as MaterialButton).iconTint = + ColorStateList.valueOf(bottomBackground) binding.bottomBackgroundButton.setOnClickListener { val tag = UpcomingWidget.PREF_BACKGROUND_FADE SimpleColorDialog().title(R.string.custom_theme) @@ -85,7 +89,8 @@ class UpcomingWidgetConfigure : AppCompatActivity(), .show(this@UpcomingWidgetConfigure, tag) } val titleTextColor = prefs.getInt(UpcomingWidget.PREF_TITLE_TEXT_COLOR, Color.WHITE) - (binding.titleColorButton as MaterialButton).iconTint = ColorStateList.valueOf(titleTextColor) + (binding.titleColorButton as MaterialButton).iconTint = + ColorStateList.valueOf(titleTextColor) binding.titleColorButton.setOnClickListener { val tag = UpcomingWidget.PREF_TITLE_TEXT_COLOR SimpleColorDialog().title(R.string.custom_theme) @@ -102,7 +107,8 @@ class UpcomingWidgetConfigure : AppCompatActivity(), .show(this@UpcomingWidgetConfigure, tag) } val countdownTextColor = prefs.getInt(UpcomingWidget.PREF_COUNTDOWN_TEXT_COLOR, Color.WHITE) - (binding.countdownColorButton as MaterialButton).iconTint = ColorStateList.valueOf(countdownTextColor) + (binding.countdownColorButton as MaterialButton).iconTint = + ColorStateList.valueOf(countdownTextColor) binding.countdownColorButton.setOnClickListener { val tag = UpcomingWidget.PREF_COUNTDOWN_TEXT_COLOR SimpleColorDialog().title(R.string.custom_theme) @@ -152,15 +158,27 @@ class UpcomingWidgetConfigure : AppCompatActivity(), private fun themeColors() { val typedValueSurface = TypedValue() - theme.resolveAttribute(com.google.android.material.R.attr.colorSurface, typedValueSurface, true) + theme.resolveAttribute( + com.google.android.material.R.attr.colorSurface, + typedValueSurface, + true + ) val backgroundColor = typedValueSurface.data val typedValuePrimary = TypedValue() - theme.resolveAttribute(com.google.android.material.R.attr.colorPrimary, typedValuePrimary, true) + theme.resolveAttribute( + com.google.android.material.R.attr.colorPrimary, + typedValuePrimary, + true + ) val textColor = typedValuePrimary.data val typedValueOutline = TypedValue() - theme.resolveAttribute(com.google.android.material.R.attr.colorOutline, typedValueOutline, true) + theme.resolveAttribute( + com.google.android.material.R.attr.colorOutline, + typedValueOutline, + true + ) val subTextColor = typedValueOutline.data getSharedPreferences(UpcomingWidget.PREFS_NAME, Context.MODE_PRIVATE).edit().apply { diff --git a/app/src/main/java/eu/kanade/domain/base/BasePreferences.kt b/app/src/main/java/eu/kanade/domain/base/BasePreferences.kt index b34758c4..6d09285a 100644 --- a/app/src/main/java/eu/kanade/domain/base/BasePreferences.kt +++ b/app/src/main/java/eu/kanade/domain/base/BasePreferences.kt @@ -17,7 +17,7 @@ class BasePreferences( fun incognitoMode() = preferenceStore.getBoolean("incognito_mode", false) fun extensionInstaller() = ExtensionInstallerPreference(context, preferenceStore) - + fun deviceHasPip() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && context.packageManager.hasSystemFeature( PackageManager.FEATURE_PICTURE_IN_PICTURE diff --git a/app/src/main/java/eu/kanade/tachiyomi/animesource/online/AnimeHttpSource.kt b/app/src/main/java/eu/kanade/tachiyomi/animesource/online/AnimeHttpSource.kt index 61e8f5db..ed1ed07d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/animesource/online/AnimeHttpSource.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/animesource/online/AnimeHttpSource.kt @@ -23,7 +23,6 @@ import uy.kohesive.injekt.injectLazy import java.net.URI import java.net.URISyntaxException import java.security.MessageDigest -import java.util.concurrent.TimeUnit /** * A simple implementation for sources from a website. @@ -89,14 +88,15 @@ abstract class AnimeHttpSource : AnimeCatalogueSource { protected fun generateId(name: String, lang: String, versionId: Int): Long { val key = "${name.lowercase()}/$lang/$versionId" val bytes = MessageDigest.getInstance("MD5").digest(key.toByteArray()) - return (0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) }.reduce(Long::or) and Long.MAX_VALUE + return (0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) } + .reduce(Long::or) and Long.MAX_VALUE } /** * Headers builder for requests. Implementations can override this method for custom headers. */ protected open fun headersBuilder() = Headers.Builder().apply { - add("User-Agent", NetworkHelper.defaultUserAgentProvider()) + add("User-Agent", defaultUserAgentProvider()) } /** @@ -148,7 +148,11 @@ abstract class AnimeHttpSource : AnimeCatalogueSource { "Use the non-RxJava API instead", ReplaceWith("getSearchAnime"), ) - override fun fetchSearchAnime(page: Int, query: String, filters: AnimeFilterList): Observable { + override fun fetchSearchAnime( + page: Int, + query: String, + filters: AnimeFilterList + ): Observable { return Observable.defer { try { client.newCall(searchAnimeRequest(page, query, filters)).asObservableSuccess() @@ -170,7 +174,11 @@ abstract class AnimeHttpSource : AnimeCatalogueSource { * @param query the search query. * @param filters the list of filters to apply. */ - protected abstract fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request + protected abstract fun searchAnimeRequest( + page: Int, + query: String, + filters: AnimeFilterList + ): Request /** * Parses the response from the site and returns a [AnimesPage] object. @@ -403,7 +411,8 @@ abstract class AnimeHttpSource : AnimeCatalogueSource { video: Video, tries: Int, ): Long { - val headers = Headers.Builder().addAll(video.headers ?: headers).add("Range", "bytes=0-1").build() + val headers = + Headers.Builder().addAll(video.headers ?: headers).add("Range", "bytes=0-1").build() val request = GET(video.videoUrl!!, headers) val response = client.newCall(request).execute() // parse the response headers to get the size of the video, in particular the content-range header diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt index e568a1fa..07809c60 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/AnimeExtensionManager.kt @@ -207,8 +207,10 @@ class AnimeExtensionManager( * @param extension The anime extension to be installed. */ fun installExtension(extension: AnimeExtension.Available): Observable { - return installer.downloadAndInstall(api.getAnimeApkUrl(extension), extension.pkgName, - extension.name, MediaType.ANIME) + return installer.downloadAndInstall( + api.getAnimeApkUrl(extension), extension.pkgName, + extension.name, MediaType.ANIME + ) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt index 7e96782e..5e7be9ef 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/PackageInstallerInstaller.kt @@ -28,18 +28,19 @@ class PackageInstallerInstaller(private val service: Service) : Installer(servic PackageInstaller.STATUS_FAILURE )) { PackageInstaller.STATUS_PENDING_USER_ACTION -> { - val userAction = intent.getParcelableExtraCompat(Intent.EXTRA_INTENT)?.run { - IntentSanitizer.Builder() - .allowAction(this.action!!) - .allowExtra(PackageInstaller.EXTRA_SESSION_ID) { id -> id == activeSession?.second } - .allowAnyComponent() - .allowPackage { - // There is no way to check the actual installer name so allow all. - true - } - .build() - .sanitizeByFiltering(this) - } + val userAction = + intent.getParcelableExtraCompat(Intent.EXTRA_INTENT)?.run { + IntentSanitizer.Builder() + .allowAction(this.action!!) + .allowExtra(PackageInstaller.EXTRA_SESSION_ID) { id -> id == activeSession?.second } + .allowAnyComponent() + .allowPackage { + // There is no way to check the actual installer name so allow all. + true + } + .build() + .sanitizeByFiltering(this) + } if (userAction == null) { Logger.log("Fatal error for $intent") continueQueue(InstallStep.Error) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/MangaExtensionManager.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/MangaExtensionManager.kt index 75f139b2..1ae39724 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/MangaExtensionManager.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/MangaExtensionManager.kt @@ -204,8 +204,10 @@ class MangaExtensionManager( * @param extension The extension to be installed. */ fun installExtension(extension: MangaExtension.Available): Observable { - return installer.downloadAndInstall(api.getMangaApkUrl(extension), extension.pkgName, - extension.name, MediaType.MANGA) + return installer.downloadAndInstall( + api.getMangaApkUrl(extension), extension.pkgName, + extension.name, MediaType.MANGA + ) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt index dce7d4f8..673ef920 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt @@ -41,9 +41,11 @@ class ExtensionInstallActivity : AppCompatActivity() { ThemeManager(this).applyTheme() if (intent.hasExtra(ExtensionInstaller.EXTRA_EXTENSION_TYPE)) - mediaType = intent.getSerializableExtraCompat(ExtensionInstaller.EXTRA_EXTENSION_TYPE) + mediaType = + intent.getSerializableExtraCompat(ExtensionInstaller.EXTRA_EXTENSION_TYPE) if (intent.hasExtra(ExtensionInstaller.EXTRA_ADDON_TYPE)) - addonType = intent.getSerializableExtraCompat(ExtensionInstaller.EXTRA_ADDON_TYPE) + addonType = + intent.getSerializableExtraCompat(ExtensionInstaller.EXTRA_ADDON_TYPE) @Suppress("DEPRECATION") val installIntent = Intent(Intent.ACTION_INSTALL_PACKAGE) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt index d40493e4..ec7d56e2 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallReceiver.kt @@ -37,14 +37,14 @@ internal class ExtensionInstallReceiver : BroadcastReceiver() { ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_EXPORTED) } - fun setAnimeListener(listener: AnimeListener) : ExtensionInstallReceiver { + fun setAnimeListener(listener: AnimeListener): ExtensionInstallReceiver { this.type = MediaType.ANIME animeListener = listener this.animeListener return this } - fun setMangaListener(listener: MangaListener) : ExtensionInstallReceiver { + fun setMangaListener(listener: MangaListener): ExtensionInstallReceiver { this.type = MediaType.MANGA mangaListener = listener return this @@ -66,21 +66,33 @@ internal class ExtensionInstallReceiver : BroadcastReceiver() { when (type) { MediaType.ANIME -> { when (val result = getAnimeExtensionFromIntent(context, intent)) { - is AnimeLoadResult.Success -> animeListener?.onExtensionInstalled(result.extension) + is AnimeLoadResult.Success -> animeListener?.onExtensionInstalled( + result.extension + ) + + is AnimeLoadResult.Untrusted -> animeListener?.onExtensionUntrusted( + result.extension + ) - is AnimeLoadResult.Untrusted -> animeListener?.onExtensionUntrusted(result.extension) else -> {} } } + MediaType.MANGA -> { when (val result = getMangaExtensionFromIntent(context, intent)) { - is MangaLoadResult.Success -> mangaListener?.onExtensionInstalled(result.extension) + is MangaLoadResult.Success -> mangaListener?.onExtensionInstalled( + result.extension + ) + + is MangaLoadResult.Untrusted -> mangaListener?.onExtensionUntrusted( + result.extension + ) - is MangaLoadResult.Untrusted -> mangaListener?.onExtensionUntrusted(result.extension) else -> {} } } - else -> { } + + else -> {} } } } @@ -90,17 +102,25 @@ internal class ExtensionInstallReceiver : BroadcastReceiver() { when (type) { MediaType.ANIME -> { when (val result = getAnimeExtensionFromIntent(context, intent)) { - is AnimeLoadResult.Success -> animeListener?.onExtensionUpdated(result.extension) + is AnimeLoadResult.Success -> animeListener?.onExtensionUpdated( + result.extension + ) + else -> {} } } + MediaType.MANGA -> { when (val result = getMangaExtensionFromIntent(context, intent)) { - is MangaLoadResult.Success -> mangaListener?.onExtensionUpdated(result.extension) + is MangaLoadResult.Success -> mangaListener?.onExtensionUpdated( + result.extension + ) + else -> {} } } - else -> { } + + else -> {} } } } @@ -114,10 +134,12 @@ internal class ExtensionInstallReceiver : BroadcastReceiver() { MediaType.ANIME -> { animeListener?.onPackageUninstalled(pkgName) } + MediaType.MANGA -> { mangaListener?.onPackageUninstalled(pkgName) } - else -> { } + + else -> {} } } } @@ -131,7 +153,10 @@ internal class ExtensionInstallReceiver : BroadcastReceiver() { * @param intent The intent containing the package name of the extension. */ @OptIn(DelicateCoroutinesApi::class) - private suspend fun getAnimeExtensionFromIntent(context: Context, intent: Intent?): AnimeLoadResult { + private suspend fun getAnimeExtensionFromIntent( + context: Context, + intent: Intent? + ): AnimeLoadResult { val pkgName = getPackageNameFromIntent(intent) if (pkgName == null) { Logger.log("Package name not found") @@ -146,7 +171,10 @@ internal class ExtensionInstallReceiver : BroadcastReceiver() { } @OptIn(DelicateCoroutinesApi::class) - private suspend fun getMangaExtensionFromIntent(context: Context, intent: Intent?): MangaLoadResult { + private suspend fun getMangaExtensionFromIntent( + context: Context, + intent: Intent? + ): MangaLoadResult { val pkgName = getPackageNameFromIntent(intent) if (pkgName == null) { Logger.log("Package name not found") diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt index 58c698dd..3b8c6571 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallService.kt @@ -14,8 +14,8 @@ import ani.dantotsu.media.Type import ani.dantotsu.util.Logger import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.data.notification.Notifications -import eu.kanade.tachiyomi.extension.installer.PackageInstallerInstaller import eu.kanade.tachiyomi.extension.installer.Installer +import eu.kanade.tachiyomi.extension.installer.PackageInstallerInstaller import eu.kanade.tachiyomi.extension.util.ExtensionInstaller.Companion.EXTRA_DOWNLOAD_ID import eu.kanade.tachiyomi.extension.util.ExtensionInstaller.Companion.EXTRA_EXTENSION_TYPE import eu.kanade.tachiyomi.util.system.getSerializableExtraCompat @@ -48,7 +48,8 @@ class ExtensionInstallService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val uri = intent?.data val mediaType = intent?.getSerializableExtraCompat(EXTRA_EXTENSION_TYPE) - val addonType = intent?.getSerializableExtraCompat(ExtensionInstaller.EXTRA_ADDON_TYPE) + val addonType = + intent?.getSerializableExtraCompat(ExtensionInstaller.EXTRA_ADDON_TYPE) val id = intent?.getLongExtra(EXTRA_DOWNLOAD_ID, -1)?.takeIf { it != -1L } val installerUsed = intent?.getSerializableExtraCompat( EXTRA_INSTALLER diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt index 1727a6a8..d83553ec 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt @@ -14,14 +14,11 @@ import androidx.core.net.toUri import ani.dantotsu.media.AddonType import ani.dantotsu.media.MediaType import ani.dantotsu.media.Type -import ani.dantotsu.parsers.novel.NovelExtension import ani.dantotsu.util.Logger import com.jakewharton.rxrelay.PublishRelay import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.extension.InstallStep -import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import eu.kanade.tachiyomi.extension.installer.Installer -import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import eu.kanade.tachiyomi.util.storage.getUriCompat import rx.Observable import rx.android.schedulers.AndroidSchedulers @@ -67,7 +64,12 @@ class ExtensionInstaller(private val context: Context) { * @param url The url of the apk. * @param extension The extension to install. */ - fun downloadAndInstall(url: String, pkgName: String, name: String, type: T): Observable = Observable.defer { + fun downloadAndInstall( + url: String, + pkgName: String, + name: String, + type: T + ): Observable = Observable.defer { val oldDownload = activeDownloads[pkgName] if (oldDownload != null) { deleteDownload(pkgName) @@ -264,11 +266,15 @@ class ExtensionInstaller(private val context: Context) { val localUri = cursor.getString( cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI), ).removePrefix(FILE_SCHEME) - val type = MediaType.fromText(cursor.getString( - cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_DESCRIPTION), - )) ?: AddonType.fromText(cursor.getString( - cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_DESCRIPTION), - )) ?: return + val type = MediaType.fromText( + cursor.getString( + cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_DESCRIPTION), + ) + ) ?: AddonType.fromText( + cursor.getString( + cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_DESCRIPTION), + ) + ) ?: return installApk(type, id, File(localUri).getUriCompat(context)) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt index d68ffbf8..fed98c98 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionLoader.kt @@ -62,7 +62,7 @@ internal object ExtensionLoader { val PACKAGE_FLAGS = PackageManager.GET_CONFIGURATIONS or PackageManager.GET_META_DATA or - @Suppress ("DEPRECATION") PackageManager.GET_SIGNATURES or + @Suppress("DEPRECATION") PackageManager.GET_SIGNATURES or (if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) PackageManager.GET_SIGNING_CERTIFICATES else 0) @@ -145,7 +145,7 @@ internal object ExtensionLoader { Logger.log(error) return AnimeLoadResult.Error } - if (!isPackageAnExtension(MediaType.ANIME,pkgInfo)) { + if (!isPackageAnExtension(MediaType.ANIME, pkgInfo)) { Logger.log("Tried to load a package that wasn't a extension ($pkgName)") return AnimeLoadResult.Error } @@ -201,8 +201,9 @@ internal object ExtensionLoader { // Validate lib version val libVersion = versionName.substringBeforeLast('.').toDoubleOrNull() if (libVersion == null || libVersion < ANIME_LIB_VERSION_MIN || libVersion > ANIME_LIB_VERSION_MAX) { - Logger.log("Lib version is $libVersion, while only versions " + - "$ANIME_LIB_VERSION_MIN to $ANIME_LIB_VERSION_MAX are allowed" + Logger.log( + "Lib version is $libVersion, while only versions " + + "$ANIME_LIB_VERSION_MIN to $ANIME_LIB_VERSION_MAX are allowed" ) return AnimeLoadResult.Error } @@ -232,7 +233,8 @@ internal object ExtensionLoader { } val hasReadme = appInfo.metaData.getInt("$ANIME_PACKAGE$XX_METADATA_HAS_README", 0) == 1 - val hasChangelog = appInfo.metaData.getInt("$ANIME_PACKAGE$XX_METADATA_HAS_CHANGELOG", 0) == 1 + val hasChangelog = + appInfo.metaData.getInt("$ANIME_PACKAGE$XX_METADATA_HAS_CHANGELOG", 0) == 1 val classLoader = PathClassLoader(appInfo.sourceDir, null, context.classLoader) @@ -248,7 +250,8 @@ internal object ExtensionLoader { } .flatMap { try { - when (val obj = Class.forName(it, false, classLoader).getDeclaredConstructor().newInstance()) { + when (val obj = Class.forName(it, false, classLoader).getDeclaredConstructor() + .newInstance()) { is AnimeSource -> listOf(obj) is AnimeSourceFactory -> obj.createSources() else -> throw Exception("Unknown source class type! ${obj.javaClass}") @@ -314,8 +317,9 @@ internal object ExtensionLoader { // Validate lib version val libVersion = versionName.substringBeforeLast('.').toDoubleOrNull() if (libVersion == null || libVersion < MANGA_LIB_VERSION_MIN || libVersion > MANGA_LIB_VERSION_MAX) { - Logger.log("Lib version is $libVersion, while only versions " + - "$MANGA_LIB_VERSION_MIN to $MANGA_LIB_VERSION_MAX are allowed" + Logger.log( + "Lib version is $libVersion, while only versions " + + "$MANGA_LIB_VERSION_MIN to $MANGA_LIB_VERSION_MAX are allowed" ) return MangaLoadResult.Error } @@ -340,7 +344,8 @@ internal object ExtensionLoader { } val hasReadme = appInfo.metaData.getInt("$MANGA_PACKAGE$XX_METADATA_HAS_README", 0) == 1 - val hasChangelog = appInfo.metaData.getInt("$MANGA_PACKAGE$XX_METADATA_HAS_CHANGELOG", 0) == 1 + val hasChangelog = + appInfo.metaData.getInt("$MANGA_PACKAGE$XX_METADATA_HAS_CHANGELOG", 0) == 1 val classLoader = PathClassLoader(appInfo.sourceDir, null, context.classLoader) @@ -401,11 +406,13 @@ internal object ExtensionLoader { * @param pkgInfo The package info of the application. */ private fun isPackageAnExtension(type: MediaType, pkgInfo: PackageInfo): Boolean { - return pkgInfo.reqFeatures.orEmpty().any { it.name == when (type) { - MediaType.ANIME -> ANIME_PACKAGE - MediaType.MANGA -> MANGA_PACKAGE - else -> "" - } } + return pkgInfo.reqFeatures.orEmpty().any { + it.name == when (type) { + MediaType.ANIME -> ANIME_PACKAGE + MediaType.MANGA -> MANGA_PACKAGE + else -> "" + } + } } /** @@ -417,7 +424,7 @@ internal object ExtensionLoader { val signatures = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) pkgInfo.signingInfo.signingCertificateHistory else - @Suppress ("DEPRECATION") pkgInfo.signatures + @Suppress("DEPRECATION") pkgInfo.signatures return if (signatures != null && signatures.isNotEmpty()) { Hash.sha256(signatures.first().toByteArray()) } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt index ead9e3e2..53149638 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt @@ -11,8 +11,8 @@ import eu.kanade.tachiyomi.network.interceptor.UncaughtExceptionInterceptor import eu.kanade.tachiyomi.network.interceptor.UserAgentInterceptor import okhttp3.Cache import okhttp3.OkHttpClient -import okhttp3.logging.HttpLoggingInterceptor import okhttp3.brotli.BrotliInterceptor +import okhttp3.logging.HttpLoggingInterceptor import java.io.File import java.util.concurrent.TimeUnit diff --git a/app/src/main/java/tachiyomi/source/local/entries/anime/LocalAnimeSource.kt b/app/src/main/java/tachiyomi/source/local/entries/anime/LocalAnimeSource.kt index 73a20c60..4586de92 100644 --- a/app/src/main/java/tachiyomi/source/local/entries/anime/LocalAnimeSource.kt +++ b/app/src/main/java/tachiyomi/source/local/entries/anime/LocalAnimeSource.kt @@ -41,10 +41,10 @@ class LocalAnimeSource( override suspend fun getLatestUpdates(page: Int) = getSearchAnime(page, "", LATEST_FILTERS) @Deprecated("Use the non-RxJava API instead", replaceWith = ReplaceWith("getPopularAnime")) - override fun fetchPopularAnime(page: Int) = fetchSearchAnime(page, "", POPULAR_FILTERS) + override fun fetchPopularAnime(page: Int) = getSearchAnime @Deprecated("Use the non-RxJava API instead", replaceWith = ReplaceWith("getLatestUpdates")) - override fun fetchLatestUpdates(page: Int) = fetchSearchAnime(page, "", LATEST_FILTERS) + override fun fetchLatestUpdates(page: Int) = getSearchAnime @Deprecated("Use the non-RxJava API instead", replaceWith = ReplaceWith("getSearchAnime")) override fun fetchSearchAnime(page: Int, query: String, filters: AnimeFilterList): Observable { diff --git a/app/src/main/res/anim/bounce_zoom.xml b/app/src/main/res/anim/bounce_zoom.xml index c19927cf..30827e89 100644 --- a/app/src/main/res/anim/bounce_zoom.xml +++ b/app/src/main/res/anim/bounce_zoom.xml @@ -1,9 +1,9 @@ \ No newline at end of file + android:toXScale="1.0" + android:toYScale="1.0" /> \ No newline at end of file diff --git a/app/src/main/res/drawable-night/widget_stats_rounded.xml b/app/src/main/res/drawable-night/widget_stats_rounded.xml index 933eab8b..c6cd5d5a 100644 --- a/app/src/main/res/drawable-night/widget_stats_rounded.xml +++ b/app/src/main/res/drawable-night/widget_stats_rounded.xml @@ -1,25 +1,27 @@ - + + android:bottomRightRadius="0dp" + android:topLeftRadius="28dp" + android:topRightRadius="28dp" /> + android:right="-3dp"> - + + android:bottomRightRadius="0dp" + android:topLeftRadius="28dp" + android:topRightRadius="28dp" /> diff --git a/app/src/main/res/drawable/adjust.xml b/app/src/main/res/drawable/adjust.xml index 6736f14f..155a57dd 100644 --- a/app/src/main/res/drawable/adjust.xml +++ b/app/src/main/res/drawable/adjust.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/backup_restore.xml b/app/src/main/res/drawable/backup_restore.xml index 2c551ca4..0348cbe3 100644 --- a/app/src/main/res/drawable/backup_restore.xml +++ b/app/src/main/res/drawable/backup_restore.xml @@ -1,11 +1,11 @@ - + android:viewportWidth="960" + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/blur_on.xml b/app/src/main/res/drawable/blur_on.xml index 11630fa4..fba75c2b 100644 --- a/app/src/main/res/drawable/blur_on.xml +++ b/app/src/main/res/drawable/blur_on.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/bottom_sheet_background.xml b/app/src/main/res/drawable/bottom_sheet_background.xml index 77a184e8..4ecbb367 100644 --- a/app/src/main/res/drawable/bottom_sheet_background.xml +++ b/app/src/main/res/drawable/bottom_sheet_background.xml @@ -2,8 +2,8 @@ android:shape="rectangle"> + android:bottomRightRadius="0dp" + android:topLeftRadius="16dp" + android:topRightRadius="16dp" /> diff --git a/app/src/main/res/drawable/cast_warning.xml b/app/src/main/res/drawable/cast_warning.xml index 15f35a55..525cfb5b 100644 --- a/app/src/main/res/drawable/cast_warning.xml +++ b/app/src/main/res/drawable/cast_warning.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/discord_status_dnd.xml b/app/src/main/res/drawable/discord_status_dnd.xml index db415306..b37a12a7 100644 --- a/app/src/main/res/drawable/discord_status_dnd.xml +++ b/app/src/main/res/drawable/discord_status_dnd.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/discord_status_idle.xml b/app/src/main/res/drawable/discord_status_idle.xml index ed0e0880..3a64bb60 100644 --- a/app/src/main/res/drawable/discord_status_idle.xml +++ b/app/src/main/res/drawable/discord_status_idle.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/discord_status_online.xml b/app/src/main/res/drawable/discord_status_online.xml index cc81654f..cdbb698d 100644 --- a/app/src/main/res/drawable/discord_status_online.xml +++ b/app/src/main/res/drawable/discord_status_online.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/gradient_background.xml b/app/src/main/res/drawable/gradient_background.xml index d4b19a1f..6d10feed 100644 --- a/app/src/main/res/drawable/gradient_background.xml +++ b/app/src/main/res/drawable/gradient_background.xml @@ -4,5 +4,5 @@ + android:startColor="@color/theme" /> diff --git a/app/src/main/res/drawable/ic_camera_roll_24.xml b/app/src/main/res/drawable/ic_camera_roll_24.xml index 1c4b99e3..a6a2e756 100644 --- a/app/src/main/res/drawable/ic_camera_roll_24.xml +++ b/app/src/main/res/drawable/ic_camera_roll_24.xml @@ -1,13 +1,12 @@ - - + android:viewportHeight="24"> + - + android:pathData="M14,5c0,-1.1 -0.9,-2 -2,-2h-1L11,2c0,-0.55 -0.45,-1 -1,-1L6,1c-0.55,0 -1,0.45 -1,1v1L4,3c-1.1,0 -2,0.9 -2,2v15c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2h8L22,5h-8zM12,18h-2v-2h2v2zM12,9h-2L10,7h2v2zM16,18h-2v-2h2v2zM16,9h-2L14,7h2v2zM20,18h-2v-2h2v2zM20,9h-2L18,7h2v2z" /> + diff --git a/app/src/main/res/drawable/ic_circle_arrow_left_24.xml b/app/src/main/res/drawable/ic_circle_arrow_left_24.xml index 687a99d4..a9d8b65d 100644 --- a/app/src/main/res/drawable/ic_circle_arrow_left_24.xml +++ b/app/src/main/res/drawable/ic_circle_arrow_left_24.xml @@ -1,17 +1,16 @@ - + android:viewportHeight="24"> + android:rotation="90" + android:translateX="24"> + android:pathData="M12,4c4.41,0 8,3.59 8,8s-3.59,8 -8,8s-8,-3.59 -8,-8S7.59,4 12,4M12,2C6.48,2 2,6.48 2,12c0,5.52 4.48,10 10,10c5.52,0 10,-4.48 10,-10C22,6.48 17.52,2 12,2L12,2zM13,12l0,-4h-2l0,4H8l4,4l4,-4H13z" /> diff --git a/app/src/main/res/drawable/ic_globe_24.xml b/app/src/main/res/drawable/ic_globe_24.xml index ff6e71b0..3b7123a0 100644 --- a/app/src/main/res/drawable/ic_globe_24.xml +++ b/app/src/main/res/drawable/ic_globe_24.xml @@ -4,7 +4,7 @@ android:tint="?attr/colorControlNormal" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/ic_label_24.xml b/app/src/main/res/drawable/ic_label_24.xml index ad3f2592..57a9cd6d 100644 --- a/app/src/main/res/drawable/ic_label_24.xml +++ b/app/src/main/res/drawable/ic_label_24.xml @@ -4,7 +4,7 @@ android:tint="?attr/colorControlNormal" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/ic_label_off_24.xml b/app/src/main/res/drawable/ic_label_off_24.xml index d4dbdd00..5579a991 100644 --- a/app/src/main/res/drawable/ic_label_off_24.xml +++ b/app/src/main/res/drawable/ic_label_off_24.xml @@ -4,7 +4,7 @@ android:tint="?attr/colorControlNormal" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/ic_lightbulb_24.xml b/app/src/main/res/drawable/ic_lightbulb_24.xml index 487b9ff8..f3fea31d 100644 --- a/app/src/main/res/drawable/ic_lightbulb_24.xml +++ b/app/src/main/res/drawable/ic_lightbulb_24.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/ic_open_24.xml b/app/src/main/res/drawable/ic_open_24.xml index 52b21320..345ab07b 100644 --- a/app/src/main/res/drawable/ic_open_24.xml +++ b/app/src/main/res/drawable/ic_open_24.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/ic_round_comment_24.xml b/app/src/main/res/drawable/ic_round_comment_24.xml index b39f06fa..d7a8f7de 100644 --- a/app/src/main/res/drawable/ic_round_comment_24.xml +++ b/app/src/main/res/drawable/ic_round_comment_24.xml @@ -4,7 +4,7 @@ android:tint="?attr/colorControlNormal" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/ic_round_globe_china_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_china_googlefonts.xml index 1a36e8f6..cae3bc7e 100644 --- a/app/src/main/res/drawable/ic_round_globe_china_googlefonts.xml +++ b/app/src/main/res/drawable/ic_round_globe_china_googlefonts.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/ic_round_globe_japan_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_japan_googlefonts.xml index 24803edd..d2624768 100644 --- a/app/src/main/res/drawable/ic_round_globe_japan_googlefonts.xml +++ b/app/src/main/res/drawable/ic_round_globe_japan_googlefonts.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/ic_round_globe_search_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_search_googlefonts.xml index 97b82b0e..09ec477f 100644 --- a/app/src/main/res/drawable/ic_round_globe_search_googlefonts.xml +++ b/app/src/main/res/drawable/ic_round_globe_search_googlefonts.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/ic_round_globe_south_korea_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_south_korea_googlefonts.xml index dff31e26..2c86d094 100644 --- a/app/src/main/res/drawable/ic_round_globe_south_korea_googlefonts.xml +++ b/app/src/main/res/drawable/ic_round_globe_south_korea_googlefonts.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/ic_round_globe_taiwan_googlefonts.xml b/app/src/main/res/drawable/ic_round_globe_taiwan_googlefonts.xml index 52052789..a6a37cd4 100644 --- a/app/src/main/res/drawable/ic_round_globe_taiwan_googlefonts.xml +++ b/app/src/main/res/drawable/ic_round_globe_taiwan_googlefonts.xml @@ -3,7 +3,7 @@ android:height="24dp" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/ic_round_help_outline.xml b/app/src/main/res/drawable/ic_round_help_outline.xml index 7f116ea4..fab6e157 100644 --- a/app/src/main/res/drawable/ic_round_help_outline.xml +++ b/app/src/main/res/drawable/ic_round_help_outline.xml @@ -1,11 +1,11 @@ - + android:viewportWidth="960" + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/ic_round_no_scroll_bar.xml b/app/src/main/res/drawable/ic_round_no_scroll_bar.xml index c11b94ee..f425dc93 100644 --- a/app/src/main/res/drawable/ic_round_no_scroll_bar.xml +++ b/app/src/main/res/drawable/ic_round_no_scroll_bar.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/ic_round_reply_24.xml b/app/src/main/res/drawable/ic_round_reply_24.xml index d7e5a744..7ac5e159 100644 --- a/app/src/main/res/drawable/ic_round_reply_24.xml +++ b/app/src/main/res/drawable/ic_round_reply_24.xml @@ -1,10 +1,11 @@ - + android:height="24dp" + android:alpha="0.9" + android:tint="?attr/colorControlNormal" + android:viewportWidth="960" + android:viewportHeight="960"> + android:pathData="M760,760v-160q0,-50 -35,-85t-85,-35L273,480l144,144 -57,56 -240,-240 240,-240 57,56 -144,144h367q83,0 141.5,58.5T840,600v160h-80Z" /> diff --git a/app/src/main/res/drawable/ic_round_search_sources_24.xml b/app/src/main/res/drawable/ic_round_search_sources_24.xml index 48e31b13..7691464c 100644 --- a/app/src/main/res/drawable/ic_round_search_sources_24.xml +++ b/app/src/main/res/drawable/ic_round_search_sources_24.xml @@ -1,17 +1,16 @@ - - + android:viewportHeight="24"> + - + android:pathData="M11.5,3.5m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" /> + - + android:pathData="M12.13,7.12c-0.17,-0.35 -0.44,-0.65 -0.8,-0.85C10.72,5.91 9.99,5.93 9.4,6.24l0,-0.01L4,9.3V14h2v-3.54l1.5,-0.85C7.18,10.71 7,11.85 7,13v5.33L4.4,21.8L6,23l3,-4l0.22,-3.54L11,18v5h2v-6.5l-1.97,-2.81c-0.04,-0.52 -0.14,-1.76 0.45,-3.4c0.75,1.14 1.88,1.98 3.2,2.41L20.63,23l0.87,-0.5L16.02,13H17v-2c-0.49,0 -2.88,0.17 -4.08,-2.21" /> + diff --git a/app/src/main/res/drawable/ic_round_upvote_active_24.xml b/app/src/main/res/drawable/ic_round_upvote_active_24.xml index 683aae88..4670fe7e 100644 --- a/app/src/main/res/drawable/ic_round_upvote_active_24.xml +++ b/app/src/main/res/drawable/ic_round_upvote_active_24.xml @@ -1,12 +1,11 @@ - + android:height="24dp" + android:alpha="0.9" + android:tint="?attr/colorControlNormal" + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M4,14h4v7a1,1 0,0 0,1 1h6a1,1 0,0 0,1 -1v-7h4a1.001,1.001 0,0 0,0.781 -1.625l-8,-10c-0.381,-0.475 -1.181,-0.475 -1.562,0l-8,10A1.001,1.001 0,0 0,4 14z" /> diff --git a/app/src/main/res/drawable/ic_round_upvote_inactive_24.xml b/app/src/main/res/drawable/ic_round_upvote_inactive_24.xml index dceee11c..01c0c3fb 100644 --- a/app/src/main/res/drawable/ic_round_upvote_inactive_24.xml +++ b/app/src/main/res/drawable/ic_round_upvote_inactive_24.xml @@ -1,11 +1,11 @@ - + android:height="24dp" + android:alpha="0.9" + android:tint="?attr/colorControlNormal" + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M12.781,2.375c-0.381,-0.475 -1.181,-0.475 -1.562,0l-8,10A1.001,1.001 0,0 0,4 14h4v7a1,1 0,0 0,1 1h6a1,1 0,0 0,1 -1v-7h4a1.001,1.001 0,0 0,0.781 -1.625l-8,-10zM15,12h-1v8h-4v-8H6.081L12,4.601 17.919,12H15z" /> diff --git a/app/src/main/res/drawable/ic_stats_24.xml b/app/src/main/res/drawable/ic_stats_24.xml index d0734d7b..1b9af2af 100644 --- a/app/src/main/res/drawable/ic_stats_24.xml +++ b/app/src/main/res/drawable/ic_stats_24.xml @@ -4,7 +4,7 @@ android:tint="?attr/colorControlNormal" android:viewportWidth="960" android:viewportHeight="960"> - + diff --git a/app/src/main/res/drawable/inbox_empty.xml b/app/src/main/res/drawable/inbox_empty.xml index bb6540aa..306c2176 100644 --- a/app/src/main/res/drawable/inbox_empty.xml +++ b/app/src/main/res/drawable/inbox_empty.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/inbox_filled.xml b/app/src/main/res/drawable/inbox_filled.xml index 08ad4bf1..8dbb33de 100644 --- a/app/src/main/res/drawable/inbox_filled.xml +++ b/app/src/main/res/drawable/inbox_filled.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/invert_all_boxes.xml b/app/src/main/res/drawable/invert_all_boxes.xml index 2a5d5763..6525bc2b 100644 --- a/app/src/main/res/drawable/invert_all_boxes.xml +++ b/app/src/main/res/drawable/invert_all_boxes.xml @@ -1,7 +1,18 @@ - - - - - - + + + + + + diff --git a/app/src/main/res/drawable/notification_circle.xml b/app/src/main/res/drawable/notification_circle.xml index d864d738..2e511007 100644 --- a/app/src/main/res/drawable/notification_circle.xml +++ b/app/src/main/res/drawable/notification_circle.xml @@ -1,8 +1,8 @@ - + + android:height="100dp" /> diff --git a/app/src/main/res/drawable/notification_icon.xml b/app/src/main/res/drawable/notification_icon.xml index 29e3dd6d..547667af 100644 --- a/app/src/main/res/drawable/notification_icon.xml +++ b/app/src/main/res/drawable/notification_icon.xml @@ -1,10 +1,17 @@ - + - - - + + + diff --git a/app/src/main/res/drawable/stacks.xml b/app/src/main/res/drawable/stacks.xml index 29383b41..a77bff77 100644 --- a/app/src/main/res/drawable/stacks.xml +++ b/app/src/main/res/drawable/stacks.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/tick_all_boxes.xml b/app/src/main/res/drawable/tick_all_boxes.xml index 59eddd41..c76b8d16 100644 --- a/app/src/main/res/drawable/tick_all_boxes.xml +++ b/app/src/main/res/drawable/tick_all_boxes.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/trail_length_short.xml b/app/src/main/res/drawable/trail_length_short.xml index 81166f10..eb6ab76a 100644 --- a/app/src/main/res/drawable/trail_length_short.xml +++ b/app/src/main/res/drawable/trail_length_short.xml @@ -1,10 +1,10 @@ - + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/untick_all_boxes.xml b/app/src/main/res/drawable/untick_all_boxes.xml index 4e86043d..7a7bf1bc 100644 --- a/app/src/main/res/drawable/untick_all_boxes.xml +++ b/app/src/main/res/drawable/untick_all_boxes.xml @@ -1,5 +1,12 @@ - - - - + + + + diff --git a/app/src/main/res/drawable/view_list_24.xml b/app/src/main/res/drawable/view_list_24.xml index f7378f12..450a12bc 100644 --- a/app/src/main/res/drawable/view_list_24.xml +++ b/app/src/main/res/drawable/view_list_24.xml @@ -1,11 +1,11 @@ - + android:viewportWidth="960" + android:viewportHeight="960"> + diff --git a/app/src/main/res/drawable/widget_stats_rounded.xml b/app/src/main/res/drawable/widget_stats_rounded.xml index 2b32dd96..b5f192d5 100644 --- a/app/src/main/res/drawable/widget_stats_rounded.xml +++ b/app/src/main/res/drawable/widget_stats_rounded.xml @@ -1,25 +1,27 @@ - + + android:bottomRightRadius="0dp" + android:topLeftRadius="28dp" + android:topRightRadius="28dp" /> + android:right="-3dp"> - + + android:bottomRightRadius="0dp" + android:topLeftRadius="28dp" + android:topRightRadius="28dp" /> diff --git a/app/src/main/res/layout-land/activity_media.xml b/app/src/main/res/layout-land/activity_media.xml index d4a133f3..08942377 100644 --- a/app/src/main/res/layout-land/activity_media.xml +++ b/app/src/main/res/layout-land/activity_media.xml @@ -307,7 +307,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:paddingTop="16dp" - android:visibility="gone"/> + android:visibility="gone" /> + app:itemTextColor="@color/tab_layout_icon" /> diff --git a/app/src/main/res/layout-land/activity_profile.xml b/app/src/main/res/layout-land/activity_profile.xml index b4844201..76eca50c 100644 --- a/app/src/main/res/layout-land/activity_profile.xml +++ b/app/src/main/res/layout-land/activity_profile.xml @@ -46,13 +46,14 @@ android:id="@+id/profileNavBar" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_weight="0" android:layout_gravity="center_horizontal|bottom" + android:layout_weight="0" android:background="?attr/colorSurface" android:padding="0dp" app:abb_animationInterpolator="@anim/over_shoot" app:abb_indicatorAppearance="round" app:abb_indicatorLocation="top" + app:abb_isVerticalBar="true" app:abb_selectedTabType="text" app:abb_textAppearance="@style/NavBarText" app:itemActiveIndicatorStyle="@style/BottomNavBar" @@ -60,7 +61,6 @@ app:itemRippleColor="#00000000" app:itemTextAppearanceActive="@style/NavBarText" app:itemTextAppearanceInactive="@style/NavBarText" - app:itemTextColor="@color/tab_layout_icon" - app:abb_isVerticalBar="true"/> + app:itemTextColor="@color/tab_layout_icon" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_character.xml b/app/src/main/res/layout/activity_character.xml index dcc8d70e..ccc2af4d 100644 --- a/app/src/main/res/layout/activity_character.xml +++ b/app/src/main/res/layout/activity_character.xml @@ -57,11 +57,11 @@ android:id="@+id/characterTitle" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_weight="1" + android:layout_marginStart="24dp" + android:layout_weight="1" android:ellipsize="marquee" android:focusable="true" - android:layout_marginStart="24dp" android:focusableInTouchMode="true" android:fontFamily="@font/poppins_bold" android:gravity="center_vertical" diff --git a/app/src/main/res/layout/activity_extensions.xml b/app/src/main/res/layout/activity_extensions.xml index 4600cf50..cc6b4da7 100644 --- a/app/src/main/res/layout/activity_extensions.xml +++ b/app/src/main/res/layout/activity_extensions.xml @@ -86,17 +86,16 @@ android:layout_height="match_parent" android:layout_gravity="bottom" android:layout_weight="1" - android:visibility="gone"> - + android:visibility="gone"> - + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_follow.xml b/app/src/main/res/layout/activity_follow.xml index 7b8e8ac5..3ff66743 100644 --- a/app/src/main/res/layout/activity_follow.xml +++ b/app/src/main/res/layout/activity_follow.xml @@ -112,8 +112,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:nestedScrollingEnabled="true" - tools:listitem="@layout/item_follower" - android:requiresFadingEdge="vertical" /> + android:requiresFadingEdge="vertical" + tools:listitem="@layout/item_follower" /> diff --git a/app/src/main/res/layout/activity_settings_anime.xml b/app/src/main/res/layout/activity_settings_anime.xml index 566960eb..902db405 100644 --- a/app/src/main/res/layout/activity_settings_anime.xml +++ b/app/src/main/res/layout/activity_settings_anime.xml @@ -62,8 +62,8 @@ diff --git a/app/src/main/res/layout/activity_settings_extensions.xml b/app/src/main/res/layout/activity_settings_extensions.xml index 67e31348..b681645d 100644 --- a/app/src/main/res/layout/activity_settings_extensions.xml +++ b/app/src/main/res/layout/activity_settings_extensions.xml @@ -51,9 +51,9 @@ diff --git a/app/src/main/res/layout/activity_settings_notifications.xml b/app/src/main/res/layout/activity_settings_notifications.xml index 479b7fa1..6aa6f909 100644 --- a/app/src/main/res/layout/activity_settings_notifications.xml +++ b/app/src/main/res/layout/activity_settings_notifications.xml @@ -44,8 +44,8 @@ android:layout_height="wrap_content" android:layout_margin="32dp" android:layout_weight="1" - android:text="@string/notifications" android:fontFamily="@font/poppins_bold" + android:text="@string/notifications" android:textSize="28sp" /> @@ -138,8 +138,8 @@ style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox.ExposedDropdownMenu" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="8dp" android:layout_marginHorizontal="16dp" + android:layout_marginBottom="8dp" app:boxCornerRadiusBottomEnd="8dp" app:boxCornerRadiusBottomStart="8dp" app:boxCornerRadiusTopEnd="8dp" diff --git a/app/src/main/res/layout/activity_single_stat.xml b/app/src/main/res/layout/activity_single_stat.xml index edc8321f..60ecd57c 100644 --- a/app/src/main/res/layout/activity_single_stat.xml +++ b/app/src/main/res/layout/activity_single_stat.xml @@ -5,9 +5,9 @@ diff --git a/app/src/main/res/layout/bottom_sheet_book.xml b/app/src/main/res/layout/bottom_sheet_book.xml index a1030975..2203c3ff 100644 --- a/app/src/main/res/layout/bottom_sheet_book.xml +++ b/app/src/main/res/layout/bottom_sheet_book.xml @@ -2,9 +2,9 @@ + android:layout_height="match_parent" + android:background="@drawable/bottom_sheet_background"> + android:layout_height="match_parent" + android:background="@drawable/bottom_sheet_background"> + android:layout_height="match_parent" + android:background="@drawable/bottom_sheet_background"> + + - + - + diff --git a/app/src/main/res/layout/bottom_sheet_image.xml b/app/src/main/res/layout/bottom_sheet_image.xml index 656b3592..b631b52a 100644 --- a/app/src/main/res/layout/bottom_sheet_image.xml +++ b/app/src/main/res/layout/bottom_sheet_image.xml @@ -2,9 +2,9 @@ + android:layout_height="wrap_content" + android:background="@drawable/bottom_sheet_background"> + android:layout_height="wrap_content" + android:background="@drawable/bottom_sheet_background"> - @@ -182,8 +181,8 @@ + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:background="@drawable/bottom_sheet_background"> diff --git a/app/src/main/res/layout/dialog_repositories.xml b/app/src/main/res/layout/dialog_repositories.xml index 66ae2850..6eb41d8c 100644 --- a/app/src/main/res/layout/dialog_repositories.xml +++ b/app/src/main/res/layout/dialog_repositories.xml @@ -16,11 +16,11 @@ android:id="@+id/repositoryTextBox" android:layout_width="match_parent" android:layout_height="wrap_content" + android:imeOptions="actionDone" app:boxCornerRadiusBottomEnd="8dp" app:boxCornerRadiusBottomStart="8dp" app:boxCornerRadiusTopEnd="8dp" app:boxCornerRadiusTopStart="8dp" - android:imeOptions="actionDone" app:hintAnimationEnabled="true" /> diff --git a/app/src/main/res/layout/dialog_user_agent.xml b/app/src/main/res/layout/dialog_user_agent.xml index fa9ac0c1..05b86db4 100644 --- a/app/src/main/res/layout/dialog_user_agent.xml +++ b/app/src/main/res/layout/dialog_user_agent.xml @@ -21,11 +21,11 @@ android:layout_height="wrap_content" android:layout_marginTop="8dp" android:hint="@string/user_agent" + android:imeOptions="actionDone" app:boxCornerRadiusBottomEnd="8dp" app:boxCornerRadiusBottomStart="8dp" app:boxCornerRadiusTopEnd="8dp" app:boxCornerRadiusTopStart="8dp" - android:imeOptions="actionDone" app:hintAnimationEnabled="true" /> diff --git a/app/src/main/res/layout/exo_player_control_view.xml b/app/src/main/res/layout/exo_player_control_view.xml index 8b406292..cdd2a7a8 100644 --- a/app/src/main/res/layout/exo_player_control_view.xml +++ b/app/src/main/res/layout/exo_player_control_view.xml @@ -132,9 +132,9 @@ android:layout_width="48dp" android:layout_height="48dp" android:backgroundTint="#00FFFFFF" - android:visibility="gone" android:scaleX="-1" android:src="@drawable/ic_round_subtitles_24" + android:visibility="gone" app:tint="#fff" tools:ignore="ContentDescription,SpeakableTextPresentCheck" /> @@ -143,8 +143,8 @@ android:layout_width="48dp" android:layout_height="48dp" android:backgroundTint="#00FFFFFF" - android:visibility="gone" android:src="@drawable/ic_round_audiotrack_24" + android:visibility="gone" app:tint="#fff" tools:ignore="ContentDescription,SpeakableTextPresentCheck" /> @@ -168,9 +168,9 @@ android:layout_height="48dp" android:backgroundTint="#00FFFFFF" android:visibility="gone" - app:mediaRouteButtonTint="#fff" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:mediaRouteButtonTint="#fff" tools:ignore="ContentDescription,SpeakableTextPresentCheck" /> - + tools:visibility="gone" /> - - - + + + diff --git a/app/src/main/res/layout/fragment_media_info.xml b/app/src/main/res/layout/fragment_media_info.xml index fddf1767..5bf851e7 100644 --- a/app/src/main/res/layout/fragment_media_info.xml +++ b/app/src/main/res/layout/fragment_media_info.xml @@ -297,6 +297,7 @@ android:fontFamily="@font/poppins_bold" android:textAlignment="textEnd" /> + + - + + + + - - diff --git a/app/src/main/res/layout/fragment_offline_page.xml b/app/src/main/res/layout/fragment_offline_page.xml index 08bf854a..f53a8fb8 100644 --- a/app/src/main/res/layout/fragment_offline_page.xml +++ b/app/src/main/res/layout/fragment_offline_page.xml @@ -82,46 +82,46 @@ - + android:paddingLeft="32dp" + android:paddingRight="32dp"> - + - + - + diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index b7b12e47..b44588ea 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -1,11 +1,10 @@ - + android:layout_height="match_parent" + android:scrollbars="none"> + android:paddingEnd="16dp" + android:paddingBottom="16dp"> + android:textColor="?attr/colorPrimary" + android:textSize="12sp" /> @@ -125,7 +125,7 @@ android:id="@+id/statisticList" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" android:nestedScrollingEnabled="true" + android:orientation="vertical" tools:listitem="@layout/item_chart" /> diff --git a/app/src/main/res/layout/item_activity.xml b/app/src/main/res/layout/item_activity.xml index e45d45ca..610e18b0 100644 --- a/app/src/main/res/layout/item_activity.xml +++ b/app/src/main/res/layout/item_activity.xml @@ -150,8 +150,8 @@ android:layout_height="160dp" android:layout_gravity="center" android:scaleType="centerCrop" - tools:srcCompat="@tools:sample/backgrounds/scenic" tools:ignore="ContentDescription,ImageContrastCheck" + tools:srcCompat="@tools:sample/backgrounds/scenic" tools:tint="@color/transparent" /> diff --git a/app/src/main/res/layout/item_activity_reply.xml b/app/src/main/res/layout/item_activity_reply.xml index 238d5316..a1c0aa04 100644 --- a/app/src/main/res/layout/item_activity_reply.xml +++ b/app/src/main/res/layout/item_activity_reply.xml @@ -4,8 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="16dp" android:layout_marginStart="8dp" + android:layout_marginTop="16dp" android:background="?attr/colorSurface" android:orientation="vertical"> diff --git a/app/src/main/res/layout/item_anime_watch.xml b/app/src/main/res/layout/item_anime_watch.xml index bcbd1fdb..3169efb0 100644 --- a/app/src/main/res/layout/item_anime_watch.xml +++ b/app/src/main/res/layout/item_anime_watch.xml @@ -35,7 +35,7 @@ app:icon="@drawable/ic_round_play_circle_24" app:iconTint="@color/bg_white" tools:ignore="TextContrastCheck" - tools:visibility="visible"/> + tools:visibility="visible" /> + app:useMaterialThemeColors="true" /> + tools:ignore="RtlSymmetry" + tools:text="Dubbed" /> @@ -343,36 +343,36 @@ android:layout_marginBottom="8dp" tools:visibility="gone" /> - - - + android:layout_height="match_parent" + android:gravity="center" + android:orientation="vertical"> -