diff --git a/app/build.gradle b/app/build.gradle index 308ac0bf..117a1cc9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -135,13 +135,13 @@ dependencies { // Markwon ext.markwon_version = '4.6.2' - implementation "io.noties.markwon:core:$markwon_version" - implementation "io.noties.markwon:editor:$markwon_version" - implementation "io.noties.markwon:ext-strikethrough:$markwon_version" - implementation "io.noties.markwon:ext-tables:$markwon_version" - implementation "io.noties.markwon:ext-tasklist:$markwon_version" - implementation "io.noties.markwon:html:$markwon_version" - implementation "io.noties.markwon:image-glide:$markwon_version" + implementation "io.noties.markwon:core:$markwon_version" + implementation "io.noties.markwon:editor:$markwon_version" + implementation "io.noties.markwon:ext-strikethrough:$markwon_version" + implementation "io.noties.markwon:ext-tables:$markwon_version" + implementation "io.noties.markwon:ext-tasklist:$markwon_version" + implementation "io.noties.markwon:html:$markwon_version" + implementation "io.noties.markwon:image-glide:$markwon_version" // Groupie ext.groupie_version = '2.10.1' diff --git a/app/src/google/java/ani/dantotsu/connections/crashlytics/FirebaseCrashlytics.kt b/app/src/google/java/ani/dantotsu/connections/crashlytics/FirebaseCrashlytics.kt index 64ab524f..105bcbf0 100644 --- a/app/src/google/java/ani/dantotsu/connections/crashlytics/FirebaseCrashlytics.kt +++ b/app/src/google/java/ani/dantotsu/connections/crashlytics/FirebaseCrashlytics.kt @@ -5,12 +5,12 @@ import com.google.firebase.FirebaseApp import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.crashlytics.ktx.crashlytics import com.google.firebase.ktx.Firebase -import com.google.firebase.ktx.app class FirebaseCrashlytics : CrashlyticsInterface { override fun initialize(context: Context) { FirebaseApp.initializeApp(context) } + override fun logException(e: Throwable) { FirebaseCrashlytics.getInstance().recordException(e) } diff --git a/app/src/google/java/ani/dantotsu/others/AppUpdater.kt b/app/src/google/java/ani/dantotsu/others/AppUpdater.kt index 6eb137a3..67b7ce43 100644 --- a/app/src/google/java/ani/dantotsu/others/AppUpdater.kt +++ b/app/src/google/java/ani/dantotsu/others/AppUpdater.kt @@ -8,7 +8,6 @@ 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 android.widget.TextView import androidx.core.content.ContextCompat @@ -88,7 +87,11 @@ object AppUpdater { try { val apks = client.get("https://api.github.com/repos/$repo/releases/tags/v$version") - .parsed().assets?.filter { it.browserDownloadURL.endsWith(".apk") } + .parsed().assets?.filter { + it.browserDownloadURL.endsWith( + ".apk" + ) + } val apkToDownload = apks?.first() apkToDownload?.browserDownloadURL.apply { if (this != null) activity.downloadUpdate(version, this) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 385f4fa7..203d7307 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,9 @@ + + @@ -42,8 +44,10 @@ - + + @@ -88,7 +92,7 @@ - + @@ -167,7 +171,7 @@ android:name=".widgets.statistics.ProfileStatsConfigure" android:exported="true"> - + @@ -430,10 +434,11 @@ android:name="androidx.media3.exoplayer.scheduler.PlatformScheduler$PlatformSchedulerService" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" /> - + android:foregroundServiceType="dataSync" + android:stopWithTask="true" /> = Build.VERSION_CODES.P && statusBarHeight == 0 - && a.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { + && a.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT + ) { window.decorView.rootWindowInsets?.displayCutout?.apply { if (boundingRects.size > 0) { statusBarHeight = min(boundingRects[0].width(), boundingRects[0].height()) @@ -296,7 +294,12 @@ fun ViewGroup.setBaseline(navBar: AnimatedBottomBar, overlayView: View) { navBar.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) overlayView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) clipToPadding = false - setPadding(paddingLeft, paddingTop, paddingRight, navBarHeight + navBar.measuredHeight + overlayView.measuredHeight) + setPadding( + paddingLeft, + paddingTop, + paddingRight, + navBarHeight + navBar.measuredHeight + overlayView.measuredHeight + ) } fun Activity.reloadActivity() { @@ -310,7 +313,8 @@ fun Activity.restartApp() { val mainIntent = Intent.makeRestartActivityTask( packageManager.getLaunchIntentForPackage(this.packageName)!!.component ) - val component = ComponentName(this@restartApp.packageName, this@restartApp::class.qualifiedName!!) + val component = + ComponentName(this@restartApp.packageName, this@restartApp::class.qualifiedName!!) try { startActivity(Intent().setComponent(component)) } catch (e: Exception) { @@ -953,7 +957,8 @@ fun copyToClipboard(string: String, toast: Boolean = true) { fun countDown(media: Media, view: ViewGroup) { if (media.anime?.nextAiringEpisode != null && media.anime.nextAiringEpisodeTime != null - && (media.anime.nextAiringEpisodeTime!! - System.currentTimeMillis() / 1000) <= 86400 * 28.toLong()) { + && (media.anime.nextAiringEpisodeTime!! - System.currentTimeMillis() / 1000) <= 86400 * 28.toLong() + ) { val v = ItemCountDownBinding.inflate(LayoutInflater.from(view.context), view, false) view.addView(v.root, 0) v.mediaCountdownText.text = @@ -1025,7 +1030,7 @@ fun displayTimer(media: Media, view: ViewGroup) { when { media.anime != null -> countDown(media, view) media.format == "MANGA" || media.format == "ONE_SHOT" -> sinceWhen(media, view) - else -> { } // No timer yet + else -> {} // No timer yet } } diff --git a/app/src/main/java/ani/dantotsu/MainActivity.kt b/app/src/main/java/ani/dantotsu/MainActivity.kt index 18f59786..4681961a 100644 --- a/app/src/main/java/ani/dantotsu/MainActivity.kt +++ b/app/src/main/java/ani/dantotsu/MainActivity.kt @@ -35,12 +35,12 @@ import androidx.lifecycle.lifecycleScope import androidx.media3.common.util.UnstableApi import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.work.OneTimeWorkRequest +import ani.dantotsu.addons.torrent.ServerService +import ani.dantotsu.addons.torrent.TorrentAddonManager import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.anilist.AnilistHomeViewModel import ani.dantotsu.databinding.ActivityMainBinding import ani.dantotsu.databinding.SplashScreenBinding -import ani.dantotsu.addons.torrent.ServerService -import ani.dantotsu.addons.torrent.TorrentAddonManager import ani.dantotsu.home.AnimeFragment import ani.dantotsu.home.HomeFragment import ani.dantotsu.home.LoginFragment diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt b/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt index 65fbb3cd..9810b8c5 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/Anilist.kt @@ -3,7 +3,6 @@ package ani.dantotsu.connections.anilist import android.content.ActivityNotFoundException import android.content.Context import android.net.Uri -import android.util.Log import androidx.browser.customtabs.CustomTabsIntent import ani.dantotsu.R import ani.dantotsu.client @@ -14,7 +13,6 @@ import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.snackString import ani.dantotsu.toast -import ani.dantotsu.tryWithSuspend import ani.dantotsu.util.Logger import java.util.Calendar @@ -201,7 +199,9 @@ object Anilist { toast("Rate limited. Try after $retry seconds") throw Exception("Rate limited after $retry seconds") } - if (!json.text.startsWith("{")) {throw Exception(currContext()?.getString(R.string.anilist_down))} + if (!json.text.startsWith("{")) { + throw Exception(currContext()?.getString(R.string.anilist_down)) + } if (show) Logger.log("Anilist Response: ${json.text}") json.parsed() } else null 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 bddedf3f..b39aeebc 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -1061,21 +1061,32 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: } return null } - private val onListAnime = (if(PrefManager.getVal(PrefName.IncludeAnimeList)) "" else "onList:false").replace("\"", "") - private val isAdult = (if (PrefManager.getVal(PrefName.AdultOnly)) "isAdult:true" else "").replace("\"", "") - private fun recentAnimeUpdates(page: Int): String{ + + private val onListAnime = + (if (PrefManager.getVal(PrefName.IncludeAnimeList)) "" else "onList:false").replace( + "\"", + "" + ) + private val isAdult = + (if (PrefManager.getVal(PrefName.AdultOnly)) "isAdult:true" else "").replace("\"", "") + + private fun recentAnimeUpdates(page: Int): String { return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}airingSchedules(airingAt_greater:0 airingAt_lesser:${System.currentTimeMillis() / 1000 - 10000} sort:TIME_DESC){episode airingAt media{id idMal status chapters episodes nextAiringEpisode{episode} isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large} title{english romaji userPreferred} mediaListEntry{progress private score(format:POINT_100) status}}}}""" } - private fun trendingMovies(page: Int): String{ + + private fun trendingMovies(page: Int): String { return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: ANIME, format: MOVIE, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun topRatedAnime(page: Int): String{ + + private fun topRatedAnime(page: Int): String { return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: ANIME, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun mostFavAnime(page: Int): String{ + + private fun mostFavAnime(page: Int): String { return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: ANIME, $onListAnime, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - suspend fun loadAnimeList(): Map>{ + + suspend fun loadAnimeList(): Map> { val list = mutableMapOf>() fun query(): String { return """{ @@ -1136,26 +1147,37 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: } return list } - private val onListManga = (if(PrefManager.getVal(PrefName.IncludeMangaList)) "" else "onList:false").replace("\"", "") - private fun trendingManga(page: Int): String{ + + private val onListManga = + (if (PrefManager.getVal(PrefName.IncludeMangaList)) "" else "onList:false").replace( + "\"", + "" + ) + + private fun trendingManga(page: Int): String { return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA,countryOfOrigin:JP, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun trendingManhwa(page: Int): String{ + + private fun trendingManhwa(page: Int): String { return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, countryOfOrigin:KR, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun trendingNovel(page: Int): String{ + + private fun trendingNovel(page: Int): String { return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:POPULARITY_DESC, type: MANGA, format: NOVEL, countryOfOrigin:JP, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun topRatedManga(page: Int): String{ + + private fun topRatedManga(page: Int): String { return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort: SCORE_DESC, type: MANGA, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - private fun mostFavManga(page: Int): String{ + + private fun mostFavManga(page: Int): String { return """Page(page:$page,perPage:50){pageInfo{hasNextPage total}media(sort:FAVOURITES_DESC,type: MANGA, $onListManga, $isAdult){id idMal status chapters episodes nextAiringEpisode{episode}isAdult type meanScore isFavourite format bannerImage countryOfOrigin coverImage{large}title{english romaji userPreferred}mediaListEntry{progress private score(format:POINT_100)status}}}""" } - suspend fun loadMangaList(): Map>{ + + suspend fun loadMangaList(): Map> { val list = mutableMapOf>() - fun query(): String{ - return """{ + fun query(): String { + return """{ trendingManga:${trendingManga(1)} trendingManga2:${trendingManga(2)} trendingManhwa:${trendingManhwa(1)} @@ -1169,7 +1191,7 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: }""".trimIndent() } - executeQuery(query() , force = true)?.data?.apply { + executeQuery(query(), force = true)?.data?.apply { list["trendingManga"] = trendingManga?.media?.map { Media(it) } as ArrayList list["trendingManhwa"] = trendingManhwa?.media?.map { Media(it) } as ArrayList list["trendingNovel"] = trendingNovel?.media?.map { Media(it) } as ArrayList @@ -1185,6 +1207,7 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: return list } + suspend fun recentlyUpdated( greater: Long = 0, lesser: Long = System.currentTimeMillis() / 1000 - 10000 @@ -1235,25 +1258,26 @@ Page(page:$page,perPage:50) { }""".replace("\n", " ").replace(""" """, "") return executeQuery(query, force = true)?.data?.page } - var i = 1 - val list = mutableListOf() - var res: Page? = null - suspend fun next() { - res = execute(i) - list.addAll(res?.airingSchedules?.mapNotNull { j -> - j.media?.let { - if (it.countryOfOrigin == "JP" && (if (!Anilist.adult) it.isAdult == false else true)) { - Media(it).apply { relation = "${j.episode},${j.airingAt}" } - } else null - } - } ?: listOf()) - } + + var i = 1 + val list = mutableListOf() + var res: Page? = null + suspend fun next() { + res = execute(i) + list.addAll(res?.airingSchedules?.mapNotNull { j -> + j.media?.let { + if (it.countryOfOrigin == "JP" && (if (!Anilist.adult) it.isAdult == false else true)) { + Media(it).apply { relation = "${j.episode},${j.airingAt}" } + } else null + } + } ?: listOf()) + } + next() + while (res?.pageInfo?.hasNextPage == true) { next() - while (res?.pageInfo?.hasNextPage == true) { - next() - i++ - } - return list.reversed().toMutableList() + i++ + } + return list.reversed().toMutableList() } suspend fun getCharacterDetails(character: Character): Character { @@ -1468,7 +1492,8 @@ Page(page:$page,perPage:50) { val characters = arrayListOf() while (hasNextPage) { page++ - val query = executeQuery(query(page), force = true + val query = executeQuery( + query(page), force = true )?.data?.author hasNextPage = query?.staffMedia?.let { it.edges?.forEach { i -> @@ -1487,7 +1512,16 @@ Page(page:$page,perPage:50) { } ?: false query?.characters?.let { it.nodes?.forEach { i -> - characters.add(Character(i.id, i.name?.userPreferred, i.image?.large, i.image?.medium, "", false)) + characters.add( + Character( + i.id, + i.name?.userPreferred, + i.image?.large, + i.image?.medium, + "", + false + ) + ) } } } @@ -1501,6 +1535,7 @@ Page(page:$page,perPage:50) { author.yearMedia = yearMedia return author } + suspend fun toggleFollow(id: Int): Query.ToggleFollow? { return executeQuery( """mutation{ToggleFollow(userId:$id){id, isFollowing, isFollower}}""" @@ -1568,7 +1603,11 @@ Page(page:$page,perPage:50) { } - suspend fun getNotifications(id: Int, page: Int = 1, resetNotification: Boolean = true): NotificationResponse? { + suspend fun getNotifications( + id: Int, + page: Int = 1, + resetNotification: Boolean = true + ): NotificationResponse? { val reset = if (resetNotification) "true" else "false" val res = executeQuery( """{User(id:$id){unreadNotificationCount}Page(page:$page,perPage:$ITEMS_PER_PAGE){pageInfo{currentPage,hasNextPage}notifications(resetNotificationCount:$reset){__typename...on AiringNotification{id,type,animeId,episode,contexts,createdAt,media{id,title{romaji,english,native,userPreferred}bannerImage,coverImage{medium,large}},}...on FollowingNotification{id,userId,type,context,createdAt,user{id,name,bannerImage,avatar{medium,large,}}}...on ActivityMessageNotification{id,userId,type,activityId,context,createdAt,message{id}user{id,name,bannerImage,avatar{medium,large,}}}...on ActivityMentionNotification{id,userId,type,activityId,context,createdAt,activity{__typename}user{id,name,bannerImage,avatar{medium,large,}}}...on ActivityReplyNotification{id,userId,type,activityId,context,createdAt,activity{__typename}user{id,name,bannerImage,avatar{medium,large,}}}...on ActivityReplySubscribedNotification{id,userId,type,activityId,context,createdAt,activity{__typename}user{id,name,bannerImage,avatar{medium,large,}}}...on ActivityLikeNotification{id,userId,type,activityId,context,createdAt,activity{__typename}user{id,name,bannerImage,avatar{medium,large,}}}...on ActivityReplyLikeNotification{id,userId,type,activityId,context,createdAt,activity{__typename}user{id,name,bannerImage,avatar{medium,large,}}}...on ThreadCommentMentionNotification{id,userId,type,commentId,context,createdAt,thread{id}comment{id}user{id,name,bannerImage,avatar{medium,large,}}}...on ThreadCommentReplyNotification{id,userId,type,commentId,context,createdAt,thread{id}comment{id}user{id,name,bannerImage,avatar{medium,large,}}}...on ThreadCommentSubscribedNotification{id,userId,type,commentId,context,createdAt,thread{id}comment{id}user{id,name,bannerImage,avatar{medium,large,}}}...on ThreadCommentLikeNotification{id,userId,type,commentId,context,createdAt,thread{id}comment{id}user{id,name,bannerImage,avatar{medium,large,}}}...on ThreadLikeNotification{id,userId,type,threadId,context,createdAt,thread{id}comment{id}user{id,name,bannerImage,avatar{medium,large,}}}...on RelatedMediaAdditionNotification{id,type,context,createdAt,media{id,title{romaji,english,native,userPreferred}bannerImage,coverImage{medium,large}}}...on MediaDataChangeNotification{id,type,mediaId,context,reason,createdAt,media{id,title{romaji,english,native,userPreferred}bannerImage,coverImage{medium,large}}}...on MediaMergeNotification{id,type,mediaId,deletedMediaTitles,context,reason,createdAt,media{id,title{romaji,english,native,userPreferred}bannerImage,coverImage{medium,large}}}...on MediaDeletionNotification{id,type,deletedMediaTitle,context,reason,createdAt,}}}}""", @@ -1583,7 +1622,12 @@ Page(page:$page,perPage:50) { return res } - suspend fun getFeed(userId: Int?, global: Boolean = false, page: Int = 1, activityId: Int? = null): FeedResponse? { + suspend fun getFeed( + userId: Int?, + global: Boolean = false, + page: Int = 1, + activityId: Int? = null + ): FeedResponse? { val filter = if (activityId != null) "id:$activityId," else if (userId != null) "userId:$userId," else if (global) "isFollowing:false,hasRepliesOrTypeText:true," @@ -1612,14 +1656,26 @@ Page(page:$page,perPage:50) { .filter { it.timeUntilAiring != null } } - suspend fun isUserFav(favType: AnilistMutations.FavType, id: Int): Boolean { //anilist isFavourite is broken, so we need to check it manually - val res = getUserProfile(Anilist.userid?: return false) + suspend fun isUserFav( + favType: AnilistMutations.FavType, + id: Int + ): Boolean { //anilist isFavourite is broken, so we need to check it manually + val res = getUserProfile(Anilist.userid ?: return false) return when (favType) { - AnilistMutations.FavType.ANIME -> res?.data?.user?.favourites?.anime?.nodes?.any { it.id == id } ?: false - AnilistMutations.FavType.MANGA -> res?.data?.user?.favourites?.manga?.nodes?.any { it.id == id } ?: false - AnilistMutations.FavType.CHARACTER -> res?.data?.user?.favourites?.characters?.nodes?.any { it.id == id } ?: false - AnilistMutations.FavType.STAFF -> res?.data?.user?.favourites?.staff?.nodes?.any { it.id == id } ?: false - AnilistMutations.FavType.STUDIO -> res?.data?.user?.favourites?.studios?.nodes?.any { it.id == id } ?: false + AnilistMutations.FavType.ANIME -> res?.data?.user?.favourites?.anime?.nodes?.any { it.id == id } + ?: false + + AnilistMutations.FavType.MANGA -> res?.data?.user?.favourites?.manga?.nodes?.any { it.id == id } + ?: false + + AnilistMutations.FavType.CHARACTER -> res?.data?.user?.favourites?.characters?.nodes?.any { it.id == id } + ?: false + + AnilistMutations.FavType.STAFF -> res?.data?.user?.favourites?.staff?.nodes?.any { it.id == id } + ?: false + + AnilistMutations.FavType.STUDIO -> res?.data?.user?.favourites?.studios?.nodes?.any { it.id == id } + ?: false } } diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt index 7c05586f..11d5cda1 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -5,9 +5,6 @@ import androidx.fragment.app.FragmentActivity import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.webkit.internal.ApiFeature.M -import androidx.webkit.internal.ApiFeature.P -import androidx.webkit.internal.StartupApiFeature import ani.dantotsu.BuildConfig import ani.dantotsu.R import ani.dantotsu.connections.discord.Discord @@ -190,21 +187,25 @@ class AnilistAnimeViewModel : ViewModel() { var loaded: Boolean = false private val updated: MutableLiveData> = MutableLiveData>(null) + fun getUpdated(): LiveData> = updated private val popularMovies: MutableLiveData> = MutableLiveData>(null) + fun getMovies(): LiveData> = popularMovies private val topRatedAnime: MutableLiveData> = MutableLiveData>(null) + fun getTopRated(): LiveData> = topRatedAnime private val mostFavAnime: MutableLiveData> = MutableLiveData>(null) + fun getMostFav(): LiveData> = mostFavAnime suspend fun loadAll() { - val list= Anilist.query.loadAnimeList() + val list = Anilist.query.loadAnimeList() updated.postValue(list["recentUpdates"]) popularMovies.postValue(list["trendingMovies"]) topRatedAnime.postValue(list["topRated"]) @@ -283,22 +284,27 @@ class AnilistMangaViewModel : ViewModel() { private val popularManga: MutableLiveData> = MutableLiveData>(null) + fun getPopularManga(): LiveData> = popularManga private val popularManhwa: MutableLiveData> = MutableLiveData>(null) + fun getPopularManhwa(): LiveData> = popularManhwa private val popularNovel: MutableLiveData> = MutableLiveData>(null) + fun getPopularNovel(): LiveData> = popularNovel private val topRatedManga: MutableLiveData> = MutableLiveData>(null) + fun getTopRated(): LiveData> = topRatedManga private val mostFavManga: MutableLiveData> = MutableLiveData>(null) + fun getMostFav(): LiveData> = mostFavManga suspend fun loadAll() { val list = Anilist.query.loadMangaList() diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/Login.kt b/app/src/main/java/ani/dantotsu/connections/anilist/Login.kt index 0ec87efb..c9e148a2 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/Login.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/Login.kt @@ -4,7 +4,6 @@ import android.net.Uri import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import ani.dantotsu.logError -import ani.dantotsu.util.Logger import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.startMainActivity diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/SearchResults.kt b/app/src/main/java/ani/dantotsu/connections/anilist/SearchResults.kt index 8458cc7e..6c2ca504 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/SearchResults.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/SearchResults.kt @@ -11,7 +11,7 @@ data class SearchResults( var onList: Boolean? = null, var perPage: Int? = null, var search: String? = null, - var countryOfOrigin :String? = null, + var countryOfOrigin: String? = null, var sort: String? = null, var genres: MutableList? = null, var excludedGenres: MutableList? = null, diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt b/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt index 499d4c30..d45fdc79 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/api/Data.kt @@ -149,8 +149,10 @@ class Query { @Serializable data class Data( @SerialName("favoriteAnime") val favoriteAnime: ani.dantotsu.connections.anilist.api.User?, - @SerialName("favoriteManga") val favoriteManga: ani.dantotsu.connections.anilist.api.User?) + @SerialName("favoriteManga") val favoriteManga: ani.dantotsu.connections.anilist.api.User? + ) } + @Serializable data class AnimeList( @SerialName("data") @@ -168,6 +170,7 @@ class Query { @SerialName("mostFav2") val mostFav2: ani.dantotsu.connections.anilist.api.Page?, ) } + @Serializable data class MangaList( @SerialName("data") @@ -187,6 +190,7 @@ class Query { @SerialName("mostFav2") val mostFav2: ani.dantotsu.connections.anilist.api.Page?, ) } + @Serializable data class ToggleFollow( @SerialName("data") @@ -317,13 +321,13 @@ class Query { val statistics: NNUserStatisticTypes, @SerialName("siteUrl") val siteUrl: String, - ): java.io.Serializable + ) : java.io.Serializable @Serializable data class NNUserStatisticTypes( @SerialName("anime") var anime: NNUserStatistics, @SerialName("manga") var manga: NNUserStatistics - ): java.io.Serializable + ) : java.io.Serializable @Serializable data class NNUserStatistics( @@ -334,7 +338,7 @@ class Query { @SerialName("episodesWatched") var episodesWatched: Int, @SerialName("chaptersRead") var chaptersRead: Int, @SerialName("volumesRead") var volumesRead: Int, - ): java.io.Serializable + ) : java.io.Serializable @Serializable data class UserFavourites( @@ -348,13 +352,13 @@ class Query { val staff: UserStaffFavouritesCollection, @SerialName("studios") val studios: UserStudioFavouritesCollection, - ): java.io.Serializable + ) : java.io.Serializable @Serializable data class UserMediaFavouritesCollection( @SerialName("nodes") val nodes: List, - ): java.io.Serializable + ) : java.io.Serializable @Serializable data class UserMediaImageFavorite( @@ -362,13 +366,13 @@ class Query { val id: Int, @SerialName("coverImage") val coverImage: MediaCoverImage - ): java.io.Serializable + ) : java.io.Serializable @Serializable data class UserCharacterFavouritesCollection( @SerialName("nodes") val nodes: List, - ): java.io.Serializable + ) : java.io.Serializable @Serializable data class UserCharacterImageFavorite( @@ -380,19 +384,19 @@ class Query { val image: CharacterImage, @SerialName("isFavourite") val isFavourite: Boolean - ): java.io.Serializable + ) : java.io.Serializable @Serializable data class UserStaffFavouritesCollection( @SerialName("nodes") val nodes: List, //downstream it's the same as character - ): java.io.Serializable + ) : java.io.Serializable @Serializable data class UserStudioFavouritesCollection( @SerialName("nodes") val nodes: List, - ): java.io.Serializable + ) : java.io.Serializable @Serializable data class UserStudioFavorite( @@ -400,7 +404,7 @@ class Query { val id: Int, @SerialName("name") val name: String, - ): java.io.Serializable + ) : java.io.Serializable //---------------------------------------- // Statistics @@ -409,12 +413,12 @@ class Query { data class StatisticsResponse( @SerialName("data") val data: Data - ): java.io.Serializable { + ) : java.io.Serializable { @Serializable data class Data( @SerialName("User") val user: StatisticsUser? - ): java.io.Serializable + ) : java.io.Serializable } @Serializable 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 1288cff9..a5c59ce1 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 @@ -21,6 +21,7 @@ enum class NotificationType(val value: String) { MEDIA_DATA_CHANGE("MEDIA_DATA_CHANGE"), MEDIA_MERGE("MEDIA_MERGE"), MEDIA_DELETION("MEDIA_DELETION"), + //custom COMMENT_REPLY("COMMENT_REPLY"), } diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/api/Staff.kt b/app/src/main/java/ani/dantotsu/connections/anilist/api/Staff.kt index 7b56f693..7c9cafe1 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/api/Staff.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/api/Staff.kt @@ -93,6 +93,7 @@ data class StaffConnection( // The pagination information // @SerialName("pageInfo") var pageInfo: PageInfo?, ) + @Serializable data class StaffImage( // The character's image of media at its largest size @@ -101,6 +102,7 @@ data class StaffImage( // The character's image of media at medium size @SerialName("medium") var medium: String?, ) : java.io.Serializable + @Serializable data class StaffEdge( var role: String?, diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/api/User.kt b/app/src/main/java/ani/dantotsu/connections/anilist/api/User.kt index b1ec8862..f6668fc4 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/api/User.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/api/User.kt @@ -111,7 +111,7 @@ data class UserAvatar( // The avatar of user at medium size @SerialName("medium") var medium: String?, -): java.io.Serializable +) : java.io.Serializable @Serializable data class UserStatisticTypes( diff --git a/app/src/main/java/ani/dantotsu/connections/bakaupdates/MangaUpdates.kt b/app/src/main/java/ani/dantotsu/connections/bakaupdates/MangaUpdates.kt index 426abc51..ec66cb7c 100644 --- a/app/src/main/java/ani/dantotsu/connections/bakaupdates/MangaUpdates.kt +++ b/app/src/main/java/ani/dantotsu/connections/bakaupdates/MangaUpdates.kt @@ -24,7 +24,7 @@ class MangaUpdates { private val apiUrl = "https://api.mangaupdates.com/v1/releases/search" - suspend fun search(title: String, startDate: FuzzyDate?) : MangaUpdatesResponse.Results? { + suspend fun search(title: String, startDate: FuzzyDate?): MangaUpdatesResponse.Results? { return tryWithSuspend { val query = JSONObject().apply { try { @@ -96,6 +96,7 @@ class MangaUpdates { @SerialName("release_date") val releaseDate: String ) + @Serializable data class MetaData( val series: Series diff --git a/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt b/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt index 9c6d473c..ea62d728 100644 --- a/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt +++ b/app/src/main/java/ani/dantotsu/connections/comments/CommentsAPI.kt @@ -32,7 +32,12 @@ object CommentsAPI { var isMod: Boolean = false var totalVotes: Int = 0 - suspend fun getCommentsForId(id: Int, page: Int = 1, tag: Int?, sort: String?): CommentResponse? { + suspend fun getCommentsForId( + id: Int, + page: Int = 1, + tag: Int?, + sort: String? + ): CommentResponse? { var url = "$ADDRESS/comments/$id/$page" val request = requestBuilder() tag?.let { @@ -399,7 +404,7 @@ object CommentsAPI { null } val message = parsed?.message ?: reason ?: error - val fullMessage = if(code == 500) message else "$code: $message" + val fullMessage = if (code == 500) message else "$code: $message" toast(fullMessage) } diff --git a/app/src/main/java/ani/dantotsu/connections/crashlytics/CrashlyticsStub.kt b/app/src/main/java/ani/dantotsu/connections/crashlytics/CrashlyticsStub.kt index 6c4e988a..76c072e1 100644 --- a/app/src/main/java/ani/dantotsu/connections/crashlytics/CrashlyticsStub.kt +++ b/app/src/main/java/ani/dantotsu/connections/crashlytics/CrashlyticsStub.kt @@ -7,6 +7,7 @@ class CrashlyticsStub : CrashlyticsInterface { override fun initialize(context: Context) { //no-op } + override fun logException(e: Throwable) { Logger.log(e) } diff --git a/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt b/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt index b8c52766..9b6d19a1 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/DiscordService.kt @@ -63,7 +63,7 @@ class DiscordService : Service() { PowerManager.PARTIAL_WAKE_LOCK, "discordRPC:backgroundPresence" ) - wakeLock.acquire(30*60*1000L /*30 minutes*/) + wakeLock.acquire(30 * 60 * 1000L /*30 minutes*/) log("WakeLock Acquired") if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val serviceChannel = NotificationChannel( @@ -402,7 +402,8 @@ class DiscordService : Service() { Thread.sleep(heartbeat.toLong()) heartbeatSend(webSocket, sequence) log("WebSocket: Heartbeat Sent") - } catch (ignored: InterruptedException) { } + } catch (ignored: InterruptedException) { + } } } diff --git a/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt b/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt index ee2d3b6a..f46dd63d 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt @@ -71,7 +71,7 @@ open class RPC(val token: String, val coroutineContext: CoroutineContext) { assets = Activity.Assets( largeImage = data.largeImage?.url?.discordUrl(), largeText = data.largeImage?.label, - smallImage = if (PrefManager.getVal(PrefName.ShowAniListIcon)) Discord.small_Image_AniList.discordUrl() else Discord.small_Image.discordUrl(), + smallImage = if (PrefManager.getVal(PrefName.ShowAniListIcon)) Discord.small_Image_AniList.discordUrl() else Discord.small_Image.discordUrl(), smallText = if (PrefManager.getVal(PrefName.ShowAniListIcon)) "Anilist" else "Dantotsu", ), buttons = data.buttons.map { it.label }, diff --git a/app/src/main/java/ani/dantotsu/connections/github/Forks.kt b/app/src/main/java/ani/dantotsu/connections/github/Forks.kt index d620742e..d9ae6424 100644 --- a/app/src/main/java/ani/dantotsu/connections/github/Forks.kt +++ b/app/src/main/java/ani/dantotsu/connections/github/Forks.kt @@ -1,9 +1,7 @@ package ani.dantotsu.connections.github import ani.dantotsu.Mapper -import ani.dantotsu.R import ani.dantotsu.client -import ani.dantotsu.getAppString import ani.dantotsu.settings.Developer import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking @@ -17,10 +15,11 @@ class Forks { fun getForks(): Array { var forks = arrayOf() runBlocking(Dispatchers.IO) { - val res = client.get("https://api.github.com/repos/rebelonion/Dantotsu/forks?sort=stargazers") - .parsed().map { - Mapper.json.decodeFromJsonElement(it) - } + val res = + client.get("https://api.github.com/repos/rebelonion/Dantotsu/forks?sort=stargazers") + .parsed().map { + Mapper.json.decodeFromJsonElement(it) + } res.forEach { forks = forks.plus( Developer( diff --git a/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt b/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt index 75c6626c..b2b9af38 100644 --- a/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt +++ b/app/src/main/java/ani/dantotsu/download/DownloadsManager.kt @@ -53,7 +53,11 @@ class DownloadsManager(private val context: Context) { saveDownloads() } - fun removeDownload(downloadedType: DownloadedType, toast: Boolean = true, onFinished: () -> Unit) { + fun removeDownload( + downloadedType: DownloadedType, + toast: Boolean = true, + onFinished: () -> Unit + ) { downloadsList.remove(downloadedType) CoroutineScope(Dispatchers.IO).launch { removeDirectory(downloadedType, toast) diff --git a/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt b/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt index c5120abf..dd8c326b 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt @@ -73,7 +73,7 @@ class AnimeDownloaderService : Service() { private val mutex = Mutex() private var isCurrentlyProcessing = false private var currentTasks: MutableList = mutableListOf() - private val ffExtension = Injekt.get().extension?.extension + private val ffExtension = Injekt.get().extension?.extension override fun onBind(intent: Intent?): IBinder? { // This is only required for bound services. @@ -244,7 +244,8 @@ class AnimeDownloaderService : Service() { headersStringBuilder.append("\"").append("User-Agent: ") .append(defaultHeaders["User-Agent"]).append("\"\'\r\n\'") } - val probeRequest = "-headers $headersStringBuilder -i ${task.video.file.url} -show_entries format=duration -v quiet -of csv=\"p=0\"" + val probeRequest = + "-headers $headersStringBuilder -i ${task.video.file.url} -show_entries format=duration -v quiet -of csv=\"p=0\"" ffExtension.executeFFProbe( probeRequest ) { 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 ce8acb7a..bc1d8e31 100644 --- a/app/src/main/java/ani/dantotsu/download/novel/NovelDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/novel/NovelDownloaderService.kt @@ -267,7 +267,9 @@ class NovelDownloaderService : Service() { task.coverUrl?.let { file.parentFile?.let { it1 -> downloadImage(it, it1, "cover.jpg") } } - val outputStream = this@NovelDownloaderService.contentResolver.openOutputStream(file.uri) ?: throw Exception("Could not open OutputStream") + val outputStream = + this@NovelDownloaderService.contentResolver.openOutputStream(file.uri) + ?: throw Exception("Could not open OutputStream") val sink = outputStream.sink().buffer() val responseBody = response.body diff --git a/app/src/main/java/ani/dantotsu/notifications/AlarmManagerScheduler.kt b/app/src/main/java/ani/dantotsu/notifications/AlarmManagerScheduler.kt index 3cc6b110..f5ed216c 100644 --- a/app/src/main/java/ani/dantotsu/notifications/AlarmManagerScheduler.kt +++ b/app/src/main/java/ani/dantotsu/notifications/AlarmManagerScheduler.kt @@ -5,9 +5,9 @@ import android.app.PendingIntent import android.content.Context import android.content.Intent import android.os.Build +import ani.dantotsu.notifications.TaskScheduler.TaskType import ani.dantotsu.notifications.anilist.AnilistNotificationReceiver import ani.dantotsu.notifications.comment.CommentNotificationReceiver -import ani.dantotsu.notifications.TaskScheduler.TaskType import ani.dantotsu.notifications.subscription.SubscriptionNotificationReceiver import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName diff --git a/app/src/main/java/ani/dantotsu/notifications/BootCompletedReceiver.kt b/app/src/main/java/ani/dantotsu/notifications/BootCompletedReceiver.kt index 8cfc0a1c..66c1f294 100644 --- a/app/src/main/java/ani/dantotsu/notifications/BootCompletedReceiver.kt +++ b/app/src/main/java/ani/dantotsu/notifications/BootCompletedReceiver.kt @@ -5,9 +5,9 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.os.Build +import ani.dantotsu.notifications.TaskScheduler.TaskType import ani.dantotsu.notifications.anilist.AnilistNotificationWorker import ani.dantotsu.notifications.comment.CommentNotificationWorker -import ani.dantotsu.notifications.TaskScheduler.TaskType import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.util.Logger diff --git a/app/src/main/java/ani/dantotsu/notifications/TaskScheduler.kt b/app/src/main/java/ani/dantotsu/notifications/TaskScheduler.kt index 04e431db..77ab1316 100644 --- a/app/src/main/java/ani/dantotsu/notifications/TaskScheduler.kt +++ b/app/src/main/java/ani/dantotsu/notifications/TaskScheduler.kt @@ -21,11 +21,16 @@ interface TaskScheduler { for (taskType in TaskType.entries) { val interval = when (taskType) { TaskType.COMMENT_NOTIFICATION -> CommentNotificationWorker.checkIntervals[PrefManager.getVal( - PrefName.CommentNotificationInterval)] + PrefName.CommentNotificationInterval + )] + TaskType.ANILIST_NOTIFICATION -> AnilistNotificationWorker.checkIntervals[PrefManager.getVal( - PrefName.AnilistNotificationInterval)] + PrefName.AnilistNotificationInterval + )] + TaskType.SUBSCRIPTION_NOTIFICATION -> SubscriptionNotificationWorker.checkIntervals[PrefManager.getVal( - PrefName.SubscriptionNotificationInterval)] + PrefName.SubscriptionNotificationInterval + )] } scheduleRepeatingTask(taskType, interval) } @@ -62,6 +67,7 @@ interface TaskScheduler { } } } + enum class TaskType { COMMENT_NOTIFICATION, ANILIST_NOTIFICATION, diff --git a/app/src/main/java/ani/dantotsu/notifications/comment/MediaNameFetch.kt b/app/src/main/java/ani/dantotsu/notifications/comment/MediaNameFetch.kt index 15e0e7e6..96e006bb 100644 --- a/app/src/main/java/ani/dantotsu/notifications/comment/MediaNameFetch.kt +++ b/app/src/main/java/ani/dantotsu/notifications/comment/MediaNameFetch.kt @@ -66,6 +66,7 @@ class MediaNameFetch { val type = object : TypeToken() {}.type return gson.fromJson(response, type) } + data class ReturnedData(val title: String, val coverImage: String, val color: String) data class MediaResponse(val data: Map) diff --git a/app/src/main/java/ani/dantotsu/notifications/subscription/SubscriptionHelper.kt b/app/src/main/java/ani/dantotsu/notifications/subscription/SubscriptionHelper.kt index 1e2f3db3..9905cb86 100644 --- a/app/src/main/java/ani/dantotsu/notifications/subscription/SubscriptionHelper.kt +++ b/app/src/main/java/ani/dantotsu/notifications/subscription/SubscriptionHelper.kt @@ -32,7 +32,7 @@ class SubscriptionHelper { return data } - private fun saveSelected( mediaId: Int, data: Selected) { + private fun saveSelected(mediaId: Int, data: Selected) { PrefManager.setCustomVal("${mediaId}-select", data) } diff --git a/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt index d78cc5af..3f07c7c0 100644 --- a/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/AnimeExtensionsFragment.kt @@ -6,20 +6,15 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.app.NotificationCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager -import ani.dantotsu.R -import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.databinding.FragmentExtensionsBinding import ani.dantotsu.settings.paging.AnimeExtensionAdapter import ani.dantotsu.settings.paging.AnimeExtensionsViewModel import ani.dantotsu.settings.paging.AnimeExtensionsViewModelFactory import ani.dantotsu.settings.paging.OnAnimeInstallClickListener -import ani.dantotsu.snackString -import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.anime.model.AnimeExtension import kotlinx.coroutines.flow.collectLatest diff --git a/app/src/main/java/ani/dantotsu/settings/DiscordDialogFragment.kt b/app/src/main/java/ani/dantotsu/settings/DiscordDialogFragment.kt index 1c546b6f..5254dcd2 100644 --- a/app/src/main/java/ani/dantotsu/settings/DiscordDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/DiscordDialogFragment.kt @@ -10,7 +10,7 @@ import ani.dantotsu.databinding.BottomSheetDiscordRpcBinding import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName -class DiscordDialogFragment: BottomSheetDialogFragment() { +class DiscordDialogFragment : BottomSheetDialogFragment() { private var _binding: BottomSheetDiscordRpcBinding? = null private val binding get() = _binding!! @@ -22,11 +22,12 @@ class DiscordDialogFragment: BottomSheetDialogFragment() { _binding = BottomSheetDiscordRpcBinding.inflate(inflater, container, false) return binding.root } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) when (PrefManager.getCustomVal("discord_mode", "dantotsu")) { - "nothing" -> binding.radioNothing.isChecked= true + "nothing" -> binding.radioNothing.isChecked = true "dantotsu" -> binding.radioDantotsu.isChecked = true "anilist" -> binding.radioAnilist.isChecked = true else -> binding.radioAnilist.isChecked = true @@ -35,7 +36,8 @@ class DiscordDialogFragment: BottomSheetDialogFragment() { binding.showIcon.setOnCheckedChangeListener { _, isChecked -> PrefManager.setVal(PrefName.ShowAniListIcon, isChecked) } - binding.anilistLinkPreview.text = getString(R.string.anilist_link, PrefManager.getVal(PrefName.AnilistUserName)) + binding.anilistLinkPreview.text = + getString(R.string.anilist_link, PrefManager.getVal(PrefName.AnilistUserName)) binding.radioGroup.setOnCheckedChangeListener { _, checkedId -> val mode = when (checkedId) { diff --git a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt index 506a43fb..0125c3df 100644 --- a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt @@ -213,9 +213,17 @@ class ExtensionsActivity : AppCompatActivity() { private fun getSavedRepositories(repoInventory: ViewGroup, type: MediaType) { repoInventory.removeAllViews() val prefName: PrefName? = when (type) { - MediaType.ANIME -> { PrefName.AnimeExtensionRepos } - MediaType.MANGA -> { PrefName.MangaExtensionRepos } - else -> { null } + MediaType.ANIME -> { + PrefName.AnimeExtensionRepos + } + + MediaType.MANGA -> { + PrefName.MangaExtensionRepos + } + + else -> { + null + } } prefName?.let { repoList -> PrefManager.getVal>(repoList).forEach { item -> @@ -233,9 +241,15 @@ class ExtensionsActivity : AppCompatActivity() { repoInventory.removeView(view.root) CoroutineScope(Dispatchers.IO).launch { when (type) { - MediaType.ANIME -> { animeExtensionManager.findAvailableExtensions() } - MediaType.MANGA -> { mangaExtensionManager.findAvailableExtensions() } - else -> { } + MediaType.ANIME -> { + animeExtensionManager.findAvailableExtensions() + } + + MediaType.MANGA -> { + mangaExtensionManager.findAvailableExtensions() + } + + else -> {} } } dialog.dismiss() @@ -274,9 +288,17 @@ class ExtensionsActivity : AppCompatActivity() { private fun generateRepositoryButton(type: MediaType) { val hintResource: Int? = when (type) { - MediaType.ANIME -> { R.string.anime_add_repository } - MediaType.MANGA -> { R.string.manga_add_repository } - else -> { null } + MediaType.ANIME -> { + R.string.anime_add_repository + } + + MediaType.MANGA -> { + R.string.manga_add_repository + } + + else -> { + null + } } hintResource?.let { res -> binding.openSettingsButton.setOnClickListener { diff --git a/app/src/main/java/ani/dantotsu/settings/InstallerSteps.kt b/app/src/main/java/ani/dantotsu/settings/InstallerSteps.kt index 13cd4251..39b91b3e 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstallerSteps.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstallerSteps.kt @@ -11,7 +11,10 @@ import eu.kanade.tachiyomi.extension.InstallStep import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -class InstallerSteps(private val notificationManager: NotificationManager, private val context: Context) { +class InstallerSteps( + private val notificationManager: NotificationManager, + private val context: Context +) { fun onInstallStep(installStep: InstallStep, extra: () -> Unit) { val builder = NotificationCompat.Builder( diff --git a/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt b/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt index c2d64f37..d198793f 100644 --- a/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/MangaExtensionsFragment.kt @@ -6,20 +6,15 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.core.app.NotificationCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager -import ani.dantotsu.R -import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.databinding.FragmentExtensionsBinding import ani.dantotsu.settings.paging.MangaExtensionAdapter import ani.dantotsu.settings.paging.MangaExtensionsViewModel import ani.dantotsu.settings.paging.MangaExtensionsViewModelFactory import ani.dantotsu.settings.paging.OnMangaInstallClickListener -import ani.dantotsu.snackString -import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager import eu.kanade.tachiyomi.extension.manga.model.MangaExtension import kotlinx.coroutines.flow.collectLatest diff --git a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt index dd6f0c71..9006228a 100644 --- a/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/PlayerSettingsActivity.kt @@ -24,7 +24,6 @@ import ani.dantotsu.others.getSerialized import ani.dantotsu.parsers.Subtitle import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName -import ani.dantotsu.settings.saving.internal.Pref import ani.dantotsu.snackString import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager @@ -40,9 +39,10 @@ class PlayerSettingsActivity : AppCompatActivity() { var media: Media? = null var subtitle: Subtitle? = null - private val Int.toSP get() = TypedValue.applyDimension( - TypedValue.COMPLEX_UNIT_SP, this.toFloat(), Resources.getSystem().displayMetrics - ) + private val Int.toSP + get() = TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_SP, this.toFloat(), Resources.getSystem().displayMetrics + ) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -151,8 +151,10 @@ class PlayerSettingsActivity : AppCompatActivity() { binding.playerSettingsTimeStampsAutoHide.isEnabled = isChecked } - binding.playerSettingsTimeStampsAutoHide.isChecked = PrefManager.getVal(PrefName.AutoHideTimeStamps) - binding.playerSettingsTimeStampsAutoHide.isEnabled = binding.playerSettingsShowTimeStamp.isChecked + binding.playerSettingsTimeStampsAutoHide.isChecked = + PrefManager.getVal(PrefName.AutoHideTimeStamps) + binding.playerSettingsTimeStampsAutoHide.isEnabled = + binding.playerSettingsShowTimeStamp.isChecked binding.playerSettingsTimeStampsAutoHide.setOnCheckedChangeListener { _, isChecked -> PrefManager.setVal(PrefName.AutoHideTimeStamps, isChecked) } @@ -484,10 +486,11 @@ class PlayerSettingsActivity : AppCompatActivity() { updateSubPreview() } } - binding.subtitleTest.addOnChangeListener(object: Xpandable.OnChangeListener { + binding.subtitleTest.addOnChangeListener(object : Xpandable.OnChangeListener { override fun onExpand() { updateSubPreview() } + override fun onRetract() {} }) updateSubPreview() @@ -496,24 +499,26 @@ class PlayerSettingsActivity : AppCompatActivity() { private fun updateSubPreview() { binding.subtitleTestWindow.run { alpha = PrefManager.getVal(PrefName.SubAlpha) - setBackgroundColor(when (PrefManager.getVal(PrefName.SubWindow)) { - 0 -> Color.TRANSPARENT - 1 -> Color.BLACK - 2 -> Color.DKGRAY - 3 -> Color.GRAY - 4 -> Color.LTGRAY - 5 -> Color.WHITE - 6 -> Color.RED - 7 -> Color.YELLOW - 8 -> Color.GREEN - 9 -> Color.CYAN - 10 -> Color.BLUE - 11 -> Color.MAGENTA - else -> Color.TRANSPARENT - }) + setBackgroundColor( + when (PrefManager.getVal(PrefName.SubWindow)) { + 0 -> Color.TRANSPARENT + 1 -> Color.BLACK + 2 -> Color.DKGRAY + 3 -> Color.GRAY + 4 -> Color.LTGRAY + 5 -> Color.WHITE + 6 -> Color.RED + 7 -> Color.YELLOW + 8 -> Color.GREEN + 9 -> Color.CYAN + 10 -> Color.BLUE + 11 -> Color.MAGENTA + else -> Color.TRANSPARENT + } + ) } binding.subtitleTestText.run { - textSize = PrefManager.getVal(PrefName.FontSize).toSP + textSize = PrefManager.getVal(PrefName.FontSize).toSP typeface = when (PrefManager.getVal(PrefName.Font)) { 0 -> ResourcesCompat.getFont(this.context, R.font.poppins_semi_bold) 1 -> ResourcesCompat.getFont(this.context, R.font.poppins_bold) @@ -524,36 +529,40 @@ class PlayerSettingsActivity : AppCompatActivity() { 6 -> ResourcesCompat.getFont(this.context, R.font.blocky) else -> ResourcesCompat.getFont(this.context, R.font.poppins_semi_bold) } - setTextColor(when (PrefManager.getVal(PrefName.PrimaryColor)) { - 0 -> Color.BLACK - 1 -> Color.DKGRAY - 2 -> Color.GRAY - 3 -> Color.LTGRAY - 4 -> Color.WHITE - 5 -> Color.RED - 6 -> Color.YELLOW - 7 -> Color.GREEN - 8 -> Color.CYAN - 9 -> Color.BLUE - 10 -> Color.MAGENTA - 11 -> Color.TRANSPARENT - else -> Color.WHITE - }) - setBackgroundColor(when (PrefManager.getVal(PrefName.SubBackground)) { - 0 -> Color.TRANSPARENT - 1 -> Color.BLACK - 2 -> Color.DKGRAY - 3 -> Color.GRAY - 4 -> Color.LTGRAY - 5 -> Color.WHITE - 6 -> Color.RED - 7 -> Color.YELLOW - 8 -> Color.GREEN - 9 -> Color.CYAN - 10 -> Color.BLUE - 11 -> Color.MAGENTA - else -> Color.TRANSPARENT - }) + setTextColor( + when (PrefManager.getVal(PrefName.PrimaryColor)) { + 0 -> Color.BLACK + 1 -> Color.DKGRAY + 2 -> Color.GRAY + 3 -> Color.LTGRAY + 4 -> Color.WHITE + 5 -> Color.RED + 6 -> Color.YELLOW + 7 -> Color.GREEN + 8 -> Color.CYAN + 9 -> Color.BLUE + 10 -> Color.MAGENTA + 11 -> Color.TRANSPARENT + else -> Color.WHITE + } + ) + setBackgroundColor( + when (PrefManager.getVal(PrefName.SubBackground)) { + 0 -> Color.TRANSPARENT + 1 -> Color.BLACK + 2 -> Color.DKGRAY + 3 -> Color.GRAY + 4 -> Color.LTGRAY + 5 -> Color.WHITE + 6 -> Color.RED + 7 -> Color.YELLOW + 8 -> Color.GREEN + 9 -> Color.CYAN + 10 -> Color.BLUE + 11 -> Color.MAGENTA + else -> Color.TRANSPARENT + } + ) } } } diff --git a/app/src/main/java/ani/dantotsu/settings/Settings.kt b/app/src/main/java/ani/dantotsu/settings/Settings.kt index db3f1d22..a8d48e6c 100644 --- a/app/src/main/java/ani/dantotsu/settings/Settings.kt +++ b/app/src/main/java/ani/dantotsu/settings/Settings.kt @@ -5,15 +5,15 @@ import ani.dantotsu.databinding.ItemSettingsSwitchBinding data class Settings( val type: Int, - val name : String, + val name: String, val desc: String, - val icon : Int, + val icon: Int, val onClick: ((ItemSettingsBinding) -> Unit)? = null, val onLongClick: (() -> Unit)? = null, - val switch: ((isChecked:Boolean , view: ItemSettingsSwitchBinding ) -> Unit)? = null, - val attach:((ItemSettingsBinding) -> Unit)? = null, - val attachToSwitch : ((ItemSettingsSwitchBinding) -> Unit)? = null, + val switch: ((isChecked: Boolean, view: ItemSettingsSwitchBinding) -> Unit)? = null, + val attach: ((ItemSettingsBinding) -> Unit)? = null, + val attachToSwitch: ((ItemSettingsSwitchBinding) -> Unit)? = null, val isVisible: Boolean = true, val isActivity: Boolean = false, - var isChecked : Boolean = false, + var isChecked: Boolean = false, ) \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsAboutActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsAboutActivity.kt index 664e9f91..d3183be4 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsAboutActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsAboutActivity.kt @@ -95,7 +95,7 @@ class SettingsAboutActivity : AppCompatActivity() { Settings( type = 1, name = getString(R.string.devs), - desc= getString(R.string.devs_desc), + desc = getString(R.string.devs_desc), icon = R.drawable.ic_round_accessible_forward_24, onClick = { DevelopersDialogFragment().show(supportFragmentManager, "dialog") @@ -131,7 +131,8 @@ class SettingsAboutActivity : AppCompatActivity() { ), ) ) - binding.settingsRecyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) + binding.settingsRecyclerView.layoutManager = + LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) } } } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsAccountActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsAccountActivity.kt index fd3300a4..362afcbb 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsAccountActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsAccountActivity.kt @@ -13,7 +13,6 @@ import ani.dantotsu.R import ani.dantotsu.connections.anilist.Anilist import ani.dantotsu.connections.discord.Discord import ani.dantotsu.connections.mal.MAL -import ani.dantotsu.databinding.ActivitySettingsAboutBinding import ani.dantotsu.databinding.ActivitySettingsAccountsBinding import ani.dantotsu.initActivity import ani.dantotsu.loadImage @@ -33,6 +32,7 @@ class SettingsAccountActivity : AppCompatActivity() { private val restartMainActivity = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() = startMainActivity(this@SettingsAccountActivity) } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ThemeManager(this).applyTheme() diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt index 60f8dace..9f7bc7f8 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsActivity.kt @@ -12,7 +12,6 @@ import android.os.Bundle import android.view.ViewGroup import android.widget.TextView import androidx.activity.addCallback -import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.AppCompatActivity import androidx.core.view.updateLayoutParams import androidx.lifecycle.lifecycleScope @@ -69,11 +68,11 @@ class SettingsActivity : AppCompatActivity() { bottomMargin = navBarHeight } - onBackPressedDispatcher.addCallback(context){ + onBackPressedDispatcher.addCallback(context) { if (PrefManager.getCustomVal("reload", false)) { startMainActivity(context) PrefManager.setCustomVal("reload", false) - }else{ + } else { finish() } } @@ -278,6 +277,7 @@ class SettingsActivity : AppCompatActivity() { ?: "Unknown Architecture" } } + override fun onResume() { ThemeManager(this).applyTheme() super.onResume() diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsAddonActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsAddonActivity.kt index bf616cd3..f0665137 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsAddonActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsAddonActivity.kt @@ -2,19 +2,14 @@ package ani.dantotsu.settings import android.content.Context import android.os.Bundle -import android.view.View import android.view.ViewGroup import android.view.animation.LinearInterpolator -import android.widget.ImageView -import android.widget.TextView import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.ContextCompat import androidx.core.view.updateLayoutParams import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import ani.dantotsu.R import ani.dantotsu.addons.AddonDownloader -import ani.dantotsu.addons.AddonListener import ani.dantotsu.addons.download.DownloadAddonManager import ani.dantotsu.addons.torrent.ServerService import ani.dantotsu.addons.torrent.TorrentAddonManager @@ -27,15 +22,12 @@ import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.snackString import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager -import ani.dantotsu.toast import ani.dantotsu.util.Logger import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.isActive -import kotlinx.coroutines.job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import tachiyomi.core.util.lang.launchIO diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsAnimeActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsAnimeActivity.kt index e75758b0..6e137d47 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsAnimeActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsAnimeActivity.kt @@ -22,7 +22,7 @@ import ani.dantotsu.themes.ThemeManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -class SettingsAnimeActivity: AppCompatActivity(){ +class SettingsAnimeActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsAnimeBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -59,7 +59,12 @@ class SettingsAnimeActivity: AppCompatActivity(){ onClick = { val dialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.purge_anime_downloads) - .setMessage(getString(R.string.purge_confirm, getString(R.string.anime))) + .setMessage( + getString( + R.string.purge_confirm, + getString(R.string.anime) + ) + ) .setPositiveButton(R.string.yes) { dialog, _ -> val downloadsManager = Injekt.get() downloadsManager.purgeDownloads(MediaType.ANIME) diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsCommonActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsCommonActivity.kt index 0bbdd406..23ad6747 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsCommonActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsCommonActivity.kt @@ -41,9 +41,10 @@ import kotlinx.coroutines.launch import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -class SettingsCommonActivity: AppCompatActivity(){ +class SettingsCommonActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsCommonBinding private lateinit var launcher: LauncherWrapper + @OptIn(DelicateCoroutinesApi::class) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -138,7 +139,12 @@ class SettingsCommonActivity: AppCompatActivity(){ desc = getString(R.string.ui_settings), icon = R.drawable.ic_round_auto_awesome_24, onClick = { - startActivity(Intent(context, UserInterfaceSettingsActivity::class.java)) + startActivity( + Intent( + context, + UserInterfaceSettingsActivity::class.java + ) + ) }, isActivity = true ), @@ -150,7 +156,8 @@ class SettingsCommonActivity: AppCompatActivity(){ onClick = { val managers = arrayOf("Default", "1DM", "ADM") val downloadManagerDialog = - AlertDialog.Builder(context, R.style.MyPopup).setTitle(R.string.download_manager) + AlertDialog.Builder(context, R.style.MyPopup) + .setTitle(R.string.download_manager) var downloadManager: Int = PrefManager.getVal(PrefName.DownloadManager) val dialog = downloadManagerDialog.setSingleChoiceItems( managers, downloadManager @@ -231,7 +238,8 @@ class SettingsCommonActivity: AppCompatActivity(){ launcher.registerForCallback { success -> if (success) { toast(getString(R.string.please_wait)) - val newUri = PrefManager.getVal(PrefName.DownloadsDir) + val newUri = + PrefManager.getVal(PrefName.DownloadsDir) GlobalScope.launch(Dispatchers.IO) { Injekt.get().moveDownloadsDir( context, Uri.parse(oldUri), Uri.parse(newUri) @@ -262,7 +270,7 @@ class SettingsCommonActivity: AppCompatActivity(){ desc = getString(R.string.always_continue_content), icon = R.drawable.ic_round_delete_24, isChecked = PrefManager.getVal(PrefName.ContinueMedia), - switch = {isChecked, _ -> + switch = { isChecked, _ -> PrefManager.setVal(PrefName.ContinueMedia, isChecked) } ), @@ -272,7 +280,7 @@ class SettingsCommonActivity: AppCompatActivity(){ desc = getString(R.string.search_source_list), icon = R.drawable.ic_round_search_sources_24, isChecked = PrefManager.getVal(PrefName.SearchSources), - switch = {isChecked, _ -> + switch = { isChecked, _ -> PrefManager.setVal(PrefName.SearchSources, isChecked) } ), @@ -282,7 +290,7 @@ class SettingsCommonActivity: AppCompatActivity(){ desc = getString(R.string.recentlyListOnly), icon = R.drawable.ic_round_new_releases_24, isChecked = PrefManager.getVal(PrefName.RecentlyListOnly), - switch = {isChecked, _ -> + switch = { isChecked, _ -> PrefManager.setVal(PrefName.RecentlyListOnly, isChecked) } ), @@ -292,7 +300,7 @@ class SettingsCommonActivity: AppCompatActivity(){ desc = getString(R.string.adult_only_content), icon = R.drawable.ic_round_nsfw_24, isChecked = PrefManager.getVal(PrefName.AdultOnly), - switch = {isChecked, _ -> + switch = { isChecked, _ -> PrefManager.setVal(PrefName.AdultOnly, isChecked) restartApp() }, @@ -334,6 +342,7 @@ class SettingsCommonActivity: AppCompatActivity(){ } } + private fun passwordAlertDialog(isExporting: Boolean, callback: (CharArray?) -> Unit) { val password = CharArray(16).apply { fill('0') } diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt b/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt index 535b7273..078c179e 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsDialogFragment.kt @@ -74,15 +74,15 @@ class SettingsDialogFragment : BottomSheetDialogFragment() { binding.settingsLogin.setText(R.string.logout) binding.settingsLogin.setOnClickListener { val alertDialog = AlertDialog.Builder(requireContext(), R.style.MyPopup) - .setTitle("Logout") - .setMessage("Are you sure you want to logout?") - .setPositiveButton("Yes") { _, _ -> - Anilist.removeSavedToken() - dismiss() - startMainActivity(requireActivity()) - } - .setNegativeButton("No") { _, _ -> } - .create() + .setTitle("Logout") + .setMessage("Are you sure you want to logout?") + .setPositiveButton("Yes") { _, _ -> + Anilist.removeSavedToken() + dismiss() + startMainActivity(requireActivity()) + } + .setNegativeButton("No") { _, _ -> } + .create() alertDialog.window?.setDimAmount(0.8f) alertDialog.show() } @@ -98,7 +98,7 @@ class SettingsDialogFragment : BottomSheetDialogFragment() { } binding.settingsNotificationCount.isVisible = Anilist.unreadNotificationCount > 0 binding.settingsNotificationCount.text = Anilist.unreadNotificationCount.toString() - binding.settingsUserAvatar.setOnClickListener{ + binding.settingsUserAvatar.setOnClickListener { ContextCompat.startActivity( requireContext(), Intent(requireContext(), ProfileActivity::class.java) .putExtra("userId", Anilist.userid), null diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsExtensionsActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsExtensionsActivity.kt index 3b4d3a06..43f8efba 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsExtensionsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsExtensionsActivity.kt @@ -24,7 +24,6 @@ import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager -import com.google.android.material.textfield.TextInputEditText import eu.kanade.domain.base.BasePreferences import eu.kanade.tachiyomi.extension.anime.AnimeExtensionManager import eu.kanade.tachiyomi.extension.manga.MangaExtensionManager @@ -35,7 +34,7 @@ import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy -class SettingsExtensionsActivity: AppCompatActivity() { +class SettingsExtensionsActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsExtensionsBinding private val extensionInstaller = Injekt.get().extensionInstaller() private val animeExtensionManager: AnimeExtensionManager by injectLazy() @@ -52,7 +51,7 @@ class SettingsExtensionsActivity: AppCompatActivity() { topMargin = statusBarHeight bottomMargin = navBarHeight } - extensionSettingsBack.setOnClickListener{ + extensionSettingsBack.setOnClickListener { onBackPressedDispatcher.onBackPressed() } fun setExtensionOutput(repoInventory: ViewGroup, type: MediaType) { @@ -139,7 +138,12 @@ class SettingsExtensionsActivity: AppCompatActivity() { } } - fun processEditorAction(dialog: AlertDialog, editText: EditText, mediaType: MediaType, view: ViewGroup) { + fun processEditorAction( + dialog: AlertDialog, + editText: EditText, + mediaType: MediaType, + view: ViewGroup + ) { editText.setOnEditorActionListener { textView, action, keyEvent -> if (action == EditorInfo.IME_ACTION_SEARCH || action == EditorInfo.IME_ACTION_DONE || (keyEvent?.action == KeyEvent.ACTION_UP && keyEvent.keyCode == KeyEvent.KEYCODE_ENTER)) { return@setOnEditorActionListener if (textView.text.isNullOrBlank()) { @@ -163,8 +167,8 @@ class SettingsExtensionsActivity: AppCompatActivity() { onClick = { val dialogView = DialogUserAgentBinding.inflate(layoutInflater) val editText = dialogView.userAgentTextBox.apply { - hint = getString(R.string.anime_add_repository) - } + hint = getString(R.string.anime_add_repository) + } val alertDialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.anime_add_repository).setView(dialogView.root) .setPositiveButton(getString(R.string.ok)) { dialog, _ -> @@ -178,7 +182,12 @@ class SettingsExtensionsActivity: AppCompatActivity() { dialog.dismiss() }.create() - processEditorAction(alertDialog, editText, MediaType.ANIME, it.attachView) + processEditorAction( + alertDialog, + editText, + MediaType.ANIME, + it.attachView + ) alertDialog.show() alertDialog.window?.setDimAmount(0.8f) }, @@ -194,8 +203,8 @@ class SettingsExtensionsActivity: AppCompatActivity() { onClick = { val dialogView = DialogUserAgentBinding.inflate(layoutInflater) val editText = dialogView.userAgentTextBox.apply { - hint = getString(R.string.manga_add_repository) - } + hint = getString(R.string.manga_add_repository) + } val alertDialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.manga_add_repository).setView(dialogView.root) .setPositiveButton(getString(R.string.ok)) { dialog, _ -> @@ -209,7 +218,12 @@ class SettingsExtensionsActivity: AppCompatActivity() { dialog.dismiss() }.create() - processEditorAction(alertDialog, editText, MediaType.MANGA, it.attachView) + processEditorAction( + alertDialog, + editText, + MediaType.MANGA, + it.attachView + ) alertDialog.show() alertDialog.window?.setDimAmount(0.8f) }, @@ -229,7 +243,10 @@ class SettingsExtensionsActivity: AppCompatActivity() { val alertDialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.user_agent).setView(dialogView.root) .setPositiveButton(getString(R.string.ok)) { dialog, _ -> - PrefManager.setVal(PrefName.DefaultUserAgent, editText.text.toString()) + PrefManager.setVal( + PrefName.DefaultUserAgent, + editText.text.toString() + ) dialog.dismiss() }.setNeutralButton(getString(R.string.reset)) { dialog, _ -> PrefManager.removeVal(PrefName.DefaultUserAgent) @@ -248,7 +265,7 @@ class SettingsExtensionsActivity: AppCompatActivity() { name = getString(R.string.force_legacy_installer), desc = getString(R.string.force_legacy_installer), icon = R.drawable.ic_round_new_releases_24, - isChecked = extensionInstaller.get() == BasePreferences.ExtensionInstaller.LEGACY, + isChecked = extensionInstaller.get() == BasePreferences.ExtensionInstaller.LEGACY, switch = { isChecked, _ -> if (isChecked) { extensionInstaller.set(BasePreferences.ExtensionInstaller.LEGACY) diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsMangaActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsMangaActivity.kt index 5b5a7750..9b485ea6 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsMangaActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsMangaActivity.kt @@ -22,7 +22,7 @@ import ani.dantotsu.themes.ThemeManager import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -class SettingsMangaActivity: AppCompatActivity(){ +class SettingsMangaActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsMangaBinding override fun onCreate(savedInstanceState: Bundle?) { @@ -82,7 +82,12 @@ class SettingsMangaActivity: AppCompatActivity(){ onClick = { val dialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.purge_manga_downloads) - .setMessage(getString(R.string.purge_confirm, getString(R.string.manga))) + .setMessage( + getString( + R.string.purge_confirm, + getString(R.string.manga) + ) + ) .setPositiveButton(R.string.yes) { dialog, _ -> val downloadsManager = Injekt.get() downloadsManager.purgeDownloads(MediaType.MANGA) @@ -103,7 +108,12 @@ class SettingsMangaActivity: AppCompatActivity(){ onClick = { val dialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.purge_novel_downloads) - .setMessage(getString(R.string.purge_confirm, getString(R.string.novels))) + .setMessage( + getString( + R.string.purge_confirm, + getString(R.string.novels) + ) + ) .setPositiveButton(R.string.yes) { dialog, _ -> val downloadsManager = Injekt.get() downloadsManager.purgeDownloads(MediaType.NOVEL) @@ -121,7 +131,7 @@ class SettingsMangaActivity: AppCompatActivity(){ desc = getString(R.string.include_list), icon = R.drawable.view_list_24, isChecked = PrefManager.getVal(PrefName.IncludeMangaList), - switch = {isChecked, _ -> + switch = { isChecked, _ -> PrefManager.setVal(PrefName.IncludeMangaList, isChecked) restartApp() } diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsNotificationActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsNotificationActivity.kt index 7958ea9e..edeb23e3 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsNotificationActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsNotificationActivity.kt @@ -25,7 +25,7 @@ import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager -class SettingsNotificationActivity: AppCompatActivity(){ +class SettingsNotificationActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsNotificationsBinding override fun onCreate(savedInstanceState: Bundle?) { @@ -68,22 +68,32 @@ class SettingsNotificationActivity: AppCompatActivity(){ arrayListOf( Settings( type = 1, - name = getString(R.string.subscriptions_checking_time_s, timeNames[curTime]), + name = getString( + R.string.subscriptions_checking_time_s, + timeNames[curTime] + ), desc = getString(R.string.subscriptions_info), icon = R.drawable.ic_round_notifications_none_24, onClick = { val speedDialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.subscriptions_checking_time) - val dialog = speedDialog.setSingleChoiceItems(timeNames, curTime) { dialog, i -> - curTime = i - it.settingsTitle.text= - getString(R.string.subscriptions_checking_time_s, timeNames[i]) - PrefManager.setVal(PrefName.SubscriptionNotificationInterval, curTime) - dialog.dismiss() - TaskScheduler.create( - context, PrefManager.getVal(PrefName.UseAlarmManager) - ).scheduleAllTasks(context) - }.show() + val dialog = + speedDialog.setSingleChoiceItems(timeNames, curTime) { dialog, i -> + curTime = i + it.settingsTitle.text = + getString( + R.string.subscriptions_checking_time_s, + timeNames[i] + ) + PrefManager.setVal( + PrefName.SubscriptionNotificationInterval, + curTime + ) + dialog.dismiss() + TaskScheduler.create( + context, PrefManager.getVal(PrefName.UseAlarmManager) + ).scheduleAllTasks(context) + }.show() dialog.window?.setDimAmount(0.8f) }, onLongClick = { @@ -100,11 +110,15 @@ class SettingsNotificationActivity: AppCompatActivity(){ onClick = { val types = NotificationType.entries.map { it.name } val filteredTypes = - PrefManager.getVal>(PrefName.AnilistFilteredTypes).toMutableSet() + PrefManager.getVal>(PrefName.AnilistFilteredTypes) + .toMutableSet() val selected = types.map { filteredTypes.contains(it) }.toBooleanArray() val dialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.anilist_notification_filters) - .setMultiChoiceItems(types.toTypedArray(), selected) { _, which, isChecked -> + .setMultiChoiceItems( + types.toTypedArray(), + selected + ) { _, which, isChecked -> val type = types[which] if (isChecked) { filteredTypes.add(type) @@ -130,13 +144,20 @@ class SettingsNotificationActivity: AppCompatActivity(){ ), icon = R.drawable.ic_round_notifications_none_24, onClick = { - val selected = PrefManager.getVal(PrefName.AnilistNotificationInterval) + val selected = + PrefManager.getVal(PrefName.AnilistNotificationInterval) val dialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.subscriptions_checking_time) - .setSingleChoiceItems(aItems.toTypedArray(), selected) { dialog, i -> + .setSingleChoiceItems( + aItems.toTypedArray(), + selected + ) { dialog, i -> PrefManager.setVal(PrefName.AnilistNotificationInterval, i) it.settingsTitle.text = - getString(R.string.anilist_notifications_checking_time, aItems[i]) + getString( + R.string.anilist_notifications_checking_time, + aItems[i] + ) dialog.dismiss() TaskScheduler.create( context, PrefManager.getVal(PrefName.UseAlarmManager) @@ -158,13 +179,20 @@ class SettingsNotificationActivity: AppCompatActivity(){ ), icon = R.drawable.ic_round_notifications_none_24, onClick = { - val selected = PrefManager.getVal(PrefName.CommentNotificationInterval) + val selected = + PrefManager.getVal(PrefName.CommentNotificationInterval) val dialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.subscriptions_checking_time) - .setSingleChoiceItems(cItems.toTypedArray(), selected) { dialog, i -> + .setSingleChoiceItems( + cItems.toTypedArray(), + selected + ) { dialog, i -> PrefManager.setVal(PrefName.CommentNotificationInterval, i) it.settingsTitle.text = - getString(R.string.comment_notification_checking_time, cItems[i]) + getString( + R.string.comment_notification_checking_time, + cItems[i] + ) dialog.dismiss() TaskScheduler.create( context, PrefManager.getVal(PrefName.UseAlarmManager) @@ -181,7 +209,10 @@ class SettingsNotificationActivity: AppCompatActivity(){ icon = R.drawable.ic_round_smart_button_24, isChecked = PrefManager.getVal(PrefName.SubscriptionCheckingNotifications), switch = { isChecked, _ -> - PrefManager.setVal(PrefName.SubscriptionCheckingNotifications, isChecked) + PrefManager.setVal( + PrefName.SubscriptionCheckingNotifications, + isChecked + ) }, onLongClick = { openSettings(context, null) @@ -193,7 +224,7 @@ class SettingsNotificationActivity: AppCompatActivity(){ desc = getString(R.string.use_alarm_manager_reliable), icon = R.drawable.ic_anilist, isChecked = PrefManager.getVal(PrefName.UseAlarmManager), - switch = {isChecked, view -> + switch = { isChecked, view -> if (isChecked) { val alertDialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.use_alarm_manager) @@ -212,7 +243,7 @@ class SettingsNotificationActivity: AppCompatActivity(){ }.setNegativeButton(R.string.cancel) { dialog, _ -> view.settingsButton.isChecked = false PrefManager.setVal(PrefName.UseAlarmManager, false) - + dialog.dismiss() }.create() alertDialog.window?.setDimAmount(0.8f) diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsThemeActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsThemeActivity.kt index acad1ecd..308cc82b 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsThemeActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsThemeActivity.kt @@ -164,14 +164,17 @@ class SettingsThemeActivity : AppCompatActivity(), SimpleDialog.OnDialogResultLi icon = R.drawable.ic_palette, onClick = { val originalColor: Int = PrefManager.getVal(PrefName.CustomThemeInt) + class CustomColorDialog : SimpleColorDialog() { override fun onPositiveButtonClick() { reload() super.onPositiveButtonClick() } } + val tag = "colorPicker" - CustomColorDialog().title(R.string.custom_theme).colorPreset(originalColor) + CustomColorDialog().title(R.string.custom_theme) + .colorPreset(originalColor) .colors(context, SimpleColorDialog.MATERIAL_COLOR_PALLET) .allowCustom(true).showOutline(0x46000000).gridNumColumn(5) .choiceMode(SimpleColorDialog.SINGLE_CHOICE).neg() @@ -198,7 +201,8 @@ class SettingsThemeActivity : AppCompatActivity(), SimpleDialog.OnDialogResultLi } return true } - fun reload(){ + + fun reload() { PrefManager.setCustomVal("reload", true) restartApp() } diff --git a/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt index dfc3cff0..78cab787 100644 --- a/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt @@ -105,7 +105,7 @@ class UserInterfaceSettingsActivity : AppCompatActivity() { PrefManager.setVal(PrefName.BlurBanners, isChecked) restartApp() } - binding.uiSettingsBlurRadius.value = (PrefManager.getVal(PrefName.BlurRadius) as Float) + binding.uiSettingsBlurRadius.value = (PrefManager.getVal(PrefName.BlurRadius) as Float) binding.uiSettingsBlurRadius.addOnChangeListener { _, value, _ -> PrefManager.setVal(PrefName.BlurRadius, value) restartApp() diff --git a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt index b418915f..6adb2b11 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt @@ -102,7 +102,7 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files UseProxyForTimeStamps(Pref(Location.Player, Boolean::class, false)), ShowTimeStampButton(Pref(Location.Player, Boolean::class, true)), AutoSkipOPED(Pref(Location.Player, Boolean::class, false)), - AutoSkipRecap(Pref(Location.Player, Boolean::class, false )), + AutoSkipRecap(Pref(Location.Player, Boolean::class, false)), AutoPlay(Pref(Location.Player, Boolean::class, true)), AutoSkipFiller(Pref(Location.Player, Boolean::class, false)), AskIndividualPlayer(Pref(Location.Player, Boolean::class, true)), diff --git a/app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt b/app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt index 365cb4bd..562abbc6 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/SharedPreferenceLiveData.kt @@ -82,6 +82,7 @@ class SharedPreferenceStringSetLiveData( fun SharedPreferences.intLiveData(key: String, defValue: Int): SharedPreferenceLiveData { return SharedPreferenceIntLiveData(this, key, defValue) } + @Suppress("unused") fun SharedPreferences.stringLiveData( diff --git a/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsConfigure.kt b/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsConfigure.kt index 38509477..8fa27687 100644 --- a/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsConfigure.kt +++ b/app/src/main/java/ani/dantotsu/widgets/statistics/ProfileStatsConfigure.kt @@ -1,6 +1,5 @@ package ani.dantotsu.widgets.statistics -import android.app.Activity import android.appwidget.AppWidgetManager import android.content.Context import android.content.Intent @@ -12,9 +11,7 @@ import android.view.View import androidx.appcompat.app.AppCompatActivity import ani.dantotsu.R import ani.dantotsu.databinding.StatisticsWidgetConfigureBinding - import ani.dantotsu.themes.ThemeManager -import ani.dantotsu.widgets.upcoming.UpcomingWidget import com.google.android.material.button.MaterialButton import eltos.simpledialogfragment.SimpleDialog import eltos.simpledialogfragment.color.SimpleColorDialog @@ -64,9 +61,12 @@ class ProfileStatsConfigure : AppCompatActivity(), AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID ) - val prefs = getSharedPreferences(ProfileStatsWidget.getPrefsName(appWidgetId), Context.MODE_PRIVATE) - val topBackground = prefs.getInt(ProfileStatsWidget.PREF_BACKGROUND_COLOR, Color.parseColor("#80000000")) - (binding.topBackgroundButton as MaterialButton).iconTint = ColorStateList.valueOf(topBackground) + val prefs = + getSharedPreferences(ProfileStatsWidget.getPrefsName(appWidgetId), Context.MODE_PRIVATE) + val topBackground = + prefs.getInt(ProfileStatsWidget.PREF_BACKGROUND_COLOR, Color.parseColor("#80000000")) + (binding.topBackgroundButton as MaterialButton).iconTint = + ColorStateList.valueOf(topBackground) binding.topBackgroundButton.setOnClickListener { val tag = ProfileStatsWidget.PREF_BACKGROUND_COLOR SimpleColorDialog().title(R.string.custom_theme) @@ -83,8 +83,10 @@ class ProfileStatsConfigure : AppCompatActivity(), .neg() .show(this@ProfileStatsConfigure, tag) } - val bottomBackground = prefs.getInt(ProfileStatsWidget.PREF_BACKGROUND_FADE, Color.parseColor("#00000000")) - (binding.bottomBackgroundButton as MaterialButton).iconTint = ColorStateList.valueOf(bottomBackground) + val bottomBackground = + prefs.getInt(ProfileStatsWidget.PREF_BACKGROUND_FADE, Color.parseColor("#00000000")) + (binding.bottomBackgroundButton as MaterialButton).iconTint = + ColorStateList.valueOf(bottomBackground) binding.bottomBackgroundButton.setOnClickListener { val tag = ProfileStatsWidget.PREF_BACKGROUND_FADE SimpleColorDialog().title(R.string.custom_theme) @@ -196,7 +198,10 @@ class ProfileStatsConfigure : AppCompatActivity(), ) val subTextColor = typedValueOutline.data - getSharedPreferences(ProfileStatsWidget.getPrefsName(appWidgetId), Context.MODE_PRIVATE).edit().apply { + getSharedPreferences( + ProfileStatsWidget.getPrefsName(appWidgetId), + Context.MODE_PRIVATE + ).edit().apply { putInt(ProfileStatsWidget.PREF_BACKGROUND_COLOR, backgroundColor) putInt(ProfileStatsWidget.PREF_BACKGROUND_FADE, backgroundColor) putInt(ProfileStatsWidget.PREF_TITLE_TEXT_COLOR, textColor) 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 4586de92..8327ecdc 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,13 +41,17 @@ 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) = getSearchAnime + override fun fetchPopularAnime(page: Int) = fetchSearchAnime(page, "", POPULAR_FILTERS) @Deprecated("Use the non-RxJava API instead", replaceWith = ReplaceWith("getLatestUpdates")) - override fun fetchLatestUpdates(page: Int) = getSearchAnime + override fun fetchLatestUpdates(page: Int) = fetchSearchAnime(page, "", LATEST_FILTERS) @Deprecated("Use the non-RxJava API instead", replaceWith = ReplaceWith("getSearchAnime")) - override fun fetchSearchAnime(page: Int, query: String, filters: AnimeFilterList): Observable { + override fun fetchSearchAnime( + page: Int, + query: String, + filters: AnimeFilterList + ): Observable { return runBlocking { Observable.just(getSearchAnime(page, query, filters)) }