package com.marverenic.music.viewmodel;
import android.content.Context;
import android.content.Intent;
import android.databinding.BaseObservable;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.PopupMenu;
import android.view.Gravity;
import android.view.View;
import com.marverenic.music.JockeyApplication;
import com.marverenic.music.R;
import com.marverenic.music.activity.instance.AutoPlaylistActivity;
import com.marverenic.music.activity.instance.AutoPlaylistEditActivity;
import com.marverenic.music.activity.instance.PlaylistActivity;
import com.marverenic.music.data.store.PlaylistStore;
import com.marverenic.music.model.AutoPlaylist;
import com.marverenic.music.model.Playlist;
import com.marverenic.music.player.PlayerController;
import javax.inject.Inject;
import timber.log.Timber;
import static android.support.design.widget.Snackbar.LENGTH_LONG;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
public class PlaylistViewModel extends BaseObservable {
@Inject PlaylistStore mPlaylistStore;
@Inject PlayerController mPlayerController;
private Context mContext;
private Playlist mPlaylist;
public PlaylistViewModel(Context context) {
mContext = context;
JockeyApplication.getComponent(mContext).inject(this);
}
public void setPlaylist(Playlist playlist) {
mPlaylist = playlist;
notifyChange();
}
public String getName() {
return mPlaylist.getPlaylistName();
}
public int getSmartIndicatorVisibility() {
if (mPlaylist instanceof AutoPlaylist) {
return VISIBLE;
} else {
return GONE;
}
}
public View.OnClickListener onClickPlaylist() {
return v -> {
Intent intent;
if (mPlaylist instanceof AutoPlaylist) {
intent = AutoPlaylistActivity.newIntent(mContext, (AutoPlaylist) mPlaylist);
} else {
intent = PlaylistActivity.newIntent(mContext, mPlaylist);
}
mContext.startActivity(intent);
};
}
public View.OnClickListener onClickMenu() {
return v -> {
PopupMenu menu = new PopupMenu(mContext, v, Gravity.END);
menu.inflate((mPlaylist instanceof AutoPlaylist)
? R.menu.instance_smart_playlist
: R.menu.instance_playlist);
menu.setOnMenuItemClickListener(onMenuItemClick(v));
menu.show();
};
}
private PopupMenu.OnMenuItemClickListener onMenuItemClick(View view) {
return menuItem -> {
switch (menuItem.getItemId()) {
case R.id.menu_item_queue_item_next:
queuePlaylistNext();
return true;
case R.id.menu_item_queue_item_last:
queuePlaylistLast();
return true;
case R.id.menu_item_edit:
editThisAsAutoPlaylist();
return true;
case R.id.menu_item_delete:
if (mPlaylist instanceof AutoPlaylist) {
deleteAutoPlaylist(view);
} else {
deletePlaylist(view);
}
return true;
}
return false;
};
}
private void queuePlaylistNext() {
mPlaylistStore.getSongs(mPlaylist).subscribe(
mPlayerController::queueNext,
throwable -> {
Timber.e(throwable, "Failed to get songs");
});
}
private void queuePlaylistLast() {
mPlaylistStore.getSongs(mPlaylist).subscribe(
mPlayerController::queueLast,
throwable -> {
Timber.e(throwable, "Failed to get songs");
});
}
private void editThisAsAutoPlaylist() {
AutoPlaylist autoPlaylist = (AutoPlaylist) mPlaylist;
Intent intent = AutoPlaylistEditActivity.newIntent(mContext, autoPlaylist);
mContext.startActivity(intent);
}
private void deletePlaylist(View snackbarContainer) {
Playlist removed = mPlaylist;
String playlistName = mPlaylist.getPlaylistName();
String message = mContext.getString(R.string.message_removed_playlist, playlistName);
mPlaylistStore.getSongs(removed)
.subscribe(originalContents -> {
mPlaylistStore.removePlaylist(removed);
Snackbar.make(snackbarContainer, message, LENGTH_LONG)
.setAction(R.string.action_undo, view -> {
mPlaylistStore.makePlaylist(playlistName, originalContents);
})
.show();
}, throwable -> {
Timber.e(throwable, "Failed to get playlist contents");
// If we can't get the original contents of the playlist, remove it anyway but
// don't give an undo option
mPlaylistStore.removePlaylist(removed);
Snackbar.make(snackbarContainer, message, LENGTH_LONG).show();
});
}
private void deleteAutoPlaylist(View snackbarContainer) {
mPlaylistStore.removePlaylist(mPlaylist);
String playlistName = mPlaylist.getPlaylistName();
String message = mContext.getString(R.string.message_removed_playlist, playlistName);
AutoPlaylist removed = (AutoPlaylist) mPlaylist;
Snackbar.make(snackbarContainer, message, LENGTH_LONG)
.setAction(R.string.action_undo, view -> {
mPlaylistStore.makePlaylist(removed);
})
.show();
}
}