From da456d30677c1dd579c155dcf677eaace5652be0 Mon Sep 17 00:00:00 2001 From: aayush262 Date: Fri, 26 Apr 2024 19:57:55 +0530 Subject: [PATCH] feat(social): like button fix --- .../connections/anilist/AnilistQueries.kt | 46 ++++++- .../connections/anilist/AnilistViewModel.kt | 23 +--- .../dantotsu/connections/anilist/api/Feed.kt | 12 +- .../java/ani/dantotsu/home/HomeFragment.kt | 13 +- .../java/ani/dantotsu/home/StatusActivity.kt | 61 +++++---- .../main/java/ani/dantotsu/home/UserStatus.kt | 3 +- .../java/ani/dantotsu/home/status/Stories.kt | 119 +++++++++++------- .../dantotsu/home/status/data/StoryItem.kt | 20 --- .../home/status/listener/StoriesCallback.kt | 1 + .../settings/UserInterfaceSettingsActivity.kt | 6 +- .../dantotsu/settings/saving/Preferences.kt | 4 +- app/src/main/res/anim/slide_in_left.xml | 6 + app/src/main/res/anim/slide_in_right.xml | 6 + app/src/main/res/anim/slide_out_left.xml | 6 + app/src/main/res/anim/slide_out_right.xml | 6 + app/src/main/res/layout/fragment_home.xml | 54 +++----- app/src/main/res/layout/fragment_status.xml | 2 + app/src/main/res/layout/item_user_status.xml | 6 +- app/src/main/res/values/strings.xml | 1 + 19 files changed, 223 insertions(+), 172 deletions(-) delete mode 100644 app/src/main/java/ani/dantotsu/home/status/data/StoryItem.kt create mode 100644 app/src/main/res/anim/slide_in_left.xml create mode 100644 app/src/main/res/anim/slide_in_right.xml create mode 100644 app/src/main/res/anim/slide_out_left.xml create mode 100644 app/src/main/res/anim/slide_out_right.xml 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 5c4e1b1c..59b25b7d 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistQueries.kt @@ -6,11 +6,13 @@ import ani.dantotsu.checkGenreTime import ani.dantotsu.checkId import ani.dantotsu.connections.anilist.Anilist.authorRoles import ani.dantotsu.connections.anilist.Anilist.executeQuery +import ani.dantotsu.connections.anilist.api.Activity import ani.dantotsu.connections.anilist.api.FeedResponse import ani.dantotsu.connections.anilist.api.FuzzyDate import ani.dantotsu.connections.anilist.api.NotificationResponse import ani.dantotsu.connections.anilist.api.Page import ani.dantotsu.connections.anilist.api.Query +import ani.dantotsu.connections.anilist.api.Social import ani.dantotsu.connections.anilist.api.ToggleLike import ani.dantotsu.currContext import ani.dantotsu.isOnline @@ -33,6 +35,7 @@ import java.io.ByteArrayOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable +import java.util.Calendar import kotlin.system.measureTimeMillis class AnilistQueries { @@ -507,7 +510,7 @@ class AnilistQueries { suspend fun initHomePage(): Map> { val toShow: List = - PrefManager.getVal(PrefName.HomeLayoutShow) // anime continue, anime fav, anime planned, manga continue, manga fav, manga planned, recommendations + PrefManager.getVal(PrefName.HomeLayout) // anime continue, anime fav, anime planned, manga continue, manga fav, manga planned, recommendations var query = """{""" if (toShow.getOrNull(0) == true) query += """currentAnime: ${ continueMediaQuery( @@ -1637,12 +1640,43 @@ Page(page:$page,perPage:50) { force = true ) } + private fun status(page: Int = 1): String { + return """Page(page:$page,perPage:50){activities(isFollowing: true, type:MEDIA_LIST,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}}}}}""" + } suspend fun getStatus( - ): FeedResponse? { - return executeQuery( - """{Page(page:1,perPage:50){activities(isFollowing: true, type:MEDIA_LIST,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}}}}}}""", - force = true - ) + ): MutableList { + fun query() = """{ + Page1:${status(1)} + Page2:${status(2)} + }""".trimIndent() + val list = mutableListOf() + val threeDaysAgo = Calendar.getInstance().apply { + add(Calendar.DAY_OF_MONTH, -10) + }.timeInMillis + executeQuery(query(), force = true)?.data?.let { data -> + val activities = listOf(data.page1.activities, data.page2.activities).flatten() + .filterNot { it.userId == Anilist.userid } + .sortedByDescending { it.createdAt } + .filter { it.createdAt < threeDaysAgo } + + val groupedActivities = activities.groupBy { it.userId } + + groupedActivities.forEach { (_, userActivities) -> + val user = userActivities.firstOrNull()?.user + if (user != null) { + list.add( + User( + user.id, + user.name ?: "", + user.avatar?.medium, + user.bannerImage, + activity = userActivities.toList() + ) + ) + } + } + } + return list } suspend fun getUpcomingAnime(id: String): List { val res = executeQuery( 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 9874ce50..92a5bd09 100644 --- a/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt +++ b/app/src/main/java/ani/dantotsu/connections/anilist/AnilistViewModel.kt @@ -108,28 +108,7 @@ class AnilistHomeViewModel : ViewModel() { fun getUserStatus(): LiveData> = userStatus suspend fun initUserStatus() { - Anilist.query.getStatus()?.data?.page?.activities?.let { activities -> - val groupedActivities = activities - .filterNot { it.userId == Anilist.userid } - .sortedByDescending { ActivityItemBuilder.getDateTime(it.createdAt) } - .groupBy { it.userId } - val userList = groupedActivities.mapNotNull { (_, activities) -> - val user = activities.firstOrNull()?.user - user?.let { - User( - it.id, - it.name ?: "", - it.avatar?.medium, - it.bannerImage, - activity = activities - ) - } - }.toMutableList() - userList.sortByDescending { user -> - user.activity.maxByOrNull { it.createdAt }?.createdAt - } - userStatus.postValue(ArrayList(userList)) - } + Anilist.query.getStatus().let { userStatus.postValue(ArrayList(it)) } } suspend fun loadMain(context: FragmentActivity) { 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 5f0af956..9d4a44d4 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 @@ -14,7 +14,17 @@ data class FeedResponse( val page: ActivityPage ) : java.io.Serializable } - +@Serializable +data class Social( + @SerialName("data") + val data: Data +) : java.io.Serializable { + @Serializable + data class Data( + @SerialName("Page1") val page1: ActivityPage, + @SerialName("Page2") val page2: ActivityPage + ) : java.io.Serializable +} @Serializable data class ActivityPage( @SerialName("activities") diff --git a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt index a496d80e..fff29e79 100644 --- a/app/src/main/java/ani/dantotsu/home/HomeFragment.kt +++ b/app/src/main/java/ani/dantotsu/home/HomeFragment.kt @@ -314,10 +314,9 @@ class HomeFragment : Fragment() { binding.homeRecommendedEmpty, binding.homeRecommended ) - binding.homeUserStatusContainer.visibility = View.VISIBLE + binding.homeUserStatusContainer.visibility = if (PrefManager.getVal>(PrefName.HomeLayout)[7]) View.VISIBLE else View.GONE binding.homeUserStatusProgressBar.visibility = View.VISIBLE binding.homeUserStatusRecyclerView.visibility = View.GONE - binding.homeUserStatus.visibility = View.INVISIBLE model.getUserStatus().observe(viewLifecycleOwner) { binding.homeUserStatusRecyclerView.visibility = View.GONE if (it != null) { @@ -335,12 +334,10 @@ class HomeFragment : Fragment() { } else { binding.homeUserStatusContainer.visibility = View.GONE } - binding.homeUserStatus.visibility = View.VISIBLE - binding.homeUserStatus.startAnimation(setSlideUp()) binding.homeUserStatusProgressBar.visibility = View.GONE } - } + } binding.homeUserAvatarContainer.startAnimation(setSlideUp()) model.empty.observe(viewLifecycleOwner) @@ -371,7 +368,7 @@ class HomeFragment : Fragment() { binding.homeContinueReadingContainer, binding.homeFavMangaContainer, binding.homePlannedMangaContainer, - binding.homeRecommendedContainer + binding.homeRecommendedContainer, ) val live = Refresh.activity.getOrPut(1) { MutableLiveData(false) } @@ -388,9 +385,9 @@ class HomeFragment : Fragment() { model.setListImages() var empty = true val homeLayoutShow: List = - PrefManager.getVal(PrefName.HomeLayoutShow) + PrefManager.getVal(PrefName.HomeLayout) runBlocking { - model.initUserStatus() + if (homeLayoutShow.getOrNull(7) == true) model.initUserStatus() model.initHomePage() } (array.indices).forEach { i -> diff --git a/app/src/main/java/ani/dantotsu/home/StatusActivity.kt b/app/src/main/java/ani/dantotsu/home/StatusActivity.kt index cee888f2..7da5211d 100644 --- a/app/src/main/java/ani/dantotsu/home/StatusActivity.kt +++ b/app/src/main/java/ani/dantotsu/home/StatusActivity.kt @@ -2,51 +2,46 @@ package ani.dantotsu.home import android.os.Bundle import android.view.ViewGroup +import android.view.animation.Animation +import android.view.animation.AnimationUtils import androidx.appcompat.app.AppCompatActivity import androidx.core.view.updateLayoutParams -import ani.dantotsu.connections.anilist.api.Activity +import ani.dantotsu.R import ani.dantotsu.databinding.ActivityStatusBinding import ani.dantotsu.initActivity import ani.dantotsu.others.getSerialized import ani.dantotsu.themes.ThemeManager -import ani.dantotsu.home.status.data.StoryItem import ani.dantotsu.home.status.listener.StoriesCallback import ani.dantotsu.navBarHeight -import ani.dantotsu.profile.activity.ActivityItemBuilder +import ani.dantotsu.profile.User import ani.dantotsu.statusBarHeight class StatusActivity : AppCompatActivity(), StoriesCallback { - private lateinit var activity: List + private lateinit var activity: ArrayList private lateinit var binding: ActivityStatusBinding + private var position: Int = -1 + private lateinit var slideInLeft: Animation + private lateinit var slideOutRight: Animation + private lateinit var slideOutLeft: Animation + private lateinit var slideInRight: Animation override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ThemeManager(this).applyTheme() initActivity(this) binding = ActivityStatusBinding.inflate(layoutInflater) setContentView(binding.root) - activity = intent.getSerialized("activity")!! + activity = intent.getSerialized("user")!! + position = intent.getIntExtra("position", -1) binding.root.updateLayoutParams { topMargin = statusBarHeight bottomMargin = navBarHeight } - val storiesList = activity.map { StoryItem( - id = it.userId, - activityId = it.id, - mediaId = it.media?.id, - userName = it.user?.name, - userAvatar = it.user?.avatar?.large, - time = ActivityItemBuilder.getDateTime(it.createdAt), - info = "${it.user!!.name} ${it.status} ${ - it.progress - ?: it.media?.title?.userPreferred - }", - cover = it.media?.coverImage?.extraLarge, - banner = it.media?.bannerImage ?: it.media?.coverImage?.extraLarge, - likes = it.likeCount ?: 0, - likedBy = it.likes, - isLiked = it.isLiked == true - ) } - binding.stories.setStoriesList(storiesList, this) + slideInLeft = AnimationUtils.loadAnimation(this, R.anim.slide_in_left) + slideOutRight = AnimationUtils.loadAnimation(this, R.anim.slide_out_right) + slideOutLeft = AnimationUtils.loadAnimation(this, R.anim.slide_out_left) + slideInRight = AnimationUtils.loadAnimation(this, R.anim.slide_in_right) + + binding.stories.setStoriesList(activity[position].activity, this) } override fun onPause() { @@ -67,7 +62,25 @@ class StatusActivity : AppCompatActivity(), StoriesCallback { } } override fun onStoriesEnd() { - finish() + position += 1 + if (position < activity.size - 1) { + binding.stories.startAnimation(slideOutLeft) + binding.stories.setStoriesList(activity[position].activity, this) + binding.stories.startAnimation(slideInRight) + } else { + finish() + } + } + + override fun onStoriesStart() { + position -= 1 + if (position >= 0) { + binding.stories.startAnimation(slideOutRight) + binding.stories.setStoriesList(activity[position].activity, this) + binding.stories.startAnimation(slideInLeft) + } else { + finish() + } } } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/home/UserStatus.kt b/app/src/main/java/ani/dantotsu/home/UserStatus.kt index 61351bde..325c4dda 100644 --- a/app/src/main/java/ani/dantotsu/home/UserStatus.kt +++ b/app/src/main/java/ani/dantotsu/home/UserStatus.kt @@ -23,7 +23,8 @@ class UserStatus(private val user: ArrayList) : Intent( itemView.context, StatusActivity::class.java - ).putExtra("activity", user[bindingAdapterPosition].activity as Serializable), + ).putExtra("user", user as Serializable) + .putExtra("position", bindingAdapterPosition), null ) } diff --git a/app/src/main/java/ani/dantotsu/home/status/Stories.kt b/app/src/main/java/ani/dantotsu/home/status/Stories.kt index bb6c5095..0d3599f5 100644 --- a/app/src/main/java/ani/dantotsu/home/status/Stories.kt +++ b/app/src/main/java/ani/dantotsu/home/status/Stories.kt @@ -3,10 +3,8 @@ package ani.dantotsu.home.status import android.animation.Animator import android.animation.ObjectAnimator import android.annotation.SuppressLint -import android.app.Activity import android.content.Context import android.content.Intent -import android.graphics.Rect import android.util.AttributeSet import android.view.LayoutInflater import android.view.MotionEvent @@ -21,17 +19,17 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintSet import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentActivity -import androidx.webkit.internal.ApiFeature.T import ani.dantotsu.R import ani.dantotsu.blurImage import ani.dantotsu.connections.anilist.Anilist -import ani.dantotsu.home.status.data.StoryItem +import ani.dantotsu.connections.anilist.api.Activity import ani.dantotsu.home.status.listener.StoriesCallback import ani.dantotsu.loadImage import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.profile.ProfileActivity import ani.dantotsu.profile.User import ani.dantotsu.profile.UsersDialogFragment +import ani.dantotsu.profile.activity.ActivityItemBuilder import ani.dantotsu.snackString import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -39,14 +37,14 @@ import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.Calendar +import java.util.Locale class Stories @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr), View.OnTouchListener { - - private lateinit var storiesList: List + private lateinit var activityList: List private lateinit var activ: FragmentActivity private lateinit var loadingViewLayout: ConstraintLayout private lateinit var leftTouchPanel: FrameLayout @@ -56,6 +54,7 @@ constructor( private lateinit var loadingView: ProgressBar private lateinit var activityLikeCount: TextView private lateinit var activityLike: ImageView + private lateinit var activityLikeContainer: LinearLayout private lateinit var userName: TextView private lateinit var userAvatar: ImageView private lateinit var time: TextView @@ -66,14 +65,12 @@ constructor( private var storyIndex: Int = 1 private var userClicked: Boolean = false private lateinit var storiesListener: StoriesCallback - private var oldStoryItem = StoryItem() init { initLayout() } - @SuppressLint("ClickableViewAccessibility") - private fun initLayout() { + fun initLayout() { val inflater: LayoutInflater = LayoutInflater.from(context) val view = inflater.inflate(R.layout.fragment_status, this, false) addView(view) @@ -95,6 +92,7 @@ constructor( infoText = findViewById(R.id.infoText) activityLikeCount = findViewById(R.id.activityLikeCount) activityLike = findViewById(R.id.activityLike) + activityLikeContainer = findViewById(R.id.statusUserActions) leftTouchPanel.setOnTouchListener(this) rightTouchPanel.setOnTouchListener(this) @@ -102,15 +100,16 @@ constructor( } - fun setStoriesList(storiesList: List, activity: FragmentActivity) { - this.storiesList = storiesList + fun setStoriesList(activityList: List, activity: FragmentActivity) { + this.activityList = activityList this.activ = activity - addLoadingViews(storiesList) + addLoadingViews(activityList) } - private fun addLoadingViews(storiesList: List) { + private fun addLoadingViews(storiesList: List) { var idCounter = 1 for (story in storiesList) { + loadingViewLayout.removeView(findViewWithTag("story${idCounter}")) val progressBar = ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal) progressBar.visibility = View.VISIBLE progressBar.id = idCounter @@ -231,15 +230,14 @@ constructor( animation.duration = secondsToMillis(storyDuration) animation.interpolator = LinearInterpolator() animation.addListener(object : Animator.AnimatorListener { - override fun onAnimationStart(animator: Animator) { - } + override fun onAnimationStart(animator: Animator) {} override fun onAnimationEnd(animator: Animator) { - if (storyIndex - 1 <= storiesList.size) { + if (storyIndex - 1 <= activityList.size) { if (userClicked) { userClicked = false } else { - if (storyIndex < storiesList.size) { + if (storyIndex < activityList.size) { storyIndex += 1 showStory() } else { @@ -261,7 +259,7 @@ constructor( override fun onAnimationRepeat(animator: Animator) {} }) - loadStory(storiesList[storyIndex - 1]) + loadStory(activityList[storyIndex - 1]) } private fun getId(tag: String): Int { @@ -321,19 +319,23 @@ constructor( } private fun rightPanelTouch() { - if (storyIndex == storiesList.size) { + if (storyIndex == activityList.size) { completeProgressBar(storyIndex) onStoriesCompleted() return } userClicked = true animation.end() - if (storyIndex < storiesList.size) + if (storyIndex < activityList.size) storyIndex += 1 showStory() } private fun leftPanelTouch() { + if (storyIndex == 1) { + onStoriesPrevious() + return + } userClicked = true animation.end() resetProgressBar(storyIndex) @@ -343,8 +345,19 @@ constructor( } private fun onStoriesCompleted() { - if (::storiesListener.isInitialized) + if (::storiesListener.isInitialized){ + storyIndex = 1 storiesListener.onStoriesEnd() + resetProgressBar(storyIndex) + } + } + + private fun onStoriesPrevious() { + if (::storiesListener.isInitialized) { + storyIndex = 1 + storiesListener.onStoriesStart() + resetProgressBar(storyIndex) + } } fun pause() { animation.pause() @@ -352,40 +365,54 @@ constructor( fun resume() { animation.resume() } - private fun loadStory(story: StoryItem) { + private fun loadStory(story: Activity) { loadingView.visibility = View.GONE animation.start() - blurImage(imageContentView, story.banner) - userAvatar.loadImage(story.userAvatar) - coverImage.loadImage(story.cover) - userName.text = story.userName - time.text = story.time - infoText.text = story.info + blurImage(imageContentView, story.media?.bannerImage ?: story.media?.coverImage?.extraLarge) + userAvatar.loadImage(story.user?.avatar?.large) + coverImage.loadImage(story.media?.coverImage?.extraLarge) + userName.text = story.user?.name + time.text = ActivityItemBuilder.getDateTime(story.createdAt) + val text = "${story.status?.replaceFirstChar { + if (it.isLowerCase()) { + it.titlecase(Locale.ROOT) + } + else { + it.toString() + } + }} ${story.progress ?: story.media?.title?.userPreferred}" + infoText.text = text + statusUserContainer.setOnClickListener { - ContextCompat.startActivity(context, Intent(context, ProfileActivity::class.java).putExtra("userId", story.id), null) + ContextCompat.startActivity(context, Intent(context, ProfileActivity::class.java) + .putExtra("userId", story.userId), + null) } + coverImage.setOnClickListener{ - ContextCompat.startActivity(context, Intent(context, MediaDetailsActivity::class.java).putExtra("mediaId", story.mediaId), null) + ContextCompat.startActivity(context, Intent(context, MediaDetailsActivity::class.java) + .putExtra("mediaId", story.media?.id), + null) } + val likeColor = ContextCompat.getColor(context, R.color.yt_red) val notLikeColor = ContextCompat.getColor(context, R.color.bg_opp) - activityLikeCount.text = story.likes.toString() - activityLike.setColorFilter(if (story.isLiked) likeColor else notLikeColor) - activityLike.setOnClickListener { + activityLikeCount.text = story.likeCount.toString() + activityLike.setColorFilter(if (story.isLiked == true) likeColor else notLikeColor) + activityLikeContainer.setOnClickListener { val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) scope.launch { - val res = Anilist.query.toggleLike(story.activityId!!, "ACTIVITY") + val res = Anilist.query.toggleLike(story.id, "ACTIVITY") withContext(Dispatchers.Main) { if (res != null) { - - if (story.isLiked) { - story.likes = story.likes.minus(1) + if (story.isLiked == true) { + story.likeCount = story.likeCount?.minus(1) } else { - story.likes = story.likes.plus(1) + story.likeCount = story.likeCount?.plus(1) } - activityLikeCount.text = (story.likes ?: 0).toString() - story.isLiked = !story.isLiked - activityLike.setColorFilter(if (story.isLiked) likeColor else notLikeColor) + activityLikeCount.text = (story.likeCount ?: 0).toString() + story.isLiked = !story.isLiked!! + activityLike.setColorFilter(if (story.isLiked == true) likeColor else notLikeColor) } else { snackString("Failed to like activity") @@ -393,21 +420,17 @@ constructor( } } } + val userList = arrayListOf() - story.likedBy?.forEach { i -> + story.likes?.forEach { i -> userList.add(User(i.id, i.name.toString(), i.avatar?.medium, i.bannerImage)) } - - activityLike.setOnLongClickListener { + activityLikeContainer.setOnLongClickListener { UsersDialogFragment().apply { userList(userList) show(activ.supportFragmentManager, "dialog") } true } - oldStoryItem = story } - - - } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/home/status/data/StoryItem.kt b/app/src/main/java/ani/dantotsu/home/status/data/StoryItem.kt deleted file mode 100644 index 04fd93a1..00000000 --- a/app/src/main/java/ani/dantotsu/home/status/data/StoryItem.kt +++ /dev/null @@ -1,20 +0,0 @@ -package ani.dantotsu.home.status.data - -import ani.dantotsu.connections.anilist.api.User - -data class StoryItem( - val id : Int? = null, - val activityId : Int? = null, - val mediaId: Int? = null, - val userName: String? = null, - val userAvatar: String? = null, - val time: String? = null, - val info: String? = null, - val cover: String? = null, - val banner: String? = null, - var likes : Int = 0, - val likedBy: List? = null, - var isLiked : Boolean = false -) - - diff --git a/app/src/main/java/ani/dantotsu/home/status/listener/StoriesCallback.kt b/app/src/main/java/ani/dantotsu/home/status/listener/StoriesCallback.kt index 0ba0251b..67cbf5b6 100644 --- a/app/src/main/java/ani/dantotsu/home/status/listener/StoriesCallback.kt +++ b/app/src/main/java/ani/dantotsu/home/status/listener/StoriesCallback.kt @@ -3,4 +3,5 @@ package ani.dantotsu.home.status.listener interface StoriesCallback { fun onStoriesEnd() + fun onStoriesStart() } \ No newline at end of file diff --git a/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt b/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt index 78cab787..a33ddb2e 100644 --- a/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt +++ b/app/src/main/java/ani/dantotsu/settings/UserInterfaceSettingsActivity.kt @@ -36,18 +36,18 @@ class UserInterfaceSettingsActivity : AppCompatActivity() { } binding.uiSettingsHomeLayout.setOnClickListener { - val set = PrefManager.getVal>(PrefName.HomeLayoutShow).toMutableList() + val set = PrefManager.getVal>(PrefName.HomeLayout).toMutableList() val views = resources.getStringArray(R.array.home_layouts) val dialog = AlertDialog.Builder(this, R.style.MyPopup) .setTitle(getString(R.string.home_layout_show)).apply { setMultiChoiceItems( views, - PrefManager.getVal>(PrefName.HomeLayoutShow).toBooleanArray() + PrefManager.getVal>(PrefName.HomeLayout).toBooleanArray() ) { _, i, value -> set[i] = value } setPositiveButton("Done") { _, _ -> - PrefManager.setVal(PrefName.HomeLayoutShow, set) + PrefManager.setVal(PrefName.HomeLayout, set) restartApp() } }.show() 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 6adb2b11..0274505f 100644 --- a/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt +++ b/app/src/main/java/ani/dantotsu/settings/saving/Preferences.kt @@ -63,11 +63,11 @@ enum class PrefName(val data: Pref) { //TODO: Split this into multiple files ImmersiveMode(Pref(Location.UI, Boolean::class, false)), SmallView(Pref(Location.UI, Boolean::class, true)), DefaultStartUpTab(Pref(Location.UI, Int::class, 1)), - HomeLayoutShow( + HomeLayout( Pref( Location.UI, List::class, - listOf(true, false, false, true, false, false, true) + listOf(true, false, false, true, false, false, true, true) ) ), BannerAnimations(Pref(Location.UI, Boolean::class, true)), diff --git a/app/src/main/res/anim/slide_in_left.xml b/app/src/main/res/anim/slide_in_left.xml new file mode 100644 index 00000000..16c77410 --- /dev/null +++ b/app/src/main/res/anim/slide_in_left.xml @@ -0,0 +1,6 @@ + + + diff --git a/app/src/main/res/anim/slide_in_right.xml b/app/src/main/res/anim/slide_in_right.xml new file mode 100644 index 00000000..9e3b267c --- /dev/null +++ b/app/src/main/res/anim/slide_in_right.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_left.xml b/app/src/main/res/anim/slide_out_left.xml new file mode 100644 index 00000000..5d737701 --- /dev/null +++ b/app/src/main/res/anim/slide_out_left.xml @@ -0,0 +1,6 @@ + + + diff --git a/app/src/main/res/anim/slide_out_right.xml b/app/src/main/res/anim/slide_out_right.xml new file mode 100644 index 00000000..5f3c9642 --- /dev/null +++ b/app/src/main/res/anim/slide_out_right.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index a23d4581..ec8017e0 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -309,50 +309,34 @@ - + android:layout_height="wrap_content" + android:minHeight="100dp"> - + android:layout_gravity="center" /> - + android:clipToPadding="false" + android:paddingStart="20dp" + android:paddingEnd="20dp" + android:requiresFadingEdge="horizontal" + tools:itemCount="4" + tools:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + tools:listitem="@layout/item_user_status" + tools:orientation="horizontal" /> + - - - - - + android:textSize="12sp" /> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e966001d..2a6c1080 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -305,6 +305,7 @@ Favourite Manga Planned Manga Recommended + Social Feeds Default Start Up Tab