Main Activity Fragments should be updated automatically now when the Media Store has changed.
This commit is contained in:
parent
e0a6535f9f
commit
9c8cba612b
59 changed files with 428 additions and 352 deletions
|
|
@ -29,8 +29,6 @@ public class PagerAdapter extends FragmentPagerAdapter {
|
|||
@NonNull
|
||||
private final Context mContext;
|
||||
|
||||
private int mCurrentPage;
|
||||
|
||||
@NonNull
|
||||
private final String[] titles;
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
|||
import com.kabouzeid.gramophone.model.Playlist;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
|
|
@ -60,6 +60,15 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
|||
setHasStableIds(true);
|
||||
}
|
||||
|
||||
public ArrayList<Playlist> getDataSet() {
|
||||
return dataSet;
|
||||
}
|
||||
|
||||
public void swapDataSet(ArrayList<Playlist> dataSet) {
|
||||
this.dataSet = dataSet;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return dataSet.get(position).id;
|
||||
|
|
@ -208,8 +217,8 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
|||
toggleChecked(getAdapterPosition());
|
||||
} else {
|
||||
Pair[] sharedViews = null;
|
||||
if (activity instanceof AbsFabActivity)
|
||||
sharedViews = ((AbsFabActivity) activity).getSharedViewsWithFab(null);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
sharedViews = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(null);
|
||||
Playlist playlist = dataSet.get(getAdapterPosition());
|
||||
NavigationUtil.goToPlaylist(activity, playlist, sharedViews);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import com.kabouzeid.gramophone.interfaces.CabHolder;
|
|||
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
|
||||
import com.kabouzeid.gramophone.model.Album;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
|
|
@ -62,6 +62,15 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
setHasStableIds(true);
|
||||
}
|
||||
|
||||
public List<Album> getDataSet() {
|
||||
return dataSet;
|
||||
}
|
||||
|
||||
public void swapDataSet(List<Album> dataSet) {
|
||||
this.dataSet = dataSet;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
|
|
@ -205,8 +214,8 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
Pair.create(image,
|
||||
activity.getResources().getString(R.string.transition_album_art)
|
||||
)};
|
||||
if (activity instanceof AbsFabActivity)
|
||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(albumPairs);
|
||||
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).id, albumPairs);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image;
|
|||
import com.kabouzeid.gramophone.loader.ArtistSongLoader;
|
||||
import com.kabouzeid.gramophone.model.Artist;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
|
|
@ -54,6 +54,15 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
|
|||
setHasStableIds(true);
|
||||
}
|
||||
|
||||
public ArrayList<Artist> getDataSet() {
|
||||
return dataSet;
|
||||
}
|
||||
|
||||
public void swapDataSet(ArrayList<Artist> dataSet) {
|
||||
this.dataSet = dataSet;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return dataSet.get(position).id;
|
||||
|
|
@ -170,8 +179,8 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
|
|||
Pair.create(image,
|
||||
activity.getResources().getString(R.string.transition_artist_image)
|
||||
)};
|
||||
if (activity instanceof AbsFabActivity)
|
||||
artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
artistPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(artistPairs);
|
||||
NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).id, artistPairs);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
|||
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
|
|
@ -98,8 +98,8 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
|
|||
Pair[] albumPairs = new Pair[]{
|
||||
Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_art))
|
||||
};
|
||||
if (activity instanceof AbsFabActivity)
|
||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(albumPairs);
|
||||
NavigationUtil.goToAlbum(activity, song.albumId, albumPairs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import android.view.View;
|
|||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -54,8 +54,8 @@ public class SmartPlaylistSongAdapter extends SongAdapter {
|
|||
Pair[] albumPairs = new Pair[]{
|
||||
Pair.create(image, activity.getString(R.string.transition_album_art))
|
||||
};
|
||||
if (activity instanceof AbsFabActivity)
|
||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(albumPairs);
|
||||
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).albumId, albumPairs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
|||
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
|
|
@ -50,6 +50,11 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
|
|||
setHasStableIds(true);
|
||||
}
|
||||
|
||||
public void swapDataSet(ArrayList<Song> dataSet) {
|
||||
this.dataSet = dataSet;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public ArrayList<Song> getDataSet() {
|
||||
return dataSet;
|
||||
}
|
||||
|
|
@ -176,8 +181,8 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
|
|||
Pair[] albumPairs = new Pair[]{
|
||||
Pair.create(image, activity.getResources().getString(R.string.transition_album_art))
|
||||
};
|
||||
if (activity instanceof AbsFabActivity)
|
||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(albumPairs);
|
||||
NavigationUtil.goToAlbum(activity, getSong().albumId, albumPairs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -101,10 +101,6 @@ public class MusicPlayerRemote {
|
|||
}
|
||||
}
|
||||
|
||||
public static boolean isServiceConnected() {
|
||||
return musicService != null;
|
||||
}
|
||||
|
||||
public static void playSongAt(final int position) {
|
||||
if (musicService != null) {
|
||||
musicService.playSongAt(position);
|
||||
|
|
@ -231,11 +227,7 @@ public class MusicPlayerRemote {
|
|||
return false;
|
||||
}
|
||||
|
||||
public static boolean shuffleAllSongs(@NonNull final Context context, boolean startPlaying) {
|
||||
return openAndShuffleQueue(context, SongLoader.getAllSongs(context), startPlaying);
|
||||
}
|
||||
|
||||
public static boolean openAndShuffleQueue(final Context context, @NonNull final ArrayList<Song> songs, boolean startPlaying) {
|
||||
public static boolean openAndShuffleQueue(@NonNull final ArrayList<Song> songs, boolean startPlaying) {
|
||||
if (musicService != null) {
|
||||
if (!songs.isEmpty()) {
|
||||
MusicPlayerRemote.openQueue(songs, new Random().nextInt(songs.size()), startPlaying);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
|
|||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
|
|
@ -62,14 +62,14 @@ public class SongMenuHelper {
|
|||
return true;
|
||||
case R.id.action_go_to_album:
|
||||
Pair[] albumPairs = null;
|
||||
if (activity instanceof AbsFabActivity)
|
||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(null);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(null);
|
||||
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(null);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
artistPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(null);
|
||||
NavigationUtil.goToArtist(activity, song.artistId, artistPairs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
package com.kabouzeid.gramophone.interfaces;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public interface MusicStateListener {
|
||||
void onPlayingMetaChanged();
|
||||
|
||||
|
||||
void onPlayStateChanged();
|
||||
|
||||
|
||||
void onMediaStoreChanged();
|
||||
}
|
||||
|
|
@ -919,7 +919,8 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
|||
@Override
|
||||
public void run() {
|
||||
// actually call refresh when the delayed callback fires
|
||||
notifyChange(MEDIA_STORE_CHANGED);
|
||||
// do not send a sticky broadcast here
|
||||
sendBroadcast(new Intent(MEDIA_STORE_CHANGED));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ import com.kabouzeid.gramophone.loader.AlbumSongLoader;
|
|||
import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks;
|
||||
import com.kabouzeid.gramophone.misc.SmallTransitionListener;
|
||||
import com.kabouzeid.gramophone.model.Album;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||
|
|
@ -58,7 +58,7 @@ import butterknife.InjectView;
|
|||
* <p/>
|
||||
* Should be kinda stable ONLY AS IT IS!!!
|
||||
*/
|
||||
public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorHolder, CabHolder {
|
||||
public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
|
||||
|
||||
public static final String TAG = AlbumDetailActivity.class.getSimpleName();
|
||||
private static final int TAG_EDITOR_REQUEST = 2001;
|
||||
|
|
@ -334,7 +334,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
|
|||
NavigationUtil.openEqualizer(this);
|
||||
return true;
|
||||
case R.id.action_shuffle_album:
|
||||
MusicPlayerRemote.openAndShuffleQueue(this, adapter.getDataSet(), true);
|
||||
MusicPlayerRemote.openAndShuffleQueue(adapter.getDataSet(), true);
|
||||
return true;
|
||||
case android.R.id.home:
|
||||
super.onBackPressed();
|
||||
|
|
@ -343,7 +343,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
|
|||
NavigationUtil.openPlayingQueueDialog(this);
|
||||
return true;
|
||||
case R.id.action_now_playing:
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null));
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
case R.id.action_tag_editor:
|
||||
Intent intent = new Intent(this, AlbumTagEditorActivity.class);
|
||||
|
|
@ -351,7 +351,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
|
|||
startActivityForResult(intent, TAG_EDITOR_REQUEST);
|
||||
return true;
|
||||
case R.id.action_go_to_artist:
|
||||
Pair[] artistPairs = getSharedViewsWithFab(null);
|
||||
Pair[] artistPairs = getSharedViewsWithPlayPauseFab(null);
|
||||
NavigationUtil.goToArtist(this, album.artistId, artistPairs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ import com.kabouzeid.gramophone.loader.ArtistSongLoader;
|
|||
import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks;
|
||||
import com.kabouzeid.gramophone.misc.SmallTransitionListener;
|
||||
import com.kabouzeid.gramophone.model.Artist;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
|
|
@ -75,7 +75,7 @@ import retrofit.client.Response;
|
|||
* <p/>
|
||||
* Should be kinda stable ONLY AS IT IS!!!
|
||||
*/
|
||||
public class ArtistDetailActivity extends AbsFabActivity implements PaletteColorHolder, CabHolder {
|
||||
public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
|
||||
|
||||
public static final String TAG = ArtistDetailActivity.class.getSimpleName();
|
||||
|
||||
|
|
@ -449,7 +449,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
|
|||
NavigationUtil.openEqualizer(this);
|
||||
return true;
|
||||
case R.id.action_shuffle_artist:
|
||||
MusicPlayerRemote.openAndShuffleQueue(this, songAdapter.getDataSet(), true);
|
||||
MusicPlayerRemote.openAndShuffleQueue(songAdapter.getDataSet(), true);
|
||||
return true;
|
||||
case android.R.id.home:
|
||||
super.onBackPressed();
|
||||
|
|
@ -469,7 +469,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
|
|||
setUpArtistImageAndApplyPalette(true);
|
||||
return true;
|
||||
case R.id.action_now_playing:
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null));
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.kabouzeid.gramophone.ui.activities;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
|
|
@ -7,6 +8,7 @@ import android.graphics.Color;
|
|||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.provider.MediaStore;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
|
@ -46,8 +48,9 @@ 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.loader.SongLoader;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment;
|
||||
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AlbumViewFragment;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
|
|
@ -66,7 +69,7 @@ import java.util.ArrayList;
|
|||
import butterknife.ButterKnife;
|
||||
import butterknife.InjectView;
|
||||
|
||||
public class MainActivity extends AbsFabActivity
|
||||
public class MainActivity extends AbsSlidingMusicPanelActivity
|
||||
implements KabViewsDisableAble, CabHolder {
|
||||
|
||||
public static final String TAG = MainActivity.class.getSimpleName();
|
||||
|
|
@ -86,7 +89,6 @@ public class MainActivity extends AbsFabActivity
|
|||
|
||||
private ActionBarDrawerToggle drawerToggle;
|
||||
private PagerAdapter pagerAdapter;
|
||||
private int currentPage = -1;
|
||||
private MaterialCab cab;
|
||||
@Nullable
|
||||
private View navigationDrawerHeader;
|
||||
|
|
@ -117,7 +119,6 @@ public class MainActivity extends AbsFabActivity
|
|||
|
||||
int startPosition = PreferenceUtil.getInstance(this).getDefaultStartPage();
|
||||
startPosition = startPosition == -1 ? PreferenceUtil.getInstance(this).getLastStartPage() : startPosition;
|
||||
currentPage = startPosition;
|
||||
|
||||
navigationView.getMenu().getItem(startPosition).setChecked(true);
|
||||
|
||||
|
|
@ -133,7 +134,6 @@ public class MainActivity extends AbsFabActivity
|
|||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
navigationView.getMenu().getItem(position).setChecked(true);
|
||||
currentPage = position;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -271,7 +271,7 @@ public class MainActivity extends AbsFabActivity
|
|||
@Override
|
||||
public void onClick(View v) {
|
||||
//noinspection ConstantConditions
|
||||
NavigationUtil.openCurrentPlayingIfPossible(MainActivity.this, getSharedViewsWithFab(new Pair[]{
|
||||
NavigationUtil.openCurrentPlayingIfPossible(MainActivity.this, getSharedViewsWithPlayPauseFab(new Pair[]{
|
||||
Pair.create(navigationDrawerHeader.findViewById(R.id.image),
|
||||
getResources().getString(R.string.transition_album_art)
|
||||
)
|
||||
|
|
@ -303,9 +303,8 @@ public class MainActivity extends AbsFabActivity
|
|||
try {
|
||||
super.enableViews();
|
||||
toolbar.setEnabled(true);
|
||||
((AbsMainActivityFragment) pagerAdapter.getItem(pager.getCurrentItem())).enableViews();
|
||||
} catch (NullPointerException e) {
|
||||
//Log.e(TAG, "wasn't able to enable the views", e);
|
||||
((AbsMainActivityFragment) pagerAdapter.getFragment(pager.getCurrentItem())).enableViews();
|
||||
} catch (NullPointerException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -313,9 +312,8 @@ public class MainActivity extends AbsFabActivity
|
|||
public void disableViews() {
|
||||
try {
|
||||
super.disableViews();
|
||||
((AbsMainActivityFragment) pagerAdapter.getItem(pager.getCurrentItem())).disableViews();
|
||||
} catch (NullPointerException e) {
|
||||
//Log.e(TAG, "wasn't able to disable the views", e);
|
||||
((AbsMainActivityFragment) pagerAdapter.getFragment(pager.getCurrentItem())).disableViews();
|
||||
} catch (NullPointerException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -326,9 +324,8 @@ public class MainActivity extends AbsFabActivity
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onServiceConnected() {
|
||||
super.onServiceConnected();
|
||||
updateNavigationDrawerHeader();
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
super.onServiceConnected(name, service);
|
||||
handlePlaybackIntent(getIntent());
|
||||
}
|
||||
|
||||
|
|
@ -371,7 +368,7 @@ public class MainActivity extends AbsFabActivity
|
|||
NavigationUtil.openEqualizer(this);
|
||||
return true;
|
||||
case R.id.action_shuffle_all:
|
||||
MusicPlayerRemote.shuffleAllSongs(this, true);
|
||||
MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(this), true);
|
||||
return true;
|
||||
case R.id.action_new_playlist:
|
||||
CreatePlaylistDialog.create().show(getSupportFragmentManager(), "CREATE_PLAYLIST");
|
||||
|
|
@ -380,7 +377,7 @@ public class MainActivity extends AbsFabActivity
|
|||
startActivity(new Intent(MainActivity.this, SearchActivity.class));
|
||||
return true;
|
||||
case R.id.action_now_playing:
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null));
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
case R.id.action_playing_queue:
|
||||
NavigationUtil.openPlayingQueueDialog(this);
|
||||
|
|
@ -405,7 +402,7 @@ public class MainActivity extends AbsFabActivity
|
|||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
PreferenceUtil.getInstance(MainActivity.this).setLastStartPage(currentPage);
|
||||
PreferenceUtil.getInstance(MainActivity.this).setLastStartPage(pager.getCurrentItem());
|
||||
}
|
||||
|
||||
private void handlePlaybackIntent(@Nullable Intent intent) {
|
||||
|
|
|
|||
|
|
@ -43,10 +43,11 @@ import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
|
|||
import com.kabouzeid.gramophone.dialogs.SongShareDialog;
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.imageloader.BlurProcessor;
|
||||
import com.kabouzeid.gramophone.loader.SongLoader;
|
||||
import com.kabouzeid.gramophone.misc.SmallTransitionListener;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.service.MusicService;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||
|
|
@ -68,7 +69,7 @@ import butterknife.ButterKnife;
|
|||
import butterknife.InjectView;
|
||||
import hugo.weaving.DebugLog;
|
||||
|
||||
public class MusicControllerActivity extends AbsFabActivity {
|
||||
public class MusicControllerActivity extends AbsSlidingMusicPanelActivity {
|
||||
|
||||
public static final String TAG = MusicControllerActivity.class.getSimpleName();
|
||||
private static final int FAB_CIRCULAR_REVEAL_ANIMATION_TIME = 1000;
|
||||
|
|
@ -193,11 +194,11 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
public void onTransitionEnd(Transition transition) {
|
||||
int cx = (getFab().getLeft() + getFab().getRight()) / 2;
|
||||
int cy = (getFab().getTop() + getFab().getBottom()) / 2;
|
||||
int cx = (getPlayPauseFab().getLeft() + getPlayPauseFab().getRight()) / 2;
|
||||
int cy = (getPlayPauseFab().getTop() + getPlayPauseFab().getBottom()) / 2;
|
||||
int finalRadius = Math.max(mediaControllerContainer.getWidth(), mediaControllerContainer.getHeight());
|
||||
|
||||
Animator animator = ViewAnimationUtils.createCircularReveal(mediaControllerContainer, cx, cy, getFab().getWidth() / 2, finalRadius);
|
||||
Animator animator = ViewAnimationUtils.createCircularReveal(mediaControllerContainer, cx, cy, getPlayPauseFab().getWidth() / 2, finalRadius);
|
||||
animator.setInterpolator(new DecelerateInterpolator());
|
||||
animator.setDuration(FAB_CIRCULAR_REVEAL_ANIMATION_TIME);
|
||||
animator.start();
|
||||
|
|
@ -225,11 +226,13 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
}
|
||||
|
||||
private void startUpdatingProgressViews() {
|
||||
startHandler();
|
||||
progressViewsUpdateHandler.sendEmptyMessage(CMD_UPDATE_PROGRESS_VIEWS);
|
||||
}
|
||||
|
||||
private void stopUpdatingProgressViews() {
|
||||
progressViewsUpdateHandler.removeMessages(CMD_UPDATE_PROGRESS_VIEWS);
|
||||
stopHandler();
|
||||
}
|
||||
|
||||
private void initAppearanceVarsFromSharedPrefs() {
|
||||
|
|
@ -244,7 +247,7 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
@Override
|
||||
protected void onPostCreate(Bundle savedInstanceState) {
|
||||
super.onPostCreate(savedInstanceState);
|
||||
getFab().setOnLongClickListener(null);
|
||||
getPlayPauseFab().setOnLongClickListener(null);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -384,9 +387,6 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
updateControllerState();
|
||||
updateCurrentSong();
|
||||
startHandler();
|
||||
startUpdatingProgressViews();
|
||||
}
|
||||
|
||||
|
|
@ -394,7 +394,6 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
protected void onPause() {
|
||||
super.onPause();
|
||||
stopUpdatingProgressViews();
|
||||
stopHandler();
|
||||
}
|
||||
|
||||
private void updateCurrentSong() {
|
||||
|
|
@ -536,12 +535,6 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
});
|
||||
}
|
||||
|
||||
protected void updateControllerState() {
|
||||
updateFabState();
|
||||
updateRepeatState();
|
||||
updateShuffleState();
|
||||
}
|
||||
|
||||
private void animateSetFavorite() {
|
||||
favoriteIcon.clearAnimation();
|
||||
|
||||
|
|
@ -641,7 +634,7 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
NavigationUtil.openEqualizer(this);
|
||||
return true;
|
||||
case R.id.action_shuffle_all:
|
||||
MusicPlayerRemote.shuffleAllSongs(this, true);
|
||||
MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(this), true);
|
||||
return true;
|
||||
case R.id.action_add_to_playlist:
|
||||
AddToPlaylistDialog.create(song).show(getSupportFragmentManager(), "ADD_PLAYLIST");
|
||||
|
|
@ -662,10 +655,10 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
SongDetailDialog.create(songFile).show(getSupportFragmentManager(), "SONG_DETAIL");
|
||||
return true;
|
||||
case R.id.action_go_to_album:
|
||||
NavigationUtil.goToAlbum(this, song.albumId, getSharedViewsWithFab(null));
|
||||
NavigationUtil.goToAlbum(this, song.albumId, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
case R.id.action_go_to_artist:
|
||||
NavigationUtil.goToArtist(this, song.artistId, getSharedViewsWithFab(null));
|
||||
NavigationUtil.goToArtist(this, song.artistId, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import com.kabouzeid.gramophone.misc.DragSortRecycler;
|
|||
import com.kabouzeid.gramophone.model.Playlist;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.kabouzeid.gramophone.util.PlaylistsUtil;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
|
|
@ -31,7 +31,7 @@ import com.kabouzeid.gramophone.util.PreferenceUtil;
|
|||
import butterknife.ButterKnife;
|
||||
import butterknife.InjectView;
|
||||
|
||||
public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder {
|
||||
public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity implements CabHolder {
|
||||
|
||||
public static final String TAG = PlaylistDetailActivity.class.getSimpleName();
|
||||
|
||||
|
|
@ -132,7 +132,7 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder
|
|||
new SleepTimerDialog().show(getSupportFragmentManager(), "SET_SLEEP_TIMER");
|
||||
return true;
|
||||
case R.id.action_shuffle_playlist:
|
||||
MusicPlayerRemote.openAndShuffleQueue(this, adapter.getDataSet(), true);
|
||||
MusicPlayerRemote.openAndShuffleQueue(adapter.getDataSet(), true);
|
||||
return true;
|
||||
case R.id.action_equalizer:
|
||||
NavigationUtil.openEqualizer(this);
|
||||
|
|
@ -141,7 +141,7 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder
|
|||
onBackPressed();
|
||||
return true;
|
||||
case R.id.action_now_playing:
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null));
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
case R.id.action_playing_queue:
|
||||
NavigationUtil.openPlayingQueueDialog(this);
|
||||
|
|
|
|||
|
|
@ -24,11 +24,21 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie
|
|||
enableViews();
|
||||
}
|
||||
|
||||
/**
|
||||
* Should be overwritten and re enable all {@link android.view.View} to ensure they are accessible again
|
||||
* <p>
|
||||
* This is necessary because of a bug with the shared element transition
|
||||
*/
|
||||
@Override
|
||||
public void enableViews() {
|
||||
areViewsEnabled = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should be overwritten and disable all views that start a new activity on click to prevent opening an activity multiple times
|
||||
* <p>
|
||||
* This is necessary because of a bug with the shared element transition
|
||||
*/
|
||||
@Override
|
||||
public void disableViews() {
|
||||
areViewsEnabled = false;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,145 @@
|
|||
package com.kabouzeid.gramophone.ui.activities.base;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.interfaces.MusicStateListener;
|
||||
import com.kabouzeid.gramophone.service.MusicService;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsMusicStateActivity extends AbsBaseActivity implements ServiceConnection, MusicStateListener {
|
||||
public static final String TAG = AbsMusicStateActivity.class.getSimpleName();
|
||||
|
||||
private final ArrayList<MusicStateListener> mMusicStateListener = new ArrayList<>();
|
||||
|
||||
private MusicPlayerRemote.ServiceToken serviceToken;
|
||||
private MusicStateReceiver musicStateReceiver;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
serviceToken = MusicPlayerRemote.bindToService(this, this);
|
||||
musicStateReceiver = new MusicStateReceiver(this);
|
||||
|
||||
final IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(MusicService.PLAY_STATE_CHANGED);
|
||||
filter.addAction(MusicService.SHUFFLE_MODE_CHANGED);
|
||||
filter.addAction(MusicService.REPEAT_MODE_CHANGED);
|
||||
filter.addAction(MusicService.META_CHANGED);
|
||||
filter.addAction(MusicService.MEDIA_STORE_CHANGED);
|
||||
|
||||
registerReceiver(musicStateReceiver, filter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
onPlayStateChanged();
|
||||
onPlayingMetaChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
MusicPlayerRemote.unbindFromService(serviceToken);
|
||||
unregisterReceiver(musicStateReceiver);
|
||||
}
|
||||
|
||||
public void addMusicStateListenerListener(final MusicStateListener listener) {
|
||||
if (listener != null) {
|
||||
mMusicStateListener.add(listener);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeMusicStateListenerListener(final MusicStateListener listener) {
|
||||
if (listener != null) {
|
||||
mMusicStateListener.remove(listener);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayingMetaChanged() {
|
||||
for (MusicStateListener listener : mMusicStateListener) {
|
||||
if (listener != null) {
|
||||
listener.onPlayingMetaChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayStateChanged() {
|
||||
for (MusicStateListener listener : mMusicStateListener) {
|
||||
if (listener != null) {
|
||||
listener.onPlayStateChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMediaStoreChanged() {
|
||||
for (MusicStateListener listener : mMusicStateListener) {
|
||||
if (listener != null) {
|
||||
listener.onMediaStoreChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onRepeatModeChanged() {
|
||||
|
||||
}
|
||||
|
||||
public void onShuffleModeChanged() {
|
||||
|
||||
}
|
||||
|
||||
private static final class MusicStateReceiver extends BroadcastReceiver {
|
||||
|
||||
private final WeakReference<AbsMusicStateActivity> reference;
|
||||
|
||||
public MusicStateReceiver(final AbsMusicStateActivity activity) {
|
||||
reference = new WeakReference<>(activity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(final Context context, @NonNull final Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
AbsMusicStateActivity activity = reference.get();
|
||||
if (activity != null) {
|
||||
switch (action) {
|
||||
case MusicService.META_CHANGED:
|
||||
activity.onPlayingMetaChanged();
|
||||
break;
|
||||
case MusicService.PLAY_STATE_CHANGED:
|
||||
activity.onPlayStateChanged();
|
||||
break;
|
||||
case MusicService.REPEAT_MODE_CHANGED:
|
||||
activity.onRepeatModeChanged();
|
||||
break;
|
||||
case MusicService.SHUFFLE_MODE_CHANGED:
|
||||
activity.onShuffleModeChanged();
|
||||
break;
|
||||
case MusicService.MEDIA_STORE_CHANGED:
|
||||
activity.onMediaStoreChanged();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
package com.kabouzeid.gramophone.ui.activities.base;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.service.MusicService;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsPlaybackControlActivity extends AbsBaseActivity {
|
||||
@Nullable
|
||||
private MusicPlayerRemote.ServiceToken serviceToken;
|
||||
private PlaybackStatusReceiver playbackStatusReceiver;
|
||||
|
||||
public void onPlayingMetaChanged() {
|
||||
|
||||
}
|
||||
|
||||
public void onPlayStateChanged() {
|
||||
|
||||
}
|
||||
|
||||
public void onRepeatModeChanged() {
|
||||
|
||||
}
|
||||
|
||||
public void onShuffleModeChanged() {
|
||||
|
||||
}
|
||||
|
||||
public void onServiceConnected() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
serviceToken = MusicPlayerRemote.bindToService(this, new ServiceConnection() {
|
||||
@Override
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
AbsPlaybackControlActivity.this.onServiceConnected();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
|
||||
}
|
||||
});
|
||||
playbackStatusReceiver = new PlaybackStatusReceiver(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
|
||||
final IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(MusicService.PLAY_STATE_CHANGED);
|
||||
filter.addAction(MusicService.SHUFFLE_MODE_CHANGED);
|
||||
filter.addAction(MusicService.REPEAT_MODE_CHANGED);
|
||||
filter.addAction(MusicService.META_CHANGED);
|
||||
|
||||
registerReceiver(playbackStatusReceiver, filter);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
try {
|
||||
unregisterReceiver(playbackStatusReceiver);
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
MusicPlayerRemote.unbindFromService(serviceToken);
|
||||
}
|
||||
|
||||
private static final class PlaybackStatusReceiver extends BroadcastReceiver {
|
||||
|
||||
@NonNull
|
||||
private final WeakReference<AbsPlaybackControlActivity> reference;
|
||||
|
||||
public PlaybackStatusReceiver(final AbsPlaybackControlActivity activity) {
|
||||
reference = new WeakReference<>(activity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(final Context context, @NonNull final Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
switch (action) {
|
||||
case MusicService.META_CHANGED:
|
||||
reference.get().onPlayingMetaChanged();
|
||||
break;
|
||||
case MusicService.PLAY_STATE_CHANGED:
|
||||
reference.get().onPlayStateChanged();
|
||||
break;
|
||||
case MusicService.REPEAT_MODE_CHANGED:
|
||||
reference.get().onRepeatModeChanged();
|
||||
break;
|
||||
case MusicService.SHUFFLE_MODE_CHANGED:
|
||||
reference.get().onShuffleModeChanged();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -22,54 +22,46 @@ import com.kabouzeid.gramophone.util.ColorUtil;
|
|||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.kabouzeid.gramophone.views.PlayPauseDrawable;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
import butterknife.InjectView;
|
||||
import butterknife.Optional;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsFabActivity extends AbsPlaybackControlActivity {
|
||||
public static final String TAG = AbsFabActivity.class.getSimpleName();
|
||||
public abstract class AbsSlidingMusicPanelActivity extends AbsMusicStateActivity {
|
||||
public static final String TAG = AbsSlidingMusicPanelActivity.class.getSimpleName();
|
||||
|
||||
@Nullable
|
||||
@Optional
|
||||
@InjectView(R.id.fab)
|
||||
FloatingActionButton fab;
|
||||
FloatingActionButton playPauseFab;
|
||||
|
||||
private PlayPauseDrawable playPauseDrawable;
|
||||
|
||||
@Override
|
||||
protected void onPostCreate(Bundle savedInstanceState) {
|
||||
super.onPostCreate(savedInstanceState);
|
||||
ButterKnife.inject(this);
|
||||
setUpFab();
|
||||
setUpPlayPauseButton();
|
||||
}
|
||||
|
||||
private void setUpFab() {
|
||||
private void setUpPlayPauseButton() {
|
||||
if (playPauseDrawable == null) {
|
||||
playPauseDrawable = new PlayPauseDrawable(this);
|
||||
}
|
||||
|
||||
getFab().setImageDrawable(playPauseDrawable);
|
||||
getPlayPauseFab().setImageDrawable(playPauseDrawable);
|
||||
final int accentColor = ThemeSingleton.get().positiveColor;
|
||||
getFab().setBackgroundTintList(ColorUtil.getEmptyColorStateList(accentColor));
|
||||
getPlayPauseFab().setBackgroundTintList(ColorUtil.getEmptyColorStateList(accentColor));
|
||||
if (accentColor == Color.WHITE) {
|
||||
getFab().getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
|
||||
getPlayPauseFab().getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
|
||||
} else {
|
||||
getFab().getDrawable().clearColorFilter();
|
||||
getPlayPauseFab().getDrawable().clearColorFilter();
|
||||
}
|
||||
|
||||
updateFabState();
|
||||
updateFabState(false);
|
||||
final GestureDetector gestureDetector = new GestureDetector(this, new SmallOnGestureListener() {
|
||||
@Override
|
||||
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
|
||||
NavigationUtil.openCurrentPlayingIfPossible(AbsFabActivity.this, getSharedViewsWithFab(null));
|
||||
NavigationUtil.openCurrentPlayingIfPossible(AbsSlidingMusicPanelActivity.this, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
getFab().setOnClickListener(new View.OnClickListener() {
|
||||
getPlayPauseFab().setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (MusicPlayerRemote.getPosition() != -1) {
|
||||
|
|
@ -79,12 +71,12 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity {
|
|||
MusicPlayerRemote.resumePlaying();
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(AbsFabActivity.this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(AbsSlidingMusicPanelActivity.this, getResources().getString(R.string.playing_queue_empty), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
getFab().setOnTouchListener(new View.OnTouchListener() {
|
||||
getPlayPauseFab().setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View view, @NonNull MotionEvent event) {
|
||||
gestureDetector.onTouchEvent(event);
|
||||
|
|
@ -92,55 +84,41 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity {
|
|||
}
|
||||
});
|
||||
|
||||
getFab().setOnLongClickListener(new View.OnLongClickListener() {
|
||||
getPlayPauseFab().setOnLongClickListener(new View.OnLongClickListener() {
|
||||
@Override
|
||||
public boolean onLongClick(View view) {
|
||||
final Song song = MusicPlayerRemote.getCurrentSong();
|
||||
if (song.id != -1) {
|
||||
Toast.makeText(AbsFabActivity.this, song.title + " - " + song.artistName, Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(AbsSlidingMusicPanelActivity.this, song.title + " - " + song.artistName, Toast.LENGTH_SHORT).show();
|
||||
} else {
|
||||
Toast.makeText(AbsFabActivity.this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(AbsSlidingMusicPanelActivity.this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected void updateFabState() {
|
||||
protected void updateFabState(boolean animate) {
|
||||
if (MusicPlayerRemote.isPlaying()) {
|
||||
playPauseDrawable.setPause();
|
||||
playPauseDrawable.setPause(animate);
|
||||
} else {
|
||||
playPauseDrawable.setPlay();
|
||||
}
|
||||
}
|
||||
|
||||
protected void animateUpdateFabState() {
|
||||
if (MusicPlayerRemote.isPlaying()) {
|
||||
setFabPause();
|
||||
} else {
|
||||
setFabPlay();
|
||||
playPauseDrawable.setPlay(animate);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
protected FloatingActionButton getFab() {
|
||||
if (fab == null) {
|
||||
fab = (FloatingActionButton) findViewById(R.id.fab);
|
||||
if (fab == null) {
|
||||
fab = new FloatingActionButton(this);
|
||||
Log.e(TAG, "No FAB found created default FAB.");
|
||||
protected FloatingActionButton getPlayPauseFab() {
|
||||
if (playPauseFab == null) {
|
||||
playPauseFab = (FloatingActionButton) findViewById(R.id.play_pause_fab);
|
||||
if (playPauseFab == null) {
|
||||
playPauseFab = new FloatingActionButton(this);
|
||||
Log.e(TAG, "PlayPauseFAB not found, created default FAB.");
|
||||
}
|
||||
}
|
||||
return fab;
|
||||
return playPauseFab;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
updateFabState();
|
||||
}
|
||||
|
||||
public Pair[] getSharedViewsWithFab(@Nullable Pair[] sharedViews) {
|
||||
public Pair[] getSharedViewsWithPlayPauseFab(@Nullable Pair[] sharedViews) {
|
||||
Pair[] sharedViewsWithFab;
|
||||
if (sharedViews != null) {
|
||||
sharedViewsWithFab = new Pair[sharedViews.length + 1];
|
||||
|
|
@ -148,21 +126,13 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity {
|
|||
} else {
|
||||
sharedViewsWithFab = new Pair[1];
|
||||
}
|
||||
sharedViewsWithFab[sharedViewsWithFab.length - 1] = Pair.create((View) getFab(), getString(R.string.transition_fab));
|
||||
sharedViewsWithFab[sharedViewsWithFab.length - 1] = Pair.create((View) getPlayPauseFab(), getString(R.string.transition_fab));
|
||||
return sharedViewsWithFab;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayStateChanged() {
|
||||
super.onPlayStateChanged();
|
||||
animateUpdateFabState();
|
||||
}
|
||||
|
||||
private void setFabPlay() {
|
||||
playPauseDrawable.animatedPlay();
|
||||
}
|
||||
|
||||
private void setFabPause() {
|
||||
playPauseDrawable.animatedPause();
|
||||
updateFabState(true);
|
||||
}
|
||||
}
|
||||
|
|
@ -70,7 +70,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
|||
private int paletteColorPrimary;
|
||||
private boolean isInNoImageMode;
|
||||
|
||||
@InjectView(R.id.fab)
|
||||
@InjectView(R.id.play_pause_fab)
|
||||
FloatingActionButton fab;
|
||||
@InjectView(R.id.observableScrollView)
|
||||
ObservableScrollView observableScrollView;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import android.view.ViewGroup;
|
|||
import android.widget.TextView;
|
||||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.interfaces.MusicStateListener;
|
||||
import com.kabouzeid.gramophone.views.FastScroller;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
|
|
@ -23,7 +24,7 @@ import butterknife.Optional;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivityFragment implements OnOffsetChangedListener {
|
||||
public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView.Adapter> extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicStateListener {
|
||||
|
||||
public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName();
|
||||
|
||||
|
|
@ -38,7 +39,7 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
|
|||
@InjectView(R.id.fast_scroller)
|
||||
FastScroller fastScroller;
|
||||
|
||||
private RecyclerView.Adapter mAdapter;
|
||||
private A mAdapter;
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
|
|
@ -56,6 +57,7 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
|
|||
}
|
||||
|
||||
getMainActivity().addOnAppBarOffsetChangedListener(this);
|
||||
getMainActivity().addMusicStateListenerListener(this);
|
||||
|
||||
setUpRecyclerView();
|
||||
|
||||
|
|
@ -76,7 +78,7 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
|
|||
recyclerView.setAdapter(mAdapter);
|
||||
}
|
||||
|
||||
public RecyclerView.Adapter getAdapter() {
|
||||
public A getAdapter() {
|
||||
return mAdapter;
|
||||
}
|
||||
|
||||
|
|
@ -93,6 +95,16 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayingMetaChanged() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayStateChanged() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enableViews() {
|
||||
super.enableViews();
|
||||
|
|
@ -131,13 +143,13 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
|
|||
|
||||
protected abstract RecyclerView.LayoutManager createLayoutManager();
|
||||
|
||||
@NonNull
|
||||
protected abstract RecyclerView.Adapter createAdapter();
|
||||
protected abstract A createAdapter();
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
getMainActivity().removeOnAppBarOffsetChangedListener(this);
|
||||
getMainActivity().removeMusicStateListenerListener(this);
|
||||
ButterKnife.reset(this);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import com.kabouzeid.gramophone.util.Util;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment {
|
||||
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment<AlbumAdapter> {
|
||||
public static final String TAG = AlbumViewFragment.class.getSimpleName();
|
||||
|
||||
private GridLayoutManager layoutManager;
|
||||
|
|
@ -27,8 +27,12 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
@NonNull
|
||||
@Override
|
||||
protected RecyclerView.Adapter createAdapter() {
|
||||
return new AlbumAdapter(getMainActivity(), AlbumLoader.getAllAlbums(getActivity()), R.layout.item_grid, getMainActivity());
|
||||
protected AlbumAdapter createAdapter() {
|
||||
return new AlbumAdapter(
|
||||
getMainActivity(),
|
||||
AlbumLoader.getAllAlbums(getActivity()),
|
||||
R.layout.item_grid,
|
||||
getMainActivity());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -40,4 +44,9 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
layoutManager.setSpanCount(columns);
|
||||
layoutManager.requestLayout();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMediaStoreChanged() {
|
||||
getAdapter().swapDataSet(AlbumLoader.getAllAlbums(getActivity()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import com.kabouzeid.gramophone.loader.ArtistLoader;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
||||
public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment<ArtistAdapter> {
|
||||
|
||||
public static final String TAG = ArtistViewFragment.class.getSimpleName();
|
||||
|
||||
|
|
@ -23,7 +23,7 @@ public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
@NonNull
|
||||
@Override
|
||||
protected RecyclerView.Adapter createAdapter() {
|
||||
protected ArtistAdapter createAdapter() {
|
||||
return new ArtistAdapter(
|
||||
getMainActivity(),
|
||||
ArtistLoader.getAllArtists(getActivity()),
|
||||
|
|
@ -35,4 +35,9 @@ public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
protected int getEmptyMessage() {
|
||||
return R.string.no_artists;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMediaStoreChanged() {
|
||||
getAdapter().swapDataSet(ArtistLoader.getAllArtists(getActivity()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ import java.util.ArrayList;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
||||
public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment<PlaylistAdapter> {
|
||||
|
||||
public static final String TAG = PlaylistViewFragment.class.getSimpleName();
|
||||
|
||||
|
|
@ -29,7 +29,21 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
@NonNull
|
||||
@Override
|
||||
protected RecyclerView.Adapter createAdapter() {
|
||||
protected PlaylistAdapter createAdapter() {
|
||||
return new PlaylistAdapter(getMainActivity(), getAllPlaylists(), R.layout.item_list_single_row, getMainActivity());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getEmptyMessage() {
|
||||
return R.string.no_playlists;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMediaStoreChanged() {
|
||||
getAdapter().swapDataSet(getAllPlaylists());
|
||||
}
|
||||
|
||||
private ArrayList<Playlist> getAllPlaylists() {
|
||||
ArrayList<Playlist> playlists = new ArrayList<>();
|
||||
|
||||
playlists.add(new LastAddedPlaylist(getActivity()));
|
||||
|
|
@ -38,11 +52,6 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
playlists.addAll(PlaylistLoader.getAllPlaylists(getActivity()));
|
||||
|
||||
return new PlaylistAdapter(getMainActivity(), playlists, R.layout.item_list_single_row, getMainActivity());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getEmptyMessage() {
|
||||
return R.string.no_playlists;
|
||||
return playlists;
|
||||
}
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@ import com.kabouzeid.gramophone.loader.SongLoader;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class SongViewFragment extends AbsMainActivityRecyclerViewFragment {
|
||||
public class SongViewFragment extends AbsMainActivityRecyclerViewFragment<SongAdapter> {
|
||||
|
||||
public static final String TAG = SongViewFragment.class.getSimpleName();
|
||||
|
||||
|
|
@ -23,7 +23,7 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
@NonNull
|
||||
@Override
|
||||
protected RecyclerView.Adapter createAdapter() {
|
||||
protected SongAdapter createAdapter() {
|
||||
return new SongAdapter(getMainActivity(), SongLoader.getAllSongs(getActivity()), R.layout.item_list, getMainActivity());
|
||||
}
|
||||
|
||||
|
|
@ -31,4 +31,9 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
protected int getEmptyMessage() {
|
||||
return R.string.no_songs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMediaStoreChanged() {
|
||||
getAdapter().swapDataSet(SongLoader.getAllSongs(getActivity()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ public class NavigationUtil {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(activity, activity.getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(activity, activity.getResources().getString(R.string.playing_queue_empty), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -114,7 +114,7 @@ public class NavigationUtil {
|
|||
if (dialog != null) {
|
||||
dialog.show(activity.getSupportFragmentManager(), "PLAY_QUEUE");
|
||||
} else {
|
||||
Toast.makeText(activity, activity.getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(activity, activity.getResources().getString(R.string.playing_queue_empty), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.views;
|
|||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
|
|
@ -50,7 +49,7 @@ public class PlayPauseDrawable extends Drawable {
|
|||
private boolean isPlay;
|
||||
private boolean isPlaySet;
|
||||
|
||||
private AnimatorSet animatorSet;
|
||||
private Animator animator;
|
||||
|
||||
public PlayPauseDrawable(@NonNull Context context) {
|
||||
final Resources res = context.getResources();
|
||||
|
|
@ -173,40 +172,38 @@ public class PlayPauseDrawable extends Drawable {
|
|||
return a + (b - a) * t;
|
||||
}
|
||||
|
||||
public void animatedPlay() {
|
||||
if (!isPlaySet) {
|
||||
togglePlayPause();
|
||||
public void setPlay(boolean animate) {
|
||||
if (animate) {
|
||||
if (!isPlaySet) {
|
||||
togglePlayPause();
|
||||
}
|
||||
} else {
|
||||
isPlaySet = true;
|
||||
isPlay = true;
|
||||
setProgress(1);
|
||||
}
|
||||
}
|
||||
|
||||
public void animatedPause() {
|
||||
if (isPlaySet) {
|
||||
togglePlayPause();
|
||||
public void setPause(boolean animate) {
|
||||
if (animate) {
|
||||
if (isPlaySet) {
|
||||
togglePlayPause();
|
||||
}
|
||||
} else {
|
||||
isPlaySet = false;
|
||||
isPlay = false;
|
||||
setProgress(0);
|
||||
}
|
||||
}
|
||||
|
||||
public void setPlay() {
|
||||
isPlaySet = true;
|
||||
isPlay = true;
|
||||
setProgress(1);
|
||||
}
|
||||
|
||||
public void setPause() {
|
||||
isPlaySet = false;
|
||||
isPlay = false;
|
||||
setProgress(0);
|
||||
}
|
||||
|
||||
public void togglePlayPause() {
|
||||
if (animatorSet != null) {
|
||||
animatorSet.cancel();
|
||||
if (animator != null) {
|
||||
animator.cancel();
|
||||
}
|
||||
|
||||
animatorSet = new AnimatorSet();
|
||||
final Animator pausePlayAnim = getPausePlayAnimator();
|
||||
animatorSet.setInterpolator(new DecelerateInterpolator());
|
||||
animatorSet.setDuration(PLAY_PAUSE_ANIMATION_DURATION);
|
||||
animatorSet.playTogether(pausePlayAnim);
|
||||
animatorSet.start();
|
||||
animator = getPausePlayAnimator();
|
||||
animator.setInterpolator(new DecelerateInterpolator());
|
||||
animator.setDuration(PLAY_PAUSE_ANIMATION_DURATION);
|
||||
animator.start();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue