diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlayingQueueAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlayingQueueAdapter.java index 5001ae6c..9e23a60a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlayingQueueAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlayingQueueAdapter.java @@ -35,7 +35,7 @@ public class PlayingQueueAdapter extends ArrayAdapter { } @Override - public View getView(int position, View convertView, ViewGroup parent) { + public View getView(final int position, View convertView, ViewGroup parent) { final Song song = getItem(position); if (convertView == null) { convertView = LayoutInflater.from(activity).inflate(R.layout.item_list_playlist, parent, false); @@ -57,11 +57,19 @@ public class PlayingQueueAdapter extends ArrayAdapter { @Override public void onClick(final View v) { PopupMenu popupMenu = new PopupMenu(activity, v); - popupMenu.inflate(R.menu.menu_song); + popupMenu.inflate(R.menu.menu_playing_queue_song); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { + case R.id.action_remove_from_playing_queue: + MusicPlayerRemote.removeFromQueue(position); + notifyDataSetChanged(); + return true; + case R.id.action_play_next: + MusicPlayerRemote.playNext(song); + notifyDataSetChanged(); + return true; case R.id.action_tag_editor: Intent intent = new Intent(activity, SongTagEditorActivity.class); intent.putExtra(AppKeys.E_ID, song.id); @@ -76,7 +84,7 @@ public class PlayingQueueAdapter extends ArrayAdapter { NavigationUtil.goToAlbum(activity, song.albumId, null); return true; case R.id.action_go_to_artist: - NavigationUtil.goToAlbum(activity, song.artistId, null); + NavigationUtil.goToArtist(activity, song.artistId, null); return true; } return false; diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java index d74221bc..9befae9d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/AlbumSongAdapter.java @@ -88,6 +88,11 @@ public class AlbumSongAdapter extends RecyclerView.Adapter { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { + case R.id.action_play_next: + MusicPlayerRemote.playNext(song); + return true; + case R.id.action_add_to_current_playing: + MusicPlayerRemote.enqueue(song); + return true; case R.id.action_tag_editor: Intent intent = new Intent(activity, SongTagEditorActivity.class); intent.putExtra(AppKeys.E_ID, song.id); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java index 35239814..0e873306 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/SongAdapter.java @@ -93,6 +93,12 @@ public class SongAdapter extends RecyclerView.Adapter { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { + case R.id.action_play_next: + MusicPlayerRemote.playNext(dataSet.get(getPosition())); + return true; + case R.id.action_add_to_current_playing: + MusicPlayerRemote.enqueue(dataSet.get(getPosition())); + return true; case R.id.action_tag_editor: Intent intent = new Intent(activity, SongTagEditorActivity.class); intent.putExtra(AppKeys.E_ID, dataSet.get(getPosition()).id); diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java index 9f82461d..7eb397e6 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -7,8 +7,10 @@ import android.content.ServiceConnection; import android.os.IBinder; import android.preference.PreferenceManager; import android.util.Log; +import android.widget.Toast; import com.kabouzeid.gramophone.App; +import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.model.MusicRemoteEvent; import com.kabouzeid.gramophone.model.Song; @@ -214,16 +216,29 @@ public class MusicPlayerRemote { return false; } + public static void playNext(Song song) { + if (musicService != null) { + musicService.addSong(getPosition() + 1, song); + Toast.makeText(musicService, musicService.getResources().getString(R.string.added_title_to_playing_queue), Toast.LENGTH_SHORT).show(); + } + } + + public static void enqueue(Song song) { + if (musicService != null) { + musicService.addSong(song); + Toast.makeText(musicService, musicService.getResources().getString(R.string.added_title_to_playing_queue), Toast.LENGTH_SHORT).show(); + } + } + + public static void removeFromQueue(int position) { + if (musicService != null) { + musicService.removeSong(position); + } + } + public static void moveSong(int from, int to) { - final int currentPosition = getPosition(); - Song songToMove = getPlayingQueue().remove(from); - getPlayingQueue().add(to, songToMove); - if (from > currentPosition && to <= currentPosition) { - setPosition(getPosition() + 1); - } else if (from < currentPosition && to >= currentPosition) { - setPosition(getPosition() - 1); - } else if (from == currentPosition) { - setPosition(to); + if(musicService != null){ + musicService.moveSong(from, to); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index 91551ed3..e20fdf8d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -477,6 +477,46 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe saveState(); } + public void addSong(int position, Song song){ + playingQueue.add(position, song); + originalPlayingQueue.add(position, song); + saveState(); + } + + public void addSong(Song song){ + playingQueue.add(song); + originalPlayingQueue.add(song); + saveState(); + } + + public void removeSong(int position){ + if(getShuffleMode() == SHUFFLE_MODE_NONE){ + playingQueue.remove(position); + originalPlayingQueue.remove(position); + } else { + originalPlayingQueue.remove(playingQueue.remove(position)); + } + saveState(); + } + + public void moveSong(int from, int to) { + final int currentPosition = getPosition(); + Song songToMove = playingQueue.remove(from); + playingQueue.add(to, songToMove); + if(getShuffleMode() == SHUFFLE_MODE_NONE) { + Song tmpSong = originalPlayingQueue.remove(from); + originalPlayingQueue.add(to, tmpSong); + } + if (from > currentPosition && to <= currentPosition) { + setPosition(getPosition() + 1); + } else if (from < currentPosition && to >= currentPosition) { + setPosition(getPosition() - 1); + } else if (from == currentPosition) { + setPosition(to); + } + saveState(); + } + public long getCurrentSongId() { return currentSongId; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index 77b69f98..82f54182 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -6,6 +6,7 @@ import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; +import android.support.v4.util.Pair; import android.support.v7.graphics.Palette; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.Toolbar; @@ -259,6 +260,9 @@ public class AlbumDetailActivity extends AbsFabActivity { case android.R.id.home: super.onBackPressed(); return true; + case R.id.action_playing_queue: + NavigationUtil.openPlayingQueueDialog(this); + return true; case R.id.action_settings: return true; case R.id.action_current_playing: @@ -270,7 +274,9 @@ public class AlbumDetailActivity extends AbsFabActivity { startActivity(intent); return true; case R.id.action_go_to_artist: - NavigationUtil.goToArtist(this, album.artistId, null); + Pair[] artistPairs = null; + artistPairs = getSharedViewsWithFab(artistPairs); + NavigationUtil.goToArtist(this, album.artistId, artistPairs); return true; } return super.onOptionsItemSelected(item); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index c0f3bdb1..07020b74 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -312,6 +312,9 @@ public class ArtistDetailActivity extends AbsFabActivity { case android.R.id.home: super.onBackPressed(); return true; + case R.id.action_playing_queue: + NavigationUtil.openPlayingQueueDialog(this); + return true; case R.id.action_biography: if(biography != null){ getBiographyDialog().show(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 0f542b50..a179cfed 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -240,12 +240,7 @@ public class MainActivity extends AbsFabActivity NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null)); return true; case R.id.action_playing_queue: - final MaterialDialog materialDialog = PlayingQueueDialogHelper.getDialog(this); - if (materialDialog != null) { - materialDialog.show(); - } else { - Toast.makeText(this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show(); - } + NavigationUtil.openPlayingQueueDialog(this); return true; } return super.onOptionsItemSelected(item); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java index 9aea523b..4dae85d4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java @@ -392,12 +392,7 @@ public class MusicControllerActivity extends AbsFabActivity { super.onBackPressed(); return true; case R.id.action_playing_queue: - final MaterialDialog materialDialog = PlayingQueueDialogHelper.getDialog(this); - if (materialDialog != null) { - materialDialog.show(); - } else { - Toast.makeText(this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show(); - } + NavigationUtil.openPlayingQueueDialog(this); return true; case R.id.action_tag_editor: Intent intent = new Intent(this, SongTagEditorActivity.class); @@ -410,10 +405,10 @@ public class MusicControllerActivity extends AbsFabActivity { SongDetailDialogHelper.getDialog(this, songFile).show(); return true; case R.id.action_go_to_album: - NavigationUtil.goToAlbum(this, song.albumId, null); + NavigationUtil.goToAlbum(this, song.albumId, getSharedViewsWithFab(null)); return true; case R.id.action_go_to_artist: - NavigationUtil.goToAlbum(this, song.artistId, null); + NavigationUtil.goToArtist(this, song.artistId, getSharedViewsWithFab(null)); return true; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java index 20750453..663207ae 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityFragment.java @@ -2,6 +2,7 @@ package com.kabouzeid.gramophone.ui.fragments.mainactivityfragments; import android.app.Fragment; import android.os.Build; +import android.view.ViewConfiguration; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java index 465682ef..4cc45fe1 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java @@ -7,8 +7,10 @@ import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.util.Pair; import android.widget.Toast; +import com.afollestad.materialdialogs.MaterialDialog; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.helper.PlayingQueueDialogHelper; import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.ui.activities.AlbumDetailActivity; @@ -20,7 +22,7 @@ import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity; */ public class NavigationUtil { public static void goToArtist(final Activity activity, final int artistId, final Pair[] sharedViews) { - if(activity instanceof ArtistDetailActivity){ + if (activity instanceof ArtistDetailActivity) { return; } if ((activity instanceof KabViewsDisableAble && ((KabViewsDisableAble) activity).areViewsEnabled()) || !(activity instanceof KabViewsDisableAble)) { @@ -40,7 +42,7 @@ public class NavigationUtil { } public static void goToAlbum(final Activity activity, final int albumId, final Pair[] sharedViews) { - if(activity instanceof AlbumDetailActivity){ + if (activity instanceof AlbumDetailActivity) { return; } if ((activity instanceof KabViewsDisableAble && ((KabViewsDisableAble) activity).areViewsEnabled()) || !(activity instanceof KabViewsDisableAble)) { @@ -60,7 +62,7 @@ public class NavigationUtil { } public static void openCurrentPlayingIfPossible(final Activity activity, final Pair[] sharedViews) { - if (activity instanceof MusicControllerActivity){ + if (activity instanceof MusicControllerActivity) { activity.onBackPressed(); return; } @@ -82,4 +84,13 @@ public class NavigationUtil { Toast.makeText(activity, activity.getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show(); } } + + public static void openPlayingQueueDialog(final Activity activity) { + final MaterialDialog materialDialog = PlayingQueueDialogHelper.getDialog(activity); + if (materialDialog != null) { + materialDialog.show(); + } else { + Toast.makeText(activity, activity.getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show(); + } + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/Util.java b/app/src/main/java/com/kabouzeid/gramophone/util/Util.java index f9f37792..da96de3f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/Util.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/Util.java @@ -3,7 +3,6 @@ package com.kabouzeid.gramophone.util; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; -import android.content.Intent; import android.content.res.Configuration; import android.content.res.TypedArray; import android.database.Cursor; @@ -13,22 +12,13 @@ import android.net.NetworkInfo; import android.net.Uri; import android.os.Build; import android.provider.MediaStore; -import android.support.v4.app.ActivityCompat; -import android.support.v4.app.ActivityOptionsCompat; -import android.support.v4.util.Pair; import android.util.TypedValue; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; -import android.widget.Toast; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.helper.MusicPlayerRemote; -import com.kabouzeid.gramophone.misc.AppKeys; -import com.kabouzeid.gramophone.ui.activities.AlbumDetailActivity; -import com.kabouzeid.gramophone.ui.activities.ArtistDetailActivity; -import com.kabouzeid.gramophone.ui.activities.MusicControllerActivity; /** * Created by karim on 12.12.14. diff --git a/app/src/main/res/menu/menu_album_detail.xml b/app/src/main/res/menu/menu_album_detail.xml index 98dfe7f1..44242cdb 100644 --- a/app/src/main/res/menu/menu_album_detail.xml +++ b/app/src/main/res/menu/menu_album_detail.xml @@ -9,6 +9,12 @@ android:title="@string/action_current_playing" app:showAsAction="ifRoom"/> + + + + - + Updated artist image for Updating… Loading… + Added 1 title to the playing queue. + Added + titles to the playing queue.