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 b8d6ad19..7651ccd3 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -1350,10 +1350,10 @@ Page(page:$page,perPage:50) { suspend fun getFeed(userId: Int?, global: Boolean = false, page: Int = 1): FeedResponse? { val filter = if (userId != null) "userId:$userId," - else if (global) "isFollowing:false," - else "isFollowing:true," + else if (global) "isFollowing:false,type:TEXT," + else "isFollowing:true,type_not:MESSAGE," val res = executeQuery( - """{Page(page:$page,perPage:$ITEMS_PER_PAGE){activities(${filter}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{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 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}}}}}}""" + """{Page(page:$page,perPage:$ITEMS_PER_PAGE){activities(${filter}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{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 res } diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt index 340c415f..7fa463bd 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt @@ -27,7 +27,7 @@ import ani.dantotsu.media.MediaAdaptor import ani.dantotsu.media.user.ListActivity import ani.dantotsu.setSlideIn import ani.dantotsu.setSlideUp -import ani.dantotsu.util.ColorEditor.Companion.toCssColor +import ani.dantotsu.util.AniMarkdown.Companion.getFullAniHTML import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -72,8 +72,8 @@ class ProfileFragment : Fragment() { binding.profileUserBio.settings.loadWithOverviewMode = true binding.profileUserBio.settings.useWideViewPort = true binding.profileUserBio.setInitialScale(1) - val styledHtml = styled( - convertMarkdownToHtml(user.about ?: ""), + val styledHtml = getFullAniHTML( + user.about ?: "", backGroundColorTypedValue.data, textColorTypedValue.data ) @@ -175,16 +175,6 @@ class ProfileFragment : Fragment() { ) } - private fun convertMarkdownToHtml(markdown: String): String { - val regex = """\[\!\[(.*?)\]\((.*?)\)\]\((.*?)\)""".toRegex() - return regex.replace(markdown) { matchResult -> - val altText = matchResult.groupValues[1] - val imageUrl = matchResult.groupValues[2] - val linkUrl = matchResult.groupValues[3] - """$altText""" - } - } - private fun initRecyclerView( mode: LiveData>, container: View, @@ -221,56 +211,6 @@ class ProfileFragment : Fragment() { } } - private fun styled(html: String, backGroundColor: Int, textColor: Int): String { //istg anilist has the worst api - //remove some of the html entities - val step1 = html.replace(" ", " ") - .replace("&", "&") - .replace("<", "<") - .replace(">", ">") - .replace(""", "\"") - .replace("'", "'") - .replace("
", "")
-            .replace("`", "")
-            .replace("~", "")
-
-        val step2 = step1.replace("(?s)___(.*?)___".toRegex(), "
$1
") - val step3 = step2.replace("(?s)__(.*?)__".toRegex(), "
$1
") - - - return """ - - - - - - - $step3 - - - """.trimIndent() - } - companion object { fun newInstance(query: Query.UserProfile): ProfileFragment { val args = Bundle().apply { diff --git a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt index 1a112de5..db702030 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/ActivityItem.kt @@ -11,6 +11,7 @@ import ani.dantotsu.connections.anilist.api.Activity import ani.dantotsu.databinding.ItemActivityBinding import ani.dantotsu.loadImage import ani.dantotsu.snackString +import ani.dantotsu.util.AniMarkdown.Companion.getBasicAniHTML import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.model.GlideUrl @@ -96,7 +97,7 @@ class ActivityItem( binding.activityContent.visibility = View.VISIBLE if (!(context as android.app.Activity).isDestroyed) { val markwon = buildMarkwon(context, false) - markwon.setMarkdown(binding.activityContent, activity.text ?: "") + markwon.setMarkdown(binding.activityContent, getBasicAniHTML(activity.text ?: "")) } } diff --git a/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt b/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt index 8513ceb2..644e34db 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedActivity.kt @@ -29,7 +29,7 @@ class FeedActivity: AppCompatActivity() { setContentView(binding.root) navBar = binding.feedNavBar navBar.updateLayoutParams { bottomMargin += navBarHeight } - val personalTab = navBar.createTab(R.drawable.ic_round_person_24, "Personal") + val personalTab = navBar.createTab(R.drawable.ic_round_person_24, "Following") val globalTab = navBar.createTab(R.drawable.ic_globe_24, "Global") navBar.addTab(personalTab) navBar.addTab(globalTab) diff --git a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt index 353748d7..5d85b0fc 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt @@ -64,14 +64,17 @@ class FeedFragment : Fragment() { withContext(Dispatchers.Main) { res?.data?.page?.activities?.let { activities -> activityList = activities - adapter.update(activityList.map { ActivityItem(it) { _, _ -> } }) + val filtered = activities.filterNot { //filter out messages that are not directed to the user + it.recipient?.id != null && it.recipient.id != Anilist.userid + } + adapter.update(filtered.map { ActivityItem(it) { _, _ -> } }) } binding.listProgressBar.visibility = ViewGroup.GONE val scrollView = binding.listRecyclerView binding.listRecyclerView.setOnTouchListener { _, event -> if (event?.action == MotionEvent.ACTION_UP) { - if (adapter.itemCount % AnilistQueries.ITEMS_PER_PAGE != 0 && !global) { + if (activityList.size % AnilistQueries.ITEMS_PER_PAGE != 0 && !global) { snackString("No more activities") } else if (!scrollView.canScrollVertically(1) && !binding.feedRefresh.isVisible && binding.listRecyclerView.adapter!!.itemCount != 0 && @@ -84,7 +87,10 @@ class FeedFragment : Fragment() { withContext(Dispatchers.Main) { res?.data?.page?.activities?.let { activities -> activityList += activities - adapter.addAll(activities.map { ActivityItem(it) { _, _ -> } }) + val filtered = activities.filterNot { + it.recipient?.id != null && it.recipient.id != Anilist.userid + } + adapter.addAll(filtered.map { ActivityItem(it) { _, _ -> } }) } binding.feedRefresh.visibility = ViewGroup.GONE } diff --git a/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt b/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt new file mode 100644 index 00000000..1c346ab2 --- /dev/null +++ b/app/src/main/java/ani/dantotsu/util/AniMarkdown.kt @@ -0,0 +1,101 @@ +package ani.dantotsu.util + +import ani.dantotsu.util.ColorEditor.Companion.toCssColor + +class AniMarkdown { //istg anilist has the worst api + companion object { + private fun convertNestedImageToHtml(markdown: String): String { + val regex = """\[\!\[(.*?)\]\((.*?)\)\]\((.*?)\)""".toRegex() + return regex.replace(markdown) { matchResult -> + val altText = matchResult.groupValues[1] + val imageUrl = matchResult.groupValues[2] + val linkUrl = matchResult.groupValues[3] + """$altText""" + } + } + + private fun convertImageToHtml(markdown: String): String { + val regex = """\!\[(.*?)\]\((.*?)\)""".toRegex() + return regex.replace(markdown) { matchResult -> + val altText = matchResult.groupValues[1] + val imageUrl = matchResult.groupValues[2] + """$altText""" + } + } + + private fun convertLinkToHtml(markdown: String): String { + val regex = """\[(.*?)\]\((.*?)\)""".toRegex() + return regex.replace(markdown) { matchResult -> + val linkText = matchResult.groupValues[1] + val linkUrl = matchResult.groupValues[2] + """$linkText""" + } + } + + private fun replaceLeftovers(html: String): String { + return html.replace(" ", " ") + .replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace(""", "\"") + .replace("'", "'") + .replace("
", "")
+                .replace("`", "")
+                .replace("~", "")
+                .replace(">\n<", "><")
+                .replace("\n", "
") + } + + private fun underlineToHtml(html: String): String { + return html.replace("(?s)___(.*?)___".toRegex(), "
$1
") + .replace("(?s)__(.*?)__".toRegex(), "
$1
") + .replace("(?s)[\\s]+_([^_]+)_[\\s]+".toRegex(), "$1") + } + + fun getBasicAniHTML(html: String): String { + val step0 = convertNestedImageToHtml(html) + val step1 = convertImageToHtml(step0) + val step2 = convertLinkToHtml(step1) + val step3 = replaceLeftovers(step2) + return underlineToHtml(step3) + } + + fun getFullAniHTML(html: String, backGroundColor: Int, textColor: Int): String { + val basicHtml = getBasicAniHTML(html) + + + return """ + + + + + + + $basicHtml + + + """.trimIndent() + } + } +} \ No newline at end of file