/** * This file is part of FileSpace for Android, an app for managing your server (files, talks...). * <p/> * Copyright (c) 2014-2015 FileSpace for Android contributors (http://mercandalli.com) * <p/> * LICENSE: * <p/> * FileSpace for Android 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 2 of the License, or (at your option) any * later version. * <p/> * FileSpace for Android 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. * * @author Jonathan Mercandalli * @license http://www.gnu.org/licenses/gpl.html * @copyright 2014-2015 FileSpace for Android contributors (http://mercandalli.com) */ package com.mercandalli.android.apps.files.file.audio; import android.app.Activity; import android.content.Context; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.annotation.DrawableRes; import android.support.annotation.IntDef; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; import com.mercandalli.android.apps.files.R; import com.mercandalli.android.apps.files.common.animation.ScaleAnimationAdapter; import com.mercandalli.android.apps.files.common.fragment.BackFragment; import com.mercandalli.android.apps.files.file.FileManager; import com.mercandalli.android.apps.files.file.FileModel; import com.mercandalli.android.apps.files.file.FileModelCardAdapter; import com.mercandalli.android.apps.files.file.FileModelCardHeaderItem; import com.mercandalli.android.apps.files.file.audio.artist.Artist; import com.mercandalli.android.apps.files.file.audio.artist.ArtistCard; import com.mercandalli.android.apps.files.file.audio.playlist.AudioPlayList; import com.mercandalli.android.apps.files.file.audio.playlist.AudioPlayListManager; import com.mercandalli.android.apps.files.file.local.FileLocalPagerFragment; import com.mercandalli.android.apps.files.file.local.fab.FileLocalFabManager; import com.mercandalli.android.apps.files.main.Config; import com.mercandalli.android.library.base.generic.GenericRecyclerAdapter; import com.mercandalli.android.library.base.java.StringUtils; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; import static com.mercandalli.android.library.base.view.ViewUtils.setViewVisibility; /** * A {@link android.support.v4.app.Fragment} that displays the local {@link FileAudioModel}s. */ public class FileAudioLocalFragment extends BackFragment implements FileAudioOverflowActions.FileAudioActionCallback, FileAudioManager.GetAllLocalMusicListener, FileAudioManager.GetLocalMusicFoldersListener, FileAudioManager.GetLocalMusicListener, FileAudioManager.GetAllLocalMusicArtistsListener, FileAudioManager.GetAllLocalMusicAlbumsListener, FileAudioManager.MusicsChangeListener, FileLocalPagerFragment.ListController, FileModelCardAdapter.OnHeaderClickListener, FileModelCardAdapter.OnFileSubtitleAdapter, ScaleAnimationAdapter.NoAnimatedPosition, SwipeRefreshLayout.OnRefreshListener, FileAudioModelListener, FileLocalPagerFragment.ScrollTop, FileLocalFabManager.FabController, AudioPlayListManager.GetPlayListsListener { private static final String TAG = "FileAudioLocalFragment"; /** * A key for the view pager position. */ private static final String ARG_POSITION_IN_VIEW_PAGER = "FileLocalFragment.Args.ARG_POSITION_IN_VIEW_PAGER"; @Retention(RetentionPolicy.SOURCE) @IntDef({ PAGE_FOLDERS, PAGE_PLAYLIST, PAGE_FOLDER_INSIDE, PAGE_ARTIST, PAGE_ALBUM, PAGE_ALL}) public @interface CurrentPage { } private static final int PAGE_FOLDERS = 0; private static final int PAGE_PLAYLIST = 1; private static final int PAGE_FOLDER_INSIDE = 2; private static final int PAGE_ARTIST = 3; private static final int PAGE_ALBUM = 4; private static final int PAGE_ALL = 5; @NonNull public static FileAudioLocalFragment newInstance(final int positionInViewPager) { final FileAudioLocalFragment fileAudioLocalFragment = new FileAudioLocalFragment(); final Bundle args = new Bundle(); args.putInt(ARG_POSITION_IN_VIEW_PAGER, positionInViewPager); fileAudioLocalFragment.setArguments(args); return fileAudioLocalFragment; } @CurrentPage private int mCurrentPage = PAGE_FOLDERS; @NonNull private final List<FileModel> mFileModels = new ArrayList<>(); @NonNull private final List<FileAudioModel> mFileAudioModels = new ArrayList<>(); @NonNull private final List<Artist> mArtists = new ArrayList<>(); @NonNull private final List<Album> mAlbums = new ArrayList<>(); /** * A simple {@link Handler}. Called by {@link #showProgressBar()} or {@link #hideProgressBar()}. */ @NonNull private final Handler mProgressBarActivationHandler = new Handler(); /** * A simple {@link Runnable}. Called by {@link #showProgressBar()} or {@link #hideProgressBar()}. */ @NonNull private final Runnable mProgressBarActivationRunnable; @Nullable private HeaderView mHeaderView; @Nullable private RecyclerView mRecyclerView; @Nullable private TextView mMessageTextView; /** * A simple {@link ProgressBar}. Call {@link #showProgressBar()} or {@link #hideProgressBar()}. */ @Nullable private ProgressBar mProgressBar; @Nullable private FileAudioRowAdapter mFileAudioRowAdapter; @Nullable private FileModelCardAdapter mFileModelCardAdapter; @Nullable private ScaleAnimationAdapter mScaleAnimationAdapter; @Nullable private String mStringDirectory; @Nullable private String mStringMusic; @Nullable private String mStringMusics; @Nullable private SwipeRefreshLayout mSwipeRefreshLayout; private int mPositionInViewPager; @Nullable private FileModel mCurrentFolder; @Nullable private FileAudioOverflowActions mFileAudioOverflowActions; @Nullable private FileLocalFabManager mFileLocalFabManager; @Nullable private FileManager mFileManager; @Nullable private FileAudioManager mFileAudioManager; @Nullable private AudioPlayListManager mAudioPlayListManager; @NonNull private GenericRecyclerAdapter<Album, AlbumCard> mAlbumCardGenericRecyclerAdapter = createAlbumCardGenericRecyclerAdapter(); @NonNull private final GenericRecyclerAdapter<Artist, ArtistCard> mArtistCardGenericRecyclerAdapter = createArtistCardGenericRecyclerAdapter(); /** * Do not use this constructor. Call {@link #newInstance(int)} instead. */ public FileAudioLocalFragment() { mProgressBarActivationRunnable = new Runnable() { @Override public void run() { setViewVisibility(mProgressBar, View.VISIBLE); setViewVisibility(mRecyclerView, View.GONE); } }; } //region Override methods /** * {@inheritDoc} */ @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); final Bundle args = getArguments(); if (!args.containsKey(ARG_POSITION_IN_VIEW_PAGER)) { throw new IllegalStateException("Missing args. Please use newInstance()"); } final Context context = getContext(); mFileLocalFabManager = FileLocalFabManager.getInstance(); mFileManager = FileManager.getInstance(context); mFileAudioManager = FileAudioManager.getInstance(context); mAudioPlayListManager = AudioPlayListManager.getInstance(context); mPositionInViewPager = args.getInt(ARG_POSITION_IN_VIEW_PAGER); mFileLocalFabManager.addFabController(mPositionInViewPager, this); } /** * {@inheritDoc} */ @Override public void onDestroy() { mFileLocalFabManager.removeFabController(mPositionInViewPager); super.onDestroy(); } /** * {@inheritDoc} */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.fragment_file_audio_local, container, false); final Context context = getContext(); mFileAudioOverflowActions = new FileAudioOverflowActions(context, getFragmentManager(), this); mStringDirectory = context.getString(R.string.file_audio_model_adapter_directory); mStringMusic = context.getString(R.string.file_audio_model_music); mStringMusics = context.getString(R.string.file_audio_model_musics); mFileAudioManager.addGetAllLocalMusicListener(this); mFileAudioManager.addGetLocalMusicFoldersListener(this); mFileAudioManager.addGetLocalMusicListener(this); mFileAudioManager.addMusicChangeListener(this); mFileAudioManager.addGetAllLocalMusicArtistsListener(this); mFileAudioManager.addGetAllLocalMusicAlbumsListener(this); mAudioPlayListManager.addGetPlayListsListener(this); mProgressBar = (ProgressBar) rootView.findViewById(R.id.fragment_file_audio_local_progress_bar); mProgressBar.setVisibility(View.GONE); mMessageTextView = (TextView) rootView.findViewById(R.id.fragment_file_audio_local_message); mSwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.fragment_file_audio_local_swipe_refresh_layout); mSwipeRefreshLayout.setOnRefreshListener(this); mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); mRecyclerView = (RecyclerView) rootView.findViewById(R.id.fragment_file_audio_local_recycler_view); mRecyclerView.setHasFixedSize(true); updateLayoutManager(); mHeaderView = new HeaderView(context); mHeaderView.addOnHeaderClickListener(this); mAlbumCardGenericRecyclerAdapter.setHeader(mHeaderView); mArtistCardGenericRecyclerAdapter.setHeader(mHeaderView); mFileAudioRowAdapter = new FileAudioRowAdapter(context, this, mFileAudioModels, this); mFileAudioRowAdapter.setOnItemClickListener(new FileAudioRowAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { if (mFileAudioModels.isEmpty()) { return; } FileModel fileModel; if (position >= mFileAudioModels.size()) { fileModel = mFileAudioModels.get(mFileAudioModels.size() - 1); Log.e(TAG, "onItemClick: position >= size"); } else { fileModel = mFileAudioModels.get(position); } if (fileModel.isDirectory()) { refreshListFoldersInside(fileModel); } else { mFileManager.execute( (Activity) context, position, new ArrayList<FileModel>(mFileAudioModels), view); } } }); mFileModelCardAdapter = new FileModelCardAdapter( context, FileAudioHeaderManager.getInstance().getHeaderIds(), this, mFileModels, null, new FileModelCardAdapter.OnFileClickListener() { @Override public void onFileCardClick(View view, int position) { refreshListFoldersInside(mFileModels.get(position)); } }, null); mFileModelCardAdapter.setOnFileSubtitleAdapter(this); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { mScaleAnimationAdapter = new ScaleAnimationAdapter(mRecyclerView, mFileModelCardAdapter); mScaleAnimationAdapter.setDuration(220); mScaleAnimationAdapter.setOffsetDuration(32); mScaleAnimationAdapter.setNoAnimatedPosition(FileAudioLocalFragment.this); mRecyclerView.setAdapter(mScaleAnimationAdapter); } else { mRecyclerView.setAdapter(mFileModelCardAdapter); } refreshListFolders(); if (context instanceof AppCompatActivity) { ((AppCompatActivity) context).invalidateOptionsMenu(); } return rootView; } /** * {@inheritDoc} */ @Override public void onDestroyView() { mHeaderView.removeOnHeaderClickListener(this); mFileAudioManager.removeGetAllLocalMusicListener(this); mFileAudioManager.removeGetLocalMusicFoldersListener(this); mFileAudioManager.removeGetLocalMusicListener(this); mFileAudioManager.removeMusicChangeListener(this); mFileAudioManager.removeGetAllLocalMusicArtistsListener(this); mFileAudioManager.removeGetAllLocalMusicAlbumsListener(this); mAudioPlayListManager.removeGetPlayListsListener(this); super.onDestroyView(); } /** * {@inheritDoc} */ @Override public void executeFileAudioModel(final FileAudioModel fileAudioModel, final View view) { mFileAudioOverflowActions.show(fileAudioModel, view, Config.isLogged()); } /** * {@inheritDoc} */ @Override public void refreshData() { refreshCurrentList(); } /** * {@inheritDoc} */ @Override public boolean back() { if (mCurrentPage == PAGE_FOLDER_INSIDE) { refreshListFolders(); return true; } return false; } /** * {@inheritDoc} */ @Override public void onFabClick( final @IntRange(from = 0, to = FileLocalFabManager.NUMBER_MAX_OF_FAB - 1) int fabPosition, final @NonNull FloatingActionButton floatingActionButton) { if (fabPosition == 0) { refreshListFolders(); } } /** * {@inheritDoc} */ @Override public boolean isFabVisible( @IntRange(from = 0, to = FileLocalFabManager.NUMBER_MAX_OF_FAB - 1) final int fabPosition) { return fabPosition == 0 && mCurrentPage == PAGE_FOLDER_INSIDE; } /** * {@inheritDoc} */ @DrawableRes @Override public int getFabImageResource( @IntRange(from = 0, to = FileLocalFabManager.NUMBER_MAX_OF_FAB - 1) final int fabPosition) { return R.drawable.arrow_up; } /** * {@inheritDoc} */ @Nullable @Override public String onFileSubtitleModify(final FileModel fileModel) { if (fileModel != null && fileModel.isDirectory() && fileModel.getCountAudio() != 0) { return mStringDirectory + ": " + StringUtils.longToShortString(fileModel.getCountAudio()) + " " + (fileModel.getCountAudio() > 1 ? mStringMusics : mStringMusic); } return null; } /** * {@inheritDoc} */ @Override public boolean onHeaderClick(View v, List<FileModelCardHeaderItem> fileModelCardHeaderItems) { FileAudioHeaderManager.getInstance().setHeaderIds(fileModelCardHeaderItems); final int viewId = v.getId(); switch (viewId) { case R.id.view_file_header_audio_folder: refreshListFolders(); break; case R.id.view_file_header_audio_playlist: refreshListPlaylist(); break; case R.id.view_file_header_audio_recent: //TODO break; case R.id.view_file_header_audio_artist: refreshListArtist(); break; case R.id.view_file_header_audio_album: refreshListAlbum(); break; case R.id.view_file_header_audio_all: refreshListAllMusic(); break; } return false; } /** * {@inheritDoc} */ @Override public void onRefresh() { refreshCurrentList(); } /** * {@inheritDoc} */ @Override public boolean isAnimatedItem(int position) { return mCurrentPage == PAGE_FOLDER_INSIDE || position != 0; } /** * {@inheritDoc} */ @Override public void onMusicsContentChange() { refreshCurrentList(); } /** * {@inheritDoc} */ @Override public void refreshCurrentList() { if (mFileAudioManager == null || mAudioPlayListManager == null) { return; } showProgressBar(); switch (mCurrentPage) { case PAGE_ALL: mFileAudioManager.getAllLocalMusic(); break; case PAGE_PLAYLIST: mAudioPlayListManager.getPlayLists(); break; case PAGE_FOLDERS: mFileAudioManager.getLocalMusicFolders(); break; case PAGE_FOLDER_INSIDE: mFileAudioManager.getLocalMusic(mCurrentFolder); break; case PAGE_ALBUM: mFileAudioManager.getAllLocalMusicAlbums(); break; case PAGE_ARTIST: mFileAudioManager.getAllLocalMusicArtists(); break; } } /** * {@inheritDoc} */ @Override public void updateAdapter() { if (mRecyclerView != null && isAdded()) { mSwipeRefreshLayout.setRefreshing(false); mFileLocalFabManager.updateFabButtons(); if (isEmpty()) { mMessageTextView.setText(getString(R.string.no_music)); mMessageTextView.setVisibility(View.VISIBLE); } else { mMessageTextView.setVisibility(View.GONE); } if (mCurrentPage == PAGE_FOLDERS) { mFileModelCardAdapter.setList(mFileModels); } else if (mCurrentPage == PAGE_ALBUM) { mAlbumCardGenericRecyclerAdapter.setModels(mAlbums); } else if (mCurrentPage == PAGE_ARTIST) { mArtistCardGenericRecyclerAdapter.setModels(mArtists); } else { mFileAudioRowAdapter.setList(mFileAudioModels); } updateLayoutManager(); } } /** * {@inheritDoc} */ @Override public void onAllLocalMusicSucceeded(final List<FileAudioModel> fileModels) { if (mCurrentPage != PAGE_ALL) { return; } hideProgressBar(); mFileAudioModels.clear(); mFileAudioModels.addAll(fileModels); mFileAudioRowAdapter.setHasHeader(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { mScaleAnimationAdapter = new ScaleAnimationAdapter(mRecyclerView, mFileAudioRowAdapter); mScaleAnimationAdapter.setDuration(220); mScaleAnimationAdapter.setOffsetDuration(32); mScaleAnimationAdapter.setNoAnimatedPosition(FileAudioLocalFragment.this); mRecyclerView.setAdapter(mScaleAnimationAdapter); } else { mRecyclerView.setAdapter(mFileAudioRowAdapter); } updateAdapter(); } /** * {@inheritDoc} */ @Override public void onAllLocalMusicFailed() { if (mCurrentPage != PAGE_ALL) { return; } hideProgressBar(); updateAdapter(); } /** * {@inheritDoc} */ @Override public void onGetPlayListsSucceeded(@NonNull final List<AudioPlayList> audioPlayLists) { if (mCurrentPage != PAGE_PLAYLIST) { return; } hideProgressBar(); mFileAudioModels.clear(); mFileAudioRowAdapter.setHasHeader(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { mScaleAnimationAdapter = new ScaleAnimationAdapter(mRecyclerView, mFileAudioRowAdapter); mScaleAnimationAdapter.setDuration(220); mScaleAnimationAdapter.setOffsetDuration(32); mScaleAnimationAdapter.setNoAnimatedPosition(FileAudioLocalFragment.this); mRecyclerView.setAdapter(mScaleAnimationAdapter); } else { mRecyclerView.setAdapter(mFileAudioRowAdapter); } updateAdapter(); } /** * {@inheritDoc} */ @Override public void onGetPlayListsFailed() { if (mCurrentPage != PAGE_PLAYLIST) { return; } hideProgressBar(); updateAdapter(); } /** * {@inheritDoc} */ @Override public void onLocalMusicFoldersSucceeded(final List<FileModel> fileModels) { if (mCurrentPage != PAGE_FOLDERS) { return; } hideProgressBar(); mFileModels.clear(); mFileModels.addAll(fileModels); mScaleAnimationAdapter = new ScaleAnimationAdapter(mRecyclerView, mFileModelCardAdapter); mScaleAnimationAdapter.setDuration(220); mScaleAnimationAdapter.setOffsetDuration(32); mScaleAnimationAdapter.setNoAnimatedPosition(FileAudioLocalFragment.this); mRecyclerView.setAdapter(mScaleAnimationAdapter); updateAdapter(); } /** * {@inheritDoc} */ @Override public void onLocalMusicFoldersFailed() { if (mCurrentPage != PAGE_FOLDERS) { return; } hideProgressBar(); } /** * {@inheritDoc} */ @Override public void onLocalMusicSucceeded(final List<FileAudioModel> fileModels) { if (mCurrentPage != PAGE_FOLDER_INSIDE) { return; } hideProgressBar(); mFileAudioModels.clear(); mFileAudioModels.addAll(fileModels); mFileAudioRowAdapter.setHasHeader(false); mScaleAnimationAdapter = new ScaleAnimationAdapter(mRecyclerView, mFileAudioRowAdapter); mScaleAnimationAdapter.setDuration(220); mScaleAnimationAdapter.setOffsetDuration(32); mScaleAnimationAdapter.setNoAnimatedPosition(FileAudioLocalFragment.this); mRecyclerView.setAdapter(mScaleAnimationAdapter); updateAdapter(); } /** * {@inheritDoc} */ @Override public void onLocalMusicFailed() { if (mCurrentPage != PAGE_FOLDER_INSIDE) { return; } updateAdapter(); } /** * {@inheritDoc} */ @Override public void onAllLocalMusicArtistsSucceeded(final List<Artist> artists) { if (mCurrentPage != PAGE_ARTIST) { return; } hideProgressBar(); mArtists.clear(); mArtists.addAll(artists); mScaleAnimationAdapter = new ScaleAnimationAdapter(mRecyclerView, mArtistCardGenericRecyclerAdapter); mScaleAnimationAdapter.setDuration(220); mScaleAnimationAdapter.setOffsetDuration(32); mScaleAnimationAdapter.setNoAnimatedPosition(FileAudioLocalFragment.this); mRecyclerView.setAdapter(mScaleAnimationAdapter); updateAdapter(); } /** * {@inheritDoc} */ @Override public void onAllLocalMusicArtistsFailed() { } /** * {@inheritDoc} */ @Override public void onAllLocalMusicAlbumsSucceeded(final List<Album> albums) { if (mCurrentPage != PAGE_ALBUM) { return; } hideProgressBar(); mAlbums.clear(); mAlbums.addAll(albums); mScaleAnimationAdapter = new ScaleAnimationAdapter(mRecyclerView, mAlbumCardGenericRecyclerAdapter); mScaleAnimationAdapter.setDuration(220); mScaleAnimationAdapter.setOffsetDuration(32); mScaleAnimationAdapter.setNoAnimatedPosition(FileAudioLocalFragment.this); mRecyclerView.setAdapter(mScaleAnimationAdapter); updateAdapter(); } /** * {@inheritDoc} */ @Override public void onAllLocalMusicAlbumsFailed() { } /** * {@inheritDoc} */ @Override public void scrollTop() { mRecyclerView.smoothScrollToPosition(0); } //endregion Override methods //region refresh private void refreshListFolders() { mCurrentFolder = null; mCurrentPage = PAGE_FOLDERS; showProgressBar(); refreshCurrentList(); } private void refreshListPlaylist() { mCurrentPage = PAGE_PLAYLIST; showProgressBar(); refreshCurrentList(); } private void refreshListAllMusic() { mCurrentPage = PAGE_ALL; showProgressBar(); refreshCurrentList(); } private void refreshListArtist() { mCurrentPage = PAGE_ARTIST; showProgressBar(); refreshCurrentList(); } private void refreshListAlbum() { mCurrentPage = PAGE_ALBUM; showProgressBar(); refreshCurrentList(); } private void refreshListFoldersInside(final FileModel fileModel) { mCurrentFolder = fileModel; mCurrentPage = PAGE_FOLDER_INSIDE; mFileAudioModels.clear(); refreshCurrentList(); } //endregion refresh private void updateLayoutManager() { if (mCurrentPage == PAGE_FOLDERS || mCurrentPage == PAGE_ALBUM) { final GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.column_number_small_card)); gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return mFileModelCardAdapter.isHeader(position) ? gridLayoutManager.getSpanCount() : 1; } }); mRecyclerView.setLayoutManager(gridLayoutManager); } else { final int nbColumn = getResources().getInteger(R.integer.column_number_card); if (nbColumn <= 1) { mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); } else { final GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), nbColumn); mRecyclerView.setLayoutManager(gridLayoutManager); gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return mFileAudioRowAdapter.isHeader(position) ? gridLayoutManager.getSpanCount() : 1; } }); } } } private void showProgressBar() { mProgressBarActivationHandler.postDelayed(mProgressBarActivationRunnable, 200); } private void hideProgressBar() { mProgressBarActivationHandler.removeCallbacks(mProgressBarActivationRunnable); mProgressBar.setVisibility(View.GONE); mRecyclerView.setVisibility(View.VISIBLE); } private boolean isEmpty() { switch (mCurrentPage) { case PAGE_ALL: return mFileAudioModels.isEmpty(); case PAGE_FOLDERS: return mFileModels.isEmpty(); case PAGE_FOLDER_INSIDE: return mFileModels.isEmpty(); case PAGE_ALBUM: return mAlbums.isEmpty(); case PAGE_ARTIST: return mArtists.isEmpty(); case PAGE_PLAYLIST: return mFileAudioModels.isEmpty(); default: return mFileAudioModels.isEmpty(); } } @NonNull private GenericRecyclerAdapter<Album, AlbumCard> createAlbumCardGenericRecyclerAdapter() { return new GenericRecyclerAdapter<>(new GenericRecyclerAdapter.ViewFabric<AlbumCard>() { @NonNull @Override public AlbumCard newInstance(@NonNull final Context context) { return new AlbumCard(context); } }); } @NonNull private GenericRecyclerAdapter<Artist, ArtistCard> createArtistCardGenericRecyclerAdapter() { return new GenericRecyclerAdapter<>(new GenericRecyclerAdapter.ViewFabric<ArtistCard>() { @NonNull @Override public ArtistCard newInstance(@NonNull final Context context) { return new ArtistCard(context); } }); } }