Clean ups and refactoring.

This commit is contained in:
Karim Abou Zeid 2016-03-23 01:52:17 +01:00
commit 73d613d11d
32 changed files with 239 additions and 295 deletions

View file

@ -81,6 +81,8 @@ android {
versionNameSuffix ' DEBUG'
manifestPlaceholders = [appName: "Phonograph DEBUG"]
ext.enableCrashlytics = false // Disable fabric build ID generation for debug builds
signingConfig signingConfigs.debug
}
}

View file

@ -3,6 +3,7 @@ package com.kabouzeid.gramophone;
import android.app.Application;
import com.crashlytics.android.Crashlytics;
import com.crashlytics.android.core.CrashlyticsCore;
import io.fabric.sdk.android.Fabric;
@ -18,6 +19,10 @@ public class App extends Application {
public void onCreate() {
super.onCreate();
if (!BuildConfig.DEBUG) Fabric.with(this, new Crashlytics());
// Set up Crashlytics, disabled for debug builds
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build();
Fabric.with(this, crashlyticsKit);
}
}

View file

@ -10,10 +10,10 @@ import android.util.SparseArray;
import android.view.ViewGroup;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.ui.fragments.libraryfragments.AlbumsFragment;
import com.kabouzeid.gramophone.ui.fragments.libraryfragments.ArtistsFragment;
import com.kabouzeid.gramophone.ui.fragments.libraryfragments.PlaylistsFragment;
import com.kabouzeid.gramophone.ui.fragments.libraryfragments.SongsFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager.AlbumsFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager.ArtistsFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager.PlaylistsFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager.SongsFragment;
import java.lang.ref.WeakReference;
import java.util.ArrayList;

View file

