package com.marverenic.music.activity.instance; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.RecyclerView; import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import com.marverenic.adapter.HeterogeneousAdapter; import com.marverenic.music.JockeyApplication; import com.marverenic.music.R; import com.marverenic.music.activity.BaseLibraryActivity; import com.marverenic.music.adapter.LibraryEmptyState; import com.marverenic.music.adapter.ShuffleAllSection; import com.marverenic.music.adapter.SongSection; import com.marverenic.music.data.store.MediaStoreUtil; import com.marverenic.music.data.store.PlayCountStore; import com.marverenic.music.data.store.PlaylistStore; import com.marverenic.music.model.AutoPlaylist; import com.marverenic.music.model.Song; import com.marverenic.music.model.playlistrules.AutoPlaylistRule; import com.marverenic.music.view.BackgroundDecoration; import com.marverenic.music.view.DividerDecoration; import java.util.List; import javax.inject.Inject; import rx.android.schedulers.AndroidSchedulers; import timber.log.Timber; public class AutoPlaylistActivity extends BaseLibraryActivity implements PopupMenu.OnMenuItemClickListener { private static final String PLAYLIST_EXTRA = "AutoPlaylistActivity.PLAYLIST"; @Inject PlaylistStore mPlaylistStore; @Inject PlayCountStore mPlayCountStore; private List<Song> mSongs; private AutoPlaylist mReference; private RecyclerView mRecyclerView; private HeterogeneousAdapter mAdapter; private ShuffleAllSection mShuffleAllSection; private SongSection mSongSection; public static Intent newIntent(Context context, AutoPlaylist playlist) { Intent intent = new Intent(context, AutoPlaylistActivity.class); intent.putExtra(PLAYLIST_EXTRA, playlist); return intent; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); JockeyApplication.getComponent(this).inject(this); mRecyclerView = (RecyclerView) findViewById(R.id.list); setupRecyclerView(); mReference = getIntent().getParcelableExtra(PLAYLIST_EXTRA); mPlaylistStore.getSongs(mReference) .subscribe( songs -> { mSongs = songs; setupAdapter(); }, throwable -> { Timber.e(throwable, "onCreate: Failed to get song contents"); }); getSupportActionBar().setTitle(mReference.getPlaylistName()); } @Override protected int getContentLayoutResource() { return R.layout.activity_instance; } private void setupAdapter() { if (mSongs == null) { return; } if (mAdapter == null) { mAdapter = new HeterogeneousAdapter(); mAdapter.setHasStableIds(true); mAdapter.setEmptyState(new LibraryEmptyState(this) { @Override public String getEmptyMessage() { return getString(R.string.empty_auto_playlist); } @Override public String getEmptyMessageDetail() { return getString(R.string.empty_auto_playlist_detail); } @Override public String getEmptyAction1Label() { return getString(R.string.action_edit_playlist_rules); } @Override public void onAction1() { if (MediaStoreUtil.hasPermission(AutoPlaylistActivity.this)) { Intent intent = AutoPlaylistEditActivity.newIntent (AutoPlaylistActivity.this, mReference); startActivity(intent); } else { super.onAction1(); } } }); mRecyclerView.setAdapter(mAdapter); } if (mSongSection == null || mShuffleAllSection == null) { mShuffleAllSection = new ShuffleAllSection(this, mSongs); mSongSection = new SongSection(this, mSongs); mAdapter.addSection(mShuffleAllSection); mAdapter.addSection(mSongSection); } else { mShuffleAllSection.setData(mSongs); mSongSection.setData(mSongs); mAdapter.notifyDataSetChanged(); } } private void setupRecyclerView() { mRecyclerView.addItemDecoration(new BackgroundDecoration()); mRecyclerView.addItemDecoration(new DividerDecoration(this, R.id.empty_layout)); LinearLayoutManager layoutManager = new LinearLayoutManager(this); layoutManager.setOrientation(LinearLayoutManager.VERTICAL); mRecyclerView.setLayoutManager(layoutManager); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_playlist, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (mReference == null) { return super.onOptionsItemSelected(item); } if (item.getItemId() == R.id.menu_playlist_sort) { PopupMenu sortMenu = new PopupMenu(this, findViewById(R.id.menu_playlist_sort), Gravity.END); sortMenu.inflate(R.menu.sort_options_auto_playlist); sortMenu.setOnMenuItemClickListener(this); sortMenu.show(); return true; } return super.onOptionsItemSelected(item); } @Override public boolean onMenuItemClick(MenuItem item) { int sortFlag; String result; boolean ascending; switch (item.getItemId()) { case R.id.menu_sort_random: result = getString(R.string.message_sorted_playlist_random); sortFlag = AutoPlaylistRule.ID; ascending = false; break; case R.id.menu_sort_name: result = getString(R.string.message_sorted_playlist_name); sortFlag = AutoPlaylistRule.NAME; ascending = true; break; case R.id.menu_sort_play: result = getString(R.string.message_sorted_playlist_play); sortFlag = AutoPlaylistRule.PLAY_COUNT; ascending = false; break; case R.id.menu_sort_skip: result = getString(R.string.message_sorted_playlist_skip); sortFlag = AutoPlaylistRule.SKIP_COUNT; ascending = false; break; case R.id.menu_sort_date_added: result = getString(R.string.message_sorted_playlist_date_added); sortFlag = AutoPlaylistRule.DATE_ADDED; ascending = false; break; case R.id.menu_sort_date_played: result = getString(R.string.message_sorted_playlist_date_played); sortFlag = AutoPlaylistRule.DATE_PLAYED; ascending = false; break; default: return false; } int oldSortFlag = mReference.getSortMethod(); if (oldSortFlag == mReference.getSortMethod()) { ascending = !mReference.isSortAscending(); } boolean alreadyLoaded = mSongSection != null; mPlaylistStore.getSongs(mReference) .skip(alreadyLoaded ? 1 : 0) .take(1) .observeOn(AndroidSchedulers.mainThread()) .subscribe(ignoredValue -> { String message = String.format(result, mReference); Snackbar.make(mRecyclerView, message, Snackbar.LENGTH_LONG) .setAction(getResources().getString(R.string.action_undo), v -> { mReference = new AutoPlaylist.Builder(mReference) .setSortMethod(oldSortFlag) .build(); mPlaylistStore.editPlaylist(mReference); }) .show(); }, throwable -> { Timber.e(throwable, "Failed to set sort method"); }); mReference = new AutoPlaylist.Builder(mReference) .setSortMethod(sortFlag) .setSortAscending(ascending) .build(); mPlaylistStore.editPlaylist(mReference); return true; } }