package com.simplecity.amp_library.utils;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.PopupMenu;
import android.view.SubMenu;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog;
import com.simplecity.amp_library.R;
import com.simplecity.amp_library.model.Album;
import com.simplecity.amp_library.model.AlbumArtist;
import com.simplecity.amp_library.model.Playlist;
import com.simplecity.amp_library.model.Song;
import com.simplecity.amp_library.sql.databases.BlacklistHelper;
import com.simplecity.amp_library.tagger.TaggerDialog;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
public class MenuUtils implements MusicUtils.Defs {
public static void addSongMenuOptions(final Context context, final PopupMenu menu) {
menu.getMenu().add(SONG_FRAGMENT_GROUP_ID, PLAY_NEXT, 0, R.string.play_next);
SubMenu sub = menu.getMenu().addSubMenu(SONG_FRAGMENT_GROUP_ID, ADD_TO_PLAYLIST, 1, R.string.add_to_playlist);
PlaylistUtils.makePlaylistMenu(context, sub, SONG_FRAGMENT_GROUP_ID);
menu.getMenu().add(SONG_FRAGMENT_GROUP_ID, QUEUE, 2, R.string.add_to_queue);
if (ShuttleUtils.isUpgraded()) {
menu.getMenu().add(SONG_FRAGMENT_GROUP_ID, TAGGER, 3, R.string.edit_tags);
}
menu.getMenu().add(SONG_FRAGMENT_GROUP_ID, USE_AS_RINGTONE, 5, R.string.ringtone_menu);
menu.getMenu().add(SONG_FRAGMENT_GROUP_ID, VIEW_INFO, 6, R.string.song_info);
menu.getMenu().add(SONG_FRAGMENT_GROUP_ID, SHARE, 7, R.string.share);
menu.getMenu().add(SONG_FRAGMENT_GROUP_ID, BLACKLIST, 8, R.string.blacklist_title);
menu.getMenu().add(SONG_FRAGMENT_GROUP_ID, DELETE_ITEM, 9, R.string.delete_item);
}
public static void addClickHandler(final AppCompatActivity activity, final PopupMenu menu, final Song song, final PopupMenu.OnMenuItemClickListener onMenuItemClickListener) {
PopupMenu.OnMenuItemClickListener listener = item -> {
switch (item.getItemId()) {
case QUEUE:
List<Song> songs = new ArrayList<>();
songs.add(song);
MusicUtils.addToQueue(activity, songs);
break;
case PLAY_NEXT:
songs = new ArrayList<>();
songs.add(song);
MusicUtils.playNext(activity, songs);
break;
case NEW_PLAYLIST:
songs = new ArrayList<>();
songs.add(song);
PlaylistUtils.createPlaylistDialog(activity, songs);
break;
case PLAYLIST_SELECTED:
songs = new ArrayList<>();
songs.add(song);
Playlist playlist = (Playlist) item.getIntent().getSerializableExtra(ShuttleUtils.ARG_PLAYLIST);
PlaylistUtils.addToPlaylist(activity, playlist, songs);
break;
case USE_AS_RINGTONE:
// Set the system setting to make this the current ringtone
ShuttleUtils.setRingtone(activity, song);
break;
case DELETE_ITEM:
new DialogUtils.DeleteDialogBuilder()
.context(activity)
.singleMessageId(R.string.delete_song_desc)
.multipleMessage(R.string.delete_song_desc_multiple)
.itemNames(Collections.singletonList(song.name))
.songsToDelete(Observable.just(Collections.singletonList(song)))
.build()
.show();
break;
case TAGGER:
TaggerDialog.newInstance(song)
.show(activity.getSupportFragmentManager());
break;
case VIEW_INFO:
DialogUtils.showSongInfoDialog(activity, song);
break;
case SHARE:
song.share(activity);
break;
}
return onMenuItemClickListener.onMenuItemClick(item);
};
menu.setOnMenuItemClickListener(listener);
}
public static void addQueueMenuOptions(final Context context, final PopupMenu menu) {
menu.getMenu().add(QUEUE_FRAGMENT_GROUP_ID, PLAY_NEXT, 0, R.string.play_next);
SubMenu sub = menu.getMenu().addSubMenu(SONG_FRAGMENT_GROUP_ID, ADD_TO_PLAYLIST, 1, R.string.add_to_playlist);
PlaylistUtils.makePlaylistMenu(context, sub, SONG_FRAGMENT_GROUP_ID);
if (ShuttleUtils.isUpgraded()) {
menu.getMenu().add(QUEUE_FRAGMENT_GROUP_ID, TAGGER, 3, R.string.edit_tags);
}
menu.getMenu().add(QUEUE_FRAGMENT_GROUP_ID, USE_AS_RINGTONE, 5, R.string.ringtone_menu);
menu.getMenu().add(QUEUE_FRAGMENT_GROUP_ID, REMOVE, 6, R.string.remove_from_queue);
menu.getMenu().add(QUEUE_FRAGMENT_GROUP_ID, VIEW_INFO, 7, R.string.song_info);
menu.getMenu().add(SONG_FRAGMENT_GROUP_ID, SHARE, 8, R.string.share);
menu.getMenu().add(QUEUE_FRAGMENT_GROUP_ID, BLACKLIST, 9, R.string.blacklist_title);
menu.getMenu().add(QUEUE_FRAGMENT_GROUP_ID, DELETE_ITEM, 10, R.string.delete_item);
}
public static void addAlbumMenuOptions(Context context, PopupMenu menu) {
menu.getMenu().add(ALBUM_FRAGMENT_GROUP_ID, PLAY_SELECTION, 0, R.string.play_selection);
SubMenu sub = menu.getMenu().addSubMenu(ALBUM_FRAGMENT_GROUP_ID, 1, 0, R.string.add_to_playlist);
PlaylistUtils.makePlaylistMenu(context, sub, ALBUM_FRAGMENT_GROUP_ID);
menu.getMenu().add(ALBUM_FRAGMENT_GROUP_ID, QUEUE, 2, R.string.add_to_queue);
if (ShuttleUtils.isUpgraded()) {
menu.getMenu().add(ALBUM_FRAGMENT_GROUP_ID, TAGGER, 3, R.string.edit_tags);
}
menu.getMenu().add(ALBUM_FRAGMENT_GROUP_ID, EDIT_ARTWORK, 4, R.string.artwork_edit);
menu.getMenu().add(QUEUE_FRAGMENT_GROUP_ID, BLACKLIST, 5, R.string.blacklist_title);
menu.getMenu().add(ALBUM_FRAGMENT_GROUP_ID, DELETE_ITEM, 6, R.string.delete_item);
}
public static void addClickHandler(final AppCompatActivity activity, final PopupMenu menu, final Album album) {
PopupMenu.OnMenuItemClickListener listener = item -> {
Observable<List<Song>> songsObservable = album.getSongsObservable()
.doOnNext(songs -> {
Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(b.year, a.year));
Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.track, b.track));
Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.discNumber, b.discNumber));
});
switch (item.getItemId()) {
case PLAY_SELECTION:
MusicUtils.playAll(activity, songsObservable);
return true;
case NEW_PLAYLIST:
songsObservable
.observeOn(AndroidSchedulers.mainThread())
.subscribe(songs -> PlaylistUtils.createPlaylistDialog(activity, songs));
return true;
case PLAYLIST_SELECTED:
songsObservable
.observeOn(AndroidSchedulers.mainThread())
.subscribe(songs -> {
Playlist playlist = (Playlist) item.getIntent().getSerializableExtra(ShuttleUtils.ARG_PLAYLIST);
PlaylistUtils.addToPlaylist(activity, playlist, songs);
});
return true;
case QUEUE:
songsObservable
.observeOn(AndroidSchedulers.mainThread())
.subscribe(songs -> MusicUtils.addToQueue(activity, songs));
return true;
case TAGGER:
TaggerDialog.newInstance(album)
.show(activity.getSupportFragmentManager());
return true;
case BLACKLIST:
songsObservable
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BlacklistHelper::addToBlacklist);
return true;
case DELETE_ITEM:
new DialogUtils.DeleteDialogBuilder()
.context(activity)
.singleMessageId(R.string.delete_album_desc)
.multipleMessage(R.string.delete_album_desc_multiple)
.itemNames(Collections.singletonList(album.name))
.songsToDelete(album.getSongsObservable())
.build()
.show();
return true;
case VIEW_INFO:
DialogUtils.showAlbumBiographyDialog(activity, album.albumArtistName, album.name);
return true;
case EDIT_ARTWORK:
ArtworkDialog.showDialog(activity, album);
return true;
}
return false;
};
menu.setOnMenuItemClickListener(listener);
}
public static void addAlbumArtistMenuOptions(Context context, PopupMenu menu) {
menu.getMenu().add(ARTIST_FRAGMENT_GROUP_ID, PLAY_SELECTION, 0, R.string.play_selection);
SubMenu sub = menu.getMenu().addSubMenu(ARTIST_FRAGMENT_GROUP_ID, ADD_TO_PLAYLIST, 1, R.string.add_to_playlist);
PlaylistUtils.makePlaylistMenu(context, sub, ARTIST_FRAGMENT_GROUP_ID);
menu.getMenu().add(ARTIST_FRAGMENT_GROUP_ID, QUEUE, 2, R.string.add_to_queue);
if (ShuttleUtils.isUpgraded()) {
menu.getMenu().add(ARTIST_FRAGMENT_GROUP_ID, TAGGER, 3, R.string.edit_tags);
menu.getMenu().add(ARTIST_FRAGMENT_GROUP_ID, EDIT_ARTWORK, 4, R.string.artwork_edit);
}
menu.getMenu().add(QUEUE_FRAGMENT_GROUP_ID, BLACKLIST, 5, R.string.blacklist_title);
menu.getMenu().add(ARTIST_FRAGMENT_GROUP_ID, DELETE_ITEM, 6, R.string.delete_item);
}
public static void addClickHandler(final AppCompatActivity activity, final PopupMenu menu, final AlbumArtist albumArtist) {
PopupMenu.OnMenuItemClickListener listener = item -> {
Observable<List<Song>> songsObservable = albumArtist.getSongsObservable()
.doOnNext(songs -> {
Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(b.year, a.year));
Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.track, b.track));
Collections.sort(songs, (a, b) -> ComparisonUtils.compareInt(a.discNumber, b.discNumber));
Collections.sort(songs, (a, b) -> ComparisonUtils.compare(a.albumName, b.albumName));
});
switch (item.getItemId()) {
case PLAY_SELECTION:
MusicUtils.playAll(activity, songsObservable);
return true;
case NEW_PLAYLIST:
songsObservable
.observeOn(AndroidSchedulers.mainThread())
.subscribe(songs -> PlaylistUtils.createPlaylistDialog(activity, songs));
return true;
case PLAYLIST_SELECTED:
songsObservable
.observeOn(AndroidSchedulers.mainThread())
.subscribe(songs -> {
Playlist playlist = (Playlist) item.getIntent().getSerializableExtra(ShuttleUtils.ARG_PLAYLIST);
PlaylistUtils.addToPlaylist(activity, playlist, songs);
});
return true;
case QUEUE:
songsObservable
.observeOn(AndroidSchedulers.mainThread())
.subscribe(songs -> MusicUtils.addToQueue(activity, songs));
return true;
case TAGGER:
TaggerDialog.newInstance(albumArtist)
.show(activity.getSupportFragmentManager());
return true;
case BLACKLIST:
songsObservable
.observeOn(AndroidSchedulers.mainThread())
.subscribe(BlacklistHelper::addToBlacklist);
return true;
case DELETE_ITEM:
new DialogUtils.DeleteDialogBuilder()
.context(activity)
.singleMessageId(R.string.delete_album_artist_desc)
.multipleMessage(R.string.delete_album_artist_desc_multiple)
.itemNames(Collections.singletonList(albumArtist.name))
.songsToDelete(albumArtist.getSongsObservable())
.build()
.show();
return true;
case VIEW_INFO:
DialogUtils.showArtistBiographyDialog(activity, albumArtist.name);
return true;
case EDIT_ARTWORK:
ArtworkDialog.showDialog(activity, albumArtist);
return true;
}
return false;
};
menu.setOnMenuItemClickListener(listener);
}
public static void addPlaylistMenuOptions(PopupMenu menu, Playlist playlist) {
menu.getMenu().add(PLAYLIST_FRAGMENT_GROUP_ID, PLAY_SELECTION, 0, R.string.play_selection);
if (playlist.canDelete) {
menu.getMenu().add(PLAYLIST_FRAGMENT_GROUP_ID, MusicUtils.PlaylistMenuOrder.DELETE_PLAYLIST, 0, R.string.delete_playlist_menu);
}
if (playlist.canClear) {
menu.getMenu().add(PLAYLIST_FRAGMENT_GROUP_ID, MusicUtils.PlaylistMenuOrder.CLEAR_PLAYLIST, 1, R.string.clear_playlist_menu);
}
if (playlist.id == MusicUtils.PlaylistIds.RECENTLY_ADDED_PLAYLIST) {
menu.getMenu().add(PLAYLIST_FRAGMENT_GROUP_ID, MusicUtils.PlaylistMenuOrder.EDIT_PLAYLIST, 0, R.string.edit_playlist_menu);
}
if (playlist.canRename) {
menu.getMenu().add(PLAYLIST_FRAGMENT_GROUP_ID, MusicUtils.PlaylistMenuOrder.RENAME_PLAYLIST, 0, R.string.rename_playlist_menu);
}
if (playlist.id != MusicUtils.PlaylistIds.MOST_PLAYED_PLAYLIST) {
menu.getMenu().add(PLAYLIST_FRAGMENT_GROUP_ID, MusicUtils.PlaylistMenuOrder.EXPORT_PLAYLIST, 0, R.string.export_playlist);
}
}
public static void addClickHandler(final Context context, final PopupMenu menu, final Playlist playlist, final MaterialDialog.SingleButtonCallback renameListener, final MaterialDialog.SingleButtonCallback editListener) {
final PopupMenu.OnMenuItemClickListener listener = item -> {
switch (item.getItemId()) {
case PLAY_SELECTION:
MusicUtils.playAll(context, playlist.getSongsObservable(context));
break;
case MusicUtils.PlaylistMenuOrder.DELETE_PLAYLIST:
playlist.delete(context);
Toast.makeText(context, R.string.playlist_deleted_message, Toast.LENGTH_SHORT).show();
break;
case MusicUtils.PlaylistMenuOrder.EDIT_PLAYLIST:
if (playlist.id == MusicUtils.PlaylistIds.RECENTLY_ADDED_PLAYLIST) {
DialogUtils.showWeekSelectorDialog(context, editListener);
}
break;
case MusicUtils.PlaylistMenuOrder.RENAME_PLAYLIST:
PlaylistUtils.renamePlaylistDialog(context, playlist, renameListener);
break;
case MusicUtils.PlaylistMenuOrder.EXPORT_PLAYLIST:
PlaylistUtils.createM3uPlaylist(context, playlist);
break;
case MusicUtils.PlaylistMenuOrder.CLEAR_PLAYLIST:
if (playlist.id == Playlist.favoritesPlaylist().id) {
PlaylistUtils.clearFavorites(context);
} else if (playlist.id == MusicUtils.PlaylistIds.MOST_PLAYED_PLAYLIST) {
PlaylistUtils.clearMostPlayed(context);
}
}
return true;
};
menu.setOnMenuItemClickListener(listener);
}
}