From 967c6fb5ac7d554fa92222aaf9997acd545e429f Mon Sep 17 00:00:00 2001 From: Eugeniu Olog Date: Fri, 17 Apr 2020 18:34:05 +0200 Subject: [PATCH 1/6] fixed statusbar implementation: `r.getIdentifier("status_bar_height", "dimen", "android")` was returning always about 24 dp, with notch not being considered. A best approach is to use WindowInset API --- .../retromusic/views/StatusBarView.java | 59 ------------------- .../monkey/retromusic/views/StatusBarView.kt | 30 ++++++++++ 2 files changed, 30 insertions(+), 59 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.kt diff --git a/app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.java b/app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.java deleted file mode 100644 index 8eaf325d4..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2019 Hemanth Savarala. - * - * Licensed under the GNU General Public License v3 - * - * This is free software: you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by - * the Free Software Foundation either version 3 of the License, or (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * See the GNU General Public License for more details. - */ - -package code.name.monkey.retromusic.views; - -import android.content.Context; -import android.content.res.Resources; -import android.util.AttributeSet; -import android.view.View; - -import androidx.annotation.NonNull; - -public class StatusBarView extends View { - - - public StatusBarView(@NonNull Context context) { - super(context); - init(context); - } - - public StatusBarView(@NonNull Context context, @NonNull AttributeSet attrs) { - super(context, attrs); - init(context); - } - - public StatusBarView(@NonNull Context context, @NonNull AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(context); - } - - public static int getStatusBarHeight(@NonNull Resources r) { - int result = 0; - int resourceId = r.getIdentifier("status_bar_height", "dimen", "android"); - if (resourceId > 0) { - result = r.getDimensionPixelSize(resourceId); - } - return result; - } - - private void init(Context context) { - - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), getStatusBarHeight(getResources())); - } -} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.kt b/app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.kt new file mode 100644 index 000000000..9a5833f79 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.kt @@ -0,0 +1,30 @@ +package code.name.monkey.retromusic.views + +import android.content.Context +import android.util.AttributeSet +import android.view.View + +class StatusBarView( + context: Context, + attrs: AttributeSet +) : View(context, attrs) { + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + if (isInEditMode){ + return + } + setOnApplyWindowInsetsListener { _, insets -> + val height = insets?.systemWindowInsetTop ?: 0 + setHeight(height) + insets + } + } + + private fun setHeight(px: Int) { + val params = layoutParams ?: return + params.height = px + layoutParams = params + } + +} \ No newline at end of file From 5d34055fd07bfb125f65f757e975c5b8183fca66 Mon Sep 17 00:00:00 2001 From: Eugeniu Olog Date: Fri, 17 Apr 2020 21:01:35 +0200 Subject: [PATCH 2/6] 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"> + + From 23c882bdb7b4d6be57e1027e42f9ac5a407920bc Mon Sep 17 00:00:00 2001 From: Eugeniu Olog Date: Fri, 17 Apr 2020 21:18:50 +0200 Subject: [PATCH 3/6] removed previous bottomnavigation translation --- .../retromusic/activities/base/AbsSlidingMusicPanelActivity.kt | 1 - 1 file changed, 1 deletion(-) 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 ae55c974a..7f92a4f62 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 @@ -146,7 +146,6 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), // necessary to make the views below clickable miniPlayerFragment?.view?.visibility = if (alpha == 0f) View.GONE else View.VISIBLE - bottomNavigationView.translationY = progress * 500 //bottomNavigationView.alpha = alpha } From 6065c994ad5e5c4add4fd0177ce11adff5ceaad2 Mon Sep 17 00:00:00 2001 From: h4h13 Date: Sat, 18 Apr 2020 12:19:35 +0530 Subject: [PATCH 4/6] Fix crashing when changing theme --- app/build.gradle | 10 +++++++++ .../monkey/retromusic/adapter/GenreAdapter.kt | 22 +++++++++++++++++-- .../mainactivity/BannerHomeFragment.kt | 8 ++++++- .../settings/ThemeSettingsFragment.kt | 17 ++++---------- .../monkey/retromusic/util/AppExecutors.kt | 16 ++++++++++++++ .../main/res/layout/activity_user_info.xml | 3 ++- 6 files changed, 59 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/util/AppExecutors.kt diff --git a/app/build.gradle b/app/build.gradle index 4d558ba8f..b1549caae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -99,6 +99,11 @@ android { kapt { generateStubs = true } + kotlin { + experimental { + coroutines "enable" + } + } } @@ -168,6 +173,9 @@ dependencies { def kotlin_coroutines_version = "1.3.3" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" + def arch_version = '2.2.0' + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$arch_version" + implementation "androidx.lifecycle:lifecycle-runtime-ktx:$arch_version" implementation 'org.eclipse.mylyn.github:org.eclipse.egit.github.core:3.4.0.201406110918-r' @@ -184,4 +192,6 @@ dependencies { def dagger_version = "2.23.1" implementation "com.google.dagger:dagger:$dagger_version" kapt "com.google.dagger:dagger-compiler:$dagger_version" + + implementation 'com.github.ologe:scroll-helper:1.1.5' } \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt index 570912a30..9b27309ed 100644 --- a/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt +++ b/app/src/main/java/code/name/monkey/retromusic/adapter/GenreAdapter.kt @@ -4,8 +4,10 @@ import android.app.Activity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.adapter.GenreAdapter.ViewHolder import code.name.monkey.retromusic.adapter.base.MediaEntryViewHolder import code.name.monkey.retromusic.model.Genre import code.name.monkey.retromusic.util.NavigationUtil @@ -19,7 +21,7 @@ class GenreAdapter( private val activity: Activity, var dataSet: List, private val mItemLayoutRes: Int -) : RecyclerView.Adapter() { +) : ListAdapter(GenreDiffCallback()) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { @@ -54,3 +56,19 @@ class GenreAdapter( } } } + +/** + * Callback for calculating the diff between two non-null items in a list. + * + * Used by ListAdapter to calculate the minimum number of changes between and old list and a new + * list that's been passed to `submitList`. + */ +class GenreDiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Genre, newItem: Genre): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: Genre, newItem: Genre): Boolean { + return oldItem == newItem + } +} \ No newline at end of file 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..fc87c4eaa 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 @@ -20,6 +20,7 @@ import android.util.DisplayMetrics import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import code.name.monkey.retromusic.App import code.name.monkey.retromusic.Constants @@ -44,6 +45,8 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy import kotlinx.android.synthetic.main.abs_playlists.* import kotlinx.android.synthetic.main.fragment_banner_home.* import kotlinx.android.synthetic.main.home_content.* +import kotlinx.coroutines.async +import kotlinx.coroutines.launch import java.io.File import java.util.* import javax.inject.Inject @@ -119,7 +122,10 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba } actionShuffle.setOnClickListener { - MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(requireActivity()), true) + lifecycleScope.launch { + val songs = async { SongLoader.getAllSongs(requireContext()) } + MusicPlayerRemote.openAndShuffleQueue(songs.await(), true) + } } history.setOnClickListener { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt index 3e72b7014..558558803 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/settings/ThemeSettingsFragment.kt @@ -16,7 +16,6 @@ package code.name.monkey.retromusic.fragments.settings import android.os.Build import android.os.Bundle -import android.os.Handler import androidx.preference.Preference import androidx.preference.TwoStatePreference import code.name.monkey.appthemehelper.ACCENT_COLORS @@ -54,9 +53,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() { requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue(theme)) DynamicShortcutManager(requireContext()).updateDynamicShortcuts() } - Handler().postDelayed({ - requireActivity().recreate() - }, 400) + requireActivity().recreate() true } } @@ -78,9 +75,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() { ThemeStore.editTheme(requireContext()).accentColor(color).commit() if (VersionUtils.hasNougatMR()) DynamicShortcutManager(requireContext()).updateDynamicShortcuts() - Handler().postDelayed({ - requireActivity().recreate() - }, 400) + requireActivity().recreate() } } return@setOnPreferenceClickListener true @@ -96,9 +91,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() { requireActivity().setTheme(PreferenceUtil.getThemeResFromPrefValue("black")) DynamicShortcutManager(requireContext()).updateDynamicShortcuts() } - Handler().postDelayed({ - requireActivity().recreate() - }, 400) + requireActivity().recreate() true } @@ -109,9 +102,7 @@ class ThemeSettingsFragment : AbsSettingsFragment() { ThemeStore.prefs(requireContext()).edit().putBoolean("desaturated_color", desaturated) .apply() PreferenceUtil.getInstance(requireContext()).setDesaturatedColor(desaturated) - Handler().postDelayed({ - requireActivity().recreate() - }, 400) + requireActivity().recreate() true } diff --git a/app/src/main/java/code/name/monkey/retromusic/util/AppExecutors.kt b/app/src/main/java/code/name/monkey/retromusic/util/AppExecutors.kt new file mode 100644 index 000000000..aed5968bb --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/util/AppExecutors.kt @@ -0,0 +1,16 @@ +package code.name.monkey.retromusic.util + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers + +const val THREAD_COUNT = 3 + +/** + * Global executor pools for the whole application. + * + * Grouping tasks like this avoids the effects of task starvation (e.g. disk reads don't wait behind + * webservice requests). + */ +open class AppExecutors constructor( + val ioContext: CoroutineDispatcher = Dispatchers.IO +) \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_info.xml b/app/src/main/res/layout/activity_user_info.xml index a3b2a3f3a..bb92d2a4d 100644 --- a/app/src/main/res/layout/activity_user_info.xml +++ b/app/src/main/res/layout/activity_user_info.xml @@ -97,7 +97,8 @@ app:retroCornerSize="36dp" app:srcCompat="@drawable/ic_person_flat" app:strokeColor="?attr/colorSurface" - app:strokeWidth="2dp" /> + app:strokeWidth="2dp" + tools:src="@tools:sample/avatars" /> Date: Sun, 19 Apr 2020 00:14:24 +0530 Subject: [PATCH 5/6] Equalizer WIP --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 26 +- .../activities/EqualizerActivity.kt | 123 ++++++++ .../retromusic/equalizer/AudioEffects.java | 272 ++++++++++++++++++ .../equalizer/AudioEffectsReceiver.java | 27 ++ .../retromusic/equalizer/BasePresenter.java | 15 + .../retromusic/equalizer/FreqLevelItem.kt | 105 +++++++ .../retromusic/equalizer/MainContract.java | 24 ++ .../retromusic/equalizer/MainPresenter.java | 116 ++++++++ .../name/monkey/retromusic/model/Band.java | 29 ++ .../retromusic/service/PlaybackHandler.java | 2 +- .../retromusic/util/NavigationUtil.java | 4 +- .../main/res/layout/activity_equalizer.xml | 66 +++++ app/src/main/res/layout/dropdown_item.xml | 10 + app/src/main/res/layout/equalizer_slider.xml | 32 +++ app/src/main/res/layout/freq_level_item.xml | 27 ++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 12 +- .../appthemehelper/common/views/ATESwitch.kt | 22 +- 19 files changed, 880 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/code/name/monkey/retromusic/activities/EqualizerActivity.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffects.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffectsReceiver.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/BasePresenter.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/FreqLevelItem.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/MainContract.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/equalizer/MainPresenter.java create mode 100644 app/src/main/java/code/name/monkey/retromusic/model/Band.java create mode 100644 app/src/main/res/layout/activity_equalizer.xml create mode 100644 app/src/main/res/layout/dropdown_item.xml create mode 100644 app/src/main/res/layout/equalizer_slider.xml create mode 100644 app/src/main/res/layout/freq_level_item.xml diff --git a/app/build.gradle b/app/build.gradle index b1549caae..c1a1beb57 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -194,4 +194,4 @@ dependencies { kapt "com.google.dagger:dagger-compiler:$dagger_version" implementation 'com.github.ologe:scroll-helper:1.1.5' -} \ No newline at end of file +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 888def0e7..95f43643c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -17,7 +17,6 @@ - + + - - - @@ -149,8 +147,6 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> - - - - - + + + + + + - - - @@ -266,4 +265,5 @@ android:name="com.android.vending.splits.required" android:value="true" /> - + + \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/EqualizerActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/EqualizerActivity.kt new file mode 100644 index 000000000..ef2c34e48 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/activities/EqualizerActivity.kt @@ -0,0 +1,123 @@ +package code.name.monkey.retromusic.activities + +import android.os.Bundle +import android.util.Log +import android.view.View +import android.widget.AdapterView +import android.widget.AdapterView.OnItemSelectedListener +import android.widget.ArrayAdapter +import code.name.monkey.appthemehelper.ThemeStore +import code.name.monkey.appthemehelper.util.ATHUtil +import code.name.monkey.appthemehelper.util.ColorUtil +import code.name.monkey.appthemehelper.util.MaterialValueHelper +import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity +import code.name.monkey.retromusic.equalizer.FreqLevelItem +import code.name.monkey.retromusic.equalizer.MainContract +import code.name.monkey.retromusic.equalizer.MainPresenter +import code.name.monkey.retromusic.helper.MusicPlayerRemote +import code.name.monkey.retromusic.model.Band +import kotlinx.android.synthetic.main.activity_equalizer.* + + +class EqualizerActivity : AbsMusicServiceActivity(), MainContract.View { + + private lateinit var mainPresenter: MainPresenter + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_equalizer) + setStatusbarColorAuto() + setNavigationbarColorAuto() + setLightNavigationBar(true) + + val toolbarColor = ATHUtil.resolveColor(this, R.attr.colorSurface) + toolbar.setBackgroundColor(toolbarColor) + ToolbarContentTintHelper.colorBackButton(toolbar) + setSupportActionBar(toolbar) + + equalizerToggle.setOnCheckedChangeListener { _, isChecked -> + mainPresenter.effectOnOff(isChecked) + } + + mainPresenter = MainPresenter(this) + mainPresenter.initEqualizer() + + val accentColor = ThemeStore.accentColor(this) + val textColor = MaterialValueHelper.getPrimaryTextColor( + this, + ColorUtil.isColorLight(accentColor) + ) + equalizerToggle.setBackgroundColor(accentColor) + equalizerToggle.setTextColor(textColor) + + } + + override fun onStop() { + super.onStop() + mainPresenter.detachView() + } + + override fun showEmptyView() { + + } + + + override fun showBandInfo(bands: Array) { + bandList.removeAllViews() + for (i in bands.indices) { + val band = bands[i] + val freqLevelItem = FreqLevelItem(this, null, 0) + freqLevelItem.setLevelInfo(band) + freqLevelItem.id = i + bandList.addView(freqLevelItem, i) + } + } + + override fun showPresetList(presetNames: Array?) { + val spinnerAdapter: ArrayAdapter<*> = ArrayAdapter( + this, + R.layout.dropdown_item, + presetNames!! + ) + spinnerAdapter.setDropDownViewResource(R.layout.dropdown_item) + preset.adapter = spinnerAdapter + preset.onItemSelectedListener = object : OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>?, + view: View?, + position: Int, + id: Long + ) { + Log.d("eq", "onItemSelected position $position, id $id") + mainPresenter.changePreset(position.toShort()) + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + Log.d("eq", "onNothingSelected") + } + } + } + + override fun showBandLevel(levels: ShortArray) { + val count = bandList.childCount + for (i in 0 until count) { + val item: View = bandList.getChildAt(i) + if (item is FreqLevelItem) { + val freqLevelItem = item as FreqLevelItem + freqLevelItem.setBandLevel(levels[i]) + } + } + } + + override fun onServiceConnected() { + super.onServiceConnected() + mainPresenter.changeAudioSession(MusicPlayerRemote.audioSessionId) + } + + override fun onPlayingMetaChanged() { + super.onPlayingMetaChanged() + mainPresenter.changeAudioSession(MusicPlayerRemote.audioSessionId) + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffects.java b/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffects.java new file mode 100644 index 000000000..0ab7307e6 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffects.java @@ -0,0 +1,272 @@ +package code.name.monkey.retromusic.equalizer; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.SharedPreferences; +import android.media.audiofx.BassBoost; +import android.media.audiofx.Equalizer; +import android.util.Log; + +import code.name.monkey.retromusic.R; + + +public class AudioEffects { + + public static final short BASSBOOST_MAX_STRENGTH = 1000; + private static final String PREF_EQ_ENABLED = "enabled"; + private static final String PREF_BAND_LEVEL = "level"; + private static final String PREF_PRESET = "preset"; + private static final String PREF_BASSBOOST = "bassboost"; + private static final String AUDIO_EFFECTS_PREFS = "audioeffects"; + + private static final BassBoostValues sBassBoostValues = new BassBoostValues(); + private static final EqualizerValues sEqualizerValues = new EqualizerValues(); + private static BassBoost sBassBoost; + private static Equalizer sEqualizer; + private static boolean sCustomPreset; + + public static void init(Context context) { + SharedPreferences prefs = context.getSharedPreferences(AUDIO_EFFECTS_PREFS, Context.MODE_PRIVATE); + + initBassBoostValues(prefs); + initEqualizerValues(prefs); + } + + + public static void openAudioEffectSession(Context context, int audioSessionId) { + SharedPreferences prefs = context.getSharedPreferences(AUDIO_EFFECTS_PREFS, Context.MODE_PRIVATE); + + initBassBoost(audioSessionId); + initEqualizer(prefs, audioSessionId); + } + + public static void closeAudioEffectSession() { + if (sBassBoost != null) { + sBassBoost.release(); + sBassBoost = null; + } + + if (sEqualizer != null) { + sEqualizer.release(); + sEqualizer = null; + } + } + + private static void initBassBoostValues(SharedPreferences prefs) { + sBassBoostValues.enabled = prefs.getBoolean(PREF_EQ_ENABLED, false); + sBassBoostValues.strength = (short) prefs.getInt(PREF_BASSBOOST, 0); + } + + private static void initBassBoost(int audioSessionId) { + if (sBassBoost != null) { + sBassBoost.release(); + sBassBoost = null; + } + sBassBoost = new BassBoost(0, audioSessionId); + sBassBoost.setEnabled(sBassBoostValues.enabled); + + short strength = sBassBoostValues.strength; + + if (strength >= 0 && strength <= BASSBOOST_MAX_STRENGTH) { + sBassBoost.setStrength(strength); + } + } + + private static void initEqualizerValues(SharedPreferences prefs) { + + + sEqualizerValues.enabled = prefs.getBoolean(PREF_EQ_ENABLED, false); + + sEqualizerValues.preset = (short) prefs.getInt(PREF_PRESET, -1); + + if (sEqualizerValues.preset == -1) { + sCustomPreset = true; + } + } + + private static void initEqualizer(SharedPreferences prefs, int audioSessionId) { + + if (sEqualizer != null) { + sEqualizer.release(); + sEqualizer = null; + } + sEqualizer = new Equalizer(0, audioSessionId); + sEqualizer.setEnabled(sEqualizerValues.enabled); + + if (!sCustomPreset) { + usePreset(sEqualizerValues.preset); + + } + + sEqualizerValues.numberOfBands = sEqualizer.getNumberOfBands(); + + + if (!sEqualizerValues.levelsSet) { + sEqualizerValues.bandLevels = new short[sEqualizerValues.numberOfBands]; + } + for (short b = 0; b < sEqualizerValues.numberOfBands; b++) { + if (!sEqualizerValues.levelsSet) { + short level = (short) prefs.getInt(PREF_BAND_LEVEL + b, sEqualizer.getBandLevel(b)); + sEqualizerValues.bandLevels[b] = level; + if (sCustomPreset) { + + sEqualizer.setBandLevel(b, level); + } + } else { + sEqualizer.setBandLevel(b, sEqualizerValues.bandLevels[b]); + } + } + + sEqualizerValues.levelsSet = true; + + + } + + public static short getBassBoostStrength() { + return sBassBoostValues.strength; + } + + public static void setBassBoostStrength(short strength) { + sBassBoostValues.strength = strength; + if (sBassBoost != null) { + sBassBoost.setStrength(strength); + } + + } + + public static short[] getBandLevelRange() { + if (sEqualizer == null) { + return null; + } + return sEqualizer.getBandLevelRange(); + } + + public static short getBandLevel(short band) { + if (sEqualizer == null) { + if (sEqualizerValues.levelsSet && sEqualizerValues.bandLevels.length > band) { + return sEqualizerValues.bandLevels[band]; + } + } + Log.d("audiofx", "eeeD"); + return sEqualizer.getBandLevel(band); + } + + public static boolean areAudioEffectsEnabled() { + if (sEqualizer == null) { + return sEqualizerValues.enabled; + } + return sEqualizer.getEnabled(); + } + + public static void setAudioEffectsEnabled(boolean enabled) { + if (sEqualizer == null || sBassBoost == null) { + return; + } + sBassBoost.setEnabled(true); + sEqualizer.setEnabled(enabled); + } + + public static void setBandLevel(short band, short level) { + sCustomPreset = true; + + if (sEqualizerValues.bandLevels.length > band) { + sEqualizerValues.preset = -1; + sEqualizerValues.bandLevels[band] = level; + } + + if (sEqualizer != null) { + sEqualizer.setBandLevel(band, level); + } + } + + public static String[] getEqualizerPresets(Context context) { + if (sEqualizer == null) { + return new String[]{}; + } + short numberOfPresets = sEqualizer.getNumberOfPresets(); + + String[] presets = new String[numberOfPresets + 1]; + + presets[0] = context.getResources().getString(R.string.custom); + + for (short n = 0; n < numberOfPresets; n++) { + presets[n + 1] = sEqualizer.getPresetName(n); + } + + return presets; + } + + public static int getCurrentPreset() { + if (sEqualizer == null || sCustomPreset) { + return 0; + } + + return sEqualizer.getCurrentPreset() + 1; + } + + public static void usePreset(short preset) { + if (sEqualizer == null) { + return; + } + sCustomPreset = false; + sEqualizer.usePreset(preset); + + } + + + public static short getNumberOfBands() { + if (sEqualizer == null) { + return 0; + } + return sEqualizer.getNumberOfBands(); + } + + public static int getCenterFreq(short band) { + if (sEqualizer == null) { + return 0; + } + return sEqualizer.getCenterFreq(band); + } + + @SuppressLint("CommitPrefEdits") + public static void savePrefs(Context context) { + if (sEqualizer == null || sBassBoost == null) { + return; + } + SharedPreferences prefs = context.getSharedPreferences(AUDIO_EFFECTS_PREFS, + Context.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + + editor.putInt(PREF_BASSBOOST, sBassBoostValues.strength); + + short preset = sCustomPreset ? -1 : sEqualizer.getCurrentPreset(); + editor.putInt(PREF_PRESET, preset); + + + short bands = sEqualizer.getNumberOfBands(); + + for (short b = 0; b < bands; b++) { + short level = sEqualizer.getBandLevel(b); + + editor.putInt(PREF_BAND_LEVEL + b, level); + } + editor.putBoolean(PREF_EQ_ENABLED, + sEqualizer.getEnabled()); + + editor.commit(); + } + + private static class BassBoostValues { + public boolean enabled; + public short strength; + } + + private static class EqualizerValues { + public boolean enabled; + public short preset; + public short numberOfBands; + public short[] bandLevels; + + public boolean levelsSet = false; + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffectsReceiver.java b/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffectsReceiver.java new file mode 100644 index 000000000..d7be8f6bd --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/AudioEffectsReceiver.java @@ -0,0 +1,27 @@ +package code.name.monkey.retromusic.equalizer; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class AudioEffectsReceiver extends BroadcastReceiver { + + public static final String EXTRA_AUDIO_SESSION_ID = "org.oucho.musicplayer.EXTRA_AUDIO_SESSION_ID"; + + public static final String ACTION_OPEN_AUDIO_EFFECT_SESSION = "org.oucho.musicplayer.OPEN_AUDIO_EFFECT_SESSION"; + public static final String ACTION_CLOSE_AUDIO_EFFECT_SESSION = "org.oucho.musicplayer.CLOSE_AUDIO_EFFECT_SESSION"; + + public AudioEffectsReceiver() { + } + + @Override + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + int audioSessionId = intent.getIntExtra(EXTRA_AUDIO_SESSION_ID, 0); + if (ACTION_OPEN_AUDIO_EFFECT_SESSION.equals(action)) { + AudioEffects.openAudioEffectSession(context, audioSessionId); + } else if (ACTION_CLOSE_AUDIO_EFFECT_SESSION.equals(action)) { + AudioEffects.closeAudioEffectSession(); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/BasePresenter.java b/app/src/main/java/code/name/monkey/retromusic/equalizer/BasePresenter.java new file mode 100644 index 000000000..8b1a0a5d5 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/BasePresenter.java @@ -0,0 +1,15 @@ +package code.name.monkey.retromusic.equalizer; + +import code.name.monkey.retromusic.mvp.BaseView; + +public class BasePresenter { + protected T mView; + + final public void attachView(T view){ + mView = view; + } + + final public void detachView(){ + mView = null; + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/FreqLevelItem.kt b/app/src/main/java/code/name/monkey/retromusic/equalizer/FreqLevelItem.kt new file mode 100644 index 000000000..852871db2 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/FreqLevelItem.kt @@ -0,0 +1,105 @@ +package code.name.monkey.retromusic.equalizer + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import android.widget.LinearLayout +import android.widget.SeekBar +import android.widget.SeekBar.OnSeekBarChangeListener +import android.widget.TextView +import code.name.monkey.retromusic.R +import code.name.monkey.retromusic.model.Band + +/** + * Created by 1100416 on 2018. 1. 11.. + */ +class FreqLevelItem @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : LinearLayout(context, attrs, defStyleAttr) { + private var band: Band? = null + private var mSeekBar: SeekBar? = null + private var mCenterFreq: TextView? = null + private var mLevel: TextView? = null + + interface OnBandLevelChangeListener { + fun onBandLevelChange(band: View?, level: Short) + fun onBandLevelChangeStop() + } + + var mBandLevelChangeListener: OnBandLevelChangeListener? = null + private fun initView() { + val rootView = + LayoutInflater.from(context).inflate(R.layout.freq_level_item, this, false) + mCenterFreq = rootView.findViewById(R.id.centerFreq) + + mLevel = rootView.findViewById(R.id.currentLevel) + mSeekBar = rootView.findViewById(R.id.seekBar) + mSeekBar?.setOnSeekBarChangeListener(object : OnSeekBarChangeListener { + override fun onProgressChanged( + seekBar: SeekBar, + i: Int, + b: Boolean + ) { + if (band != null) { + mLevel?.text = "${i + band!!.rangeMin}" + } else { + mLevel?.text = "$i" + } + if (mBandLevelChangeListener != null) { + mBandLevelChangeListener!!.onBandLevelChange( + this@FreqLevelItem, + (i + band!!.rangeMin).toShort() + ) + } + } + + override fun onStartTrackingTouch(seekBar: SeekBar) {} + override fun onStopTrackingTouch(seekBar: SeekBar) { + if (mBandLevelChangeListener != null) { + mBandLevelChangeListener!!.onBandLevelChangeStop() + } + } + }) + addView(rootView) + } + + fun setLevelInfo(band: Band?) { + this.band = band + mCenterFreq!!.text = displayNameOfHz(band!!.centerFreq) + + mSeekBar!!.max = band.rangeMax - band.rangeMin + mSeekBar!!.progress = band.level - band.rangeMin + } + + private fun displayNameOfHz(freq: Int): String { + var display = freq.toString() + "mHz" + when { + 1000 * 1000 * 1000 < freq -> { + display = String.format("%.1f", freq / 1000 / 1000f) + "MHz" + } + 1000 * 1000 < freq -> { + display = String.format("%.1f", freq / 1000 / 1000f) + "KHz" + } + 1000 < freq -> { + display = String.format("%d", freq / 1000) + "Hz" + } + } + return display + } + + fun setBandLevel(level: Short) { + band!!.level = level + setLevelInfo(band) + } + + fun setBandLevelChangeListener(listener: OnBandLevelChangeListener?) { + mBandLevelChangeListener = listener + } + + init { + initView() + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/MainContract.java b/app/src/main/java/code/name/monkey/retromusic/equalizer/MainContract.java new file mode 100644 index 000000000..785e2764b --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/MainContract.java @@ -0,0 +1,24 @@ +package code.name.monkey.retromusic.equalizer; + +import code.name.monkey.retromusic.model.Band; +import code.name.monkey.retromusic.mvp.BaseView; + +public interface MainContract { + interface View extends BaseView { + void showBandInfo(Band[] bands); + + void showPresetList(String[] presetNames); + + void showBandLevel(short[] levels); + } + + abstract class Presenter extends BasePresenter { + abstract void initEqualizer(); + + abstract void changePreset(short presetId); + + abstract void changeAudioSession(int audioSession); + + abstract public void effectOnOff(boolean effectOn); + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/equalizer/MainPresenter.java b/app/src/main/java/code/name/monkey/retromusic/equalizer/MainPresenter.java new file mode 100644 index 000000000..22422bcef --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/equalizer/MainPresenter.java @@ -0,0 +1,116 @@ +package code.name.monkey.retromusic.equalizer; + +import android.media.audiofx.Equalizer; +import android.util.Log; + +import code.name.monkey.retromusic.helper.MusicPlayerRemote; +import code.name.monkey.retromusic.model.Band; + + +/** + * Created by 1100416 on 2018. 1. 15.. + */ + +public class MainPresenter extends MainContract.Presenter { + private Equalizer mEqualizer; + private int mAudioSession = -1; + private boolean mEffectEnabled = false; + + private short mPreset = 0; + + + public MainPresenter(MainContract.View view) { + attachView(view); + } + + @Override + public void initEqualizer() { + initEqualizer(MusicPlayerRemote.INSTANCE.getAudioSessionId()); + mAudioSession = 0; + displayEQStatus(mEqualizer); + } + + @Override + public void changePreset(short presetId) { + mEqualizer.usePreset(presetId); + updateBandLevel(mEqualizer); + mPreset = presetId; + } + + @Override + public void changeAudioSession(int audioSession) { + initEqualizer(audioSession); + mAudioSession = audioSession; + enableEqualisingEffect(mEffectEnabled); + } + + @Override + public void effectOnOff(boolean effectOn) { + mEffectEnabled = effectOn; + enableEqualisingEffect(mEffectEnabled); + } + + + private void initEqualizer(int audioSession) { + if (mAudioSession != audioSession) { + try { + mEqualizer = new Equalizer(0, audioSession); + mEqualizer.usePreset(mPreset); + mEqualizer.setParameterListener(mEqualizerParameterChangeListener); + } catch (UnsupportedOperationException e) { + e.printStackTrace(); + } + } + } + + private void enableEqualisingEffect(boolean enable) { + if (mEqualizer != null) { + mEqualizer.setEnabled(enable); + } + } + + private void displayEQStatus(Equalizer equalizer) { + if (mView != null && equalizer != null) { + int numOfPresets = equalizer.getNumberOfPresets(); + String[] presetNames = new String[numOfPresets]; + + for (short p = 0; p < numOfPresets; p++) { + presetNames[p] = equalizer.getPresetName(p); + } + ((MainContract.View) mView).showPresetList(presetNames); + + int numOfBands = mEqualizer.getNumberOfBands(); + Band[] bands = new Band[numOfBands]; + for (short i = 0; i < numOfBands; i++) { + int centerFreq = mEqualizer.getCenterFreq(i); + short bandLevel = mEqualizer.getBandLevel(i); + int freqRange[] = mEqualizer.getBandFreqRange(i); + short[] bandLevelRange = mEqualizer.getBandLevelRange(); + + Band band = new Band(centerFreq, bandLevel, freqRange, bandLevelRange[0], bandLevelRange[bandLevelRange.length - 1]); + bands[i] = band; + } + ((MainContract.View) mView).showBandInfo(bands); + } + } + + private void updateBandLevel(Equalizer equalizer) { + if (equalizer != null) { + int numOfBands = equalizer.getNumberOfBands(); + short[] bandLevels = new short[numOfBands]; + for (short i = 0; i < numOfBands; i++) { + bandLevels[i] = equalizer.getBandLevel(i); + } + + if (mView != null) { + ((MainContract.View) mView).showBandLevel(bandLevels); + } + } + } + + + private Equalizer.OnParameterChangeListener mEqualizerParameterChangeListener = (equalizer, i, i1, i2, i3) -> { + Log.d("eq", "onParameterChange : i " + i + ", i1 " + i1 + ", i2 " + i2 + ", i3 " + i3); + updateBandLevel(equalizer); + }; +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/model/Band.java b/app/src/main/java/code/name/monkey/retromusic/model/Band.java new file mode 100644 index 000000000..1ccfde6d6 --- /dev/null +++ b/app/src/main/java/code/name/monkey/retromusic/model/Band.java @@ -0,0 +1,29 @@ +package code.name.monkey.retromusic.model; + +public class Band { + public final int centerFreq; + public short level; + + private final int[] freqRange; + public final int freqLow; + public final int freqHigh; + public final short rangeMin; + public final short rangeMax; + + public Band(int centerFreq, short level, int[] freqRange, short rangeMin, short rangeMax) { + this.centerFreq = centerFreq; + this.level = level; + this.freqRange = freqRange; + + if (0 < freqRange.length) { + freqLow = freqRange[0]; + freqHigh = freqRange[freqRange.length - 1]; + } else { + freqLow = 0; + freqHigh = 0; + } + + this.rangeMin = rangeMin; + this.rangeMax = rangeMax; + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java index 2fe34fbef..cb0455505 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java +++ b/app/src/main/java/code/name/monkey/retromusic/service/PlaybackHandler.java @@ -168,4 +168,4 @@ class PlaybackHandler extends Handler { break; } } -} +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java index c6812aeb0..9e18d09ec 100755 --- a/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java +++ b/app/src/main/java/code/name/monkey/retromusic/util/NavigationUtil.java @@ -32,6 +32,7 @@ import code.name.monkey.retromusic.activities.AboutActivity; import code.name.monkey.retromusic.activities.AlbumDetailsActivity; import code.name.monkey.retromusic.activities.ArtistDetailActivity; import code.name.monkey.retromusic.activities.DriveModeActivity; +import code.name.monkey.retromusic.activities.EqualizerActivity; import code.name.monkey.retromusic.activities.GenreDetailsActivity; import code.name.monkey.retromusic.activities.LicenseActivity; import code.name.monkey.retromusic.activities.LyricsActivity; @@ -39,7 +40,6 @@ import code.name.monkey.retromusic.activities.PlayingQueueActivity; import code.name.monkey.retromusic.activities.PlaylistDetailActivity; import code.name.monkey.retromusic.activities.PurchaseActivity; import code.name.monkey.retromusic.activities.SearchActivity; -import code.name.monkey.retromusic.activities.SettingsActivity; import code.name.monkey.retromusic.activities.SupportDevelopmentActivity; import code.name.monkey.retromusic.activities.UserInfoActivity; import code.name.monkey.retromusic.activities.WhatsNewActivity; @@ -139,7 +139,7 @@ public class NavigationUtil { } public static void goToSettings(@NonNull Activity activity) { - ActivityCompat.startActivity(activity, new Intent(activity, SettingsActivity.class), null); + ActivityCompat.startActivity(activity, new Intent(activity, EqualizerActivity.class), null); } public static void goToSupportDevelopment(@NonNull Activity activity) { diff --git a/app/src/main/res/layout/activity_equalizer.xml b/app/src/main/res/layout/activity_equalizer.xml new file mode 100644 index 000000000..5ec86dc98 --- /dev/null +++ b/app/src/main/res/layout/activity_equalizer.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dropdown_item.xml b/app/src/main/res/layout/dropdown_item.xml new file mode 100644 index 000000000..15c4fa0de --- /dev/null +++ b/app/src/main/res/layout/dropdown_item.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/equalizer_slider.xml b/app/src/main/res/layout/equalizer_slider.xml new file mode 100644 index 000000000..e4804fc17 --- /dev/null +++ b/app/src/main/res/layout/equalizer_slider.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/freq_level_item.xml b/app/src/main/res/layout/freq_level_item.xml new file mode 100644 index 000000000..71ac6596c --- /dev/null +++ b/app/src/main/res/layout/freq_level_item.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + \ 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 126cc8ce1..287bfb656 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -844,5 +844,6 @@ Start payment Show now playing screen Clicking on the notification will show now playing screen instead of the home screen + Custom diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index d63156045..c86606bd6 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -2,15 +2,15 @@ - - @@ -211,4 +211,10 @@ @color/md_white_1000 @color/md_red_400 + + diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt index 6bdff1f72..1aba187dd 100755 --- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt +++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/common/views/ATESwitch.kt @@ -10,22 +10,14 @@ import code.name.monkey.appthemehelper.ThemeStore /** * @author Aidan Follestad (afollestad) */ -class ATESwitch : SwitchCompat { +class ATESwitch @JvmOverloads constructor( + context: Context?, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : SwitchCompat(context, attrs, defStyleAttr) { - constructor(context: Context) : super(context) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { - init(context) - } - - constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { - init(context) - } - - private fun init(context: Context) { - ATH.setTint(this, ThemeStore.accentColor(context)) + init { + ATH.setTint(this, ThemeStore.accentColor(getContext())) } override fun isShown(): Boolean { From 5de5fc1c3a493653db1f37d6c83a21ebc550964c Mon Sep 17 00:00:00 2001 From: Hemanth S Date: Sun, 19 Apr 2020 02:19:30 +0530 Subject: [PATCH 6/6] Revert "Scroll helper" --- app/build.gradle | 2 - .../monkey/retromusic/RetroScrollHelper.kt | 67 --------- .../retromusic/activities/MainActivity.java | 7 - .../base/AbsSlidingMusicPanelActivity.kt | 13 +- .../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 +- .../retromusic/views/StatusBarView.java | 59 ++++++++ .../monkey/retromusic/views/StatusBarView.kt | 30 ---- .../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 +- 22 files changed, 194 insertions(+), 217 deletions(-) delete mode 100644 app/src/main/java/code/name/monkey/retromusic/RetroScrollHelper.kt delete mode 100644 app/src/main/java/code/name/monkey/retromusic/extensions/ContextExtensions.kt create mode 100644 app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.java delete mode 100644 app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.kt diff --git a/app/build.gradle b/app/build.gradle index 1598ef34a..c1a1beb57 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -184,8 +184,6 @@ 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 deleted file mode 100644 index b7fa8031d..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/RetroScrollHelper.kt +++ /dev/null @@ -1,67 +0,0 @@ -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 12a276f6c..34d39e445 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,7 +55,6 @@ 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; @@ -84,7 +83,6 @@ 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. @@ -121,9 +119,6 @@ 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(); @@ -156,8 +151,6 @@ 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 7f92a4f62..3a84f55bc 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,14 +111,10 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), } } - override fun onPause() { - super.onPause() - bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList) - } - override fun onDestroy() { super.onDestroy() - navigationBarColorAnimator?.cancel() // just in case + bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList) + if (navigationBarColorAnimator != null) navigationBarColorAnimator?.cancel() // just in case } protected fun wrapSlidingMusicPanel(@LayoutRes resId: Int): View { @@ -146,6 +142,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), // necessary to make the views below clickable miniPlayerFragment?.view?.visibility = if (alpha == 0f) View.GONE else View.VISIBLE + bottomNavigationView.translationY = progress * 500 //bottomNavigationView.alpha = alpha } @@ -220,8 +217,8 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(), } } - fun setBottomBarVisibility(visibility: Int) { - bottomNavigationView.visibility = visibility + fun setBottomBarVisibility(gone: Int) { + bottomNavigationView.visibility = gone 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 deleted file mode 100644 index 297e4d59a..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ContextExtensions.kt +++ /dev/null @@ -1,10 +0,0 @@ -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 bd7b45a8e..2ef27d5f5 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,13 +8,17 @@ 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() { + AbsLibraryPagerFragment(), AppBarLayout.OnOffsetChangedListener { protected var adapter: A? = null protected var layoutManager: LM? = null @@ -27,6 +31,7 @@ abstract class AbsLibraryPagerRecyclerViewFragment, override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + mainActivity.addOnAppBarOffsetChangedListener(this) initLayoutManager() initAdapter() setUpRecyclerView() @@ -36,6 +41,13 @@ 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 { @@ -48,6 +60,7 @@ abstract class AbsLibraryPagerRecyclerViewFragment, override fun onChanged() { super.onChanged() checkIsEmpty() + checkForPadding() } }) } @@ -65,6 +78,18 @@ 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() } @@ -74,6 +99,25 @@ 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 @@ -85,6 +129,11 @@ 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 d7b541b29..32c374d7e 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,7 +12,6 @@ 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 : @@ -52,7 +51,7 @@ class AlbumsFragment : get() = R.string.no_albums override fun createLayoutManager(): GridLayoutManager { - return OverScrollGridLayoutManager(requireActivity(), getGridSize()) + return GridLayoutManager(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 adb055946..6f4ded1cf 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,7 +12,6 @@ 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 : @@ -64,7 +63,7 @@ class ArtistsFragment : } override fun createLayoutManager(): GridLayoutManager { - return OverScrollGridLayoutManager(requireActivity(), getGridSize()) + return GridLayoutManager(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 10fb58daf..fc87c4eaa 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 @@ -42,7 +42,6 @@ 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.* @@ -148,7 +147,7 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba homeAdapter = HomeAdapter(mainActivity, displayMetrics) recyclerView.apply { - layoutManager = OverScrollLinearLayoutManager(mainActivity) + layoutManager = LinearLayoutManager(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 a912731fb..ab2daabce 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,7 +74,6 @@ 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 @@ -479,7 +478,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements } private void setUpRecyclerView() { - recyclerView.setLayoutManager(new OverScrollLinearLayoutManager(getActivity())); + recyclerView.setLayoutManager(new LinearLayoutManager(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 548c13309..bf0dc49cd 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,7 +25,6 @@ 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(), @@ -43,7 +42,7 @@ class GenresFragment : AbsLibraryPagerRecyclerViewFragment 0) { + result = r.getDimensionPixelSize(resourceId); + } + return result; + } + + private void init(Context context) { + + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), getStatusBarHeight(getResources())); + } +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.kt b/app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.kt deleted file mode 100644 index 9a5833f79..000000000 --- a/app/src/main/java/code/name/monkey/retromusic/views/StatusBarView.kt +++ /dev/null @@ -1,30 +0,0 @@ -package code.name.monkey.retromusic.views - -import android.content.Context -import android.util.AttributeSet -import android.view.View - -class StatusBarView( - context: Context, - attrs: AttributeSet -) : View(context, attrs) { - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - if (isInEditMode){ - return - } - setOnApplyWindowInsetsListener { _, insets -> - val height = insets?.systemWindowInsetTop ?: 0 - setHeight(height) - insets - } - } - - private fun setHeight(px: Int) { - val params = layoutParams ?: return - params.height = px - layoutParams = params - } - -} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_content.xml b/app/src/main/res/layout/activity_main_content.xml index 66c852744..b3e78f41e 100644 --- a/app/src/main/res/layout/activity_main_content.xml +++ b/app/src/main/res/layout/activity_main_content.xml @@ -1,71 +1,79 @@ - - - - + android:background="?colorSurface" + android:orientation="vertical"> - - + android:elevation="0dp" + tools:ignore="UnusedAttribute"> + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - \ No newline at end of file + android:layout_height="match_parent" + app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" /> + + \ 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 250d99db1..5d571b410 100644 --- a/app/src/main/res/layout/fragment_banner_home.xml +++ b/app/src/main/res/layout/fragment_banner_home.xml @@ -17,7 +17,6 @@ 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"> - -