From bce9de2782da4557188f730f1e2c1aa53b53582d Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sat, 11 Apr 2015 19:56:09 +0200 Subject: [PATCH] Fixes --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 58 ++++++++++++++ .../adapter/PlayingQueueAdapter.java | 35 +-------- .../gramophone/adapter/PlaylistAdapter.java | 17 +--- .../gramophone/adapter/SearchAdapter.java | 33 ++++++-- .../adapter/songadapter/AlbumSongAdapter.java | 39 +-------- .../songadapter/ArtistSongAdapter.java | 31 +------- .../songadapter/PlaylistSongAdapter.java | 46 +---------- .../adapter/songadapter/SongAdapter.java | 31 +------- .../helper/MenuItemClickHelper.java | 74 ++++++++++++++++++ .../gramophone/helper/MusicPlayerRemote.java | 24 +++++- .../com/kabouzeid/gramophone/model/Album.java | 1 + .../gramophone/service/MusicService.java | 43 ++++++---- .../ui/activities/MainActivity.java | 68 +++++++++++++++- .../fragments/NavigationDrawerFragment.java | 2 +- .../ic_audiotrack_white_24dp.png | Bin 0 -> 248 bytes .../ic_audiotrack_white_24dp.png | Bin 0 -> 170 bytes .../ic_audiotrack_white_24dp.png | Bin 0 -> 284 bytes .../ic_audiotrack_white_24dp.png | Bin 0 -> 429 bytes .../ic_audiotrack_white_24dp.png | Bin 0 -> 565 bytes app/src/main/res/layout/item_list_search.xml | 6 ++ app/src/main/res/layout/item_list_song.xml | 8 +- 22 files changed, 303 insertions(+), 217 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/helper/MenuItemClickHelper.java create mode 100644 app/src/main/res/drawable-hdpi/ic_audiotrack_white_24dp.png create mode 100644 app/src/main/res/drawable-mdpi/ic_audiotrack_white_24dp.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_audiotrack_white_24dp.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_audiotrack_white_24dp.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_audiotrack_white_24dp.png diff --git a/app/build.gradle b/app/build.gradle index f3e46209..e184499d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,8 +23,8 @@ android { applicationId "com.kabouzeid.gramophone" minSdkVersion 16 targetSdkVersion 22 - versionCode 13 - versionName "0.9.6.3b" + versionCode 16 + versionName "0.9.8b" } compileOptions { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 07a6c12b..638672a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,8 +19,66 @@ android:label="@string/app_name" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 22503cd4..52295db4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlayingQueueAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlayingQueueAdapter.java @@ -15,6 +15,7 @@ import android.widget.Toast; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper; import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper; +import com.kabouzeid.gramophone.helper.MenuItemClickHelper; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.SongDetailDialogHelper; import com.kabouzeid.gramophone.loader.SongFilePathLoader; @@ -64,39 +65,7 @@ public class PlayingQueueAdapter extends ArrayAdapter { popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_delete_from_disk: - DeleteSongsDialogHelper.getDialog(activity, song).show(); - return true; - case R.id.action_add_to_playlist: - AddToPlaylistDialogHelper.getDialog(activity, song).show(); - return true; - 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); - activity.startActivity(intent); - return true; - case R.id.action_details: - String songFilePath = SongFilePathLoader.getSongFilePath(activity, song.id); - File songFile = new File(songFilePath); - SongDetailDialogHelper.getDialog(activity, songFile).show(); - return true; - case R.id.action_go_to_album: - NavigationUtil.goToAlbum(activity, song.albumId, null); - return true; - case R.id.action_go_to_artist: - NavigationUtil.goToArtist(activity, song.artistId, null); - return true; - } - return false; + return MenuItemClickHelper.handleSongMenuClick(activity, song, item); } }); popupMenu.show(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java index 8a71f892..6cdeb3ac 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java @@ -1,10 +1,8 @@ package com.kabouzeid.gramophone.adapter; import android.app.Activity; -import android.graphics.Color; import android.support.v4.util.Pair; import android.support.v7.widget.RecyclerView; -import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -15,16 +13,13 @@ import android.widget.TextView; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.helper.DeletePlaylistDialogHelper; -import com.kabouzeid.gramophone.helper.RenamePlaylistDialogHelper; +import com.kabouzeid.gramophone.helper.MenuItemClickHelper; import com.kabouzeid.gramophone.loader.PlaylistLoader; import com.kabouzeid.gramophone.model.DataBaseChangedEvent; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; import com.kabouzeid.gramophone.util.NavigationUtil; -import com.kabouzeid.gramophone.util.Util; import com.squareup.otto.Subscribe; -import com.squareup.picasso.Picasso; import java.util.List; @@ -78,15 +73,7 @@ public class PlaylistAdapter extends RecyclerView.Adapter { +public class SearchAdapter extends ArrayAdapter{ + private Activity activity; - public SearchAdapter(Context context, List objects) { - super(context, R.layout.item_list_search, objects); + public SearchAdapter(Activity activity, List objects) { + super(activity, R.layout.item_list_search, objects); + this.activity = activity; } @Override @@ -33,26 +38,44 @@ public class SearchAdapter extends ArrayAdapter { convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_list_search, parent, false); } - SearchEntry item = getItem(position); + final SearchEntry item = getItem(position); final TextView title = (TextView) convertView.findViewById(R.id.title); final TextView subTitle = (TextView) convertView.findViewById(R.id.sub_title); final ImageView imageView = (ImageView) convertView.findViewById(R.id.image); + final ImageView overflowButton = (ImageView) convertView.findViewById(R.id.menu); if (item instanceof SearchActivity.LabelEntry) { title.setTypeface(null, Typeface.BOLD); subTitle.setVisibility(View.GONE); imageView.setVisibility(View.GONE); + overflowButton.setVisibility(View.GONE); convertView.setBackgroundColor(Util.resolveColor(getContext(), R.attr.default_bar_color)); } else if (item instanceof Song) { title.setTypeface(null, Typeface.NORMAL); subTitle.setVisibility(View.VISIBLE); imageView.setVisibility(View.GONE); convertView.setBackgroundColor(Color.TRANSPARENT); + overflowButton.setVisibility(View.VISIBLE); + overflowButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + PopupMenu popupMenu = new PopupMenu(activity, view); + popupMenu.inflate(R.menu.menu_item_song); + popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem menuItem) { + return MenuItemClickHelper.handleSongMenuClick(activity, (Song) item, menuItem); + } + }); + popupMenu.show(); + } + }); } else { title.setTypeface(null, Typeface.NORMAL); subTitle.setVisibility(View.VISIBLE); imageView.setVisibility(View.VISIBLE); + overflowButton.setVisibility(View.GONE); convertView.setBackgroundColor(Color.TRANSPARENT); } 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 2e38631b..80c47131 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 @@ -15,6 +15,7 @@ import android.widget.TextView; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper; import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper; +import com.kabouzeid.gramophone.helper.MenuItemClickHelper; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.SongDetailDialogHelper; import com.kabouzeid.gramophone.loader.SongFilePathLoader; @@ -92,43 +93,7 @@ public class AlbumSongAdapter extends RecyclerView.Adapter { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { - case R.id.action_delete_from_disk: - DeleteSongsDialogHelper.getDialog(activity, song).show(); - return true; - case R.id.action_add_to_playlist: - AddToPlaylistDialogHelper.getDialog(activity, song).show(); - return true; - 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); - activity.startActivity(intent); - return true; - case R.id.action_details: - String songFilePath = SongFilePathLoader.getSongFilePath(activity, song.id); - File songFile = new File(songFilePath); - SongDetailDialogHelper.getDialog(activity, songFile).show(); - return true; case R.id.action_go_to_album: Pair[] albumPairs = new Pair[]{ Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_cover)) @@ -100,14 +79,8 @@ public class ArtistSongAdapter extends ArrayAdapter { albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); NavigationUtil.goToAlbum(activity, song.albumId, albumPairs); return true; - case R.id.action_go_to_artist: - Pair[] artistPairs = null; - if (activity instanceof AbsFabActivity) - artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs); - NavigationUtil.goToArtist(activity, song.artistId, artistPairs); - return true; } - return false; + return MenuItemClickHelper.handleSongMenuClick(activity, song, item); } }); popupMenu.show(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java index 26c5c359..7d0a4dc5 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/songadapter/PlaylistSongAdapter.java @@ -1,7 +1,6 @@ package com.kabouzeid.gramophone.adapter.songadapter; import android.app.Activity; -import android.content.Intent; import android.support.v4.util.Pair; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -11,25 +10,17 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.TextView; -import android.widget.Toast; import com.kabouzeid.gramophone.R; -import com.kabouzeid.gramophone.helper.AddToPlaylistDialogHelper; -import com.kabouzeid.gramophone.helper.DeleteSongsDialogHelper; +import com.kabouzeid.gramophone.helper.MenuItemClickHelper; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; -import com.kabouzeid.gramophone.helper.SongDetailDialogHelper; -import com.kabouzeid.gramophone.loader.SongFilePathLoader; -import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.model.PlaylistSong; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; -import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; -import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.squareup.picasso.Picasso; -import java.io.File; import java.util.List; /** @@ -98,33 +89,6 @@ public class PlaylistSongAdapter extends RecyclerView.Adapter { public boolean onMenuItemClick(MenuItem item) { final int position = getAdapterPosition() - 1; switch (item.getItemId()) { - case R.id.action_delete_from_disk: - DeleteSongsDialogHelper.getDialog(activity, dataSet.get(position)).show(); - return true; - case R.id.action_add_to_playlist: - AddToPlaylistDialogHelper.getDialog(activity, dataSet.get(position)).show(); - return true; - case R.id.action_play_next: - MusicPlayerRemote.playNext(dataSet.get(position)); - return true; - case R.id.action_add_to_current_playing: - MusicPlayerRemote.enqueue(dataSet.get(position)); - return true; - case R.id.action_tag_editor: - Intent intent = new Intent(activity, SongTagEditorActivity.class); - intent.putExtra(AppKeys.E_ID, dataSet.get(position).id); - activity.startActivity(intent); - return true; - case R.id.action_details: - String songFilePath = SongFilePathLoader.getSongFilePath(activity, dataSet.get(position).id); - File songFile = new File(songFilePath); - SongDetailDialogHelper.getDialog(activity, songFile).show(); - return true; case R.id.action_go_to_album: Pair[] albumPairs = new Pair[]{ Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_cover)) @@ -168,14 +147,8 @@ public class SongAdapter extends RecyclerView.Adapter { albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); NavigationUtil.goToAlbum(activity, dataSet.get(position).albumId, albumPairs); return true; - case R.id.action_go_to_artist: - Pair[] artistPairs = null; - if (activity instanceof AbsFabActivity) - artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs); - NavigationUtil.goToArtist(activity, dataSet.get(position).artistId, artistPairs); - return true; } - return false; + return MenuItemClickHelper.handleSongMenuClick(activity, dataSet.get(position), item); } }); popupMenu.show(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MenuItemClickHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MenuItemClickHelper.java new file mode 100644 index 00000000..bc266a4f --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MenuItemClickHelper.java @@ -0,0 +1,74 @@ +package com.kabouzeid.gramophone.helper; + +import android.app.Activity; +import android.content.Intent; +import android.support.v4.util.Pair; +import android.view.MenuItem; + +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.loader.SongFilePathLoader; +import com.kabouzeid.gramophone.misc.AppKeys; +import com.kabouzeid.gramophone.model.Playlist; +import com.kabouzeid.gramophone.model.Song; +import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity; +import com.kabouzeid.gramophone.util.NavigationUtil; + +import java.io.File; + +/** + * Created by karim on 11.04.15. + */ +public class MenuItemClickHelper { + public static boolean handleSongMenuClick(Activity activity, Song song, MenuItem item){ + switch (item.getItemId()) { + case R.id.action_delete_from_disk: + DeleteSongsDialogHelper.getDialog(activity, song).show(); + return true; + case R.id.action_add_to_playlist: + AddToPlaylistDialogHelper.getDialog(activity, song).show(); + return true; + 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); + activity.startActivity(intent); + return true; + case R.id.action_details: + String songFilePath = SongFilePathLoader.getSongFilePath(activity, song.id); + File songFile = new File(songFilePath); + SongDetailDialogHelper.getDialog(activity, songFile).show(); + return true; + case R.id.action_go_to_album: + Pair[] albumPairs = null; + if (activity instanceof AbsFabActivity) + albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); + NavigationUtil.goToAlbum(activity, song.albumId, albumPairs); + return true; + case R.id.action_go_to_artist: + Pair[] artistPairs = null; + if (activity instanceof AbsFabActivity) + artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs); + NavigationUtil.goToArtist(activity, song.artistId, artistPairs); + return true; + } + return false; + } + + public static boolean handlePlaylistMenuClick(Activity activity, Playlist playlist, MenuItem item){ + switch (item.getItemId()) { + case R.id.action_rename_playlist: + RenamePlaylistDialogHelper.getDialog(activity, playlist.id).show(); + return true; + case R.id.action_delete_playlist: + DeletePlaylistDialogHelper.getDialog(activity, playlist.id).show(); + return true; + } + return false; + } +} 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 c72d71c6..abfa283f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -4,6 +4,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.net.Uri; import android.os.IBinder; import android.preference.PreferenceManager; import android.util.Log; @@ -11,6 +12,9 @@ import android.widget.Toast; import com.kabouzeid.gramophone.App; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.loader.AlbumSongLoader; +import com.kabouzeid.gramophone.loader.ArtistSongLoader; +import com.kabouzeid.gramophone.loader.PlaylistSongLoader; import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.misc.AppKeys; import com.kabouzeid.gramophone.model.MusicRemoteEvent; @@ -85,19 +89,19 @@ public class MusicPlayerRemote { public static void playNextSong() { if (musicService != null) { - musicService.playNextSong(); + musicService.playNextSong(true); } } public static void playPreviousSong() { if (musicService != null) { - musicService.back(); + musicService.back(true); } } public static void back() { if (musicService != null) { - musicService.back(); + musicService.back(true); } } @@ -304,4 +308,18 @@ public class MusicPlayerRemote { position = -1; } } + + public static void playFile(Uri uri) { + if (musicService != null && uri != null) { + String filename; + String scheme = uri.getScheme(); + if ("file".equals(scheme)) { + filename = uri.getPath(); + } else { + filename = uri.toString(); + } + //musicService.playFile(filename); //TODO + Toast.makeText(context, "This feature is not working yet", Toast.LENGTH_SHORT).show(); + } + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java index f9a2d149..f8cbeee4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/model/Album.java +++ b/app/src/main/java/com/kabouzeid/gramophone/model/Album.java @@ -52,6 +52,7 @@ public class Album implements SearchEntry { imageView.setImageResource(R.drawable.default_album_art); Picasso.with(context) .load(MusicUtil.getAlbumArtUri(id)) + .placeholder(R.drawable.default_album_art) .into(imageView); } } 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 6b78b119..927ceb3a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -20,6 +20,7 @@ import android.os.Binder; import android.os.IBinder; import android.os.PowerManager; import android.preference.PreferenceManager; +import android.text.TextUtils; import android.util.Log; import android.widget.Toast; @@ -153,10 +154,10 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe resumePlaying(); break; case ACTION_REWIND: - back(); + back(true); break; case ACTION_SKIP: - playNextSong(); + playNextSong(true); break; case ACTION_STOP: stopPlaying(); @@ -167,7 +168,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe } } } - return START_NOT_STICKY; + return START_STICKY; } @Override @@ -268,14 +269,14 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP); } else { - playNextSong(); + playNextSong(false); } } - public void playNextSong() { + public void playNextSong(boolean force) { if (position != -1) { if (isPlayerPrepared) { - setPosition(getNextPosition()); + setPosition(getNextPosition(force)); playSong(); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.NEXT); } @@ -380,7 +381,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe return ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, playingQueue.get(position).id); } - public int getNextPosition() { + public int getNextPosition(boolean force) { int position = 0; switch (repeatMode) { case REPEAT_MODE_NONE: @@ -396,7 +397,14 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe } break; case REPEAT_MODE_THIS: - position = getPosition(); + if(force){ + position = getPosition() + 1; + if (isLastTrack()) { + position = 0; + } + } else { + position = getPosition(); + } break; } return position; @@ -628,25 +636,25 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe } } - public void playPreviousSong() { + public void playPreviousSong(boolean force) { if (position != -1) { - setPosition(getPreviousPosition()); + setPosition(getPreviousPosition(force)); playSong(); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.PREV); } } - public void back() { + public void back(boolean force) { if (position != -1) { if (getSongProgressMillis() > 2000) { seekTo(0); } else { - playPreviousSong(); + playPreviousSong(force); } } } - public int getPreviousPosition() { + public int getPreviousPosition(boolean force) { int position = 0; switch (repeatMode) { case REPEAT_MODE_NONE: @@ -662,7 +670,14 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe } break; case REPEAT_MODE_THIS: - position = getPosition(); + if(force){ + position = getPosition() - 1; + if (position < 0) { + position = getPlayingQueue().size() - 1; + } + } else { + position = getPosition(); + } break; } return position; 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 4dd6c33b..99de245a 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 @@ -2,13 +2,16 @@ package com.kabouzeid.gramophone.ui.activities; import android.content.Intent; import android.content.res.Configuration; +import android.net.Uri; import android.os.Bundle; +import android.provider.MediaStore; import android.support.v4.util.Pair; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.Toolbar; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -20,6 +23,9 @@ import com.kabouzeid.gramophone.helper.AboutDeveloperDialogHelper; import com.kabouzeid.gramophone.helper.CreatePlaylistDialogHelper; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; +import com.kabouzeid.gramophone.loader.AlbumSongLoader; +import com.kabouzeid.gramophone.loader.ArtistSongLoader; +import com.kabouzeid.gramophone.loader.PlaylistSongLoader; import com.kabouzeid.gramophone.model.MusicRemoteEvent; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.UIPreferenceChangedEvent; @@ -33,6 +39,8 @@ import com.kabouzeid.gramophone.util.Util; import com.kabouzeid.gramophone.util.ViewUtil; import com.squareup.picasso.Picasso; +import java.util.List; + public class MainActivity extends AbsFabActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks, KabViewsDisableAble { @@ -61,6 +69,8 @@ public class MainActivity extends AbsFabActivity ); setUpToolBar(); setUpViewPager(); + + handlePlaybackIntent(getIntent()); } private void setUpViewPager() { @@ -120,7 +130,7 @@ public class MainActivity extends AbsFabActivity setUpDrawerToggle(); } - private void setToolBarTransparent(boolean transparent){ + private void setToolBarTransparent(boolean transparent) { float alpha = transparent ? 0.97f : 1f; final int colorPrimary = Util.resolveColor(this, R.attr.colorPrimary); ViewUtil.setBackgroundAlpha(toolbar, alpha, colorPrimary); @@ -297,4 +307,60 @@ public class MainActivity extends AbsFabActivity super.onPause(); PreferenceUtils.getInstance(MainActivity.this).setLastStartPage(currentPage); } + + private boolean handlePlaybackIntent(Intent intent) { + if (intent == null) { + return false; + } + + Uri uri = intent.getData(); + String mimeType = intent.getType(); + boolean handled = false; + + if (uri != null && uri.toString().length() > 0) { + MusicPlayerRemote.playFile(uri); + handled = true; + } else if (MediaStore.Audio.Playlists.CONTENT_TYPE.equals(mimeType)) { + final int id = (int) parseIdFromIntent(intent, "playlistId", "playlist"); + if (id >= 0) { + int position = intent.getIntExtra("position", 0); + MusicPlayerRemote.openQueue((List) (List) PlaylistSongLoader.getPlaylistSongList(this, id), position, true); + handled = true; + } + } else if (MediaStore.Audio.Albums.CONTENT_TYPE.equals(mimeType)) { + final int id = (int) parseIdFromIntent(intent, "albumId", "album"); + if (id >= 0) { + int position = intent.getIntExtra("position", 0); + MusicPlayerRemote.openQueue(AlbumSongLoader.getAlbumSongList(this, id), position, true); + handled = true; + } + } else if (MediaStore.Audio.Artists.CONTENT_TYPE.equals(mimeType)) { + final int id = (int) parseIdFromIntent(intent, "artistId", "artist"); + if (id >= 0) { + int position = intent.getIntExtra("position", 0); + MusicPlayerRemote.openQueue(ArtistSongLoader.getArtistSongList(this, id), position, true); + handled = true; + } + } + if (handled) { + setIntent(new Intent()); + } + return handled; + } + + private long parseIdFromIntent(Intent intent, String longKey, + String stringKey) { + long id = intent.getLongExtra(longKey, -1); + if (id < 0) { + String idString = intent.getStringExtra(stringKey); + if (idString != null) { + try { + id = Long.parseLong(idString); + } catch (NumberFormatException e) { + Log.e(TAG, e.getMessage()); + } + } + } + return id; + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/NavigationDrawerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/NavigationDrawerFragment.java index b2f492b5..ac5a0e0f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/NavigationDrawerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/NavigationDrawerFragment.java @@ -135,7 +135,7 @@ public class NavigationDrawerFragment extends Fragment { private void setUpListView() { final ArrayList navigationDrawerItems = new ArrayList<>(); - navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.songs), R.drawable.ic_my_library_music_white_24dp)); + navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.songs), R.drawable.ic_audiotrack_white_24dp)); navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.albums), R.drawable.ic_album_white_24dp)); navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.artists), R.drawable.ic_person_white_24dp)); navigationDrawerItems.add(new NavigationDrawerItem(getString(R.string.playlists), R.drawable.ic_queue_music_white_24dp)); diff --git a/app/src/main/res/drawable-hdpi/ic_audiotrack_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_audiotrack_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..33b9e2931b5ef2f13135bf98af35228a2a24e538 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@??DuqW45_%4{Nw+B`@;!` zcoy?Xo#e|>5VF2-+VMzJTOfO{Rfh+=DNl)>bm@f^&2F+LuN0~*J;XbnGkj!L_{V%? zenZ872g?Shs~o;5cKUseriC?&D_`H}fv$lj4zJSi~#Hb=-H}6$S}1|M>sko>|xM zaK{z~d5NtIhnZ#_Ke&SR@ByYgg*?_r?GAs$JKhIgW}5JDxu@^uabt@bWe8`>>b;0RClb4t71Exp87CiPmN8VgH!LHyvYr)I^{8RE6lKL)M&CHTu ZDA}z1p|MNxB?AKkgQu&X%Q~loCIC|mL#6-# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_audiotrack_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_audiotrack_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..dc67379deea1bd01c1a5c0c08e4d0bd3ef9ec1c6 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F~)y=l*N$Ux-y z$1f^;ewVm+bTwakY{{+kO(@S#iBIl;{oY247Yj-|>=*97wdcd9C*nWey?1sN?)ZGq z`m`kzheAVx|JGO*0S5-gLdIwHi@_`~q2bJ`71)~f#iiQBS9ZeU+%vb+d=3cQO^TnM z%=qcR!%)V^1KT{A0xD)MWz$&8to6F#meqqq*#aSny5*b^91Lo+8a6U4SYIoY&(s#b z?1S9}=j&pJ=Lf1!W$!!K-_iZ#+QeOc`}ZID)%`Gh#q3YQmpRT}6udio^P`5evs-8P h*RTjU9GK4(H}OdS*%~)y=~~l>?qRy z@y3l#DIF8{O&d0B=#e<7s-t7mprJJBm{!XZnYe=!?i@Jgrkt^`?|-9isop#zm|Bn`HYDA&CuV8{i-+lf^ZN!}i=EYL2pReab1A&P{;n!Aq*<9zlx2ARVGB7YOc)I$ztaD0e F0s!06uH^s# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_audiotrack_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_audiotrack_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..74b0274ace94f18306ea38504da87e8108c5df36 GIT binary patch literal 565 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4mJh`hDS5XEf^RW|9HAMhE&{od)wN}*-@nZ zV}gK5Ygkt5!(?VXha8rT!rF!jt5tSyxW>wnwRp*<>wY3r9vIJEuiElO>c~f)os9|N zd(T-Ou3?s6^6&qlr)oPjEuM2N5m#nlU|>W>7s40vGhhQB89t=SV3WWu){^hG%FA@6 z;?^bGzD(V_Z#v%+-b|i`8ZEEXmG_>{n9uNMZ|Y0kYwq01Y#N^J8|`mPY9DC%@}R`; z6GPpf@a5%`*fccveP#^U^^EyK@%G0I7Z^3z_FZLp;GUZPT!k}$-GM*h+D)sIj3JB{ zSXVGE;J(1%AijXLLC-;&fnf&=;{x^%85w_q^PEf1`*kshIx}c%GWkeL{*RUN{d#&w zHZz0zwPXC88}b+u6jK@gH=pT#^kcf%asI!PpG>;+B6e|G z{EIC6$-H2B;Y-T{Kg=(6JpH(pq2}MlPq*u3{@;0IyI+;z{)8>lKY#dV&$9bc0?*@Y z=91_s^NJ+y+kdi;+l*Osh~-}6|1Noc0RwvW1uU(8f + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_list_song.xml b/app/src/main/res/layout/item_list_song.xml index 8bda5a3a..8df3f9d5 100644 --- a/app/src/main/res/layout/item_list_song.xml +++ b/app/src/main/res/layout/item_list_song.xml @@ -30,22 +30,22 @@ android:orientation="vertical"> + android:textAppearance="@style/TextAppearance.AppCompat.Subhead" + android:textColor="?title_text_color"/> + android:textAppearance="@style/TextAppearance.AppCompat.Body1" + android:textColor="?caption_text_color"/>