package com.simplecity.amp_library.ui.fragments; import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.annimon.stream.Collectors; import com.annimon.stream.Stream; import com.simplecity.amp_library.R; import com.simplecity.amp_library.model.AdaptableItem; import com.simplecity.amp_library.model.Genre; import com.simplecity.amp_library.ui.adapters.GenreAdapter; import com.simplecity.amp_library.ui.modelviews.EmptyView; import com.simplecity.amp_library.ui.modelviews.GenreView; import com.simplecity.amp_library.ui.recyclerview.GridDividerDecoration; import com.simplecity.amp_library.utils.ColorUtils; import com.simplecity.amp_library.utils.ComparisonUtils; import com.simplecity.amp_library.utils.DataManager; import com.simplecity.amp_library.utils.MusicUtils; import com.simplecity.amp_library.utils.PermissionUtils; import com.simplecity.amp_library.utils.ThemeUtils; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; public class GenreFragment extends BaseFragment implements MusicUtils.Defs, RecyclerView.RecyclerListener, GenreAdapter.GenreListener { private static final String TAG = "GenreFragment"; public interface GenreClickListener { void onItemClicked(Genre genre); } private static final String ARG_PAGE_TITLE = "page_title"; private SharedPreferences mPrefs; private GenreClickListener genreClickListener; private FastScrollRecyclerView mRecyclerView; private GenreAdapter genreAdapter; private SharedPreferences.OnSharedPreferenceChangeListener mSharedPreferenceChangeListener; private Subscription subscription; public GenreFragment() { } public static GenreFragment newInstance(String pageTitle) { GenreFragment fragment = new GenreFragment(); Bundle args = new Bundle(); args.putString(ARG_PAGE_TITLE, pageTitle); fragment.setArguments(args); return fragment; } @Override public void onAttach(Context context) { super.onAttach(context); genreClickListener = (GenreClickListener) getActivity(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); genreAdapter = new GenreAdapter(); genreAdapter.setListener(this); mPrefs = PreferenceManager.getDefaultSharedPreferences(this.getActivity()); mSharedPreferenceChangeListener = (sharedPreferences, key) -> { if (key.equals("pref_theme_highlight_color") || key.equals("pref_theme_accent_color") || key.equals("pref_theme_white_accent")) { themeUIComponents(); } }; mPrefs.registerOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (mRecyclerView == null) { mRecyclerView = (FastScrollRecyclerView) inflater.inflate(R.layout.fragment_recycler, container, false); mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); mRecyclerView.addItemDecoration(new GridDividerDecoration(getResources(), 4, true)); mRecyclerView.setRecyclerListener(this); mRecyclerView.setAdapter(genreAdapter); themeUIComponents(); } return mRecyclerView; } @Override public void onPause() { if (subscription != null) { subscription.unsubscribe(); } super.onPause(); } @Override public void onResume() { super.onResume(); refreshAdapterItems(); } @Override public void onDestroy() { mPrefs.unregisterOnSharedPreferenceChangeListener(mSharedPreferenceChangeListener); super.onDestroy(); } private void refreshAdapterItems() { PermissionUtils.RequestStoragePermissions(() -> { if (getActivity() != null && isAdded()) { subscription = DataManager.getInstance().getGenresRelay() .map(genres -> Stream.of(genres) .sorted((a, b) -> ComparisonUtils.compare(a.name, b.name)) .map(genre -> (AdaptableItem) new GenreView(genre)) .collect(Collectors.toList())) .observeOn(AndroidSchedulers.mainThread()) .subscribe(items -> { if (items.isEmpty()) { genreAdapter.setEmpty(new EmptyView(R.string.empty_genres)); } else { genreAdapter.setItems(items); } }); } }); } private void themeUIComponents() { if (mRecyclerView != null) { ThemeUtils.themeRecyclerView(mRecyclerView); mRecyclerView.setThumbColor(ColorUtils.getAccentColor()); mRecyclerView.setPopupBgColor(ColorUtils.getAccentColor()); mRecyclerView.setPopupTextColor(ColorUtils.getAccentColorSensitiveTextColor(getContext())); mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { ThemeUtils.themeRecyclerView(recyclerView); super.onScrollStateChanged(recyclerView, newState); } }); } } @Override public void onItemClick(View v, int position, Genre genre) { genreClickListener.onItemClicked(genre); } @Override public void onViewRecycled(RecyclerView.ViewHolder holder) { if (holder.getAdapterPosition() != -1) { genreAdapter.items.get(holder.getAdapterPosition()).recycle(holder); } } @Override protected String screenName() { return TAG; } }