This commit is contained in:
h4h13 2020-04-19 02:18:34 +05:30
parent 23c882bdb7
commit b52d5936e8
9 changed files with 187 additions and 322 deletions

View file

@ -34,13 +34,30 @@ class HomeAdapter(
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layout = LayoutInflater.from(activity) println("onCreateViewHolder: $viewType")
.inflate(R.layout.section_recycler_view, parent, false)
return when (viewType) { return when (viewType) {
RECENT_ARTISTS, TOP_ARTISTS -> ArtistViewHolder(layout) RECENT_ARTISTS, TOP_ARTISTS -> ArtistViewHolder(
PLAYLISTS -> PlaylistViewHolder(layout) LayoutInflater.from(activity).inflate(
else -> { R.layout.section_recycler_view,
AlbumViewHolder( parent,
false
)
)
PLAYLISTS -> PlaylistViewHolder(
LayoutInflater.from(activity).inflate(
R.layout.section_recycler_view,
parent,
false
)
)
/*TOP_ALBUMS, RECENT_ALBUMS -> AlbumViewHolder(
LayoutInflater.from(activity).inflate(
R.layout.metal_section_recycler_view,
parent,
false
)
)*/
else -> AlbumViewHolder(
LayoutInflater.from(activity).inflate( LayoutInflater.from(activity).inflate(
R.layout.metal_section_recycler_view, R.layout.metal_section_recycler_view,
parent, parent,
@ -49,7 +66,6 @@ class HomeAdapter(
) )
} }
} }
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (getItemViewType(position)) { when (getItemViewType(position)) {
@ -63,13 +79,17 @@ class HomeAdapter(
} }
RECENT_ARTISTS -> { RECENT_ARTISTS -> {
val viewHolder = holder as ArtistViewHolder val viewHolder = holder as ArtistViewHolder
viewHolder.bindView(list[position].arrayList.toArtists(), R.string.recent_artists) viewHolder.bindView(
list[position].arrayList.toArtists(),
R.string.recent_artists
)
} }
TOP_ARTISTS -> { TOP_ARTISTS -> {
val viewHolder = holder as ArtistViewHolder val viewHolder = holder as ArtistViewHolder
viewHolder.bindView(list[position].arrayList.toArtists(), R.string.top_artists) viewHolder.bindView(list[position].arrayList.toArtists(), R.string.top_artists)
} }
PLAYLISTS -> { PLAYLISTS -> {
val viewHolder = holder as PlaylistViewHolder val viewHolder = holder as PlaylistViewHolder
viewHolder.bindView(list[position].arrayList.toPlaylist(), R.string.favorites) viewHolder.bindView(list[position].arrayList.toPlaylist(), R.string.favorites)
} }
@ -91,14 +111,18 @@ class HomeAdapter(
@Retention(AnnotationRetention.SOURCE) @Retention(AnnotationRetention.SOURCE)
annotation class HomeSection annotation class HomeSection
const val RECENT_ALBUMS = 3 const val RECENT_ALBUMS = 4
const val TOP_ALBUMS = 1 const val TOP_ALBUMS = 2
const val RECENT_ARTISTS = 2 const val RECENT_ARTISTS = 3
const val TOP_ARTISTS = 0 const val TOP_ARTISTS = 1
const val PLAYLISTS = 4 const val PLAYLISTS = 5
} }
private inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) { inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
inner class AlbumViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(list: ArrayList<Album>, titleRes: Int) { fun bindView(list: ArrayList<Album>, titleRes: Int) {
if (list.isNotEmpty()) { if (list.isNotEmpty()) {
recyclerView.apply { recyclerView.apply {
@ -130,7 +154,7 @@ class HomeAdapter(
} }
} }
private inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) { inner class PlaylistViewHolder(view: View) : AbsHomeViewItem(view) {
fun bindView(arrayList: ArrayList<Playlist>, titleRes: Int) { fun bindView(arrayList: ArrayList<Playlist>, titleRes: Int) {
if (arrayList.isNotEmpty()) { if (arrayList.isNotEmpty()) {
val songs = PlaylistSongsLoader.getPlaylistSongList(activity, arrayList[0]) val songs = PlaylistSongsLoader.getPlaylistSongList(activity, arrayList[0])

View file

@ -0,0 +1,34 @@
package code.name.monkey.retromusic.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.R
class SmartPlaylistAdapter : RecyclerView.Adapter<SmartPlaylistAdapter.ViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ViewHolder {
return ViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.abs_playlists,
parent,
false
)
);
}
override fun getItemCount(): Int {
return 1
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
}
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
}

View file

@ -14,39 +14,24 @@
package code.name.monkey.retromusic.fragments.mainactivity package code.name.monkey.retromusic.fragments.mainactivity
import android.app.ActivityOptions
import android.os.Bundle import android.os.Bundle
import android.util.DisplayMetrics import android.util.DisplayMetrics
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.MergeAdapter
import code.name.monkey.retromusic.App import code.name.monkey.retromusic.App
import code.name.monkey.retromusic.Constants
import code.name.monkey.retromusic.Constants.USER_BANNER
import code.name.monkey.retromusic.R import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.HomeAdapter import code.name.monkey.retromusic.adapter.HomeAdapter
import code.name.monkey.retromusic.adapter.SmartPlaylistAdapter
import code.name.monkey.retromusic.extensions.show import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks import code.name.monkey.retromusic.interfaces.MainActivityFragmentCallbacks
import code.name.monkey.retromusic.loaders.SongLoader
import code.name.monkey.retromusic.model.Home import code.name.monkey.retromusic.model.Home
import code.name.monkey.retromusic.model.smartplaylist.HistoryPlaylist
import code.name.monkey.retromusic.model.smartplaylist.LastAddedPlaylist
import code.name.monkey.retromusic.model.smartplaylist.MyTopTracksPlaylist
import code.name.monkey.retromusic.mvp.presenter.HomePresenter import code.name.monkey.retromusic.mvp.presenter.HomePresenter
import code.name.monkey.retromusic.mvp.presenter.HomeView import code.name.monkey.retromusic.mvp.presenter.HomeView
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 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.* import kotlinx.android.synthetic.main.home_content.*
import java.io.File
import java.util.*
import javax.inject.Inject import javax.inject.Inject
class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallbacks, HomeView { class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallbacks, HomeView {
@ -65,27 +50,12 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
return inflater.inflate( return inflater.inflate(
if (PreferenceUtil.getInstance(requireContext()).isHomeBanner) R.layout.fragment_banner_home else R.layout.fragment_home, R.layout.fragment_home,
viewGroup, viewGroup,
false false
) )
} }
private fun loadImageFromStorage() {
Glide.with(requireContext())
.load(
File(
PreferenceUtil.getInstance(requireContext()).profileImage,
Constants.USER_PROFILE
)
)
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.placeholder(R.drawable.ic_person_flat)
.error(R.drawable.ic_person_flat)
.into(userImage)
}
private val displayMetrics: DisplayMetrics private val displayMetrics: DisplayMetrics
get() { get() {
@ -99,51 +69,13 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
setStatusBarColorAuto(view) setStatusBarColorAuto(view)
bannerImage?.setOnClickListener {
val options = ActivityOptions.makeSceneTransitionAnimation(
mainActivity,
userImage,
getString(R.string.transition_user_image)
)
NavigationUtil.goToUserInfo(requireActivity(), options)
}
lastAdded.setOnClickListener {
NavigationUtil.goToPlaylistNew(requireActivity(), LastAddedPlaylist(requireActivity()))
}
topPlayed.setOnClickListener {
NavigationUtil.goToPlaylistNew(
requireActivity(),
MyTopTracksPlaylist(requireActivity())
)
}
actionShuffle.setOnClickListener {
MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(requireActivity()), true)
}
history.setOnClickListener {
NavigationUtil.goToPlaylistNew(requireActivity(), HistoryPlaylist(requireActivity()))
}
userImage?.setOnClickListener {
val options = ActivityOptions.makeSceneTransitionAnimation(
mainActivity,
userImage,
getString(R.string.transition_user_image)
)
NavigationUtil.goToUserInfo(requireActivity(), options)
}
titleWelcome?.text =
String.format("%s", PreferenceUtil.getInstance(requireContext()).userName)
App.musicComponent.inject(this) App.musicComponent.inject(this)
homeAdapter = HomeAdapter(mainActivity, displayMetrics) homeAdapter = HomeAdapter(mainActivity, displayMetrics)
val smartPlaylistAdapter: SmartPlaylistAdapter = SmartPlaylistAdapter()
recyclerView.apply { recyclerView.apply {
layoutManager = OverScrollLinearLayoutManager(mainActivity) layoutManager = OverScrollLinearLayoutManager(mainActivity)
adapter = homeAdapter adapter = MergeAdapter(smartPlaylistAdapter, homeAdapter)
} }
homePresenter.attachView(this) homePresenter.attachView(this)
homePresenter.loadSections() homePresenter.loadSections()
@ -153,11 +85,6 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba
return false return false
} }
override fun onResume() {
super.onResume()
getTimeOfTheDay()
}
override fun onDestroyView() { override fun onDestroyView() {
super.onDestroyView() super.onDestroyView()
homePresenter.detachView() homePresenter.detachView()
@ -167,49 +94,6 @@ class BannerHomeFragment : AbsMainActivityFragment(), MainActivityFragmentCallba
emptyContainer.show() emptyContainer.show()
} }
private fun getTimeOfTheDay() {
val c = Calendar.getInstance()
val timeOfDay = c.get(Calendar.HOUR_OF_DAY)
var images = arrayOf<String>()
when (timeOfDay) {
in 0..5 -> images = resources.getStringArray(R.array.night)
in 6..11 -> images = resources.getStringArray(R.array.morning)
in 12..15 -> images = resources.getStringArray(R.array.after_noon)
in 16..19 -> images = resources.getStringArray(R.array.evening)
in 20..23 -> images = resources.getStringArray(R.array.night)
}
val day = images[Random().nextInt(images.size)]
loadTimeImage(day)
}
private fun loadTimeImage(day: String) {
bannerImage?.let {
val request = Glide.with(requireContext())
if (PreferenceUtil.getInstance(requireContext()).bannerImage.isEmpty()) {
request.load(day)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.placeholder(R.drawable.material_design_default)
.error(R.drawable.material_design_default)
.into(it)
} else {
request.load(
File(
PreferenceUtil.getInstance(requireContext()).bannerImage,
USER_BANNER
)
)
.asBitmap()
.diskCacheStrategy(DiskCacheStrategy.NONE)
.skipMemoryCache(true)
.placeholder(R.drawable.material_design_default)
.error(R.drawable.material_design_default)
.into(it)
}
}
loadImageFromStorage()
}
companion object { companion object {
const val TAG: String = "BannerHomeFragment" const val TAG: String = "BannerHomeFragment"

View file

@ -24,7 +24,6 @@ import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.webkit.MimeTypeMap; import android.webkit.MimeTypeMap;
import android.widget.PopupMenu; import android.widget.PopupMenu;
import android.widget.TextView; import android.widget.TextView;
@ -34,7 +33,6 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.loader.app.LoaderManager; import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader; import androidx.loader.content.Loader;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.afollestad.materialcab.MaterialCab; import com.afollestad.materialcab.MaterialCab;
@ -50,7 +48,6 @@ import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Objects;
import code.name.monkey.appthemehelper.ThemeStore; import code.name.monkey.appthemehelper.ThemeStore;
import code.name.monkey.appthemehelper.util.ATHUtil; import code.name.monkey.appthemehelper.util.ATHUtil;
@ -67,20 +64,16 @@ import code.name.monkey.retromusic.misc.DialogAsyncTask;
import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener; import code.name.monkey.retromusic.misc.UpdateToastMediaScannerCompletionListener;
import code.name.monkey.retromusic.misc.WrappedAsyncTaskLoader; import code.name.monkey.retromusic.misc.WrappedAsyncTaskLoader;
import code.name.monkey.retromusic.model.Song; import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.util.DensityUtil;
import code.name.monkey.retromusic.util.FileUtil; import code.name.monkey.retromusic.util.FileUtil;
import code.name.monkey.retromusic.util.PreferenceUtil; import code.name.monkey.retromusic.util.PreferenceUtil;
import code.name.monkey.retromusic.util.RetroColorUtil; import code.name.monkey.retromusic.util.RetroColorUtil;
import code.name.monkey.retromusic.util.ThemedFastScroller; import code.name.monkey.retromusic.util.ThemedFastScroller;
import code.name.monkey.retromusic.views.BreadCrumbLayout;
import code.name.monkey.retromusic.views.ScrollingViewOnApplyWindowInsetsListener; import code.name.monkey.retromusic.views.ScrollingViewOnApplyWindowInsetsListener;
import dev.olog.scrollhelper.layoutmanagers.OverScrollLinearLayoutManager; import dev.olog.scrollhelper.layoutmanagers.OverScrollLinearLayoutManager;
import me.zhanghai.android.fastscroll.FastScroller; import me.zhanghai.android.fastscroll.FastScroller;
public class FoldersFragment extends AbsMainActivityFragment implements public class FoldersFragment extends AbsMainActivityFragment implements
MainActivityFragmentCallbacks, MainActivityFragmentCallbacks, CabHolder, SongFileAdapter.Callbacks, LoaderManager.LoaderCallbacks<List<File>> {
CabHolder, BreadCrumbLayout.SelectionCallback, SongFileAdapter.Callbacks,
LoaderManager.LoaderCallbacks<List<File>> {
public static final String TAG = FoldersFragment.class.getSimpleName(); public static final String TAG = FoldersFragment.class.getSimpleName();
public static final FileFilter AUDIO_FILE_FILTER = file -> !file.isHidden() && (file.isDirectory() || public static final FileFilter AUDIO_FILE_FILTER = file -> !file.isHidden() && (file.isDirectory() ||
@ -88,11 +81,11 @@ public class FoldersFragment extends AbsMainActivityFragment implements
FileUtil.fileIsMimeType(file, "application/opus", MimeTypeMap.getSingleton()) || FileUtil.fileIsMimeType(file, "application/opus", MimeTypeMap.getSingleton()) ||
FileUtil.fileIsMimeType(file, "application/ogg", MimeTypeMap.getSingleton())); FileUtil.fileIsMimeType(file, "application/ogg", MimeTypeMap.getSingleton()));
private static final String PATH = "path"; private static final String PATH = "path";
private static final String CRUMBS = "crumbs";
private static final int LOADER_ID = LoaderIds.Companion.getFOLDERS_FRAGMENT(); private static final int LOADER_ID = LoaderIds.Companion.getFOLDERS_FRAGMENT();
private SongFileAdapter adapter; private SongFileAdapter adapter;
private BreadCrumbLayout breadCrumbs;
private MaterialCab cab; private MaterialCab cab;
private File file;
private View coordinatorLayout, empty; private View coordinatorLayout, empty;
private TextView emojiText; private TextView emojiText;
private Comparator<File> fileComparator = (lhs, rhs) -> { private Comparator<File> fileComparator = (lhs, rhs) -> {
@ -111,7 +104,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
} }
public static File getDefaultStartDirectory() { public static File getDefaultStartDirectory() {
File musicDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC); File musicDir = Environment.getExternalStorageDirectory();
File startFolder; File startFolder;
if (musicDir.exists() && musicDir.isDirectory()) { if (musicDir.exists() && musicDir.isDirectory()) {
startFolder = musicDir; startFolder = musicDir;
@ -160,8 +153,6 @@ public class FoldersFragment extends AbsMainActivityFragment implements
@Override @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
setStatusBarColorAuto(view); setStatusBarColorAuto(view);
setUpAppbarColor();
setUpBreadCrumbs();
setUpRecyclerView(); setUpRecyclerView();
setUpAdapter(); setUpAdapter();
} }
@ -172,39 +163,19 @@ public class FoldersFragment extends AbsMainActivityFragment implements
if (savedInstanceState == null) { if (savedInstanceState == null) {
//noinspection ConstantConditions //noinspection ConstantConditions
setCrumb(new BreadCrumbLayout.Crumb( setCrumb(FileUtil.safeGetCanonicalFile((File) getArguments().getSerializable(PATH)));
FileUtil.safeGetCanonicalFile((File) getArguments().getSerializable(PATH))), true);
} else { } else {
breadCrumbs.restoreFromStateWrapper(savedInstanceState.getParcelable(CRUMBS));
getLoaderManager().initLoader(LOADER_ID, null, this); getLoaderManager().initLoader(LOADER_ID, null, this);
} }
} }
@Override
public void onPause() {
super.onPause();
saveScrollPosition();
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
if (breadCrumbs != null) {
outState.putParcelable(CRUMBS, breadCrumbs.getStateWrapper());
}
}
@Override @Override
public boolean handleBackPress() { public boolean handleBackPress() {
if (cab != null && cab.isActive()) { if (cab != null && cab.isActive()) {
cab.finish(); cab.finish();
return true; return true;
} }
if (breadCrumbs != null && breadCrumbs.popHistory()) {
setCrumb(breadCrumbs.lastHistory(), false);
return true;
}
return false; return false;
} }
@ -214,10 +185,6 @@ public class FoldersFragment extends AbsMainActivityFragment implements
return new AsyncFileLoader(this); return new AsyncFileLoader(this);
} }
@Override
public void onCrumbSelection(BreadCrumbLayout.Crumb crumb, int index) {
setCrumb(crumb, true);
}
@Override @Override
public void onFileMenuClicked(final File file, View view) { public void onFileMenuClicked(final File file, View view) {
@ -287,7 +254,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
public void onFileSelected(File file) { public void onFileSelected(File file) {
file = tryGetCanonicalFile(file); // important as we compare the path value later file = tryGetCanonicalFile(file); // important as we compare the path value later
if (file.isDirectory()) { if (file.isDirectory()) {
setCrumb(new BreadCrumbLayout.Crumb(file), true); setCrumb(file);
} else { } else {
FileFilter fileFilter = pathname -> !pathname.isDirectory() && AUDIO_FILE_FILTER FileFilter fileFilter = pathname -> !pathname.isDirectory() && AUDIO_FILE_FILTER
.accept(pathname); .accept(pathname);
@ -341,34 +308,21 @@ public class FoldersFragment extends AbsMainActivityFragment implements
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_go_to_start_directory: case R.id.action_go_to_start_directory:
setCrumb(new BreadCrumbLayout.Crumb( setCrumb(tryGetCanonicalFile(PreferenceUtil.getInstance(requireContext()).getStartDirectory()));
tryGetCanonicalFile(PreferenceUtil.getInstance(requireContext()).getStartDirectory())), true);
return true; return true;
case R.id.action_scan: case R.id.action_scan:
BreadCrumbLayout.Crumb crumb = getActiveCrumb();
if (crumb != null) { /* if (crumb != null) {
//noinspection Convert2MethodRef //noinspection Convert2MethodRef
new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths)) new ListPathsAsyncTask(getActivity(), paths -> scanPaths(paths))
.execute(new ListPathsAsyncTask.LoadingInfo(crumb.getFile(), .execute(new ListPathsAsyncTask.LoadingInfo(crumb.getFile(),
AUDIO_FILE_FILTER)); AUDIO_FILE_FILTER));
} }*/
return true; return true;
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@Override
public void onQueueChanged() {
super.onQueueChanged();
checkForPadding();
}
@Override
public void onServiceConnected() {
super.onServiceConnected();
checkForPadding();
}
@NonNull @NonNull
@Override @Override
public MaterialCab openCab(int menuRes, MaterialCab.Callback callback) { public MaterialCab openCab(int menuRes, MaterialCab.Callback callback) {
@ -384,12 +338,6 @@ public class FoldersFragment extends AbsMainActivityFragment implements
return cab; return cab;
} }
private void checkForPadding() {
final int count = adapter.getItemCount();
final MarginLayoutParams params = (MarginLayoutParams) coordinatorLayout.getLayoutParams();
params.bottomMargin = count > 0 && !MusicPlayerRemote.getPlayingQueue().isEmpty() ? DensityUtil
.dip2px(requireContext(), 104f) : DensityUtil.dip2px(requireContext(), 54f);
}
private void checkIsEmpty() { private void checkIsEmpty() {
emojiText.setText(getEmojiByUnicode(0x1F631)); emojiText.setText(getEmojiByUnicode(0x1F631));
@ -398,11 +346,6 @@ public class FoldersFragment extends AbsMainActivityFragment implements
} }
} }
@Nullable
private BreadCrumbLayout.Crumb getActiveCrumb() {
return breadCrumbs != null && breadCrumbs.size() > 0 ? breadCrumbs
.getCrumb(breadCrumbs.getActiveIndex()) : null;
}
private String getEmojiByUnicode(int unicode) { private String getEmojiByUnicode(int unicode) {
return new String(Character.toChars(unicode)); return new String(Character.toChars(unicode));
@ -415,18 +358,11 @@ public class FoldersFragment extends AbsMainActivityFragment implements
private void initViews(View view) { private void initViews(View view) {
coordinatorLayout = view.findViewById(R.id.coordinatorLayout); coordinatorLayout = view.findViewById(R.id.coordinatorLayout);
recyclerView = view.findViewById(R.id.recyclerView); recyclerView = view.findViewById(R.id.recyclerView);
breadCrumbs = view.findViewById(R.id.breadCrumbs);
empty = view.findViewById(android.R.id.empty); empty = view.findViewById(android.R.id.empty);
emojiText = view.findViewById(R.id.emptyEmoji); emojiText = view.findViewById(R.id.emptyEmoji);
} }
private void saveScrollPosition() {
BreadCrumbLayout.Crumb crumb = getActiveCrumb();
if (crumb != null) {
crumb.setScrollPosition(
((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition());
}
}
private void scanPaths(@Nullable String[] toBeScanned) { private void scanPaths(@Nullable String[] toBeScanned) {
if (getActivity() == null) { if (getActivity() == null) {
@ -440,15 +376,12 @@ public class FoldersFragment extends AbsMainActivityFragment implements
} }
} }
private void setCrumb(BreadCrumbLayout.Crumb crumb, boolean addToHistory) { public File getFile() {
if (crumb == null) { return file;
return;
}
saveScrollPosition();
breadCrumbs.setActiveOrAdd(crumb, false);
if (addToHistory) {
breadCrumbs.addHistory(crumb);
} }
private void setCrumb(File file) {
this.file = file;
getLoaderManager().restartLoader(LOADER_ID, null, this); getLoaderManager().restartLoader(LOADER_ID, null, this);
} }
@ -460,23 +393,12 @@ public class FoldersFragment extends AbsMainActivityFragment implements
public void onChanged() { public void onChanged() {
super.onChanged(); super.onChanged();
checkIsEmpty(); checkIsEmpty();
checkForPadding();
} }
}); });
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
checkIsEmpty(); checkIsEmpty();
} }
private void setUpAppbarColor() {
breadCrumbs.setActivatedContentColor(
ATHUtil.INSTANCE.resolveColor(requireContext(), android.R.attr.textColorPrimary));
breadCrumbs.setDeactivatedContentColor(
ATHUtil.INSTANCE.resolveColor(requireContext(), android.R.attr.textColorSecondary));
}
private void setUpBreadCrumbs() {
breadCrumbs.setCallback(this);
}
private void setUpRecyclerView() { private void setUpRecyclerView() {
recyclerView.setLayoutManager(new OverScrollLinearLayoutManager(getActivity())); recyclerView.setLayoutManager(new OverScrollLinearLayoutManager(getActivity()));
@ -493,11 +415,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
private void updateAdapter(@NonNull List<File> files) { private void updateAdapter(@NonNull List<File> files) {
adapter.swapDataSet(files); adapter.swapDataSet(files);
BreadCrumbLayout.Crumb crumb = getActiveCrumb();
if (crumb != null && recyclerView != null) {
((LinearLayoutManager) recyclerView.getLayoutManager())
.scrollToPositionWithOffset(crumb.getScrollPosition(), 0);
}
} }
public static class ListPathsAsyncTask extends public static class ListPathsAsyncTask extends
@ -596,7 +514,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
private WeakReference<FoldersFragment> fragmentWeakReference; private WeakReference<FoldersFragment> fragmentWeakReference;
AsyncFileLoader(FoldersFragment foldersFragment) { AsyncFileLoader(FoldersFragment foldersFragment) {
super(Objects.requireNonNull(foldersFragment.getActivity())); super(foldersFragment.requireActivity());
fragmentWeakReference = new WeakReference<>(foldersFragment); fragmentWeakReference = new WeakReference<>(foldersFragment);
} }
@ -605,10 +523,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements
FoldersFragment foldersFragment = fragmentWeakReference.get(); FoldersFragment foldersFragment = fragmentWeakReference.get();
File directory = null; File directory = null;
if (foldersFragment != null) { if (foldersFragment != null) {
BreadCrumbLayout.Crumb crumb = foldersFragment.getActiveCrumb(); directory = foldersFragment.getFile();
if (crumb != null) {
directory = crumb.getFile();
}
} }
if (directory != null) { if (directory != null) {
List<File> files = FileUtil.listFiles(directory, AUDIO_FILE_FILTER); List<File> files = FileUtil.listFiles(directory, AUDIO_FILE_FILTER);

View file

@ -185,7 +185,7 @@ public final class PreferenceUtil {
private static final String AUTO_DOWNLOAD_IMAGES_POLICY = "auto_download_images_policy"; private static final String AUTO_DOWNLOAD_IMAGES_POLICY = "auto_download_images_policy";
private static final String START_DIRECTORY = "start_directory"; private static final String START_DIRECTORY = "start_directory_";
private static final String SYNCHRONIZED_LYRICS_SHOW = "synchronized_lyrics_show"; private static final String SYNCHRONIZED_LYRICS_SHOW = "synchronized_lyrics_show";

View file

@ -13,20 +13,20 @@
android:id="@+id/fragment_container" android:id="@+id/fragment_container"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@+id/status_bar" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/status_bar" />
<com.google.android.material.card.MaterialCardView <com.google.android.material.card.MaterialCardView
android:id="@+id/toolbarContainer" android:id="@+id/toolbarContainer"
app:layout_constraintTop_toBottomOf="@+id/status_bar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:cardCornerRadius="8dp" app:cardCornerRadius="8dp"
app:cardUseCompatPadding="true" app:cardUseCompatPadding="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/status_bar"
app:layout_scrollFlags="scroll|enterAlways"> app:layout_scrollFlags="scroll|enterAlways">
<FrameLayout <FrameLayout
@ -39,8 +39,8 @@
android:layout_height="@dimen/toolbar_height" android:layout_height="@dimen/toolbar_height"
android:background="?attr/colorSurface" android:background="?attr/colorSurface"
app:popupTheme="?attr/toolbarPopupTheme" app:popupTheme="?attr/toolbarPopupTheme"
app:titleTextColor="?attr/colorControlNormal"
app:titleTextAppearance="@style/TextViewHeadline6" app:titleTextAppearance="@style/TextViewHeadline6"
app:titleTextColor="?attr/colorControlNormal"
tools:ignore="UnusedAttribute"> tools:ignore="UnusedAttribute">
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
@ -49,8 +49,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:gravity="center" android:gravity="center"
android:text="@string/app_name" android:text="@string/app_name"
android:textColor="?attr/colorControlNormal" android:textAppearance="@style/TextViewHeadline6"
android:textAppearance="@style/TextViewHeadline6" /> android:textColor="?attr/colorControlNormal" />
</androidx.appcompat.widget.Toolbar> </androidx.appcompat.widget.Toolbar>
<ViewStub <ViewStub
@ -60,12 +60,13 @@
</FrameLayout> </FrameLayout>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>
<include layout="@layout/status_bar" <include
app:layout_constraintTop_toTopOf="parent" layout="@layout/status_bar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="0dp" android:layout_width="0dp"
tools:layout_height="24dp" android:layout_height="wrap_content"
android:layout_height="wrap_content"/> app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:layout_height="24dp" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View file

@ -11,20 +11,14 @@
~ without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ~ without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
~ See the GNU General Public License for more details. ~ See the GNU General Public License for more details.
--> -->
<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent">
android:layout_marginTop="@dimen/toolbar_height"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
<androidx.constraintlayout.widget.ConstraintLayout <!-- <code.name.monkey.retromusic.views.RetroShapeableImageView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<code.name.monkey.retromusic.views.RetroShapeableImageView
android:id="@+id/userImage" android:id="@+id/userImage"
android:layout_width="42dp" android:layout_width="42dp"
android:layout_height="42dp" android:layout_height="42dp"
@ -61,14 +55,28 @@
app:layout_constraintStart_toEndOf="@+id/userImage" app:layout_constraintStart_toEndOf="@+id/userImage"
app:layout_constraintTop_toBottomOf="@+id/text" app:layout_constraintTop_toBottomOf="@+id/text"
tools:text="@tools:sample/lorem" /> tools:text="@tools:sample/lorem" />
-->
<include <!--<include
layout="@layout/home_content" layout="@layout/home_content"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/titleWelcome" /> app:layout_constraintTop_toBottomOf="@id/titleWelcome" />-->
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView> <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:nestedScrollingEnabled="false"
android:overScrollMode="never"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:spanCount="3"
tools:itemCount="3"
tools:listitem="@layout/item_album_card" />
</FrameLayout>

View file

@ -22,7 +22,7 @@
android:focusableInTouchMode="true" android:focusableInTouchMode="true"
android:orientation="vertical"> android:orientation="vertical">
<include layout="@layout/abs_playlists" /> <!-- <include layout="@layout/abs_playlists" />-->
<FrameLayout <FrameLayout
android:layout_width="match_parent" android:layout_width="match_parent"

View file

@ -5,5 +5,4 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:background="@android:color/transparent" android:background="@android:color/transparent"
android:elevation="@dimen/toolbar_elevation"
tools:ignore="UnusedAttribute" /> tools:ignore="UnusedAttribute" />