From 5d34055fd07bfb125f65f757e975c5b8183fca66 Mon Sep 17 00:00:00 2001 From: Eugeniu Olog Date: Fri, 17 Apr 2020 21:01:35 +0200 Subject: [PATCH] added scroll helper to main activity --- app/build.gradle | 2 + .../monkey/retromusic/RetroScrollHelper.kt | 67 +++++++++ .../retromusic/activities/MainActivity.java | 7 + .../base/AbsSlidingMusicPanelActivity.kt | 12 +- .../extensions/ContextExtensions.kt | 10 ++ .../AbsLibraryPagerRecyclerViewFragment.kt | 51 +------ .../fragments/mainactivity/AlbumsFragment.kt | 3 +- .../fragments/mainactivity/ArtistsFragment.kt | 3 +- .../mainactivity/BannerHomeFragment.kt | 3 +- .../mainactivity/FoldersFragment.java | 3 +- .../fragments/mainactivity/GenresFragment.kt | 3 +- .../mainactivity/PlayingQueueFragment.kt | 3 +- .../mainactivity/PlaylistsFragment.kt | 3 +- .../fragments/mainactivity/SongsFragment.kt | 3 +- .../retromusic/util/ThemedFastScroller.kt | 11 +- .../main/res/layout/activity_main_content.xml | 128 ++++++++---------- .../main/res/layout/fragment_banner_home.xml | 1 + app/src/main/res/layout/fragment_home.xml | 1 + .../fragment_main_activity_recycler_view.xml | 5 +- .../res/layout/sliding_music_panel_layout.xml | 2 +- 20 files changed, 187 insertions(+), 134 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/RetroScrollHelper.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/extensions/ContextExtensions.kt diff --git a/app/build.gradle b/app/build.gradle index 4d558ba8f..9b447e358 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -176,6 +176,8 @@ dependencies { implementation 'com.github.AdrienPoupa:jaudiotagger:2.2.3' + implementation 'com.github.ologe:scroll-helper:2.0.0-beta01' + implementation 'com.anjlab.android.iab.v3:library:1.1.0' implementation 'com.r0adkll:slidableactivity:2.1.0' implementation 'com.heinrichreimersoftware:material-intro:1.6' diff --git a/app/src/main/java/code/name/monkey/retromusic/RetroScrollHelper.kt b/app/src/main/java/code/name/monkey/retromusic/RetroScrollHelper.kt new file mode 100644 index 000000000..b7fa8031d --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/RetroScrollHelper.kt @@ -0,0 +1,67 @@ +package code.name.monkey.retromusic + +import android.view.View +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 +import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment +import dev.olog.scrollhelper.ScrollHelper + +class RetroScrollHelper( + private val activity: FragmentActivity +) : ScrollHelper(activity, + true, + false // TODO when true, scrolls both bottomsheet and bottom navigation +) { + + private val skipFragment = listOf( + PlayerFragment::class.java.name + ) + + // TODO every fragment has to have it's unique tag in order to work correctly + // here you can decide what fragment will be processed by the library + // probably you want to skip player fragments, ecc .. + override fun shouldSkipFragment(fragment: Fragment): Boolean { + return fragment::class.java.name in skipFragment + } + + override fun findBottomNavigation(): View? { + return activity.findViewById(R.id.bottomNavigationView) + } + + override fun findBottomSheet(): View? { + return activity.findViewById(R.id.slidingPanel) + } + + override fun findFab(fragment: Fragment): View? { + return null + } + + override fun findRecyclerView(fragment: Fragment): RecyclerView? { + return fragment.requireView().findViewById(R.id.recyclerView) + } + + override fun findToolbar(fragment: Fragment): View? { + return fragment.requireActivity().findViewById(R.id.toolbarContainer) + } + + override fun findTabLayout(fragment: Fragment): View? { + return null + } + + override fun findViewPager(fragment: Fragment): ViewPager2? { + return null + } + + // TODO override this if you want to apply custom padding + override fun updateRecyclerViewPadding( + fragment: Fragment, + recyclerView: RecyclerView, + topPadding: Int, + bottomPadding: Int + ) { + super.updateRecyclerViewPadding(fragment, recyclerView, topPadding, bottomPadding) + } + +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java index 34d39e445..12a276f6c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java +++ b/app/src/main/java/code/name/monkey/retromusic/activities/MainActivity.java @@ -55,6 +55,7 @@ import java.util.List; import code.name.monkey.appthemehelper.util.ATHUtil; import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper; import code.name.monkey.retromusic.R; +import code.name.monkey.retromusic.RetroScrollHelper; import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity; import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog; import code.name.monkey.retromusic.fragments.base.AbsLibraryPagerRecyclerViewCustomGridSizeFragment; @@ -83,6 +84,7 @@ import code.name.monkey.retromusic.util.NavigationUtil; import code.name.monkey.retromusic.util.PreferenceUtil; import code.name.monkey.retromusic.util.RetroColorUtil; import code.name.monkey.retromusic.util.RetroUtil; +import dev.olog.scrollhelper.ScrollHelper; /** * Created by hemanths on 2020-02-19. @@ -119,6 +121,9 @@ public class MainActivity extends AbsSlidingMusicPanelActivity private Toolbar mToolbar; private MaterialCardView mToolbarContainer; + @SuppressWarnings("FieldCanBeLocal") + private ScrollHelper scrollHelper; + @Override protected void onCreate(@Nullable final Bundle savedInstanceState) { setDrawUnderStatusBar(); @@ -151,6 +156,8 @@ public class MainActivity extends AbsSlidingMusicPanelActivity checkShowChangelog(); AppRater.appLaunched(this); setupToolbar(); + + scrollHelper = new RetroScrollHelper(this); } @Override diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt index 3a84f55bc..ae55c974a 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivity.kt @@ -111,10 +111,14 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), } } + override fun onPause() { + super.onPause() + bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList) + } + override fun onDestroy() { super.onDestroy() - bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList) - if (navigationBarColorAnimator != null) navigationBarColorAnimator?.cancel() // just in case + navigationBarColorAnimator?.cancel() // just in case } protected fun wrapSlidingMusicPanel(@LayoutRes resId: Int): View { @@ -217,8 +221,8 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), } } - fun setBottomBarVisibility(gone: Int) { - bottomNavigationView.visibility = gone + fun setBottomBarVisibility(visibility: Int) { + bottomNavigationView.visibility = visibility hideBottomBar(false) } diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ContextExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ContextExtensions.kt new file mode 100644 index 000000000..297e4d59a --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ContextExtensions.kt @@ -0,0 +1,10 @@ +package code.name.monkey.retromusic.extensions + +import android.content.Context +import androidx.annotation.DimenRes + +@Suppress("NOTHING_TO_INLINE") +inline fun Context.dip(value: Int): Int = (value * resources.displayMetrics.density).toInt() + +@Suppress("NOTHING_TO_INLINE") +inline fun Context.dimen(@DimenRes resource: Int): Int = resources.getDimensionPixelSize(resource) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsLibraryPagerRecyclerViewFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsLibraryPagerRecyclerViewFragment.kt index 2ef27d5f5..bd7b45a8e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsLibraryPagerRecyclerViewFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsLibraryPagerRecyclerViewFragment.kt @@ -8,17 +8,13 @@ import androidx.annotation.NonNull import androidx.annotation.StringRes import androidx.recyclerview.widget.RecyclerView import code.name.monkey.retromusic.R -import code.name.monkey.retromusic.helper.MusicPlayerRemote -import code.name.monkey.retromusic.util.DensityUtil import code.name.monkey.retromusic.util.ThemedFastScroller.create -import code.name.monkey.retromusic.views.ScrollingViewOnApplyWindowInsetsListener -import com.google.android.material.appbar.AppBarLayout import kotlinx.android.synthetic.main.fragment_main_activity_recycler_view.* import me.zhanghai.android.fastscroll.FastScroller import me.zhanghai.android.fastscroll.FastScrollerBuilder abstract class AbsLibraryPagerRecyclerViewFragment, LM : RecyclerView.LayoutManager> : - AbsLibraryPagerFragment(), AppBarLayout.OnOffsetChangedListener { + AbsLibraryPagerFragment() { protected var adapter: A? = null protected var layoutManager: LM? = null @@ -31,7 +27,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment, override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mainActivity.addOnAppBarOffsetChangedListener(this) initLayoutManager() initAdapter() setUpRecyclerView() @@ -41,13 +36,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment, recyclerView.layoutManager = layoutManager recyclerView.adapter = adapter val fastScroller = create(recyclerView) - recyclerView.setOnApplyWindowInsetsListener( - ScrollingViewOnApplyWindowInsetsListener( - recyclerView, - fastScroller - ) - ) - checkForPadding() } protected open fun createFastScroller(recyclerView: RecyclerView): FastScroller { @@ -60,7 +48,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment, override fun onChanged() { super.onChanged() checkIsEmpty() - checkForPadding() } }) } @@ -78,18 +65,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment, empty.visibility = if (adapter!!.itemCount == 0) View.VISIBLE else View.GONE } - private fun checkForPadding() { - val itemCount: Int = adapter?.itemCount ?: 0 - val params = container.layoutParams as ViewGroup.MarginLayoutParams - if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) { - val height = DensityUtil.dip2px(requireContext(), 104f) - params.bottomMargin = height - } else { - val height = DensityUtil.dip2px(requireContext(), 52f) - params.bottomMargin = height - } - } - private fun initLayoutManager() { layoutManager = createLayoutManager() } @@ -99,25 +74,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment, @NonNull protected abstract fun createAdapter(): A - override fun onOffsetChanged(p0: AppBarLayout?, i: Int) { - container.setPadding( - container.paddingLeft, - container.paddingTop, - container.paddingRight, - mainActivity.totalAppBarScrollingRange + i - ) - } - - override fun onQueueChanged() { - super.onQueueChanged() - checkForPadding() - } - - override fun onServiceConnected() { - super.onServiceConnected() - checkForPadding() - } - protected fun invalidateLayoutManager() { initLayoutManager() recyclerView.layoutManager = layoutManager @@ -129,11 +85,6 @@ abstract class AbsLibraryPagerRecyclerViewFragment, recyclerView.adapter = adapter } - override fun onDestroyView() { - super.onDestroyView() - mainActivity.removeOnAppBarOffsetChangedListener(this) - } - fun recyclerView(): RecyclerView { return recyclerView } diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/AlbumsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/AlbumsFragment.kt index 32c374d7e..d7b541b29 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/AlbumsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/AlbumsFragment.kt @@ -12,6 +12,7 @@ import code.name.monkey.retromusic.model.Album import code.name.monkey.retromusic.mvp.presenter.AlbumsPresenter import code.name.monkey.retromusic.mvp.presenter.AlbumsView import code.name.monkey.retromusic.util.PreferenceUtil +import dev.olog.scrollhelper.layoutmanagers.OverScrollGridLayoutManager import javax.inject.Inject class AlbumsFragment : @@ -51,7 +52,7 @@ class AlbumsFragment : get() = R.string.no_albums override fun createLayoutManager(): GridLayoutManager { - return GridLayoutManager(requireActivity(), getGridSize()) + return OverScrollGridLayoutManager(requireActivity(), getGridSize()) } override fun createAdapter(): AlbumAdapter { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/ArtistsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/ArtistsFragment.kt index 6f4ded1cf..adb055946 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/ArtistsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/ArtistsFragment.kt @@ -12,6 +12,7 @@ import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.mvp.presenter.ArtistsPresenter import code.name.monkey.retromusic.mvp.presenter.ArtistsView import code.name.monkey.retromusic.util.PreferenceUtil +import dev.olog.scrollhelper.layoutmanagers.OverScrollGridLayoutManager import javax.inject.Inject class ArtistsFragment : @@ -63,7 +64,7 @@ class ArtistsFragment : } override fun createLayoutManager(): GridLayoutManager { - return GridLayoutManager(requireActivity(), getGridSize()) + return OverScrollGridLayoutManager(requireActivity(), getGridSize()) } override fun createAdapter(): ArtistAdapter { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/BannerHomeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/BannerHomeFragment.kt index 33b02895c..8c4faf0b0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/BannerHomeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/BannerHomeFragment.kt @@ -41,6 +41,7 @@ import code.name.monkey.retromusic.util.NavigationUtil import code.name.monkey.retromusic.util.PreferenceUtil import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy +import dev.olog.scrollhelper.layoutmanagers.OverScrollLinearLayoutManager import kotlinx.android.synthetic.main.abs_playlists.* import kotlinx.android.synthetic.main.fragment_banner_home.* import kotlinx.android.synthetic.main.home_content.* @@ -141,7 +142,7 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba homeAdapter = HomeAdapter(mainActivity, displayMetrics) recyclerView.apply { - layoutManager = LinearLayoutManager(mainActivity) + layoutManager = OverScrollLinearLayoutManager(mainActivity) adapter = homeAdapter } homePresenter.attachView(this) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java index ab2daabce..a912731fb 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/FoldersFragment.java @@ -74,6 +74,7 @@ import code.name.monkey.retromusic.util.RetroColorUtil; import code.name.monkey.retromusic.util.ThemedFastScroller; import code.name.monkey.retromusic.views.BreadCrumbLayout; import code.name.monkey.retromusic.views.ScrollingViewOnApplyWindowInsetsListener; +import dev.olog.scrollhelper.layoutmanagers.OverScrollLinearLayoutManager; import me.zhanghai.android.fastscroll.FastScroller; public class FoldersFragment extends AbsMainActivityFragment implements @@ -478,7 +479,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements } private void setUpRecyclerView() { - recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + recyclerView.setLayoutManager(new OverScrollLinearLayoutManager(getActivity())); FastScroller fastScroller = ThemedFastScroller.INSTANCE.create(recyclerView); recyclerView.setOnApplyWindowInsetsListener( new ScrollingViewOnApplyWindowInsetsListener(recyclerView, fastScroller)); diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/GenresFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/GenresFragment.kt index bf0dc49cd..548c13309 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/GenresFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/mainactivity/GenresFragment.kt @@ -25,6 +25,7 @@ import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks import code.name.monkey.retromusic.model.Genre import code.name.monkey.retromusic.mvp.presenter.GenresPresenter import code.name.monkey.retromusic.mvp.presenter.GenresView +import dev.olog.scrollhelper.layoutmanagers.OverScrollLinearLayoutManager import javax.inject.Inject class GenresFragment : AbsLibraryPagerRecyclerViewFragment(), @@ -42,7 +43,7 @@ class GenresFragment : AbsLibraryPagerRecyclerViewFragment - + android:background="?colorSurface"> + + + + + - - - - - - - - - - - - - - - - - - - - - - + app:cardCornerRadius="8dp" + app:cardUseCompatPadding="true" + app:layout_scrollFlags="scroll|enterAlways"> - - \ No newline at end of file + android:layout_height="wrap_content"> + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_banner_home.xml b/app/src/main/res/layout/fragment_banner_home.xml index 5d571b410..250d99db1 100644 --- a/app/src/main/res/layout/fragment_banner_home.xml +++ b/app/src/main/res/layout/fragment_banner_home.xml @@ -17,6 +17,7 @@ android:id="@+id/container" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/toolbar_height" app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"> + +