From 5e38b00c1f64486578d7cdaaba89aed0bc151400 Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Fri, 24 May 2024 12:39:03 -0500 Subject: [PATCH 001/112] fix: separate status query --- .../connections/anilist/AnilistQueries.kt | 151 +++++++++++------- .../connections/anilist/AnilistViewModel.kt | 5 +- .../java/ani/dantotsu/home/HomeFragment.kt | 3 + 3 files changed, 99 insertions(+), 60 deletions(-) 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 4315ad13..797e6191 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -211,7 +211,7 @@ class AnilistQueries { } } } - if (fetchedMedia.reviews?.nodes != null){ + if (fetchedMedia.reviews?.nodes != null) { media.review = fetchedMedia.reviews!!.nodes as ArrayList } if (user?.mediaList?.isNotEmpty() == true) { @@ -376,6 +376,7 @@ class AnilistQueries { } return media } + private fun continueMediaQuery(type: String, status: String): String { return """ MediaListCollection(userId: ${Anilist.userid}, type: $type, status: $status , sort: UPDATED_TIME ) { lists { entries { progress private score(format:POINT_100) status media { id idMal type isAdult status chapters episodes nextAiringEpisode {episode} meanScore isFavourite format bannerImage coverImage{large} title { english romaji userPreferred } } } } } """ } @@ -416,6 +417,54 @@ class AnilistQueries { return """ MediaListCollection(userId: ${Anilist.userid}, type: $type, status: PLANNING${if (type == "ANIME") ", sort: MEDIA_POPULARITY_DESC" else ""} ) { lists { entries { media { id mediaListEntry { progress private score(format:POINT_100) status } idMal type isAdult popularity status(version: 2) chapters episodes nextAiringEpisode {episode} meanScore isFavourite format bannerImage coverImage{large} title { english romaji userPreferred } } } } }""" } + suspend fun getUserStatus(): ArrayList? { + val toShow: List = + PrefManager.getVal(PrefName.HomeLayout) + if (toShow.getOrNull(7) != true) return null + var query = """{""" + query += "Page1:${status(1)}Page2:${status(2)}" + query += """}""".trimEnd(',') + val response = executeQuery(query, show = true) + val list = mutableListOf() + val threeDaysAgo = Calendar.getInstance().apply { + add(Calendar.DAY_OF_MONTH, -3) + }.timeInMillis + if (response?.data?.page1 != null && response.data.page2 != null) { + val activities = listOf( + response.data.page1.activities, + response.data.page2.activities + ).asSequence().flatten() + .filter { it.typename != "MessageActivity" } + .filter { if (Anilist.adult) true else it.media?.isAdult == false } + .filter { it.createdAt * 1000L > threeDaysAgo }.toList() + .sortedByDescending { it.createdAt } + val anilistActivities = mutableListOf() + val groupedActivities = activities.groupBy { it.userId } + + groupedActivities.forEach { (_, userActivities) -> + val user = userActivities.firstOrNull()?.user + if (user != null) { + val userToAdd = User( + user.id, + user.name ?: "", + user.avatar?.medium, + user.bannerImage, + activity = userActivities.sortedBy { it.createdAt }.toList() + ) + if (user.id == Anilist.userid) { + anilistActivities.add(0, userToAdd) + } else { + list.add(userToAdd) + } + } + } + + + list.addAll(0, anilistActivities) + return list.toCollection(ArrayList()) + } else return null + } + suspend fun initHomePage(): Map> { val removeList = PrefManager.getCustomVal("removeList", setOf()) val removedMedia = ArrayList() @@ -453,7 +502,6 @@ class AnilistQueries { "ANIME" ) }, recommendationPlannedQueryManga: ${recommendationPlannedQuery("MANGA")}""" - if (toShow.getOrNull(7) == true) query += "Page1:${status(1)}Page2:${status(2)}" query += """}""".trimEnd(',') val response = executeQuery(query, show = true) @@ -618,47 +666,8 @@ class AnilistQueries { list.sortByDescending { it.meanScore } returnMap["recommendations"] = list } - if (toShow.getOrNull(7) == true) { - val list = mutableListOf() - val threeDaysAgo = Calendar.getInstance().apply { - add(Calendar.DAY_OF_MONTH, -3) - }.timeInMillis - if (response?.data?.page1 != null && response.data.page2 != null) { - val activities = listOf( - response.data.page1.activities, - response.data.page2.activities - ).asSequence().flatten() - .filter { it.typename != "MessageActivity" } - .filter { if (Anilist.adult) true else it.media?.isAdult == false } - .filter { it.createdAt * 1000L > threeDaysAgo }.toList() - .sortedByDescending { it.createdAt } - val anilistActivities = mutableListOf() - val groupedActivities = activities.groupBy { it.userId } - groupedActivities.forEach { (_, userActivities) -> - val user = userActivities.firstOrNull()?.user - if (user != null) { - val userToAdd = User( - user.id, - user.name ?: "", - user.avatar?.medium, - user.bannerImage, - activity = userActivities.sortedBy { it.createdAt }.toList() - ) - if (user.id == Anilist.userid) { - anilistActivities.add(0, userToAdd) - } else { - list.add(userToAdd) - } - } - } - - - list.addAll(0, anilistActivities) - returnMap["status"] = ArrayList(list) - } - returnMap["hidden"] = removedMedia.distinctBy { it.id } as ArrayList - } + returnMap["hidden"] = removedMedia.distinctBy { it.id }.toCollection(arrayListOf()) return returnMap } @@ -1093,9 +1102,12 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: } }?.toCollection(ArrayList()) ?: arrayListOf() - list["trendingMovies"] = trendingMovies?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() - list["topRated"] = topRated?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() - list["mostFav"] = mostFav?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() + list["trendingMovies"] = + trendingMovies?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() + list["topRated"] = + topRated?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() + list["mostFav"] = + mostFav?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() list["recentUpdates"]?.addAll(recentUpdates2?.airingSchedules?.mapNotNull { i -> i.media?.let { @@ -1113,9 +1125,14 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: else null } }?.toCollection(ArrayList()) ?: arrayListOf()) - list["trendingMovies"]?.addAll(trendingMovies2?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf()) - list["topRated"]?.addAll(topRated2?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf()) - list["mostFav"]?.addAll(mostFav2?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf()) + list["trendingMovies"]?.addAll(trendingMovies2?.media?.map { Media(it) } + ?.toCollection(ArrayList()) ?: arrayListOf()) + list["topRated"]?.addAll( + topRated2?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() + ) + list["mostFav"]?.addAll( + mostFav2?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() + ) } return list } @@ -1164,15 +1181,26 @@ query (${"$"}page: Int = 1, ${"$"}id: Int, ${"$"}type: MediaType, ${"$"}isAdult: } executeQuery(query(), force = true)?.data?.apply { - list["trendingManga"] = trendingManga?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() - list["trendingManhwa"] = trendingManhwa?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() - list["trendingNovel"] = trendingNovel?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() - list["topRated"] = topRated?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() - list["mostFav"] = mostFav?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() + list["trendingManga"] = + trendingManga?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() + list["trendingManhwa"] = + trendingManhwa?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() + list["trendingNovel"] = + trendingNovel?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() + list["topRated"] = + topRated?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() + list["mostFav"] = + mostFav?.media?.map { Media(it) }?.toCollection(ArrayList()) ?: arrayListOf() - list["trendingManga"]?.addAll(trendingManga2?.media?.map { Media(it) }?.toList() ?: arrayListOf()) - list["trendingManhwa"]?.addAll(trendingManhwa2?.media?.map { Media(it) }?.toList() ?: arrayListOf()) - list["trendingNovel"]?.addAll(trendingNovel2?.media?.map { Media(it) }?.toList() ?: arrayListOf()) + list["trendingManga"]?.addAll( + trendingManga2?.media?.map { Media(it) }?.toList() ?: arrayListOf() + ) + list["trendingManhwa"]?.addAll( + trendingManhwa2?.media?.map { Media(it) }?.toList() ?: arrayListOf() + ) + list["trendingNovel"]?.addAll( + trendingNovel2?.media?.map { Media(it) }?.toList() ?: arrayListOf() + ) list["topRated"]?.addAll(topRated2?.media?.map { Media(it) }?.toList() ?: arrayListOf()) list["mostFav"]?.addAll(mostFav2?.media?.map { Media(it) }?.toList() ?: arrayListOf()) } @@ -1509,7 +1537,11 @@ Page(page:$page,perPage:50) { return author } - suspend fun getReviews(mediaId: Int, page: Int = 1, sort: String = "SCORE_DESC"): Query.ReviewsResponse? { + suspend fun getReviews( + mediaId: Int, + page: Int = 1, + sort: String = "SCORE_DESC" + ): Query.ReviewsResponse? { return executeQuery( """{Page(page:$page,perPage:10){pageInfo{currentPage,hasNextPage,total}reviews(mediaId:$mediaId,sort:$sort){id,mediaId,mediaType,summary,body(asHtml:true)rating,ratingAmount,userRating,score,private,siteUrl,createdAt,updatedAt,user{id,name,bannerImage avatar{medium,large}}}}}""", force = true @@ -1621,8 +1653,9 @@ Page(page:$page,perPage:50) { suspend fun getReplies( activityId: Int, page: Int = 1 - ) : ReplyResponse? { - val query = """{Page(page:$page,perPage:50){activityReplies(activityId:$activityId){id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}}}""" + ): ReplyResponse? { + val query = + """{Page(page:$page,perPage:50){activityReplies(activityId:$activityId){id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}}}""" return executeQuery(query, force = true) } 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 6cda8e7a..e75383a1 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -81,6 +81,10 @@ class AnilistHomeViewModel : ViewModel() { MutableLiveData>(null) fun getUserStatus(): LiveData> = userStatus + suspend fun initUserStatus() { + val res = Anilist.query.getUserStatus() + res?.let { userStatus.postValue(it) } + } private val hidden: MutableLiveData> = MutableLiveData>(null) @@ -98,7 +102,6 @@ class AnilistHomeViewModel : ViewModel() { res["plannedManga"]?.let { mangaPlanned.postValue(it as ArrayList?) } res["recommendations"]?.let { recommendation.postValue(it as ArrayList?) } res["hidden"]?.let { hidden.postValue(it as ArrayList?) } - res["status"]?.let { userStatus.postValue(it as ArrayList?) } } suspend fun loadMain(context: FragmentActivity) { diff --git a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt index fc729b9d..cb541c17 100644 --- a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt @@ -481,6 +481,9 @@ class HomeFragment : Fragment() { CoroutineScope(Dispatchers.IO).launch { model.setListImages() } + CoroutineScope(Dispatchers.IO).launch { + model.initUserStatus() + } var empty = true val homeLayoutShow: List = PrefManager.getVal(PrefName.HomeLayout) From 945018653ef4bdb4649d57c6e297a14654f070e6 Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Fri, 24 May 2024 13:28:26 -0500 Subject: [PATCH 002/112] fix: some network stuff --- .../kanade/tachiyomi/network/NetworkHelper.kt | 19 +++++++++++++---- .../interceptor/IgnoreGzipInterceptor.kt | 21 +++++++++++++++++++ .../UncaughtExceptionInterceptor.kt | 1 + 3 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/network/interceptor/IgnoreGzipInterceptor.kt 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 53149638..ef9855a8 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/NetworkHelper.kt @@ -5,8 +5,10 @@ import android.os.Build import ani.dantotsu.Mapper import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName +import ani.dantotsu.util.Logger import com.lagradost.nicehttp.Requests import eu.kanade.tachiyomi.network.interceptor.CloudflareInterceptor +import eu.kanade.tachiyomi.network.interceptor.IgnoreGzipInterceptor import eu.kanade.tachiyomi.network.interceptor.UncaughtExceptionInterceptor import eu.kanade.tachiyomi.network.interceptor.UserAgentInterceptor import okhttp3.Cache @@ -35,12 +37,21 @@ class NetworkHelper( ), ) .addInterceptor(UncaughtExceptionInterceptor()) - .addInterceptor(BrotliInterceptor) .addInterceptor(UserAgentInterceptor(::defaultUserAgentProvider)) + .addNetworkInterceptor(IgnoreGzipInterceptor()) + .addNetworkInterceptor(BrotliInterceptor) + + class ConsoleLogger : HttpLoggingInterceptor.Logger { + override fun log(message: String) { + Logger.log("OkHttp: $message") + } + } + + + if (PrefManager.getVal(PrefName.VerboseLogging)) { + val httpLoggingInterceptor = HttpLoggingInterceptor(ConsoleLogger()).apply { + level = HttpLoggingInterceptor.Level.BASIC - if (PrefManager.getVal(PrefName.VerboseLogging)) { - val httpLoggingInterceptor = HttpLoggingInterceptor().apply { - level = HttpLoggingInterceptor.Level.HEADERS } builder.addNetworkInterceptor(httpLoggingInterceptor) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/IgnoreGzipInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/IgnoreGzipInterceptor.kt new file mode 100644 index 00000000..f1331a57 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/IgnoreGzipInterceptor.kt @@ -0,0 +1,21 @@ +package eu.kanade.tachiyomi.network.interceptor + +import okhttp3.Interceptor +import okhttp3.Response + +/** + * To use [okhttp3.brotli.BrotliInterceptor] as a network interceptor, + * add [IgnoreGzipInterceptor] right before it. + * + * This nullifies the transparent gzip of [okhttp3.internal.http.BridgeInterceptor] + * so gzip and Brotli are explicitly handled by the [okhttp3.brotli.BrotliInterceptor]. + */ +class IgnoreGzipInterceptor : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + var request = chain.request() + if (request.header("Accept-Encoding") == "gzip") { + request = request.newBuilder().removeHeader("Accept-Encoding").build() + } + return chain.proceed(request) + } +} diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor.kt index dccfd469..44fa9a5c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/interceptor/UncaughtExceptionInterceptor.kt @@ -23,6 +23,7 @@ class UncaughtExceptionInterceptor : Interceptor { Logger.log(e) throw IOException("Request timed out") // there's some odd behavior throwing a SocketTimeoutException } catch (e: Exception) { + Logger.log(e) if (e is IOException) { throw e } else { From a5304477c78fb3b6250f506d955f47350a6074a5 Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Fri, 24 May 2024 13:34:39 -0500 Subject: [PATCH 003/112] fix: move try inside withContext --- .../download/anime/AnimeDownloaderService.kt | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) 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 ebeb17b4..6515e46a 100644 --- a/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/anime/AnimeDownloaderService.kt @@ -201,8 +201,8 @@ class AnimeDownloaderService : Service() { @androidx.annotation.OptIn(UnstableApi::class) suspend fun download(task: AnimeDownloadTask) { - try { - withContext(Dispatchers.Main) { + withContext(Dispatchers.Main) { + try { val notifi = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { ContextCompat.checkSelfPermission( this@AnimeDownloaderService, @@ -226,10 +226,14 @@ class AnimeDownloaderService : Service() { ) ?: throw Exception("Failed to create output directory") val extension = ffExtension!!.getFileExtension() - outputDir.findFile("${task.getTaskName().findValidName()}.${extension.first}")?.delete() + outputDir.findFile("${task.getTaskName().findValidName()}.${extension.first}") + ?.delete() val outputFile = - outputDir.createFile(extension.second, "${task.getTaskName()}.${extension.first}") + outputDir.createFile( + extension.second, + "${task.getTaskName()}.${extension.first}" + ) ?: throw Exception("Failed to create output file") var percent = 0 @@ -385,15 +389,15 @@ class AnimeDownloaderService : Service() { broadcastDownloadFinished(task.episode) } else throw Exception("Download failed") + } catch (e: Exception) { + if (e.message?.contains("Coroutine was cancelled") == false) { //wut + Logger.log("Exception while downloading file: ${e.message}") + snackString("Exception while downloading file: ${e.message}") + e.printStackTrace() + Injekt.get().logException(e) + } + broadcastDownloadFailed(task.episode) } - } catch (e: Exception) { - if (e.message?.contains("Coroutine was cancelled") == false) { //wut - Logger.log("Exception while downloading file: ${e.message}") - snackString("Exception while downloading file: ${e.message}") - e.printStackTrace() - Injekt.get().logException(e) - } - broadcastDownloadFailed(task.episode) } } From 7bce053202d35cbc78aff144d471bc3deda1b64a Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Fri, 24 May 2024 14:02:36 -0500 Subject: [PATCH 004/112] fix: notification setting formatting --- .../ani/dantotsu/settings/SettingsNotificationActivity.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/ani/dantotsu/settings/SettingsNotificationActivity.kt b/app/src/main/java/ani/dantotsu/settings/SettingsNotificationActivity.kt index 2b417df0..b97dfa4c 100644 --- a/app/src/main/java/ani/dantotsu/settings/SettingsNotificationActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/SettingsNotificationActivity.kt @@ -25,6 +25,7 @@ import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager +import java.util.Locale class SettingsNotificationActivity : AppCompatActivity() { private lateinit var binding: ActivitySettingsNotificationsBinding @@ -130,7 +131,10 @@ class SettingsNotificationActivity : AppCompatActivity() { val dialog = AlertDialog.Builder(context, R.style.MyPopup) .setTitle(R.string.anilist_notification_filters) .setMultiChoiceItems( - types.toTypedArray(), + types.map { name -> + name.replace("_", " ").lowercase().replaceFirstChar { + if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() + } }.toTypedArray(), selected ) { _, which, isChecked -> val type = types[which] From e7a60e07d8cf94cabb421b871eff4709a4bcb04a Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Fri, 24 May 2024 14:03:33 -0500 Subject: [PATCH 005/112] fix: destroyed activity crash on slower phones --- .../java/ani/dantotsu/others/AppUpdater.kt | 23 +++++++++++++++++++ .../java/ani/dantotsu/others/AppUpdater.kt | 7 +++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/src/fdroid/java/ani/dantotsu/others/AppUpdater.kt b/app/src/fdroid/java/ani/dantotsu/others/AppUpdater.kt index bb9893f6..5dfb79e7 100644 --- a/app/src/fdroid/java/ani/dantotsu/others/AppUpdater.kt +++ b/app/src/fdroid/java/ani/dantotsu/others/AppUpdater.kt @@ -6,4 +6,27 @@ object AppUpdater { suspend fun check(activity: FragmentActivity, post: Boolean = false) { //no-op } + + @Serializable + data class GithubResponse( + @SerialName("html_url") + val htmlUrl: String, + @SerialName("tag_name") + val tagName: String, + val prerelease: Boolean, + @SerialName("created_at") + val createdAt: String, + val body: String? = null, + val assets: List? = null + ) { + @Serializable + data class Asset( + @SerialName("browser_download_url") + val browserDownloadURL: String + ) + + fun timeStamp(): Long { + return dateFormat.parse(createdAt)!!.time + } + } } \ No newline at end of file diff --git a/app/src/google/java/ani/dantotsu/others/AppUpdater.kt b/app/src/google/java/ani/dantotsu/others/AppUpdater.kt index 67b7ce43..f6f8e8ca 100644 --- a/app/src/google/java/ani/dantotsu/others/AppUpdater.kt +++ b/app/src/google/java/ani/dantotsu/others/AppUpdater.kt @@ -29,6 +29,7 @@ import ani.dantotsu.util.Logger import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.MainScope import kotlinx.coroutines.launch +import kotlinx.coroutines.time.delay import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.json.JsonArray @@ -69,7 +70,11 @@ object AppUpdater { ) addView( TextView(activity).apply { - val markWon = buildMarkwon(activity, false) + val markWon = try { //slower phones can destroy the activity before this is done + buildMarkwon(activity, false) + } catch (e: IllegalArgumentException) { + return@runOnUiThread + } markWon.setMarkdown(this, md) } ) From 37949c7e8e8b4cf97bcff53d641d60934216b36a Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Fri, 24 May 2024 14:51:25 -0500 Subject: [PATCH 006/112] fix: move some stuffs around --- .../dantotsu/parsers/OfflineAnimeParser.kt | 10 +++---- .../dantotsu/parsers/OfflineMangaParser.kt | 26 +++++++++---------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt b/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt index 85d1af90..f8ae2e54 100644 --- a/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt +++ b/app/src/main/java/ani/dantotsu/parsers/OfflineAnimeParser.kt @@ -55,13 +55,11 @@ class OfflineAnimeParser : AnimeParser() { episodes.add(episode) } } - //episodes.sortBy { MediaNameAdapter.findEpisodeNumber(it.number) } - episodes.addAll(loadEpisodesCompat(animeLink, extra, sAnime)) - //filter those with the same name - return episodes.distinctBy { it.number } - .sortedBy { MediaNameAdapter.findEpisodeNumber(it.number) } } - return emptyList() + episodes.addAll(loadEpisodesCompat(animeLink, extra, sAnime)) + //filter those with the same name + return episodes.distinctBy { it.number } + .sortedBy { MediaNameAdapter.findEpisodeNumber(it.number) } } override suspend fun loadVideoServers( diff --git a/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt b/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt index f0c1237f..ec3ca338 100644 --- a/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt +++ b/app/src/main/java/ani/dantotsu/parsers/OfflineMangaParser.kt @@ -43,11 +43,10 @@ class OfflineMangaParser : MangaParser() { chapters.add(chapter) } } - chapters.addAll(loadChaptersCompat(mangaLink, extra, sManga)) - return chapters.distinctBy { it.number } - .sortedBy { MediaNameAdapter.findChapterNumber(it.number) } } - return emptyList() + chapters.addAll(loadChaptersCompat(mangaLink, extra, sManga)) + return chapters.distinctBy { it.number } + .sortedBy { MediaNameAdapter.findChapterNumber(it.number) } } override suspend fun loadImages(chapterLink: String, sChapter: SChapter): List { @@ -66,17 +65,16 @@ class OfflineMangaParser : MangaParser() { for (image in images) { Logger.log("imageNumber: ${image.url.url}") } - return if (images.isNotEmpty()) { - images.sortBy { image -> - val matchResult = imageNumberRegex.find(image.url.url) - matchResult?.groups?.get(1)?.value?.toIntOrNull() ?: Int.MAX_VALUE - } - images - } else { - loadImagesCompat(chapterLink, sChapter) - } } - return emptyList() + return if (images.isNotEmpty()) { + images.sortBy { image -> + val matchResult = imageNumberRegex.find(image.url.url) + matchResult?.groups?.get(1)?.value?.toIntOrNull() ?: Int.MAX_VALUE + } + images + } else { + loadImagesCompat(chapterLink, sChapter) + } } override suspend fun search(query: String): List { From 7717974b9e1ce36626323dd0494d5d7c2283a5dd Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Sat, 25 May 2024 08:37:16 -0500 Subject: [PATCH 007/112] =?UTF-8?q?fix:=20what=20does=20the=20fix=20say=3F?= =?UTF-8?q?=20=F0=9F=A6=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dantotsu/home/status/StatusActivity.kt | 19 +- .../dantotsu/media/MediaDetailsActivity.kt | 3 +- .../dantotsu/settings/ExtensionsActivity.kt | 8 +- .../ani/dantotsu/settings/InstallerSteps.kt | 2 + .../main/res/layout-land/activity_calc.xml | 390 ++++++++++++++++++ app/src/main/res/layout/activity_calc.xml | 16 +- .../res/layout/activity_markdown_creator.xml | 9 +- app/src/main/res/layout/fragment_status.xml | 4 +- 8 files changed, 436 insertions(+), 15 deletions(-) create mode 100644 app/src/main/res/layout-land/activity_calc.xml diff --git a/app/src/main/java/ani/dantotsu/home/status/StatusActivity.kt b/app/src/main/java/ani/dantotsu/home/status/StatusActivity.kt index 43b2cb55..e37c68a5 100644 --- a/app/src/main/java/ani/dantotsu/home/status/StatusActivity.kt +++ b/app/src/main/java/ani/dantotsu/home/status/StatusActivity.kt @@ -16,6 +16,8 @@ import ani.dantotsu.navBarHeight import ani.dantotsu.profile.User import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.statusBarHeight +import ani.dantotsu.toast +import ani.dantotsu.util.Logger class StatusActivity : AppCompatActivity(), StoriesCallback { private lateinit var activity: ArrayList @@ -44,10 +46,14 @@ class StatusActivity : AppCompatActivity(), StoriesCallback { val key = "activities" val watchedActivity = PrefManager.getCustomVal>(key, setOf()) - val startFrom = findFirstNonMatch(watchedActivity, activity[position].activity ) - val startIndex = if ( startFrom > 0) startFrom else 0 - binding.stories.setStoriesList(activity[position].activity, this, startIndex + 1) - + if (activity.getOrNull(position) != null) { + val startFrom = findFirstNonMatch(watchedActivity, activity[position].activity ) + val startIndex = if ( startFrom > 0) startFrom else 0 + binding.stories.setStoriesList(activity[position].activity, this, startIndex + 1) + } else { + Logger.log("index out of bounds for position $position of size ${activity.size}") + finish() + } } private fun findFirstNonMatch(watchedActivity: Set, activity: List): Int { @@ -58,13 +64,16 @@ class StatusActivity : AppCompatActivity(), StoriesCallback { } return -1 } + override fun onPause() { super.onPause() binding.stories.pause() } + override fun onResume() { super.onResume() - binding.stories.resume() + if (hasWindowFocus()) + binding.stories.resume() } override fun onWindowFocusChanged(hasFocus: Boolean) { diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index 44b04457..048ba398 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -424,7 +424,8 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi } override fun onResume() { - navBar.selectTabAt(selected) + if (::navBar.isInitialized) + navBar.selectTabAt(selected) super.onResume() } diff --git a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt index 0fa65612..748e476e 100644 --- a/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/ExtensionsActivity.kt @@ -43,6 +43,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import uy.kohesive.injekt.injectLazy +import java.util.Locale class ExtensionsActivity : AppCompatActivity() { lateinit var binding: ActivityExtensionsBinding @@ -173,8 +174,11 @@ class ExtensionsActivity : AppCompatActivity() { initActivity(this) binding.languageselect.setOnClickListener { val languageOptions = - LanguageMapper.Companion.Language.entries.map { it.name }.toTypedArray() - val builder = AlertDialog.Builder(currContext(), R.style.MyPopup) + LanguageMapper.Companion.Language.entries.map { entry -> + entry.name.lowercase().replace("_", " ") + .replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.ROOT) else it.toString() } + }.toTypedArray() + val builder = AlertDialog.Builder(this, R.style.MyPopup) val listOrder: String = PrefManager.getVal(PrefName.LangSort) val index = LanguageMapper.Companion.Language.entries.toTypedArray() .indexOfFirst { it.code == listOrder } diff --git a/app/src/main/java/ani/dantotsu/settings/InstallerSteps.kt b/app/src/main/java/ani/dantotsu/settings/InstallerSteps.kt index 39b91b3e..e66d39c4 100644 --- a/app/src/main/java/ani/dantotsu/settings/InstallerSteps.kt +++ b/app/src/main/java/ani/dantotsu/settings/InstallerSteps.kt @@ -6,6 +6,7 @@ import androidx.core.app.NotificationCompat import ani.dantotsu.R import ani.dantotsu.connections.crashlytics.CrashlyticsInterface import ani.dantotsu.snackString +import ani.dantotsu.util.Logger import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.extension.InstallStep import uy.kohesive.injekt.Injekt @@ -30,6 +31,7 @@ class InstallerSteps( fun onError(error: Throwable, extra: () -> Unit) { Injekt.get().logException(error) + Logger.log(error) val builder = NotificationCompat.Builder( context, Notifications.CHANNEL_DOWNLOADER_ERROR diff --git a/app/src/main/res/layout-land/activity_calc.xml b/app/src/main/res/layout-land/activity_calc.xml new file mode 100644 index 00000000..de7d9d5f --- /dev/null +++ b/app/src/main/res/layout-land/activity_calc.xml @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + +