Main Activity Fragments should be updated automatically now when the Media Store has changed.

This commit is contained in:
Karim Abou Zeid 2015-07-13 16:50:05 +02:00
commit 9c8cba612b
59 changed files with 428 additions and 352 deletions

View file

@ -29,8 +29,6 @@ public class PagerAdapter extends FragmentPagerAdapter {
@NonNull
private final Context mContext;
private int mCurrentPage;
@NonNull
private final String[] titles;

View file

@ -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);
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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);

View file

@ -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;
}

View file

@ -0,0 +1,14 @@
package com.kabouzeid.gramophone.interfaces;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public interface MusicStateListener {
void onPlayingMetaChanged();
void onPlayStateChanged();
void onMediaStoreChanged();
}

View file

@ -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));
}
}

View file

@ -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;
}

View file

@ -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);

View file

@ -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) {

View file

@ -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;
}

View file

@ -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);

View file

@ -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;

View file

@ -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;
}
}
}
}
}

View file

@ -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;
}
}
}
}

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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);
}
}

View file

@ -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()));
}
}

View file

@ -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()));
}
}

View file

@ -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;
}
}

View file

@ -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()));
}
}

View file

@ -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();
}
}

View file

@ -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();
}
}