diff --git a/app/src/main/java/ani/dantotsu/addons/AddonDownloader.kt b/app/src/main/java/ani/dantotsu/addons/AddonDownloader.kt index 76f077c1..4ab1876f 100644 --- a/app/src/main/java/ani/dantotsu/addons/AddonDownloader.kt +++ b/app/src/main/java/ani/dantotsu/addons/AddonDownloader.kt @@ -35,7 +35,7 @@ class AddonDownloader { val md = r.body ?: "" val version = v.ifEmpty { throw Exception("Weird Version : ${r.tagName}") } - Logger.log("Git Version : $version") + Logger.log("Git Version for $repo: $version") Pair(md, version) } catch (e: Exception) { Logger.log("Error checking for update") 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 d9f07b73..f7917b23 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -25,7 +25,6 @@ import ani.dantotsu.profile.User import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.snackString -import ani.dantotsu.util.Logger import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.runBlocking @@ -413,7 +412,7 @@ 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 initHomePage(): Map> { + suspend fun initHomePage(): Map> { val toShow: List = PrefManager.getVal(PrefName.HomeLayout) // anime continue, anime fav, anime planned, manga continue, manga fav, manga planned, recommendations var query = """{""" @@ -448,11 +447,11 @@ 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) - Logger.log(response.toString()) - val returnMap = mutableMapOf>() + val returnMap = mutableMapOf>() fun current(type: String) { val subMap = mutableMapOf() val returnArray = arrayListOf() @@ -595,6 +594,45 @@ 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 + ).flatten() + .filter { it.typename != "MessageActivity" } + .sortedByDescending { it.createdAt } + .filter { it.createdAt * 1000L > threeDaysAgo } + 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) + } + } return returnMap } @@ -1546,48 +1584,9 @@ Page(page:$page,perPage:50) { ) } private fun status(page: Int = 1): String { - return """Page(page:$page,perPage:50){activities(isFollowing: true,sort:ID_DESC){__typename ... on TextActivity{id userId type replyCount text(asHtml:true)siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}... on ListActivity{id userId type replyCount status progress siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}media{id title{english romaji native userPreferred}bannerImage coverImage{extraLarge medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}... on MessageActivity{id recipientId messengerId type replyCount likeCount message(asHtml:true)isLocked isSubscribed isLiked isPrivate siteUrl createdAt recipient{id name bannerImage avatar{medium large}}messenger{id name bannerImage avatar{medium large}}replies{id userId activityId text(asHtml:true)likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}likes{id name bannerImage avatar{medium large}}}}}""" + return """Page(page:$page,perPage:50){activities(isFollowing: true,sort:ID_DESC){__typename ... on TextActivity{id userId type replyCount text(asHtml:true)siteUrl isLocked isSubscribed likeCount isLiked createdAt user{id name bannerImage avatar{medium large}}likes{id name bannerImage avatar{medium large}}}... on ListActivity{id userId type replyCount status progress siteUrl isLocked isSubscribed likeCount isLiked isPinned createdAt user{id name bannerImage avatar{medium large}}media{id title{english romaji native userPreferred}bannerImage coverImage{extraLarge medium large}}likes{id name bannerImage avatar{medium large}}}... on MessageActivity{id type createdAt}}}""" } - suspend fun getStatus( - ): MutableList { - fun query() = """{ - Page1:${status(1)} - Page2:${status(2)} - }""".trimIndent() - val list = mutableListOf() - val threeDaysAgo = Calendar.getInstance().apply { - add(Calendar.DAY_OF_MONTH, -3) - }.timeInMillis - executeQuery(query(), force = true)?.data?.let { data -> - val activities = listOf(data.page1.activities, data.page2.activities).flatten() - .sortedByDescending { it.createdAt } - .filter { it.createdAt * 1000L > threeDaysAgo } - 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 - } suspend fun getUpcomingAnime(id: String): List { val res = executeQuery( """{MediaListCollection(userId:$id,type:ANIME){lists{name entries{media{id,isFavourite,title{userPreferred,romaji}coverImage{medium}nextAiringEpisode{timeUntilAiring}}}}}}""", 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 92a5bd09..65f26c81 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -23,16 +23,6 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch suspend fun getUserId(context: Context, block: () -> Unit) { - CoroutineScope(Dispatchers.IO).launch { - val token = PrefManager.getVal(PrefName.DiscordToken, null as String?) - val userid = PrefManager.getVal(PrefName.DiscordId, null as String?) - if (userid == null && token != null) { - /*if (!Discord.getUserData()) - snackString(context.getString(R.string.error_loading_discord_user_data))*/ - //TODO: Discord.getUserData() - } - } - val anilist = if (Anilist.userid == null && Anilist.token != null) { if (Anilist.query.getUserData()) { tryWithSuspend { @@ -91,26 +81,23 @@ class AnilistHomeViewModel : ViewModel() { fun getRecommendation(): LiveData> = recommendation + @Suppress("UNCHECKED_CAST") suspend fun initHomePage() { val res = Anilist.query.initHomePage() - Logger.log("AnilistHomeViewModel : res=$res") - res["currentAnime"]?.let { animeContinue.postValue(it) } - res["favoriteAnime"]?.let { animeFav.postValue(it) } - res["plannedAnime"]?.let { animePlanned.postValue(it) } - res["currentManga"]?.let { mangaContinue.postValue(it) } - res["favoriteManga"]?.let { mangaFav.postValue(it) } - res["plannedManga"]?.let { mangaPlanned.postValue(it) } - res["recommendations"]?.let { recommendation.postValue(it) } + res["currentAnime"]?.let { animeContinue.postValue(it as ArrayList?) } + res["favoriteAnime"]?.let { animeFav.postValue(it as ArrayList?) } + res["plannedAnime"]?.let { animePlanned.postValue(it as ArrayList?) } + res["currentManga"]?.let { mangaContinue.postValue(it as ArrayList?) } + res["favoriteManga"]?.let { mangaFav.postValue(it as ArrayList?) } + res["plannedManga"]?.let { mangaPlanned.postValue(it as ArrayList?) } + res["recommendations"]?.let { recommendation.postValue(it as ArrayList?) } + res["status"]?.let { userStatus.postValue(it as ArrayList?) } } private val userStatus: MutableLiveData> = MutableLiveData>(null) fun getUserStatus(): LiveData> = userStatus - suspend fun initUserStatus() { - Anilist.query.getStatus().let { userStatus.postValue(ArrayList(it)) } - } - suspend fun loadMain(context: FragmentActivity) { Anilist.getSavedToken() MAL.getSavedToken() 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 d45fdc79..bb6ee792 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 @@ -138,6 +138,8 @@ class Query { @SerialName("recommendationQuery") val recommendationQuery: ani.dantotsu.connections.anilist.api.Page?, @SerialName("recommendationPlannedQueryAnime") val recommendationPlannedQueryAnime: ani.dantotsu.connections.anilist.api.MediaListCollection?, @SerialName("recommendationPlannedQueryManga") val recommendationPlannedQueryManga: ani.dantotsu.connections.anilist.api.MediaListCollection?, + @SerialName("Page1") val page1: ActivityPage?, + @SerialName("Page2") val page2: ActivityPage? ) } diff --git a/app/src/main/java/ani/dantotsu/connections/anilist/api/Feed.kt b/app/src/main/java/ani/dantotsu/connections/anilist/api/Feed.kt index 9d4a44d4..9b17d668 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/api/Feed.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/api/Feed.kt @@ -58,7 +58,7 @@ data class Activity( @SerialName("siteUrl") val siteUrl: String?, @SerialName("isLocked") - val isLocked: Boolean, + val isLocked: Boolean?, @SerialName("isSubscribed") val isSubscribed: Boolean, @SerialName("likeCount") diff --git a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt index 56857254..499c7cdb 100644 --- a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt @@ -46,6 +46,7 @@ import ani.dantotsu.settings.saving.PrefManager.asLiveBool import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.snackString import ani.dantotsu.statusBarHeight +import ani.dantotsu.util.Logger import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -75,7 +76,9 @@ class HomeFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val scope = lifecycleScope + Logger.log("HomeFragment") fun load() { + Logger.log("Loading HomeFragment") if (activity != null && _binding != null) lifecycleScope.launch(Dispatchers.Main) { binding.homeUserName.text = Anilist.username binding.homeUserEpisodesWatched.text = Anilist.episodesWatched.toString() @@ -315,7 +318,7 @@ class HomeFragment : Fragment() { binding.homeRecommendedEmpty, binding.homeRecommended ) - binding.homeUserStatusContainer.visibility =View.VISIBLE + binding.homeUserStatusContainer.visibility = View.VISIBLE binding.homeUserStatusProgressBar.visibility = View.VISIBLE binding.homeUserStatusRecyclerView.visibility = View.GONE model.getUserStatus().observe(viewLifecycleOwner) { @@ -391,13 +394,12 @@ class HomeFragment : Fragment() { } model.loaded = true model.setListImages() + Logger.log("HomeFragment: Refreshing") var empty = true val homeLayoutShow: List = PrefManager.getVal(PrefName.HomeLayout) - runBlocking { - if (homeLayoutShow.getOrNull(7) == true) model.initUserStatus() - model.initHomePage() - } + model.initHomePage() + (array.indices).forEach { i -> if (homeLayoutShow.elementAt(i)) { empty = false