diff --git a/res/values/translatable.xml b/res/values/translatable.xml index 14f692d3..17138686 100644 --- a/res/values/translatable.xml +++ b/res/values/translatable.xml @@ -275,6 +275,8 @@ THE SOFTWARE. Enqueue album Enqueue artist Enqueue genre + Enqueue… + More from… Empty queue Show queue Hide queue diff --git a/src/ch/blinkenlights/android/vanilla/FullPlaybackActivity.java b/src/ch/blinkenlights/android/vanilla/FullPlaybackActivity.java index 39fec19c..92f94b9a 100644 --- a/src/ch/blinkenlights/android/vanilla/FullPlaybackActivity.java +++ b/src/ch/blinkenlights/android/vanilla/FullPlaybackActivity.java @@ -36,6 +36,7 @@ import android.view.Gravity; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; +import android.view.SubMenu; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; @@ -298,14 +299,23 @@ public class FullPlaybackActivity extends SlidingPlaybackActivity { super.onCreateOptionsMenu(menu); menu.add(0, MENU_DELETE, 30, R.string.delete); - menu.add(0, MENU_ENQUEUE_ALBUM, 30, R.string.enqueue_current_album); - menu.add(0, MENU_ENQUEUE_ARTIST, 30, R.string.enqueue_current_artist); - menu.add(0, MENU_ENQUEUE_GENRE, 30, R.string.enqueue_current_genre); + SubMenu enqueueMenu = menu.addSubMenu(0, MENU_ENQUEUE, 30, R.string.enqueue_current); + SubMenu moreMenu = menu.addSubMenu(0, MENU_MORE, 30, R.string.more_from_current); menu.add(0, MENU_ADD_TO_PLAYLIST, 30, R.string.add_to_playlist); menu.add(0, MENU_SHARE, 30, R.string.share); menu.add(0, MENU_PLUGINS, 30, R.string.plugins); mFavorites = menu.add(0, MENU_SONG_FAVORITE, 0, R.string.add_to_favorites).setIcon(R.drawable.btn_rating_star_off_mtrl_alpha).setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM); + // Subitems of 'enqueue...' + enqueueMenu.add(0, MENU_ENQUEUE_ALBUM, 30, R.string._album); + enqueueMenu.add(0, MENU_ENQUEUE_ARTIST, 30, R.string._artist); + enqueueMenu.add(0, MENU_ENQUEUE_GENRE, 30, R.string._genre); + + // Subitems of 'more from...' + moreMenu.add(0, MENU_MORE_ALBUM, 30, R.string._album); + moreMenu.add(0, MENU_MORE_ARTIST, 30, R.string._artist); + moreMenu.add(0, MENU_MORE_GENRE, 30, R.string._genre); + // ensure that mFavorites is updated mHandler.sendEmptyMessage(MSG_LOAD_FAVOURITE_INFO); return true; @@ -318,8 +328,16 @@ public class FullPlaybackActivity extends SlidingPlaybackActivity switch (item.getItemId()) { case android.R.id.home: - case MENU_LIBRARY: - openLibrary(null); + openLibrary(null, -1); + break; + case MENU_MORE_ALBUM: + openLibrary(song, MediaUtils.TYPE_ALBUM); + break; + case MENU_MORE_ARTIST: + openLibrary(song, MediaUtils.TYPE_ARTIST); + break; + case MENU_MORE_GENRE: + openLibrary(song, MediaUtils.TYPE_GENRE); break; case MENU_ENQUEUE_ALBUM: PlaybackService.get(this).enqueueFromSong(song, MediaUtils.TYPE_ALBUM); @@ -396,7 +414,7 @@ public class FullPlaybackActivity extends SlidingPlaybackActivity @Override public boolean onSearchRequested() { - openLibrary(null); + openLibrary(null, -1); return false; } @@ -639,7 +657,7 @@ public class FullPlaybackActivity extends SlidingPlaybackActivity } else if (view == mCoverView) { performAction(mCoverPressAction); } else if (view.getId() == R.id.info_table) { - openLibrary(mCurrentSong); + openLibrary(mCurrentSong, MediaUtils.TYPE_ALBUM); } else { super.onClick(view); } diff --git a/src/ch/blinkenlights/android/vanilla/LibraryActivity.java b/src/ch/blinkenlights/android/vanilla/LibraryActivity.java index 2a13c3aa..dd69302b 100644 --- a/src/ch/blinkenlights/android/vanilla/LibraryActivity.java +++ b/src/ch/blinkenlights/android/vanilla/LibraryActivity.java @@ -185,7 +185,7 @@ public class LibraryActivity pager.setCurrentItem(page); } - loadAlbumIntent(getIntent()); + loadLimiterIntent(getIntent()); bindControlButtons(); } @@ -230,22 +230,22 @@ public class LibraryActivity } /** - * If the given intent has album data, set a limiter built from that + * If the given intent has type data, set a limiter built from that * data. */ - private void loadAlbumIntent(Intent intent) + private void loadLimiterIntent(Intent intent) { - long albumId = intent.getLongExtra("albumId", -1); - if (albumId != -1) { - String[] fields = { intent.getStringExtra("artist"), intent.getStringExtra("album") }; - String data = String.format("album_id=%d", albumId); - Limiter limiter = new Limiter(MediaUtils.TYPE_ALBUM, fields, data); + int type = intent.getIntExtra("type", -1); + long id = intent.getLongExtra("id", -1); + if (type != -1 && id != -1) { + MediaAdapter adapter = new MediaAdapter(this, type, null, null); + adapter.commitQuery(adapter.query()); + Limiter limiter = adapter.buildLimiter(id); int tab = mPagerAdapter.setLimiter(limiter); if (tab == -1 || tab == mViewPager.getCurrentItem()) updateLimiterViews(); else mViewPager.setCurrentItem(tab); - } } @@ -256,7 +256,7 @@ public class LibraryActivity return; checkForLaunch(intent); - loadAlbumIntent(intent); + loadLimiterIntent(intent); } @Override diff --git a/src/ch/blinkenlights/android/vanilla/PlaybackActivity.java b/src/ch/blinkenlights/android/vanilla/PlaybackActivity.java index fc204b51..5cf84dd4 100644 --- a/src/ch/blinkenlights/android/vanilla/PlaybackActivity.java +++ b/src/ch/blinkenlights/android/vanilla/PlaybackActivity.java @@ -393,9 +393,9 @@ public abstract class PlaybackActivity extends Activity static final int MENU_SORT = 1; static final int MENU_PREFS = 2; - static final int MENU_LIBRARY = 3; - static final int MENU_PLAYBACK = 5; - static final int MENU_SEARCH = 7; + static final int MENU_PLAYBACK = 3; + static final int MENU_SEARCH = 4; + static final int MENU_ENQUEUE = 7; // toplevel menu, has no action static final int MENU_ENQUEUE_ALBUM = 8; static final int MENU_ENQUEUE_ARTIST = 9; static final int MENU_ENQUEUE_GENRE = 10; @@ -409,6 +409,10 @@ public abstract class PlaybackActivity extends Activity static final int MENU_SHARE = 18; static final int MENU_GO_HOME = 19; static final int MENU_PLUGINS = 20; // used in FullPlaybackActivity + static final int MENU_MORE = 21; // toplevel menu, has no own action + static final int MENU_MORE_ALBUM = 22; + static final int MENU_MORE_ARTIST = 23; + static final int MENU_MORE_GENRE = 24; @Override public boolean onCreateOptionsMenu(Menu menu) @@ -633,15 +637,29 @@ public abstract class PlaybackActivity extends Activity * Open the library activity. * * @param song If non-null, will open the library focused on this song. + * @param type the media type to switch to for 'song' */ - public void openLibrary(Song song) + public void openLibrary(Song song, int type) { Intent intent = new Intent(this, LibraryActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); if (song != null) { - intent.putExtra("albumId", song.albumId); - intent.putExtra("album", song.album); - intent.putExtra("artist", song.artist); + long id = -1; + switch(type) { + case MediaUtils.TYPE_ARTIST: + id = song.artistId; + break; + case MediaUtils.TYPE_ALBUM: + id = song.albumId; + break; + case MediaUtils.TYPE_GENRE: + id = MediaUtils.queryGenreForSong(this, song.id); + break; + default: + throw new IllegalArgumentException("Invalid media type " + type); + } + intent.putExtra("type", type); + intent.putExtra("id", id); } startActivity(intent); } diff --git a/src/ch/blinkenlights/android/vanilla/SlidingPlaybackActivity.java b/src/ch/blinkenlights/android/vanilla/SlidingPlaybackActivity.java index 6a8d1a5b..672059c5 100644 --- a/src/ch/blinkenlights/android/vanilla/SlidingPlaybackActivity.java +++ b/src/ch/blinkenlights/android/vanilla/SlidingPlaybackActivity.java @@ -331,7 +331,7 @@ public class SlidingPlaybackActivity extends PlaybackActivity return; // not initialized yet final int[] slide_visible = {MENU_HIDE_QUEUE, MENU_CLEAR_QUEUE, MENU_EMPTY_QUEUE, MENU_SAVE_QUEUE}; - final int[] slide_hidden = {MENU_SHOW_QUEUE, MENU_SORT, MENU_DELETE, MENU_ENQUEUE_ALBUM, MENU_ENQUEUE_ARTIST, MENU_ENQUEUE_GENRE, MENU_ADD_TO_PLAYLIST, MENU_SHARE}; + final int[] slide_hidden = {MENU_SHOW_QUEUE, MENU_SORT, MENU_DELETE, MENU_ENQUEUE, MENU_MORE, MENU_ADD_TO_PLAYLIST, MENU_SHARE}; for (int id : slide_visible) { MenuItem item = mMenu.findItem(id);