diff --git a/app/build.gradle b/app/build.gradle index f5e0f090..05f8f8bf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -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 } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/App.java b/app/src/main/java/com/kabouzeid/gramophone/App.java index 79133741..761ab9a2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/App.java +++ b/app/src/main/java/com/kabouzeid/gramophone/App.java @@ -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); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/MusicLibraryPagerAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/MusicLibraryPagerAdapter.java index 3297b5b1..20c57414 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/MusicLibraryPagerAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/MusicLibraryPagerAdapter.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlayingQueueAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlayingQueueAdapter.java index 3286fd12..feb5b6c4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlayingQueueAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/PlayingQueueAdapter.java @@ -30,8 +30,9 @@ public class PlayingQueueAdapter extends SongAdapter implements DraggableItemAda private int current; - public PlayingQueueAdapter(AppCompatActivity activity, ArrayList dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) { + public PlayingQueueAdapter(AppCompatActivity activity, ArrayList dataSet, int current, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) { super(activity, dataSet, itemLayoutRes, usePalette, cabHolder); + this.current = current; } @Override diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java index 8bae787f..06d2512e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/MusicPlayerRemote.java @@ -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 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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/interfaces/MusicServiceEventListener.java b/app/src/main/java/com/kabouzeid/gramophone/interfaces/MusicServiceEventListener.java index 282a966c..02749186 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/interfaces/MusicServiceEventListener.java +++ b/app/src/main/java/com/kabouzeid/gramophone/interfaces/MusicServiceEventListener.java @@ -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(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/loader/SortedCursor.java b/app/src/main/java/com/kabouzeid/gramophone/loader/SortedCursor.java index a501848b..38348b44 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/loader/SortedCursor.java +++ b/app/src/main/java/com/kabouzeid/gramophone/loader/SortedCursor.java @@ -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); diff --git a/app/src/main/java/com/kabouzeid/gramophone/misc/WrappedAsyncTaskLoader.java b/app/src/main/java/com/kabouzeid/gramophone/misc/WrappedAsyncTaskLoader.java index a8fbe651..11ec7c09 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/misc/WrappedAsyncTaskLoader.java +++ b/app/src/main/java/com/kabouzeid/gramophone/misc/WrappedAsyncTaskLoader.java @@ -4,8 +4,6 @@ package com.kabouzeid.gramophone.misc; import android.content.Context; import android.support.v4.content.AsyncTaskLoader; -import hugo.weaving.DebugLog; - /** * Issue * 14944 @@ -28,7 +26,6 @@ public abstract class WrappedAsyncTaskLoader extends AsyncTaskLoader { /** * {@inheritDoc} */ - @DebugLog @Override public void deliverResult(D data) { if (!isReset()) { @@ -42,7 +39,6 @@ public abstract class WrappedAsyncTaskLoader extends AsyncTaskLoader { /** * {@inheritDoc} */ - @DebugLog @Override protected void onStartLoading() { if (this.mData != null) { @@ -55,7 +51,6 @@ public abstract class WrappedAsyncTaskLoader extends AsyncTaskLoader { /** * {@inheritDoc} */ - @DebugLog @Override protected void onStopLoading() { // Attempt to cancel the current load task if possible @@ -65,7 +60,6 @@ public abstract class WrappedAsyncTaskLoader extends AsyncTaskLoader { /** * {@inheritDoc} */ - @DebugLog @Override protected void onReset() { super.onReset(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index 711a14fc..4c820e55 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -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); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java index ddc5c75b..ae732f20 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/AlbumDetailActivity.java @@ -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 loader, Album data) { supportStartPostponedEnterTransition(); @@ -347,7 +345,6 @@ public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements } } - @DebugLog @Override public void onLoaderReset(Loader 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); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java index 81c9e567..c817f54c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/ArtistDetailActivity.java @@ -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 loader, ArtistData data) { supportStartPostponedEnterTransition(); @@ -428,7 +426,6 @@ public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implement } } - @DebugLog @Override public void onLoaderReset(Loader 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); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index d3bbdb7c..9acc411b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -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(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicServiceActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicServiceActivity.java index 8961503c..ab696b28 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicServiceActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicServiceActivity.java @@ -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 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(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java index 5b4b29a0..40450a8f 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java @@ -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; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/AbsMusicServiceFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/AbsMusicServiceFragment.java index 87268526..05193ab3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/AbsMusicServiceFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/AbsMusicServiceFragment.java @@ -47,6 +47,16 @@ public class AbsMusicServiceFragment extends Fragment implements MusicServiceEve } + @Override + public void onServiceConnected() { + + } + + @Override + public void onServiceDisconnected() { + + } + @Override public void onQueueChanged() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/AbsMainActivityFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/AbsMainActivityFragment.java similarity index 89% rename from app/src/main/java/com/kabouzeid/gramophone/ui/fragments/AbsMainActivityFragment.java rename to app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/AbsMainActivityFragment.java index 5b5fe08d..104f68c9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/AbsMainActivityFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/AbsMainActivityFragment.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/FolderFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/folders/FoldersFragment.java similarity index 97% rename from app/src/main/java/com/kabouzeid/gramophone/ui/fragments/FolderFragment.java rename to app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/folders/FoldersFragment.java index 5cb63a61..2bea9003 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/FolderFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/folders/FoldersFragment.java @@ -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() { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/LibraryFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java similarity index 97% rename from app/src/main/java/com/kabouzeid/gramophone/ui/fragments/LibraryFragment.java rename to app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java index fc0abb84..7fecf878 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/LibraryFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/AbsLibraryPagerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerFragment.java similarity index 65% rename from app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/AbsLibraryPagerFragment.java rename to app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerFragment.java index cd227a6f..c52c0247 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/AbsLibraryPagerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerFragment.java @@ -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 diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/AbsLibraryPagerRecyclerViewCustomGridSizeFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewCustomGridSizeFragment.java similarity index 98% rename from app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/AbsLibraryPagerRecyclerViewCustomGridSizeFragment.java rename to app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewCustomGridSizeFragment.java index b42ef451..17261755 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/AbsLibraryPagerRecyclerViewCustomGridSizeFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewCustomGridSizeFragment.java @@ -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; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/AbsLibraryPagerRecyclerViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java similarity index 87% rename from app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/AbsLibraryPagerRecyclerViewFragment.java rename to app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java index 1c1623d0..3c3d2a56 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/AbsLibraryPagerRecyclerViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/AbsLibraryPagerRecyclerViewFragment.java @@ -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 extends AbsLibraryPagerFragment implements OnOffsetChangedListener, MusicServiceEventListener { +public abstract class AbsLibraryPagerRecyclerViewFragment extends AbsLibraryPagerFragment implements OnOffsetChangedListener { public static final String TAG = AbsLibraryPagerRecyclerViewFragment.class.getSimpleName(); @@ -59,7 +58,6 @@ public abstract class AbsLibraryPagerRecyclerViewFragment> onCreateLoader(int id, Bundle args) { return new AsyncAlbumLoader(getActivity()); } - @DebugLog @Override public void onLoadFinished(Loader> loader, ArrayList data) { getAdapter().swapDataSet(data); } - @DebugLog @Override public void onLoaderReset(Loader> loader) { getAdapter().swapDataSet(new ArrayList()); @@ -126,7 +121,6 @@ public class AlbumsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFra super(context); } - @DebugLog @Override public ArrayList loadInBackground() { return AlbumLoader.getAllAlbums(getContext()); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/ArtistsFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java similarity index 96% rename from app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/ArtistsFragment.java rename to app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java index c5ed76f3..8d4c0db3 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/ArtistsFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/ArtistsFragment.java @@ -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> onCreateLoader(int id, Bundle args) { return new AsyncArtistLoader(getActivity()); } - @DebugLog + @Override public void onLoadFinished(Loader> loader, ArrayList data) { getAdapter().swapDataSet(data); } - @DebugLog + @Override public void onLoaderReset(Loader> loader) { getAdapter().swapDataSet(new ArrayList()); @@ -128,7 +126,6 @@ public class ArtistsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFr super(context); } - @DebugLog @Override public ArrayList loadInBackground() { return ArtistLoader.getAllArtists(getContext()); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/PlaylistsFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java similarity index 95% rename from app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/PlaylistsFragment.java rename to app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java index be6acc5b..8f7952a2 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/PlaylistsFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/PlaylistsFragment.java @@ -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> onCreateLoader(int id, Bundle args) { return new AsyncPlaylistLoader(getActivity()); } - @DebugLog @Override public void onLoadFinished(Loader> loader, ArrayList data) { getAdapter().swapDataSet(data); } - @DebugLog @Override public void onLoaderReset(Loader> loader) { getAdapter().swapDataSet(new ArrayList()); @@ -94,7 +89,6 @@ public class PlaylistsFragment extends AbsLibraryPagerRecyclerViewFragment loadInBackground() { return getAllPlaylists(getContext()); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/SongsFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/SongsFragment.java similarity index 96% rename from app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/SongsFragment.java rename to app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/SongsFragment.java index 9ba36a10..2faa1b60 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/libraryfragments/SongsFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/pager/SongsFragment.java @@ -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> onCreateLoader(int id, Bundle args) { return new AsyncSongLoader(getActivity()); } - @DebugLog @Override public void onLoadFinished(Loader> loader, ArrayList data) { getAdapter().swapDataSet(data); } - @DebugLog @Override public void onLoaderReset(Loader> loader) { getAdapter().swapDataSet(new ArrayList()); @@ -139,7 +134,6 @@ public class SongsFragment extends AbsLibraryPagerRecyclerViewCustomGridSizeFrag super(context); } - @DebugLog @Override public ArrayList loadInBackground() { return SongLoader.getAllSongs(getContext()); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/MiniPlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/MiniPlayerFragment.java index 16b1b549..c7bae1cd 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/MiniPlayerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/MiniPlayerFragment.java @@ -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 { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlaybackControlsFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlaybackControlsFragment.java index 854f1550..aba3f45d 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlaybackControlsFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlaybackControlsFragment.java @@ -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) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerAlbumCoverFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerAlbumCoverFragment.java index e122eb2d..1f1838fc 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerAlbumCoverFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerAlbumCoverFragment.java @@ -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()); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerFragment.java index 90289f3c..879892cf 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/PlayerFragment.java @@ -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(); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java index 5ceb7065..28742b40 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/PreferenceUtil.java @@ -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) { diff --git a/app/src/main/res/layout/fragment_folder.xml b/app/src/main/res/layout/fragment_folder.xml index 626121b3..da021c9c 100644 --- a/app/src/main/res/layout/fragment_folder.xml +++ b/app/src/main/res/layout/fragment_folder.xml @@ -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"> + tools:context=".ui.fragments.mainactivity.library.LibraryFragment">