@ -30,8 +30,9 @@ public class PlayingQueueAdapter extends SongAdapter implements DraggableItemAda
private int current;
public PlayingQueueAdapter(AppCompatActivity activity, ArrayList<Song> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) {
public PlayingQueueAdapter(AppCompatActivity activity, ArrayList<Song> dataSet, int current, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) {
super(activity, dataSet, itemLayoutRes, usePalette, cabHolder);
this.current = current;
}
@Override

View file

@ -21,6 +21,8 @@ import java.util.ArrayList;
import java.util.Random;
import java.util.WeakHashMap;
import hugo.weaving.DebugLog;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -33,6 +35,7 @@ public class MusicPlayerRemote {
private static final WeakHashMap<Context, ServiceBinder> mConnectionMap = new WeakHashMap<>();
@DebugLog
public static ServiceToken bindToService(@NonNull final Context context,
final ServiceConnection callback) {
Activity realActivity = ((Activity) context).getParent();
@ -52,6 +55,7 @@ public class MusicPlayerRemote {
return null;
}
@DebugLog
public static void unbindFromService(@Nullable final ServiceToken token) {
if (token == null) {
return;

View file

@ -4,10 +4,14 @@ package com.kabouzeid.gramophone.interfaces;
* @author Karim Abou Zeid (kabouzeid)
*/
public interface MusicServiceEventListener {
void onPlayingMetaChanged();
void onServiceConnected();
void onServiceDisconnected();
void onQueueChanged();
void onPlayingMetaChanged();
void onPlayStateChanged();
void onRepeatModeChanged();

View file

@ -24,8 +24,6 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import hugo.weaving.DebugLog;
/**
* This cursor basically wraps a song cursor and is given a list of the order of the ids of the
* contents of the cursor. It wraps the Cursor and simulates the internal cursor being sorted
@ -46,7 +44,6 @@ public class SortedCursor extends AbstractCursor {
* @param order the list of unique ids in sorted order to display
* @param columnName the column name of the id to look up in the internal cursor
*/
@DebugLog
public SortedCursor(@NonNull final Cursor cursor, @Nullable final String[] order, final String columnName) {
mCursor = cursor;
mMissingValues = buildCursorPositionMapping(order, columnName);

View file

@ -4,8 +4,6 @@ package com.kabouzeid.gramophone.misc;
import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import hugo.weaving.DebugLog;
/**
* <a href="http://code.google.com/p/android/issues/detail?id=14944">Issue
* 14944</a>
@ -28,7 +26,6 @@ public abstract class WrappedAsyncTaskLoader<D> extends AsyncTaskLoader<D> {
/**
* {@inheritDoc}
*/
@DebugLog
@Override
public void deliverResult(D data) {
if (!isReset()) {
@ -42,7 +39,6 @@ public abstract class WrappedAsyncTaskLoader<D> extends AsyncTaskLoader<D> {
/**
* {@inheritDoc}
*/
@DebugLog
@Override
protected void onStartLoading() {
if (this.mData != null) {
@ -55,7 +51,6 @@ public abstract class WrappedAsyncTaskLoader<D> extends AsyncTaskLoader<D> {
/**
* {@inheritDoc}
*/
@DebugLog
@Override
protected void onStopLoading() {
// Attempt to cancel the current load task if possible
@ -65,7 +60,6 @@ public abstract class WrappedAsyncTaskLoader<D> extends AsyncTaskLoader<D> {
/**
* {@inheritDoc}
*/
@DebugLog
@Override
protected void onReset() {
super.onReset();

View file

@ -29,12 +29,15 @@ import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast;
import com.bumptech.glide.BitmapRequestBuilder;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.appwidget.WidgetMedium;
import com.kabouzeid.gramophone.glide.BlurTransformation;
@ -74,10 +77,11 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
public static final String ACTION_REWIND = "com.kabouzeid.gramophone.rewind";
public static final String ACTION_QUIT = "com.kabouzeid.gramophone.quitservice";
// do not change this strings as it will break support with other apps (e.g. last.fm scrobbling)
// do not change these three strings as it will break support with other apps (e.g. last.fm scrobbling)
public static final String META_CHANGED = "com.kabouzeid.gramophone.metachanged";
public static final String QUEUE_CHANGED = "com.kabouzeid.gramophone.queuechanged";
public static final String PLAY_STATE_CHANGED = "com.kabouzeid.gramophone.playstatechanged";
public static final String REPEAT_MODE_CHANGED = "com.kabouzeid.gramophone.repeatmodechanged";
public static final String SHUFFLE_MODE_CHANGED = "com.kabouzeid.gramophone.shufflemodechanged";
public static final String MEDIA_STORE_CHANGED = "com.kabouzeid.gramophone.mediastorechanged";
@ -133,8 +137,6 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
private QueueSaveHandler queueSaveHandler;
private HandlerThread musicPlayerHandlerThread;
private HandlerThread queueSaveHandlerThread;
private HistoryStore historyStore;
private SongPlayCountStore songPlayCountStore;
private SongPlayCountHelper songPlayCountHelper = new SongPlayCountHelper();
private final BroadcastReceiver becomingNoisyReceiver = new BroadcastReceiver() {
@Override
@ -146,7 +148,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
};
private ContentObserver mediaStoreObserver;
private boolean notHandledMetaChangedForCurrentTrack;
private boolean isServiceInUse;
private boolean isServiceBound;
private Handler uiThreadHandler;
@ -154,23 +156,25 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
return MusicUtil.getSongFileUri(song.id).toString();
}
@DebugLog
@Override
public void onCreate() {
super.onCreate();
playingNotificationHelper = new PlayingNotificationHelper(this);
historyStore = HistoryStore.getInstance(this);
songPlayCountStore = SongPlayCountStore.getInstance(this);
shuffleMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_SHUFFLE_MODE, 0);
repeatMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_REPEAT_MODE, 0);
final PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());
wakeLock.setReferenceCounted(false);
musicPlayerHandlerThread = new HandlerThread("PlaybackHandler");
String playbackHandlerName = "PlaybackHandler";
try {
musicPlayerHandlerThread = new HandlerThread(playbackHandlerName, Process.THREAD_PRIORITY_AUDIO);
} catch (SecurityException e) {
Log.e(TAG, "Failed to create HandlerThread with Process.THREAD_PRIORITY_AUDIO", e);
Answers.getInstance().logCustom(new CustomEvent("SecurityException: Process.THREAD_PRIORITY_AUDIO")); // TODO remove in future update
musicPlayerHandlerThread = new HandlerThread(playbackHandlerName, Process.THREAD_PRIORITY_FOREGROUND);
}
musicPlayerHandlerThread.start();
playerHandler = new PlaybackHandler(this, musicPlayerHandlerThread.getLooper());
@ -186,8 +190,6 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
registerReceiversAndRemoteControlClient();
restoreState();
mediaStoreObserver = new MediaStoreObserver(playerHandler);
getContentResolver().registerContentObserver(
MediaStore.Audio.Media.INTERNAL_CONTENT_URI, true, mediaStoreObserver);
@ -196,8 +198,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
PreferenceUtil.getInstance(this).registerOnSharedPreferenceChangedListener(this);
notifyChange(SHUFFLE_MODE_CHANGED);
notifyChange(REPEAT_MODE_CHANGED);
restoreState();
}
private void registerReceiversAndRemoteControlClient() {
@ -230,6 +231,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
getAudioManager().registerRemoteControlClient(remoteControlClient);
}
@DebugLog
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
if (intent != null) {
@ -266,6 +268,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
return START_STICKY;
}
@DebugLog
@Override
public void onDestroy() {
quit();
@ -275,20 +278,23 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
wakeLock.release();
}
@DebugLog
@Override
public IBinder onBind(Intent intent) {
isServiceInUse = true;
isServiceBound = true;
return musicBind;
}
@DebugLog
@Override
public void onRebind(Intent intent) {
isServiceInUse = true;
isServiceBound = true;
}
@DebugLog
@Override
public boolean onUnbind(Intent intent) {
isServiceInUse = false;
isServiceBound = false;
if (!isPlaying()) {
stopSelf();
}
@ -350,6 +356,11 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
}
private void restoreState() {
shuffleMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_SHUFFLE_MODE, 0);
repeatMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(SAVED_REPEAT_MODE, 0);
notifyPrivateChange(SHUFFLE_MODE_CHANGED);
notifyPrivateChange(REPEAT_MODE_CHANGED);
playerHandler.removeMessages(RESTORE_QUEUES);
playerHandler.sendEmptyMessage(RESTORE_QUEUES);
}
@ -372,8 +383,8 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
if (restoredPositionInTrack > 0) seek(restoredPositionInTrack);
notHandledMetaChangedForCurrentTrack = true;
sendChangeIntent(META_CHANGED);
sendChangeIntent(QUEUE_CHANGED);
sendPrivateIntent(META_CHANGED);
sendPrivateIntent(QUEUE_CHANGED);
updateWidgets();
}
}
@ -383,7 +394,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
pause();
playingNotificationHelper.killNotification();
if (isServiceInUse) {
if (isServiceBound) {
return START_STICKY;
} else {
closeAudioEffectSession();
@ -623,7 +634,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
.putInt(SAVED_REPEAT_MODE, repeatMode)
.apply();
prepareNext();
notifyChange(REPEAT_MODE_CHANGED);
notifyPrivateChange(REPEAT_MODE_CHANGED);
break;
}
}
@ -886,33 +897,43 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
position = newPosition;
break;
}
notifyChange(SHUFFLE_MODE_CHANGED);
notifyPrivateChange(SHUFFLE_MODE_CHANGED);
notifyChange(QUEUE_CHANGED);
}
@DebugLog
private void notifyChange(@NonNull final String what) {
handleChange(what);
sendChangeIntent(what);
notifyPrivateChange(what);
sendPublicIntent(what);
}
private void sendChangeIntent(@NonNull final String what) {
final Intent internalIntent = new Intent(what);
@DebugLog
private void notifyPrivateChange(@NonNull final String what) {
handleChange(what);
sendPrivateIntent(what);
}
// to let other apps know whats playing. i.E. last.fm (scrobbling) or musixmatch
@DebugLog
private void sendPublicIntent(@NonNull final String what) {
final Intent intent = new Intent(what.replace(PHONOGRAPH_PACKAGE_NAME, MUSIC_PACKAGE_NAME));
final Song currentSong = getCurrentSong();
if (currentSong.id != -1) {
internalIntent.putExtra("id", currentSong.id);
internalIntent.putExtra("artist", currentSong.artistName);
internalIntent.putExtra("album", currentSong.albumName);
internalIntent.putExtra("track", currentSong.title);
internalIntent.putExtra("duration", currentSong.duration);
intent.putExtra("id", currentSong.id);
intent.putExtra("artist", currentSong.artistName);
intent.putExtra("album", currentSong.albumName);
intent.putExtra("track", currentSong.title);
intent.putExtra("duration", currentSong.duration);
}
internalIntent.putExtra("playing", isPlaying());
sendStickyBroadcast(internalIntent);
intent.putExtra("playing", isPlaying());
// to let other apps know whats playing. i.E. last.fm (scrobbling) or musixmatch
final Intent publicMusicIntent = new Intent(internalIntent);
publicMusicIntent.setAction(what.replace(PHONOGRAPH_PACKAGE_NAME, MUSIC_PACKAGE_NAME));
sendStickyBroadcast(publicMusicIntent);
sendStickyBroadcast(intent);
}
@DebugLog
private void sendPrivateIntent(final String what) {
sendBroadcast(new Intent(what));
}
private void handleChange(@NonNull final String what) {
@ -935,9 +956,9 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
savePosition();
savePositionInTrack();
final Song currentSong = getCurrentSong();
historyStore.addSongId(currentSong.id);
HistoryStore.getInstance(this).addSongId(currentSong.id);
if (songPlayCountHelper.shouldBumpPlayCount()) {
songPlayCountStore.bumpPlayCount(songPlayCountHelper.getSong().id);
SongPlayCountStore.getInstance(this).bumpPlayCount(songPlayCountHelper.getSong().id);
}
songPlayCountHelper.notifySongChanged(currentSong);
break;
@ -1146,7 +1167,7 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
public void run() {
// actually call refresh when the delayed callback fires
// do not send a sticky broadcast here
sendBroadcast(new Intent(MEDIA_STORE_CHANGED));
notifyPrivateChange(MEDIA_STORE_CHANGED);
}
}

View file

@ -46,7 +46,6 @@ import com.kabouzeid.gramophone.util.Util;
import butterknife.Bind;
import butterknife.ButterKnife;
import hugo.weaving.DebugLog;
/**
* Be careful when changing things in this Activity!
@ -337,7 +336,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
return new AsyncAlbumLoader(this, args.getInt(EXTRA_ALBUM_ID));
}
@DebugLog
@Override
public void onLoadFinished(Loader<Album> loader, Album data) {
supportStartPostponedEnterTransition();
@ -347,7 +345,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
}
}
@DebugLog
@Override
public void onLoaderReset(Loader<Album> loader) {
this.album = new Album();
@ -362,7 +359,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements
this.albumId = albumId;
}
@DebugLog
@Override
public Album loadInBackground() {
return AlbumLoader.getAlbum(getContext(), albumId);

View file

@ -62,7 +62,6 @@ import java.util.ArrayList;
import butterknife.Bind;
import butterknife.ButterKnife;
import hugo.weaving.DebugLog;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
@ -418,7 +417,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
return new AsyncArtistDataLoader(this, args.getInt(EXTRA_ARTIST_ID));
}
@DebugLog
@Override
public void onLoadFinished(Loader<ArtistData> loader, ArtistData data) {
supportStartPostponedEnterTransition();
@ -428,7 +426,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
}
}
@DebugLog
@Override
public void onLoaderReset(Loader<ArtistData> loader) {
this.artistData = new ArtistData();
@ -444,7 +441,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement
this.artistId = artistId;
}
@DebugLog
@Override
public ArtistData loadInBackground() {
Artist artist = ArtistLoader.getArtist(getContext(), artistId);

View file

@ -1,7 +1,6 @@
package com.kabouzeid.gramophone.ui.activities;
import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
@ -9,7 +8,6 @@ import android.net.Uri;
import android.os.Build;
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;
@ -24,6 +22,8 @@ import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.appthemehelper.util.ATHUtil;
import com.kabouzeid.appthemehelper.util.NavigationViewUtil;
@ -40,8 +40,8 @@ import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
import com.kabouzeid.gramophone.ui.activities.intro.AppIntroActivity;
import com.kabouzeid.gramophone.ui.fragments.FolderFragment;
import com.kabouzeid.gramophone.ui.fragments.LibraryFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.folders.FoldersFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.library.LibraryFragment;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.Util;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
@ -74,14 +74,13 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
private boolean blockRequestPermissions;
private boolean bottomBarSupposedToBeHidden = true;
private boolean keepBottomBarHidden = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ButterKnife.bind(this);
Answers.getInstance().logCustom(new CustomEvent("TEST")); // TODO remove in future update
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
Util.setStatusBarTranslucent(getWindow());
drawerLayout.setFitsSystemWindows(false);
@ -94,15 +93,8 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
if (savedInstanceState == null) {
setMusicChooser(PreferenceUtil.getInstance(this).getLastMusicChooser());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
initDelayedBottomBar();
}
}, 500);
} else {
restoreCurrentFragment();
initDelayedBottomBar();
}
if (!checkShowIntro()) {
@ -119,7 +111,7 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
break;
case FOLDERS:
navigationView.setCheckedItem(R.id.nav_folders);
setCurrentFragment(FolderFragment.newInstance(this));
setCurrentFragment(FoldersFragment.newInstance(this));
break;
}
}
@ -255,8 +247,9 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
super.onServiceConnected(name, service);
public void onServiceConnected() {
super.onServiceConnected();
updateNavigationDrawerHeader();
handlePlaybackIntent(getIntent());
}
@ -410,17 +403,6 @@ public class MainActivity extends AbsSlidingMusicPanelActivity
}
@Override
public void hideBottomBar(boolean hide) {
bottomBarSupposedToBeHidden = hide;
super.hideBottomBar(hide || keepBottomBarHidden);
}
private void initDelayedBottomBar() {
keepBottomBarHidden = false;
hideBottomBar(bottomBarSupposedToBeHidden);
}
public interface MainActivityFragmentCallbacks {
boolean handleBackPress();
}

View file

@ -20,10 +20,12 @@ import com.kabouzeid.gramophone.service.MusicService;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import hugo.weaving.DebugLog;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements ServiceConnection, MusicServiceEventListener {
public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements MusicServiceEventListener {
public static final String TAG = AbsMusicServiceActivity.class.getSimpleName();
private final ArrayList<MusicServiceEventListener> mMusicServiceEventListeners = new ArrayList<>();
@ -33,41 +35,26 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements
private boolean receiverRegistered;
@DebugLog
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
serviceToken = MusicPlayerRemote.bindToService(this, this);
serviceToken = MusicPlayerRemote.bindToService(this, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
AbsMusicServiceActivity.this.onServiceConnected();
}
@Override
public void onServiceDisconnected(ComponentName name) {
AbsMusicServiceActivity.this.onServiceDisconnected();
}
});
setPermissionDeniedMessage(getString(R.string.permission_external_storage_denied));
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
if (!receiverRegistered) {
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.QUEUE_CHANGED);
filter.addAction(MusicService.MEDIA_STORE_CHANGED);
registerReceiver(musicStateReceiver, filter);
receiverRegistered = true;
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
if (receiverRegistered) {
unregisterReceiver(musicStateReceiver);
receiverRegistered = false;
}
}
@DebugLog
@Override
protected void onDestroy() {
super.onDestroy();
@ -90,6 +77,45 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements
}
}
@Override
public void onServiceConnected() {
if (!receiverRegistered) {
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.QUEUE_CHANGED);
filter.addAction(MusicService.MEDIA_STORE_CHANGED);
registerReceiver(musicStateReceiver, filter);
receiverRegistered = true;
}
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
if (listener != null) {
listener.onServiceConnected();
}
}
}
@Override
public void onServiceDisconnected() {
if (receiverRegistered) {
unregisterReceiver(musicStateReceiver);
receiverRegistered = false;
}
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
if (listener != null) {
listener.onServiceDisconnected();
}
}
}
@Override
public void onPlayingMetaChanged() {
for (MusicServiceEventListener listener : mMusicServiceEventListeners) {
@ -152,6 +178,7 @@ public abstract class AbsMusicServiceActivity extends AbsBaseActivity implements
reference = new WeakReference<>(activity);
}
@DebugLog
@Override
public void onReceive(final Context context, @NonNull final Intent intent) {
final String action = intent.getAction();

View file

@ -79,6 +79,14 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
protected abstract View createContentView();
@Override
public void onServiceConnected() {
super.onServiceConnected();
if (!MusicPlayerRemote.getPlayingQueue().isEmpty()) {
hideBottomBar(false);
} // don't call hideBottomBar(true) here as it causes a bug with the SlidingUpPanelLayout
}
@Override
public void onQueueChanged() {
super.onQueueChanged();
@ -212,6 +220,10 @@ public abstract class AbsSlidingMusicPanelActivity extends AbsMusicServiceActivi
}
}
public SlidingUpPanelLayout getSlidingUpPanelLayout() {
return slidingUpPanelLayout;
}
public MiniPlayerFragment getMiniPlayerFragment() {
return miniPlayerFragment;
}

View file

@ -47,6 +47,16 @@ public class AbsMusicServiceFragment extends Fragment implements MusicServiceEve
}
@Override
public void onServiceConnected() {
}
@Override
public void onServiceDisconnected() {
}
@Override
public void onQueueChanged() {

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments;
package com.kabouzeid.gramophone.ui.fragments.mainactivity;
import android.os.Bundle;
import android.support.v4.app.Fragment;

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments;
package com.kabouzeid.gramophone.ui.fragments.mainactivity.folders;
import android.annotation.SuppressLint;
@ -41,6 +41,7 @@ import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.loader.SortedCursor;
import com.kabouzeid.gramophone.model.Song;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.AbsMainActivityFragment;
import com.kabouzeid.gramophone.util.PhonographColorUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
import com.kabouzeid.gramophone.util.ViewUtil;
@ -59,10 +60,9 @@ import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
import hugo.weaving.DebugLog;
public class FolderFragment extends AbsMainActivityFragment implements MainActivity.MainActivityFragmentCallbacks, CabHolder, BreadCrumbLayout.SelectionCallback, SongFileAdapter.Callbacks, AppBarLayout.OnOffsetChangedListener {
public static final String TAG = FolderFragment.class.getSimpleName();
public class FoldersFragment extends AbsMainActivityFragment implements MainActivity.MainActivityFragmentCallbacks, CabHolder, BreadCrumbLayout.SelectionCallback, SongFileAdapter.Callbacks, AppBarLayout.OnOffsetChangedListener {
public static final String TAG = FoldersFragment.class.getSimpleName();
protected static final String PATH = "path";
protected static final String CRUMBS = "crumbs";
@ -85,15 +85,15 @@ public class FolderFragment extends AbsMainActivityFragment implements MainActiv
private SongFileAdapter adapter;
private MaterialCab cab;
public FolderFragment() {
public FoldersFragment() {
}
public static FolderFragment newInstance(Context context) {
public static FoldersFragment newInstance(Context context) {
return newInstance(PreferenceUtil.getInstance(context).getStartDirectory());
}
public static FolderFragment newInstance(File directory) {
FolderFragment frag = new FolderFragment();
public static FoldersFragment newInstance(File directory) {
FoldersFragment frag = new FoldersFragment();
Bundle b = new Bundle();
b.putSerializable(PATH, directory);
frag.setArguments(b);
@ -416,7 +416,6 @@ public class FolderFragment extends AbsMainActivityFragment implements MainActiv
int scanned = 0;
int failed = 0;
@DebugLog
@Override
public void onScanCompleted(final String path, final Uri uri) {
getActivity().runOnUiThread(new Runnable() {

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments;
package com.kabouzeid.gramophone.ui.fragments.mainactivity.library;
import android.content.Intent;
@ -31,7 +31,8 @@ import com.kabouzeid.gramophone.interfaces.CabHolder;
import com.kabouzeid.gramophone.loader.SongLoader;
import com.kabouzeid.gramophone.ui.activities.MainActivity;
import com.kabouzeid.gramophone.ui.activities.SearchActivity;
import com.kabouzeid.gramophone.ui.fragments.libraryfragments.AbsLibraryPagerRecyclerViewCustomGridSizeFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.AbsMainActivityFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager.AbsLibraryPagerRecyclerViewCustomGridSizeFragment;
import com.kabouzeid.gramophone.util.NavigationUtil;
import com.kabouzeid.gramophone.util.PhonographColorUtil;
import com.kabouzeid.gramophone.util.PreferenceUtil;
@ -151,6 +152,7 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
if (pager == null) return;
inflater.inflate(R.menu.menu_main, menu);
if (isPlaylistPage()) {
menu.add(0, R.id.action_new_playlist, 0, R.string.new_playlist_title);
@ -175,6 +177,7 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (pager == null) return false;
Fragment currentFragment = getCurrentFragment();
if (currentFragment instanceof AbsLibraryPagerRecyclerViewCustomGridSizeFragment) {
AbsLibraryPagerRecyclerViewCustomGridSizeFragment absLibraryRecyclerViewCustomGridSizeFragment = (AbsLibraryPagerRecyclerViewCustomGridSizeFragment) currentFragment;

View file

@ -1,15 +1,15 @@
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
package com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager;
import com.kabouzeid.gramophone.ui.fragments.LibraryFragment;
import com.kabouzeid.gramophone.ui.fragments.AbsMusicServiceFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.library.LibraryFragment;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class AbsLibraryPagerFragment extends Fragment {
public class AbsLibraryPagerFragment extends AbsMusicServiceFragment {
/* http://stackoverflow.com/a/2888433 */
@Override

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
package com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager;
import android.os.Bundle;
import android.support.annotation.LayoutRes;

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
package com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
@ -15,7 +15,6 @@ import android.widget.TextView;
import com.kabouzeid.appthemehelper.ThemeStore;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.util.ViewUtil;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
@ -25,7 +24,7 @@ import butterknife.ButterKnife;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsLibraryPagerFragment implements OnOffsetChangedListener, MusicServiceEventListener {
public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView.Adapter, LM extends RecyclerView.LayoutManager> extends AbsLibraryPagerFragment implements OnOffsetChangedListener {
public static final String TAG = AbsLibraryPagerRecyclerViewFragment.class.getSimpleName();
@ -59,7 +58,6 @@ public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView
super.onViewCreated(view, savedInstanceState);
getLibraryFragment().addOnAppBarOffsetChangedListener(this);
getLibraryFragment().getMainActivity().addMusicServiceEventListener(this);
setUpRecyclerView();
}
@ -115,31 +113,6 @@ public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView
container.setPadding(container.getPaddingLeft(), container.getPaddingTop(), container.getPaddingRight(), getLibraryFragment().getTotalAppBarScrollingRange() + i);
}
@Override
public void onPlayingMetaChanged() {
}
@Override
public void onQueueChanged() {
}
@Override
public void onPlayStateChanged() {
}
@Override
public void onShuffleModeChanged() {
}
@Override
public void onRepeatModeChanged() {
}
private void checkIsEmpty() {
if (empty != null) {
empty.setText(getEmptyMessage());
@ -166,7 +139,6 @@ public abstract class AbsLibraryPagerRecyclerViewFragment<A extends RecyclerView
public void onDestroyView() {
super.onDestroyView();
getLibraryFragment().removeOnAppBarOffsetChangedListener(this);
getLibraryFragment().getMainActivity().removeMusicServiceEventListener(this);
ButterKnife.unbind(this);
}
}

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
package com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager;
import android.content.Context;
import android.os.Bundle;
@ -17,8 +17,6 @@ import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList;
import hugo.weaving.DebugLog;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -103,19 +101,16 @@ public class AlbumsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFra
getLoaderManager().restartLoader(LOADER_ID, null, this);
}
@DebugLog
@Override
public Loader<ArrayList<Album>> onCreateLoader(int id, Bundle args) {
return new AsyncAlbumLoader(getActivity());
}
@DebugLog
@Override
public void onLoadFinished(Loader<ArrayList<Album>> loader, ArrayList<Album> data) {
getAdapter().swapDataSet(data);
}
@DebugLog
@Override
public void onLoaderReset(Loader<ArrayList<Album>> loader) {
getAdapter().swapDataSet(new ArrayList<Album>());
@ -126,7 +121,6 @@ public class AlbumsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFra
super(context);
}
@DebugLog
@Override
public ArrayList<Album> loadInBackground() {
return AlbumLoader.getAllAlbums(getContext());

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
package com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager;
import android.content.Context;
import android.os.Bundle;
@ -17,8 +17,6 @@ import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList;
import hugo.weaving.DebugLog;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -105,19 +103,19 @@ public class ArtistsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFr
getAdapter().notifyDataSetChanged();
}
@DebugLog
@Override
public Loader<ArrayList<Artist>> onCreateLoader(int id, Bundle args) {
return new AsyncArtistLoader(getActivity());
}
@DebugLog
@Override
public void onLoadFinished(Loader<ArrayList<Artist>> loader, ArrayList<Artist> data) {
getAdapter().swapDataSet(data);
}
@DebugLog
@Override
public void onLoaderReset(Loader<ArrayList<Artist>> loader) {
getAdapter().swapDataSet(new ArrayList<Artist>());
@ -128,7 +126,6 @@ public class ArtistsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFr
super(context);
}
@DebugLog
@Override
public ArrayList<Artist> loadInBackground() {
return ArtistLoader.getAllArtists(getContext());

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
package com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager;
import android.content.Context;
import android.os.Bundle;
@ -19,8 +19,6 @@ import com.kabouzeid.gramophone.model.smartplaylist.MyTopTracksPlaylist;
import java.util.ArrayList;
import hugo.weaving.DebugLog;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -59,19 +57,16 @@ public class PlaylistsFragment extends AbsLibraryPagerRecyclerViewFragment<Playl
getLoaderManager().restartLoader(LOADER_ID, null, this);
}
@DebugLog
@Override
public Loader<ArrayList<Playlist>> onCreateLoader(int id, Bundle args) {
return new AsyncPlaylistLoader(getActivity());
}
@DebugLog
@Override
public void onLoadFinished(Loader<ArrayList<Playlist>> loader, ArrayList<Playlist> data) {
getAdapter().swapDataSet(data);
}
@DebugLog
@Override
public void onLoaderReset(Loader<ArrayList<Playlist>> loader) {
getAdapter().swapDataSet(new ArrayList<Playlist>());
@ -94,7 +89,6 @@ public class PlaylistsFragment extends AbsLibraryPagerRecyclerViewFragment<Playl
return playlists;
}
@DebugLog
@Override
public ArrayList<Playlist> loadInBackground() {
return getAllPlaylists(getContext());

View file

@ -1,4 +1,4 @@
package com.kabouzeid.gramophone.ui.fragments.libraryfragments;
package com.kabouzeid.gramophone.ui.fragments.mainactivity.library.pager;
import android.content.Context;
import android.os.Bundle;
@ -18,8 +18,6 @@ import com.kabouzeid.gramophone.util.PreferenceUtil;
import java.util.ArrayList;
import hugo.weaving.DebugLog;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
@ -116,19 +114,16 @@ public class SongsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFrag
getAdapter().notifyDataSetChanged();
}
@DebugLog
@Override
public Loader<ArrayList<Song>> onCreateLoader(int id, Bundle args) {
return new AsyncSongLoader(getActivity());
}
@DebugLog
@Override
public void onLoadFinished(Loader<ArrayList<Song>> loader, ArrayList<Song> data) {
getAdapter().swapDataSet(data);
}
@DebugLog
@Override
public void onLoaderReset(Loader<ArrayList<Song>> loader) {
getAdapter().swapDataSet(new ArrayList<Song>());
@ -139,7 +134,6 @@ public class SongsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFrag
super(context);
}
@DebugLog
@Override
public ArrayList<Song> loadInBackground() {
return SongLoader.getAllSongs(getContext());

View file

@ -5,7 +5,6 @@ import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@ -20,8 +19,7 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.MusicProgressViewUpdateHelper;
import com.kabouzeid.gramophone.helper.PlayPauseButtonOnClickHandler;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
import com.kabouzeid.gramophone.ui.fragments.AbsMusicServiceFragment;
import com.kabouzeid.gramophone.views.PlayPauseDrawable;
import butterknife.Bind;
@ -31,11 +29,9 @@ import me.zhanghai.android.materialprogressbar.MaterialProgressBar;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class MiniPlayerFragment extends Fragment implements MusicServiceEventListener, MusicProgressViewUpdateHelper.Callback {
public class MiniPlayerFragment extends AbsMusicServiceFragment implements MusicProgressViewUpdateHelper.Callback {
@Bind(R.id.mini_player_title)
TextView miniPlayerTitle;
@Bind(R.id.mini_player_image)
ImageView miniPlayerImage;
@Bind(R.id.mini_player_play_pause_button)
ImageView miniPlayerPlayPauseButton;
@Bind(R.id.progress_bar)
@ -45,24 +41,6 @@ public class MiniPlayerFragment extends Fragment implements MusicServiceEventLis
private MusicProgressViewUpdateHelper progressViewUpdateHelper;
private AbsMusicServiceActivity activity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
activity = (AbsMusicServiceActivity) context;
} catch (ClassCastException e) {
throw new RuntimeException(context.getClass().getSimpleName() + " must be an instance of " + AbsMusicServiceActivity.class.getSimpleName());
}
}
@Override
public void onDetach() {
super.onDetach();
activity = null;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -80,39 +58,41 @@ public class MiniPlayerFragment extends Fragment implements MusicServiceEventLis
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
view.setOnTouchListener(new FlingPlayBackController(activity));
view.setOnTouchListener(new FlingPlayBackController(getActivity()));
setUpMiniPlayer();
activity.addMusicServiceEventListener(this);
}
@Override
public void onDestroyView() {
super.onDestroyView();
activity.removeMusicServiceEventListener(this);
ButterKnife.unbind(this);
}
private void setUpMiniPlayer() {
setUpPlayPauseButton();
progressBar.setProgressTintList(ColorStateList.valueOf(ThemeStore.accentColor(activity)));
progressBar.setProgressTintList(ColorStateList.valueOf(ThemeStore.accentColor(getActivity())));
}
private void setUpPlayPauseButton() {
updatePlayPauseDrawableState(false);
miniPlayerPlayPauseDrawable = new PlayPauseDrawable(getActivity());
miniPlayerPlayPauseButton.setImageDrawable(miniPlayerPlayPauseDrawable);
miniPlayerPlayPauseButton.setColorFilter(ATHUtil.resolveColor(activity, R.attr.iconColor, ThemeStore.textColorSecondary(getActivity())), PorterDuff.Mode.SRC_IN);
miniPlayerPlayPauseButton.setColorFilter(ATHUtil.resolveColor(getActivity(), R.attr.iconColor, ThemeStore.textColorSecondary(getActivity())), PorterDuff.Mode.SRC_IN);
miniPlayerPlayPauseButton.setOnClickListener(new PlayPauseButtonOnClickHandler());
}
@Override
public void onPlayingMetaChanged() {
private void updateSongTitle() {
miniPlayerTitle.setText(MusicPlayerRemote.getCurrentSong().title);
}
@Override
public void onQueueChanged() {
public void onServiceConnected() {
updateSongTitle();
updatePlayPauseDrawableState(false);
}
@Override
public void onPlayingMetaChanged() {
updateSongTitle();
}
@Override
@ -120,21 +100,6 @@ public class MiniPlayerFragment extends Fragment implements MusicServiceEventLis
updatePlayPauseDrawableState(true);
}
@Override
public void onRepeatModeChanged() {
}
@Override
public void onShuffleModeChanged() {
}
@Override
public void onMediaStoreChanged() {
}
@Override
public void onUpdateProgressViews(int progress, int total) {
progressBar.setMax(total);
@ -182,9 +147,6 @@ public class MiniPlayerFragment extends Fragment implements MusicServiceEventLis
}
protected void updatePlayPauseDrawableState(boolean animate) {
if (miniPlayerPlayPauseDrawable == null) {
miniPlayerPlayPauseDrawable = new PlayPauseDrawable(activity);
}
if (MusicPlayerRemote.isPlaying()) {
miniPlayerPlayPauseDrawable.setPause(animate);
} else {

View file

@ -1,11 +1,9 @@
package com.kabouzeid.gramophone.ui.fragments.player;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -21,10 +19,9 @@ import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
import com.kabouzeid.gramophone.helper.MusicProgressViewUpdateHelper;
import com.kabouzeid.gramophone.helper.PlayPauseButtonOnClickHandler;
import com.kabouzeid.gramophone.interfaces.MusicServiceEventListener;
import com.kabouzeid.gramophone.misc.SimpleOnSeekbarChangeListener;
import com.kabouzeid.gramophone.service.MusicService;
import com.kabouzeid.gramophone.ui.activities.base.AbsMusicServiceActivity;
import com.kabouzeid.gramophone.ui.fragments.AbsMusicServiceFragment;
import com.kabouzeid.gramophone.util.MusicUtil;
import com.kabouzeid.gramophone.views.PlayPauseDrawable;
@ -34,7 +31,7 @@ import butterknife.ButterKnife;
/**
* @author Karim Abou Zeid (kabouzeid)
*/
public class PlaybackControlsFragment extends Fragment implements MusicServiceEventListener, MusicProgressViewUpdateHelper.Callback {
public class PlaybackControlsFragment extends AbsMusicServiceFragment implements MusicProgressViewUpdateHelper.Callback {
@Bind(R.id.player_play_pause_fab)
FloatingActionButton playPauseFab;
@ -56,28 +53,11 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
private PlayPauseDrawable playerFabPlayPauseDrawable;
private AbsMusicServiceActivity activity;
private int lastPlaybackControlsColor;
private int lastDisabledPlaybackControlsColor;
private MusicProgressViewUpdateHelper progressViewUpdateHelper;
@Override
public void onAttach(Context context) {
super.onAttach(context);
try {
activity = (AbsMusicServiceActivity) context;
} catch (ClassCastException e) {
throw new RuntimeException(context.getClass().getSimpleName() + " must be an instance of " + AbsMusicServiceActivity.class.getSimpleName());
}
}
@Override
public void onDetach() {
super.onDetach();
activity = null;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@ -94,7 +74,6 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
activity.addMusicServiceEventListener(this);
setUpMusicControllers();
updateProgressTextColor();
}
@ -102,7 +81,6 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
@Override
public void onDestroyView() {
super.onDestroyView();
activity.removeMusicServiceEventListener(this);
ButterKnife.unbind(this);
}
@ -119,12 +97,10 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
}
@Override
public void onPlayingMetaChanged() {
}
@Override
public void onQueueChanged() {
public void onServiceConnected() {
updatePlayPauseDrawableState(false);
updateRepeatState();
updateShuffleState();
}
@Override
@ -142,13 +118,8 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
updateShuffleState();
}
@Override
public void onMediaStoreChanged() {
}
public void setColor(int color) {
if (ColorUtil.isColorLight(color)) {
public void setDark(boolean dark) {
if (dark) {
lastPlaybackControlsColor = MaterialValueHelper.getSecondaryTextColor(getActivity(), true);
lastDisabledPlaybackControlsColor = MaterialValueHelper.getSecondaryDisabledTextColor(getActivity(), true);
} else {
@ -166,9 +137,9 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
final int fabColor = Color.WHITE;
TintHelper.setTintAuto(playPauseFab, fabColor, true);
updatePlayPauseDrawableState(false);
// Note: set the drawable AFTER TintHelper.setTintAuto() was called
playPauseFab.setImageDrawable(playerFabPlayPauseDrawable);
playerFabPlayPauseDrawable = new PlayPauseDrawable(getActivity());
playPauseFab.setImageDrawable(playerFabPlayPauseDrawable); // Note: set the drawable AFTER TintHelper.setTintAuto() was called
playPauseFab.setColorFilter(MaterialValueHelper.getPrimaryTextColor(getContext(), ColorUtil.isColorLight(fabColor)), PorterDuff.Mode.SRC_IN);
playPauseFab.setOnClickListener(new PlayPauseButtonOnClickHandler());
playPauseFab.post(new Runnable() {
@ -183,9 +154,6 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
}
protected void updatePlayPauseDrawableState(boolean animate) {
if (playerFabPlayPauseDrawable == null) {
playerFabPlayPauseDrawable = new PlayPauseDrawable(activity);
}
if (MusicPlayerRemote.isPlaying()) {
playerFabPlayPauseDrawable.setPause(animate);
} else {
@ -229,7 +197,6 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
}
private void setUpShuffleButton() {
updateShuffleState();
shuffleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@ -250,7 +217,6 @@ public class PlaybackControlsFragment extends Fragment implements MusicServiceEv
}
private void setUpRepeatButton() {
updateRepeatState();
repeatButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

View file

@ -47,7 +47,6 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
updatePlayingQueue();
viewPager.addOnPageChangeListener(this);
viewPager.setOnTouchListener(new View.OnTouchListener() {
GestureDetector gestureDetector = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() {
@ -75,6 +74,11 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements
ButterKnife.unbind(this);
}
@Override
public void onServiceConnected() {
updatePlayingQueue();
}
@Override
public void onPlayingMetaChanged() {
viewPager.setCurrentItem(MusicPlayerRemote.getPosition());
@ -88,7 +92,6 @@ public class PlayerAlbumCoverFragment extends AbsMusicServiceFragment implements
private void updatePlayingQueue() {
viewPager.setAdapter(new AlbumCoverPagerAdapter(getFragmentManager(), MusicPlayerRemote.getPlayingQueue()));
viewPager.setCurrentItem(MusicPlayerRemote.getPosition());
// doesn't get called automatically for some reason
onPageSelected(MusicPlayerRemote.getPosition());
}

View file

@ -65,7 +65,6 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
@Bind(R.id.player_queue_sub_header)
TextView playerQueueSubHeader;
private int lastColor;
private PlaybackControlsFragment playbackControlsFragment;
@ -154,9 +153,16 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
}
@Override
public void onPlayingMetaChanged() {
updateIsFavorite();
public void onServiceConnected() {
updateQueue();
updateCurrentSong();
updateIsFavorite();
}
@Override
public void onPlayingMetaChanged() {
updateCurrentSong();
updateIsFavorite();
updateQueuePosition();
}
@ -215,6 +221,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
playingQueueAdapter = new PlayingQueueAdapter(
((AppCompatActivity) getActivity()),
MusicPlayerRemote.getPlayingQueue(),
MusicPlayerRemote.getPosition(),
R.layout.item_list,
false,
null);
@ -227,6 +234,8 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
recyclerView.setItemAnimator(animator);
recyclerViewDragDropManager.attachRecyclerView(recyclerView);
layoutManager.scrollToPositionWithOffset(MusicPlayerRemote.getPosition() + 1, 0);
}
@ -287,7 +296,7 @@ public class PlayerFragment extends AbsPlayerFragment implements PlayerAlbumCove
@Override
public void onColorChanged(int color) {
animateColorChange(color);
playbackControlsFragment.setColor(color);
playbackControlsFragment.setDark(ColorUtil.isColorLight(color));
getCallbacks().onPaletteColorChanged();
}

View file

@ -9,7 +9,7 @@ import android.support.annotation.StyleRes;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.helper.SortOrder;
import com.kabouzeid.gramophone.ui.fragments.FolderFragment;
import com.kabouzeid.gramophone.ui.fragments.mainactivity.folders.FoldersFragment;
import java.io.File;
@ -317,7 +317,7 @@ public final class PreferenceUtil {
}
public final File getStartDirectory() {
return new File(mPreferences.getString(START_DIRECTORY, FolderFragment.getDefaultStartDirectory().getPath()));
return new File(mPreferences.getString(START_DIRECTORY, FoldersFragment.getDefaultStartDirectory().getPath()));
}
public void setStartDirectory(File file) {

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.kabouzeid.gramophone.ui.fragments.FolderFragment">
tools:context=".ui.fragments.mainactivity.folders.FoldersFragment">
<FrameLayout
android:layout_width="match_parent"

View file

@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.kabouzeid.gramophone.ui.fragments.LibraryFragment">
tools:context=".ui.fragments.mainactivity.library.LibraryFragment">
<FrameLayout
android:layout_width="match_parent"