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">
+
+