feat(social): like button fix

This commit is contained in:
aayush262 2024-04-26 19:57:55 +05:30
parent 856deb7755
commit da456d3067
19 changed files with 223 additions and 172 deletions

View file

@ -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<String, ArrayList<Media>> {
val toShow: List<Boolean> =
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<FeedResponse>(
"""{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<User> {
fun query() = """{
Page1:${status(1)}
Page2:${status(2)}
}""".trimIndent()
val list = mutableListOf<User>()
val threeDaysAgo = Calendar.getInstance().apply {
add(Calendar.DAY_OF_MONTH, -10)
}.timeInMillis
executeQuery<Social>(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<Media> {
val res = executeQuery<Query.MediaListCollection>(

View file

@ -108,28 +108,7 @@ class AnilistHomeViewModel : ViewModel() {
fun getUserStatus(): LiveData<ArrayList<User>> = 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) {

View file

@ -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")

View file

@ -314,10 +314,9 @@ class HomeFragment : Fragment() {
binding.homeRecommendedEmpty,
binding.homeRecommended
)
binding.homeUserStatusContainer.visibility = View.VISIBLE
binding.homeUserStatusContainer.visibility = if (PrefManager.getVal<List<Boolean>>(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<Boolean> =
PrefManager.getVal(PrefName.HomeLayoutShow)
PrefManager.getVal(PrefName.HomeLayout)
runBlocking {
model.initUserStatus()
if (homeLayoutShow.getOrNull(7) == true) model.initUserStatus()
model.initHomePage()
}
(array.indices).forEach { i ->

View file

@ -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<Activity>
private lateinit var activity: ArrayList<User>
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<ViewGroup.MarginLayoutParams> {
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()
}
}
}

View file

@ -23,7 +23,8 @@ class UserStatus(private val user: ArrayList<User>) :
Intent(
itemView.context,
StatusActivity::class.java
).putExtra("activity", user[bindingAdapterPosition].activity as Serializable),
).putExtra("user", user as Serializable)
.putExtra("position", bindingAdapterPosition),
null
)
}

View file

@ -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<StoryItem>
private lateinit var activityList: List<Activity>
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<StoryItem>, activity: FragmentActivity) {
this.storiesList = storiesList
fun setStoriesList(activityList: List<Activity>, activity: FragmentActivity) {
this.activityList = activityList
this.activ = activity
addLoadingViews(storiesList)
addLoadingViews(activityList)
}
private fun addLoadingViews(storiesList: List<StoryItem>) {
private fun addLoadingViews(storiesList: List<Activity>) {
var idCounter = 1
for (story in storiesList) {
loadingViewLayout.removeView(findViewWithTag<ProgressBar>("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<User>()
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
}
}

View file

@ -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<User>? = null,
var isLiked : Boolean = false
)

View file

@ -3,4 +3,5 @@ package ani.dantotsu.home.status.listener
interface StoriesCallback {
fun onStoriesEnd()
fun onStoriesStart()
}

View file

@ -36,18 +36,18 @@ class UserInterfaceSettingsActivity : AppCompatActivity() {
}
binding.uiSettingsHomeLayout.setOnClickListener {
val set = PrefManager.getVal<List<Boolean>>(PrefName.HomeLayoutShow).toMutableList()
val set = PrefManager.getVal<List<Boolean>>(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<List<Boolean>>(PrefName.HomeLayoutShow).toBooleanArray()
PrefManager.getVal<List<Boolean>>(PrefName.HomeLayout).toBooleanArray()
) { _, i, value ->
set[i] = value
}
setPositiveButton("Done") { _, _ ->
PrefManager.setVal(PrefName.HomeLayoutShow, set)
PrefManager.setVal(PrefName.HomeLayout, set)
restartApp()
}
}.show()

View file

@ -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)),

View file

@ -0,0 +1,6 @@
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="-100%"
android:toXDelta="0%" />
</set>

View file

@ -0,0 +1,6 @@
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="100%"
android:toXDelta="0%" />
</set>

View file

@ -0,0 +1,6 @@
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="0%"
android:toXDelta="-100%" />
</set>

View file

@ -0,0 +1,6 @@
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="0%"
android:toXDelta="100%" />
</set>

View file

@ -309,50 +309,34 @@
</LinearLayout>
</FrameLayout>
<LinearLayout
<FrameLayout
android:id="@+id/homeUserStatusContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:visibility="gone">
android:layout_height="wrap_content"
android:minHeight="100dp">
<TextView
android:id="@+id/homeUserStatus"
<ProgressBar
android:id="@+id/homeUserStatusProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:fontFamily="@font/poppins_bold"
android:padding="8dp"
android:text="@string/social"
android:textSize="16sp" />
android:layout_gravity="center" />
<FrameLayout
<ani.dantotsu.FadingEdgeRecyclerView
android:id="@+id/homeUserStatusRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="100dp">
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" />
</FrameLayout>
<ProgressBar
android:id="@+id/homeUserStatusProgressBar"
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_margin="90dp" />
<ani.dantotsu.FadingEdgeRecyclerView
android:id="@+id/homeUserStatusRecyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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" />
</FrameLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/homeContinueWatchingContainer"
android:layout_width="match_parent"

View file

@ -112,10 +112,12 @@
tools:ignore="HardcodedText,RtlSymmetry" />
<LinearLayout
android:id="@+id/statusUserActions"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:orientation="vertical"
android:paddingHorizontal="24dp"
tools:ignore="UseCompoundDrawables">
<ImageView

View file

@ -12,7 +12,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:backgroundTint="@color/bg_white"
android:backgroundTint="@color/transparent"
app:strokeColor="@color/transparent"
app:cardCornerRadius="124dp">
<ImageView
@ -28,10 +29,11 @@
android:id="@+id/profileUserName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/poppins_semi_bold"
android:layout_gravity="center_horizontal|center_vertical"
android:ellipsize="end"
android:text="@string/username"
android:textColor="?attr/colorOnBackground"
android:textSize="14sp" />
android:textSize="12sp" />
</LinearLayout>

View file

@ -305,6 +305,7 @@
<item>Favourite Manga</item>
<item>Planned Manga</item>
<item>Recommended</item>
<item>Social Feeds</item>
</string-array>
<string name="startUpTab">Default Start Up Tab</string>