From 92089067f1e4e779312ddbe84207f9d23fe68982 Mon Sep 17 00:00:00 2001 From: rebelonion <87634197+rebelonion@users.noreply.github.com> Date: Sun, 10 Mar 2024 03:20:05 -0500 Subject: [PATCH] fix: activity pagination --- .../ani/dantotsu/profile/ProfileActivity.kt | 49 ++++++++++++++++++- .../ani/dantotsu/profile/StatsFragment.kt | 5 +- .../dantotsu/profile/activity/FeedFragment.kt | 9 ++-- app/src/main/res/layout/activity_profile.xml | 38 ++++++++------ app/src/main/res/layout/fragment_profile.xml | 21 +++++--- .../main/res/layout/fragment_statistics.xml | 5 +- 6 files changed, 97 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt index a7f8216d..ac3c64a9 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt @@ -1,8 +1,10 @@ package ani.dantotsu.profile +import android.animation.ObjectAnimator import android.annotation.SuppressLint import android.content.Intent import android.os.Bundle +import android.util.TypedValue import android.view.View import android.view.ViewGroup import android.widget.PopupMenu @@ -29,13 +31,15 @@ import ani.dantotsu.snackString import ani.dantotsu.statusBarHeight import ani.dantotsu.themes.ThemeManager import ani.dantotsu.toast +import com.google.android.material.appbar.AppBarLayout import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import nl.joery.animatedbottombar.AnimatedBottomBar +import kotlin.math.abs -class ProfileActivity : AppCompatActivity() { +class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListener { lateinit var binding: ActivityProfileBinding private var selected: Int = 1 private lateinit var navBar: AnimatedBottomBar @@ -47,6 +51,7 @@ class ProfileActivity : AppCompatActivity() { initActivity(this) binding = ActivityProfileBinding.inflate(layoutInflater) setContentView(binding.root) + screenWidth = resources.displayMetrics.widthPixels.toFloat() navBar = binding.profileNavBar navBar.updateLayoutParams { bottomMargin = navBarHeight } val feedTab = navBar.createTab(R.drawable.ic_round_filter_24, "Feed") @@ -57,6 +62,7 @@ class ProfileActivity : AppCompatActivity() { navBar.addTab(statsTab) navBar.visibility = View.GONE binding.profileViewPager.isUserInputEnabled = false + lifecycleScope.launch(Dispatchers.IO) { val userid = intent.getIntExtra("userId", 0) val respond = Anilist.query.getUserProfile(userid) @@ -72,6 +78,7 @@ class ProfileActivity : AppCompatActivity() { } binding.profileViewPager.adapter = ViewPagerAdapter(supportFragmentManager, lifecycle, user) + binding.profileViewPager.setOffscreenPageLimit(3) binding.profileViewPager.setCurrentItem(selected, false) navBar.visibility = View.VISIBLE navBar.selectTabAt(selected) @@ -163,10 +170,50 @@ class ProfileActivity : AppCompatActivity() { ) } + mMaxScrollSize = binding.profileAppBar.totalScrollRange + binding.profileAppBar.addOnOffsetChangedListener(this@ProfileActivity) } } } + //Collapsing UI Stuff + private var isCollapsed = false + private val percent = 45 + private var mMaxScrollSize = 0 + private var screenWidth: Float = 0f + + override fun onOffsetChanged(appBar: AppBarLayout, i: Int) { + if (mMaxScrollSize == 0) mMaxScrollSize = appBar.totalScrollRange + val percentage = abs(i) * 100 / mMaxScrollSize + + binding.profileUserAvatarContainer.visibility = + if (binding.profileUserAvatarContainer.scaleX == 0f) View.GONE else View.VISIBLE + val duration = (200 * (PrefManager.getVal(PrefName.AnimationSpeed) as Float)).toLong() + val typedValue = TypedValue() + this@ProfileActivity.theme.resolveAttribute( + com.google.android.material.R.attr.colorSecondary, + typedValue, + true + ) + val color = typedValue.data + if (percentage >= percent && !isCollapsed) { + isCollapsed = true + ObjectAnimator.ofFloat(binding.profileUserDataContainer, "translationX", screenWidth) + .setDuration(duration).start() + ObjectAnimator.ofFloat(binding.profileUserAvatarContainer, "translationX", screenWidth) + .setDuration(duration).start() + binding.profileBannerImage.pause() + } + if (percentage <= percent && isCollapsed) { + isCollapsed = false + ObjectAnimator.ofFloat(binding.profileUserDataContainer, "translationX", 0f) + .setDuration(duration).start() + ObjectAnimator.ofFloat(binding.profileUserAvatarContainer, "translationX", 0f).setDuration(duration) + .start() + if (PrefManager.getVal(PrefName.BannerAnimations)) binding.profileBannerImage.resume() + } + } + override fun onResume() { if (this::navBar.isInitialized) { navBar.selectTabAt(selected) diff --git a/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt b/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt index bb245f47..3b878846 100644 --- a/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter +import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager @@ -16,6 +17,7 @@ import ani.dantotsu.profile.ChartBuilder.Companion.ChartPacket import ani.dantotsu.profile.ChartBuilder.Companion.ChartType import ani.dantotsu.profile.ChartBuilder.Companion.MediaType import ani.dantotsu.profile.ChartBuilder.Companion.StatType +import ani.dantotsu.statusBarHeight import com.github.aachartmodel.aainfographics.aachartcreator.AAChartType import com.xwray.groupie.GroupieAdapter import kotlinx.coroutines.Dispatchers @@ -49,10 +51,11 @@ class StatsFragment : binding.statisticList.adapter = adapter binding.statisticList.setHasFixedSize(true) - binding.statisticList.isNestedScrollingEnabled = false + binding.statisticList.isNestedScrollingEnabled = true binding.statisticList.layoutManager = LinearLayoutManager(requireContext()) binding.statisticProgressBar.visibility = View.VISIBLE binding.compare.visibility = if (user.id == Anilist.userid) View.GONE else View.VISIBLE + binding.filterContainer.updateLayoutParams { topMargin = statusBarHeight } binding.sourceType.setAdapter( ArrayAdapter( 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 f6751d53..720514c9 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt @@ -58,14 +58,11 @@ class FeedFragment : Fragment() { adapter.update(activityList.map { ActivityItem(it) { _, _ -> } }) } binding.listProgressBar.visibility = ViewGroup.GONE - val scrollView = if (activity is ProfileActivity) { - (activity as ProfileActivity).binding.profileScrollView - } else { - binding.listRecyclerView - } + val scrollView = binding.listRecyclerView + binding.listRecyclerView.setOnTouchListener { _, event -> if (event?.action == MotionEvent.ACTION_UP) { - if (adapter.itemCount % AnilistQueries.ITEMS_PER_PAGE != 0) { + if (adapter.itemCount % AnilistQueries.ITEMS_PER_PAGE != 0 && !global) { snackString("No more activities") } else if (!scrollView.canScrollVertically(1) && !binding.feedRefresh.isVisible && binding.listRecyclerView.adapter!!.itemCount != 0 && diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 409e6860..5cfbe177 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -19,17 +19,18 @@ android:layout_height="wrap_content" /> - + android:translationZ="5dp"> - + android:layout_height="wrap_content" + android:fitsSystemWindows="false" + app:contentScrim="?android:colorBackground" + app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"> - + - + - + + + + - + @@ -344,9 +349,9 @@ android:layout_marginTop="8dp" android:layout_marginEnd="32dp" android:fontFamily="@font/poppins_bold" - android:text="@string/about_me" android:padding="8dp" - android:textSize="18sp"/> + android:text="@string/about_me" + android:textSize="18sp" /> @@ -464,8 +470,8 @@ android:layout_marginTop="8dp" android:layout_marginEnd="32dp" android:fontFamily="@font/poppins_bold" - android:text="@string/fav_character" android:padding="8dp" + android:text="@string/fav_character" android:textSize="18sp" /> - \ No newline at end of file + + diff --git a/app/src/main/res/layout/fragment_statistics.xml b/app/src/main/res/layout/fragment_statistics.xml index 19aaff14..9f202f6d 100644 --- a/app/src/main/res/layout/fragment_statistics.xml +++ b/app/src/main/res/layout/fragment_statistics.xml @@ -14,7 +14,9 @@ android:layout_height="wrap_content" android:baselineAligned="false" android:orientation="vertical" - android:padding="16dp"> + android:paddingBottom="16dp" + android:paddingStart="16dp" + android:paddingEnd="16dp">