diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java index 732291e3..d8db1694 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PagerAdapter.java @@ -29,8 +29,6 @@ public class PagerAdapter extends FragmentPagerAdapter { @NonNull private final Context mContext; - private int mCurrentPage; - @NonNull private final String[] titles; diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java index 8c2832c4..9ca40bdd 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/PlaylistAdapter.java @@ -25,7 +25,7 @@ import com.kabouzeid.gramophone.loader.PlaylistSongLoader; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; @@ -60,6 +60,15 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter getDataSet() { + return dataSet; + } + + public void swapDataSet(ArrayList dataSet) { + this.dataSet = dataSet; + notifyDataSetChanged(); + } + @Override public long getItemId(int position) { return dataSet.get(position).id; @@ -208,8 +217,8 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter getDataSet() { + return dataSet; + } + + public void swapDataSet(List dataSet) { + this.dataSet = dataSet; + notifyDataSetChanged(); + } + @NonNull @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { @@ -205,8 +214,8 @@ public class AlbumAdapter extends AbsMultiSelectAdapter getDataSet() { + return dataSet; + } + + public void swapDataSet(ArrayList dataSet) { + this.dataSet = dataSet; + notifyDataSetChanged(); + } + @Override public long getItemId(int position) { return dataSet.get(position).id; @@ -170,8 +179,8 @@ public class ArtistAdapter extends AbsMultiSelectAdapter implements MaterialCab Pair[] albumPairs = new Pair[]{ Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_art)) }; - if (activity instanceof AbsFabActivity) - albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); + if (activity instanceof AbsSlidingMusicPanelActivity) + albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(albumPairs); NavigationUtil.goToAlbum(activity, song.albumId, albumPairs); return true; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SmartPlaylistSongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SmartPlaylistSongAdapter.java index c87118fd..9c4c4c9b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SmartPlaylistSongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SmartPlaylistSongAdapter.java @@ -11,7 +11,7 @@ import android.view.View; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.util.NavigationUtil; import java.util.ArrayList; @@ -54,8 +54,8 @@ public class SmartPlaylistSongAdapter extends SongAdapter { Pair[] albumPairs = new Pair[]{ Pair.create(image, activity.getString(R.string.transition_album_art)) }; - if (activity instanceof AbsFabActivity) - albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs); + if (activity instanceof AbsSlidingMusicPanelActivity) + albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(albumPairs); NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).albumId, albumPairs); return true; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java index c249980b..cd85aa67 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java +++ b/app/src/main/java/com/kabouzeid/gramophone/adapter/song/SongAdapter.java @@ -20,7 +20,7 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.nostra13.universalimageloader.core.DisplayImageOptions; @@ -50,6 +50,11 @@ public class SongAdapter extends AbsMultiSelectAdapter dataSet) { + this.dataSet = dataSet; + notifyDataSetChanged(); + } + public ArrayList getDataSet() { return dataSet; } @@ -176,8 +181,8 @@ public class SongAdapter extends AbsMultiSelectAdapter songs, boolean startPlaying) { + public static boolean openAndShuffleQueue(@NonNull final ArrayList songs, boolean startPlaying) { if (musicService != null) { if (!songs.isEmpty()) { MusicPlayerRemote.openQueue(songs, new Random().nextInt(songs.size()), startPlaying); diff --git a/app/src/main/java/com/kabouzeid/gramophone/helper/menu/SongMenuHelper.java b/app/src/main/java/com/kabouzeid/gramophone/helper/menu/SongMenuHelper.java index 41db096d..9bffb76c 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/helper/menu/SongMenuHelper.java +++ b/app/src/main/java/com/kabouzeid/gramophone/helper/menu/SongMenuHelper.java @@ -15,7 +15,7 @@ import com.kabouzeid.gramophone.dialogs.SongDetailDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.interfaces.PaletteColorHolder; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity; import com.kabouzeid.gramophone.util.MusicUtil; @@ -62,14 +62,14 @@ public class SongMenuHelper { return true; case R.id.action_go_to_album: Pair[] albumPairs = null; - if (activity instanceof AbsFabActivity) - albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(null); + if (activity instanceof AbsSlidingMusicPanelActivity) + albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(null); NavigationUtil.goToAlbum(activity, song.albumId, albumPairs); return true; case R.id.action_go_to_artist: Pair[] artistPairs = null; - if (activity instanceof AbsFabActivity) - artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(null); + if (activity instanceof AbsSlidingMusicPanelActivity) + artistPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(null); NavigationUtil.goToArtist(activity, song.artistId, artistPairs); return true; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/interfaces/MusicStateListener.java b/app/src/main/java/com/kabouzeid/gramophone/interfaces/MusicStateListener.java new file mode 100644 index 00000000..a0d7e993 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/interfaces/MusicStateListener.java @@ -0,0 +1,14 @@ +package com.kabouzeid.gramophone.interfaces; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public interface MusicStateListener { + void onPlayingMetaChanged(); + + + void onPlayStateChanged(); + + + void onMediaStoreChanged(); +} 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 6687dc73..f13f34ea 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -919,7 +919,8 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP @Override public void run() { // actually call refresh when the delayed callback fires - notifyChange(MEDIA_STORE_CHANGED); + // do not send a sticky broadcast here + sendBroadcast(new Intent(MEDIA_STORE_CHANGED)); } } 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 3f46a8bd..b2c1fc9d 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 @@ -36,7 +36,7 @@ import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks; import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.model.Album; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity; import com.kabouzeid.gramophone.util.ColorUtil; @@ -58,7 +58,7 @@ import butterknife.InjectView; *

* Should be kinda stable ONLY AS IT IS!!! */ -public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorHolder, CabHolder { +public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder { public static final String TAG = AlbumDetailActivity.class.getSimpleName(); private static final int TAG_EDITOR_REQUEST = 2001; @@ -334,7 +334,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH NavigationUtil.openEqualizer(this); return true; case R.id.action_shuffle_album: - MusicPlayerRemote.openAndShuffleQueue(this, adapter.getDataSet(), true); + MusicPlayerRemote.openAndShuffleQueue(adapter.getDataSet(), true); return true; case android.R.id.home: super.onBackPressed(); @@ -343,7 +343,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH NavigationUtil.openPlayingQueueDialog(this); return true; case R.id.action_now_playing: - NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null)); + NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null)); return true; case R.id.action_tag_editor: Intent intent = new Intent(this, AlbumTagEditorActivity.class); @@ -351,7 +351,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH startActivityForResult(intent, TAG_EDITOR_REQUEST); return true; case R.id.action_go_to_artist: - Pair[] artistPairs = getSharedViewsWithFab(null); + Pair[] artistPairs = getSharedViewsWithPlayPauseFab(null); NavigationUtil.goToArtist(this, album.artistId, artistPairs); return true; } 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 3002967c..04ccb52b 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 @@ -48,7 +48,7 @@ import com.kabouzeid.gramophone.loader.ArtistSongLoader; import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks; import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.model.Artist; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; @@ -75,7 +75,7 @@ import retrofit.client.Response; *

* Should be kinda stable ONLY AS IT IS!!! */ -public class ArtistDetailActivity extends AbsFabActivity implements PaletteColorHolder, CabHolder { +public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder { public static final String TAG = ArtistDetailActivity.class.getSimpleName(); @@ -449,7 +449,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor NavigationUtil.openEqualizer(this); return true; case R.id.action_shuffle_artist: - MusicPlayerRemote.openAndShuffleQueue(this, songAdapter.getDataSet(), true); + MusicPlayerRemote.openAndShuffleQueue(songAdapter.getDataSet(), true); return true; case android.R.id.home: super.onBackPressed(); @@ -469,7 +469,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor setUpArtistImageAndApplyPalette(true); return true; case R.id.action_now_playing: - NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null)); + NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null)); return true; } return super.onOptionsItemSelected(item); 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 62816d70..7d26b360 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,5 +1,6 @@ package com.kabouzeid.gramophone.ui.activities; +import android.content.ComponentName; import android.content.Intent; import android.content.res.ColorStateList; import android.content.res.Configuration; @@ -7,6 +8,7 @@ import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.IBinder; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -46,8 +48,9 @@ import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble; import com.kabouzeid.gramophone.loader.AlbumSongLoader; import com.kabouzeid.gramophone.loader.ArtistSongLoader; import com.kabouzeid.gramophone.loader.PlaylistSongLoader; +import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.model.Song; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment; import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AlbumViewFragment; import com.kabouzeid.gramophone.util.MusicUtil; @@ -66,7 +69,7 @@ import java.util.ArrayList; import butterknife.ButterKnife; import butterknife.InjectView; -public class MainActivity extends AbsFabActivity +public class MainActivity extends AbsSlidingMusicPanelActivity implements KabViewsDisableAble, CabHolder { public static final String TAG = MainActivity.class.getSimpleName(); @@ -86,7 +89,6 @@ public class MainActivity extends AbsFabActivity private ActionBarDrawerToggle drawerToggle; private PagerAdapter pagerAdapter; - private int currentPage = -1; private MaterialCab cab; @Nullable private View navigationDrawerHeader; @@ -117,7 +119,6 @@ public class MainActivity extends AbsFabActivity int startPosition = PreferenceUtil.getInstance(this).getDefaultStartPage(); startPosition = startPosition == -1 ? PreferenceUtil.getInstance(this).getLastStartPage() : startPosition; - currentPage = startPosition; navigationView.getMenu().getItem(startPosition).setChecked(true); @@ -133,7 +134,6 @@ public class MainActivity extends AbsFabActivity @Override public void onPageSelected(int position) { navigationView.getMenu().getItem(position).setChecked(true); - currentPage = position; } @Override @@ -271,7 +271,7 @@ public class MainActivity extends AbsFabActivity @Override public void onClick(View v) { //noinspection ConstantConditions - NavigationUtil.openCurrentPlayingIfPossible(MainActivity.this, getSharedViewsWithFab(new Pair[]{ + NavigationUtil.openCurrentPlayingIfPossible(MainActivity.this, getSharedViewsWithPlayPauseFab(new Pair[]{ Pair.create(navigationDrawerHeader.findViewById(R.id.image), getResources().getString(R.string.transition_album_art) ) @@ -303,9 +303,8 @@ public class MainActivity extends AbsFabActivity try { super.enableViews(); toolbar.setEnabled(true); - ((AbsMainActivityFragment) pagerAdapter.getItem(pager.getCurrentItem())).enableViews(); - } catch (NullPointerException e) { - //Log.e(TAG, "wasn't able to enable the views", e); + ((AbsMainActivityFragment) pagerAdapter.getFragment(pager.getCurrentItem())).enableViews(); + } catch (NullPointerException ignored) { } } @@ -313,9 +312,8 @@ public class MainActivity extends AbsFabActivity public void disableViews() { try { super.disableViews(); - ((AbsMainActivityFragment) pagerAdapter.getItem(pager.getCurrentItem())).disableViews(); - } catch (NullPointerException e) { - //Log.e(TAG, "wasn't able to disable the views", e); + ((AbsMainActivityFragment) pagerAdapter.getFragment(pager.getCurrentItem())).disableViews(); + } catch (NullPointerException ignored) { } } @@ -326,9 +324,8 @@ public class MainActivity extends AbsFabActivity } @Override - public void onServiceConnected() { - super.onServiceConnected(); - updateNavigationDrawerHeader(); + public void onServiceConnected(ComponentName name, IBinder service) { + super.onServiceConnected(name, service); handlePlaybackIntent(getIntent()); } @@ -371,7 +368,7 @@ public class MainActivity extends AbsFabActivity NavigationUtil.openEqualizer(this); return true; case R.id.action_shuffle_all: - MusicPlayerRemote.shuffleAllSongs(this, true); + MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(this), true); return true; case R.id.action_new_playlist: CreatePlaylistDialog.create().show(getSupportFragmentManager(), "CREATE_PLAYLIST"); @@ -380,7 +377,7 @@ public class MainActivity extends AbsFabActivity startActivity(new Intent(MainActivity.this, SearchActivity.class)); return true; case R.id.action_now_playing: - NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null)); + NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null)); return true; case R.id.action_playing_queue: NavigationUtil.openPlayingQueueDialog(this); @@ -405,7 +402,7 @@ public class MainActivity extends AbsFabActivity @Override protected void onPause() { super.onPause(); - PreferenceUtil.getInstance(MainActivity.this).setLastStartPage(currentPage); + PreferenceUtil.getInstance(MainActivity.this).setLastStartPage(pager.getCurrentItem()); } private void handlePlaybackIntent(@Nullable Intent intent) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java index 3ee1c425..a12ddf22 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MusicControllerActivity.java @@ -43,10 +43,11 @@ import com.kabouzeid.gramophone.dialogs.SongDetailDialog; import com.kabouzeid.gramophone.dialogs.SongShareDialog; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.imageloader.BlurProcessor; +import com.kabouzeid.gramophone.loader.SongLoader; import com.kabouzeid.gramophone.misc.SmallTransitionListener; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.service.MusicService; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity; import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity; import com.kabouzeid.gramophone.util.ColorUtil; @@ -68,7 +69,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import hugo.weaving.DebugLog; -public class MusicControllerActivity extends AbsFabActivity { +public class MusicControllerActivity extends AbsSlidingMusicPanelActivity { public static final String TAG = MusicControllerActivity.class.getSimpleName(); private static final int FAB_CIRCULAR_REVEAL_ANIMATION_TIME = 1000; @@ -193,11 +194,11 @@ public class MusicControllerActivity extends AbsFabActivity { @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override public void onTransitionEnd(Transition transition) { - int cx = (getFab().getLeft() + getFab().getRight()) / 2; - int cy = (getFab().getTop() + getFab().getBottom()) / 2; + int cx = (getPlayPauseFab().getLeft() + getPlayPauseFab().getRight()) / 2; + int cy = (getPlayPauseFab().getTop() + getPlayPauseFab().getBottom()) / 2; int finalRadius = Math.max(mediaControllerContainer.getWidth(), mediaControllerContainer.getHeight()); - Animator animator = ViewAnimationUtils.createCircularReveal(mediaControllerContainer, cx, cy, getFab().getWidth() / 2, finalRadius); + Animator animator = ViewAnimationUtils.createCircularReveal(mediaControllerContainer, cx, cy, getPlayPauseFab().getWidth() / 2, finalRadius); animator.setInterpolator(new DecelerateInterpolator()); animator.setDuration(FAB_CIRCULAR_REVEAL_ANIMATION_TIME); animator.start(); @@ -225,11 +226,13 @@ public class MusicControllerActivity extends AbsFabActivity { } private void startUpdatingProgressViews() { + startHandler(); progressViewsUpdateHandler.sendEmptyMessage(CMD_UPDATE_PROGRESS_VIEWS); } private void stopUpdatingProgressViews() { progressViewsUpdateHandler.removeMessages(CMD_UPDATE_PROGRESS_VIEWS); + stopHandler(); } private void initAppearanceVarsFromSharedPrefs() { @@ -244,7 +247,7 @@ public class MusicControllerActivity extends AbsFabActivity { @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - getFab().setOnLongClickListener(null); + getPlayPauseFab().setOnLongClickListener(null); } @@ -384,9 +387,6 @@ public class MusicControllerActivity extends AbsFabActivity { @Override protected void onResume() { super.onResume(); - updateControllerState(); - updateCurrentSong(); - startHandler(); startUpdatingProgressViews(); } @@ -394,7 +394,6 @@ public class MusicControllerActivity extends AbsFabActivity { protected void onPause() { super.onPause(); stopUpdatingProgressViews(); - stopHandler(); } private void updateCurrentSong() { @@ -536,12 +535,6 @@ public class MusicControllerActivity extends AbsFabActivity { }); } - protected void updateControllerState() { - updateFabState(); - updateRepeatState(); - updateShuffleState(); - } - private void animateSetFavorite() { favoriteIcon.clearAnimation(); @@ -641,7 +634,7 @@ public class MusicControllerActivity extends AbsFabActivity { NavigationUtil.openEqualizer(this); return true; case R.id.action_shuffle_all: - MusicPlayerRemote.shuffleAllSongs(this, true); + MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(this), true); return true; case R.id.action_add_to_playlist: AddToPlaylistDialog.create(song).show(getSupportFragmentManager(), "ADD_PLAYLIST"); @@ -662,10 +655,10 @@ public class MusicControllerActivity extends AbsFabActivity { SongDetailDialog.create(songFile).show(getSupportFragmentManager(), "SONG_DETAIL"); return true; case R.id.action_go_to_album: - NavigationUtil.goToAlbum(this, song.albumId, getSharedViewsWithFab(null)); + NavigationUtil.goToAlbum(this, song.albumId, getSharedViewsWithPlayPauseFab(null)); return true; case R.id.action_go_to_artist: - NavigationUtil.goToArtist(this, song.artistId, getSharedViewsWithFab(null)); + NavigationUtil.goToArtist(this, song.artistId, getSharedViewsWithPlayPauseFab(null)); return true; } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java index 1bdc85aa..61be5dfd 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/PlaylistDetailActivity.java @@ -23,7 +23,7 @@ import com.kabouzeid.gramophone.misc.DragSortRecycler; import com.kabouzeid.gramophone.model.Playlist; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist; -import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity; +import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.util.PlaylistsUtil; import com.kabouzeid.gramophone.util.PreferenceUtil; @@ -31,7 +31,7 @@ import com.kabouzeid.gramophone.util.PreferenceUtil; import butterknife.ButterKnife; import butterknife.InjectView; -public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder { +public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity implements CabHolder { public static final String TAG = PlaylistDetailActivity.class.getSimpleName(); @@ -132,7 +132,7 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder new SleepTimerDialog().show(getSupportFragmentManager(), "SET_SLEEP_TIMER"); return true; case R.id.action_shuffle_playlist: - MusicPlayerRemote.openAndShuffleQueue(this, adapter.getDataSet(), true); + MusicPlayerRemote.openAndShuffleQueue(adapter.getDataSet(), true); return true; case R.id.action_equalizer: NavigationUtil.openEqualizer(this); @@ -141,7 +141,7 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder onBackPressed(); return true; case R.id.action_now_playing: - NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null)); + NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null)); return true; case R.id.action_playing_queue: NavigationUtil.openPlayingQueueDialog(this); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java index 56ee1271..bc6def30 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsBaseActivity.java @@ -24,11 +24,21 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie enableViews(); } + /** + * Should be overwritten and re enable all {@link android.view.View} to ensure they are accessible again + *

+ * This is necessary because of a bug with the shared element transition + */ @Override public void enableViews() { areViewsEnabled = true; } + /** + * Should be overwritten and disable all views that start a new activity on click to prevent opening an activity multiple times + *

+ * This is necessary because of a bug with the shared element transition + */ @Override public void disableViews() { areViewsEnabled = false; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicStateActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicStateActivity.java new file mode 100644 index 00000000..b3450654 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsMusicStateActivity.java @@ -0,0 +1,145 @@ +package com.kabouzeid.gramophone.ui.activities.base; + +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.ServiceConnection; +import android.os.Bundle; +import android.os.IBinder; +import android.support.annotation.NonNull; + +import com.kabouzeid.gramophone.helper.MusicPlayerRemote; +import com.kabouzeid.gramophone.interfaces.MusicStateListener; +import com.kabouzeid.gramophone.service.MusicService; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; + +/** + * @author Karim Abou Zeid (kabouzeid) + */ +public abstract class AbsMusicStateActivity extends AbsBaseActivity implements ServiceConnection, MusicStateListener { + public static final String TAG = AbsMusicStateActivity.class.getSimpleName(); + + private final ArrayList mMusicStateListener = new ArrayList<>(); + + private MusicPlayerRemote.ServiceToken serviceToken; + private MusicStateReceiver musicStateReceiver; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + serviceToken = MusicPlayerRemote.bindToService(this, this); + musicStateReceiver = new MusicStateReceiver(this); + + final IntentFilter filter = new IntentFilter(); + filter.addAction(MusicService.PLAY_STATE_CHANGED); + filter.addAction(MusicService.SHUFFLE_MODE_CHANGED); + filter.addAction(MusicService.REPEAT_MODE_CHANGED); + filter.addAction(MusicService.META_CHANGED); + filter.addAction(MusicService.MEDIA_STORE_CHANGED); + + registerReceiver(musicStateReceiver, filter); + } + + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + onPlayStateChanged(); + onPlayingMetaChanged(); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + + } + + @Override + protected void onDestroy() { + super.onDestroy(); + MusicPlayerRemote.unbindFromService(serviceToken); + unregisterReceiver(musicStateReceiver); + } + + public void addMusicStateListenerListener(final MusicStateListener listener) { + if (listener != null) { + mMusicStateListener.add(listener); + } + } + + public void removeMusicStateListenerListener(final MusicStateListener listener) { + if (listener != null) { + mMusicStateListener.remove(listener); + } + } + + @Override + public void onPlayingMetaChanged() { + for (MusicStateListener listener : mMusicStateListener) { + if (listener != null) { + listener.onPlayingMetaChanged(); + } + } + } + + @Override + public void onPlayStateChanged() { + for (MusicStateListener listener : mMusicStateListener) { + if (listener != null) { + listener.onPlayStateChanged(); + } + } + } + + @Override + public void onMediaStoreChanged() { + for (MusicStateListener listener : mMusicStateListener) { + if (listener != null) { + listener.onMediaStoreChanged(); + } + } + } + + public void onRepeatModeChanged() { + + } + + public void onShuffleModeChanged() { + + } + + private static final class MusicStateReceiver extends BroadcastReceiver { + + private final WeakReference reference; + + public MusicStateReceiver(final AbsMusicStateActivity activity) { + reference = new WeakReference<>(activity); + } + + @Override + public void onReceive(final Context context, @NonNull final Intent intent) { + final String action = intent.getAction(); + AbsMusicStateActivity activity = reference.get(); + if (activity != null) { + switch (action) { + case MusicService.META_CHANGED: + activity.onPlayingMetaChanged(); + break; + case MusicService.PLAY_STATE_CHANGED: + activity.onPlayStateChanged(); + break; + case MusicService.REPEAT_MODE_CHANGED: + activity.onRepeatModeChanged(); + break; + case MusicService.SHUFFLE_MODE_CHANGED: + activity.onShuffleModeChanged(); + break; + case MusicService.MEDIA_STORE_CHANGED: + activity.onMediaStoreChanged(); + break; + } + } + } + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsPlaybackControlActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsPlaybackControlActivity.java deleted file mode 100644 index ed1dda56..00000000 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsPlaybackControlActivity.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.kabouzeid.gramophone.ui.activities.base; - -import android.content.BroadcastReceiver; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.ServiceConnection; -import android.os.Bundle; -import android.os.IBinder; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; - -import com.kabouzeid.gramophone.helper.MusicPlayerRemote; -import com.kabouzeid.gramophone.service.MusicService; - -import java.lang.ref.WeakReference; - -/** - * @author Karim Abou Zeid (kabouzeid) - */ -public abstract class AbsPlaybackControlActivity extends AbsBaseActivity { - @Nullable - private MusicPlayerRemote.ServiceToken serviceToken; - private PlaybackStatusReceiver playbackStatusReceiver; - - public void onPlayingMetaChanged() { - - } - - public void onPlayStateChanged() { - - } - - public void onRepeatModeChanged() { - - } - - public void onShuffleModeChanged() { - - } - - public void onServiceConnected() { - - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - serviceToken = MusicPlayerRemote.bindToService(this, new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - AbsPlaybackControlActivity.this.onServiceConnected(); - } - - @Override - public void onServiceDisconnected(ComponentName name) { - - } - }); - playbackStatusReceiver = new PlaybackStatusReceiver(this); - } - - @Override - protected void onStart() { - super.onStart(); - - final IntentFilter filter = new IntentFilter(); - filter.addAction(MusicService.PLAY_STATE_CHANGED); - filter.addAction(MusicService.SHUFFLE_MODE_CHANGED); - filter.addAction(MusicService.REPEAT_MODE_CHANGED); - filter.addAction(MusicService.META_CHANGED); - - registerReceiver(playbackStatusReceiver, filter); - } - - @Override - protected void onStop() { - super.onStop(); - try { - unregisterReceiver(playbackStatusReceiver); - } catch (Throwable ignored) { - } - } - - @Override - protected void onDestroy() { - super.onDestroy(); - MusicPlayerRemote.unbindFromService(serviceToken); - } - - private static final class PlaybackStatusReceiver extends BroadcastReceiver { - - @NonNull - private final WeakReference reference; - - public PlaybackStatusReceiver(final AbsPlaybackControlActivity activity) { - reference = new WeakReference<>(activity); - } - - @Override - public void onReceive(final Context context, @NonNull final Intent intent) { - final String action = intent.getAction(); - switch (action) { - case MusicService.META_CHANGED: - reference.get().onPlayingMetaChanged(); - break; - case MusicService.PLAY_STATE_CHANGED: - reference.get().onPlayStateChanged(); - break; - case MusicService.REPEAT_MODE_CHANGED: - reference.get().onRepeatModeChanged(); - break; - case MusicService.SHUFFLE_MODE_CHANGED: - reference.get().onShuffleModeChanged(); - break; - } - } - } -} diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java similarity index 56% rename from app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java rename to app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java index d5ac54b3..b5c65fe0 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsFabActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/base/AbsSlidingMusicPanelActivity.java @@ -22,54 +22,46 @@ import com.kabouzeid.gramophone.util.ColorUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.kabouzeid.gramophone.views.PlayPauseDrawable; -import butterknife.ButterKnife; -import butterknife.InjectView; -import butterknife.Optional; - /** * @author Karim Abou Zeid (kabouzeid) */ -public abstract class AbsFabActivity extends AbsPlaybackControlActivity { - public static final String TAG = AbsFabActivity.class.getSimpleName(); +public abstract class AbsSlidingMusicPanelActivity extends AbsMusicStateActivity { + public static final String TAG = AbsSlidingMusicPanelActivity.class.getSimpleName(); - @Nullable - @Optional - @InjectView(R.id.fab) - FloatingActionButton fab; + FloatingActionButton playPauseFab; private PlayPauseDrawable playPauseDrawable; @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); - ButterKnife.inject(this); - setUpFab(); + setUpPlayPauseButton(); } - private void setUpFab() { + private void setUpPlayPauseButton() { if (playPauseDrawable == null) { playPauseDrawable = new PlayPauseDrawable(this); } - getFab().setImageDrawable(playPauseDrawable); + getPlayPauseFab().setImageDrawable(playPauseDrawable); final int accentColor = ThemeSingleton.get().positiveColor; - getFab().setBackgroundTintList(ColorUtil.getEmptyColorStateList(accentColor)); + getPlayPauseFab().setBackgroundTintList(ColorUtil.getEmptyColorStateList(accentColor)); if (accentColor == Color.WHITE) { - getFab().getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN); + getPlayPauseFab().getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN); } else { - getFab().getDrawable().clearColorFilter(); + getPlayPauseFab().getDrawable().clearColorFilter(); } - updateFabState(); + updateFabState(false); final GestureDetector gestureDetector = new GestureDetector(this, new SmallOnGestureListener() { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - NavigationUtil.openCurrentPlayingIfPossible(AbsFabActivity.this, getSharedViewsWithFab(null)); + NavigationUtil.openCurrentPlayingIfPossible(AbsSlidingMusicPanelActivity.this, getSharedViewsWithPlayPauseFab(null)); return true; } }); - getFab().setOnClickListener(new View.OnClickListener() { + getPlayPauseFab().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (MusicPlayerRemote.getPosition() != -1) { @@ -79,12 +71,12 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity { MusicPlayerRemote.resumePlaying(); } } else { - Toast.makeText(AbsFabActivity.this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show(); + Toast.makeText(AbsSlidingMusicPanelActivity.this, getResources().getString(R.string.playing_queue_empty), Toast.LENGTH_SHORT).show(); } } }); - getFab().setOnTouchListener(new View.OnTouchListener() { + getPlayPauseFab().setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, @NonNull MotionEvent event) { gestureDetector.onTouchEvent(event); @@ -92,55 +84,41 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity { } }); - getFab().setOnLongClickListener(new View.OnLongClickListener() { + getPlayPauseFab().setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { final Song song = MusicPlayerRemote.getCurrentSong(); if (song.id != -1) { - Toast.makeText(AbsFabActivity.this, song.title + " - " + song.artistName, Toast.LENGTH_SHORT).show(); + Toast.makeText(AbsSlidingMusicPanelActivity.this, song.title + " - " + song.artistName, Toast.LENGTH_SHORT).show(); } else { - Toast.makeText(AbsFabActivity.this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show(); + Toast.makeText(AbsSlidingMusicPanelActivity.this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show(); } return true; } }); } - protected void updateFabState() { + protected void updateFabState(boolean animate) { if (MusicPlayerRemote.isPlaying()) { - playPauseDrawable.setPause(); + playPauseDrawable.setPause(animate); } else { - playPauseDrawable.setPlay(); - } - } - - protected void animateUpdateFabState() { - if (MusicPlayerRemote.isPlaying()) { - setFabPause(); - } else { - setFabPlay(); + playPauseDrawable.setPlay(animate); } } @NonNull - protected FloatingActionButton getFab() { - if (fab == null) { - fab = (FloatingActionButton) findViewById(R.id.fab); - if (fab == null) { - fab = new FloatingActionButton(this); - Log.e(TAG, "No FAB found created default FAB."); + protected FloatingActionButton getPlayPauseFab() { + if (playPauseFab == null) { + playPauseFab = (FloatingActionButton) findViewById(R.id.play_pause_fab); + if (playPauseFab == null) { + playPauseFab = new FloatingActionButton(this); + Log.e(TAG, "PlayPauseFAB not found, created default FAB."); } } - return fab; + return playPauseFab; } - @Override - protected void onResume() { - super.onResume(); - updateFabState(); - } - - public Pair[] getSharedViewsWithFab(@Nullable Pair[] sharedViews) { + public Pair[] getSharedViewsWithPlayPauseFab(@Nullable Pair[] sharedViews) { Pair[] sharedViewsWithFab; if (sharedViews != null) { sharedViewsWithFab = new Pair[sharedViews.length + 1]; @@ -148,21 +126,13 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity { } else { sharedViewsWithFab = new Pair[1]; } - sharedViewsWithFab[sharedViewsWithFab.length - 1] = Pair.create((View) getFab(), getString(R.string.transition_fab)); + sharedViewsWithFab[sharedViewsWithFab.length - 1] = Pair.create((View) getPlayPauseFab(), getString(R.string.transition_fab)); return sharedViewsWithFab; } @Override public void onPlayStateChanged() { super.onPlayStateChanged(); - animateUpdateFabState(); - } - - private void setFabPlay() { - playPauseDrawable.animatedPlay(); - } - - private void setFabPause() { - playPauseDrawable.animatedPause(); + updateFabState(true); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java index 3aefce01..c94c408e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/tageditor/AbsTagEditorActivity.java @@ -70,7 +70,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity { private int paletteColorPrimary; private boolean isInNoImageMode; - @InjectView(R.id.fab) + @InjectView(R.id.play_pause_fab) FloatingActionButton fab; @InjectView(R.id.observableScrollView) ObservableScrollView observableScrollView; diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java index 88d6f0c4..6df761a7 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AbsMainActivityRecyclerViewFragment.java @@ -14,6 +14,7 @@ import android.view.ViewGroup; import android.widget.TextView; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.interfaces.MusicStateListener; import com.kabouzeid.gramophone.views.FastScroller; import butterknife.ButterKnife; @@ -23,7 +24,7 @@ import butterknife.Optional; /** * @author Karim Abou Zeid (kabouzeid) */ -public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivityFragment implements OnOffsetChangedListener { +public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicStateListener { public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName(); @@ -38,7 +39,7 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit @InjectView(R.id.fast_scroller) FastScroller fastScroller; - private RecyclerView.Adapter mAdapter; + private A mAdapter; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -56,6 +57,7 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit } getMainActivity().addOnAppBarOffsetChangedListener(this); + getMainActivity().addMusicStateListenerListener(this); setUpRecyclerView(); @@ -76,7 +78,7 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit recyclerView.setAdapter(mAdapter); } - public RecyclerView.Adapter getAdapter() { + public A getAdapter() { return mAdapter; } @@ -93,6 +95,16 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit } } + @Override + public void onPlayingMetaChanged() { + + } + + @Override + public void onPlayStateChanged() { + + } + @Override public void enableViews() { super.enableViews(); @@ -131,13 +143,13 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit protected abstract RecyclerView.LayoutManager createLayoutManager(); - @NonNull - protected abstract RecyclerView.Adapter createAdapter(); + protected abstract A createAdapter(); @Override public void onDestroyView() { super.onDestroyView(); getMainActivity().removeOnAppBarOffsetChangedListener(this); + getMainActivity().removeMusicStateListenerListener(this); ButterKnife.reset(this); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java index 1e0694ce..61432a69 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/AlbumViewFragment.java @@ -13,7 +13,7 @@ import com.kabouzeid.gramophone.util.Util; /** * @author Karim Abou Zeid (kabouzeid) */ -public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment { +public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment { public static final String TAG = AlbumViewFragment.class.getSimpleName(); private GridLayoutManager layoutManager; @@ -27,8 +27,12 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment { @NonNull @Override - protected RecyclerView.Adapter createAdapter() { - return new AlbumAdapter(getMainActivity(), AlbumLoader.getAllAlbums(getActivity()), R.layout.item_grid, getMainActivity()); + protected AlbumAdapter createAdapter() { + return new AlbumAdapter( + getMainActivity(), + AlbumLoader.getAllAlbums(getActivity()), + R.layout.item_grid, + getMainActivity()); } @Override @@ -40,4 +44,9 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment { layoutManager.setSpanCount(columns); layoutManager.requestLayout(); } + + @Override + public void onMediaStoreChanged() { + getAdapter().swapDataSet(AlbumLoader.getAllAlbums(getActivity())); + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/ArtistViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/ArtistViewFragment.java index 89d58d9f..f6b0f7be 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/ArtistViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/ArtistViewFragment.java @@ -11,7 +11,7 @@ import com.kabouzeid.gramophone.loader.ArtistLoader; /** * @author Karim Abou Zeid (kabouzeid) */ -public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment { +public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment { public static final String TAG = ArtistViewFragment.class.getSimpleName(); @@ -23,7 +23,7 @@ public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment { @NonNull @Override - protected RecyclerView.Adapter createAdapter() { + protected ArtistAdapter createAdapter() { return new ArtistAdapter( getMainActivity(), ArtistLoader.getAllArtists(getActivity()), @@ -35,4 +35,9 @@ public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment { protected int getEmptyMessage() { return R.string.no_artists; } + + @Override + public void onMediaStoreChanged() { + getAdapter().swapDataSet(ArtistLoader.getAllArtists(getActivity())); + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java index 7cc1aafd..740a8777 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/PlaylistViewFragment.java @@ -17,7 +17,7 @@ import java.util.ArrayList; /** * @author Karim Abou Zeid (kabouzeid) */ -public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment { +public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment { public static final String TAG = PlaylistViewFragment.class.getSimpleName(); @@ -29,7 +29,21 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment { @NonNull @Override - protected RecyclerView.Adapter createAdapter() { + protected PlaylistAdapter createAdapter() { + return new PlaylistAdapter(getMainActivity(), getAllPlaylists(), R.layout.item_list_single_row, getMainActivity()); + } + + @Override + protected int getEmptyMessage() { + return R.string.no_playlists; + } + + @Override + public void onMediaStoreChanged() { + getAdapter().swapDataSet(getAllPlaylists()); + } + + private ArrayList getAllPlaylists() { ArrayList playlists = new ArrayList<>(); playlists.add(new LastAddedPlaylist(getActivity())); @@ -38,11 +52,6 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment { playlists.addAll(PlaylistLoader.getAllPlaylists(getActivity())); - return new PlaylistAdapter(getMainActivity(), playlists, R.layout.item_list_single_row, getMainActivity()); - } - - @Override - protected int getEmptyMessage() { - return R.string.no_playlists; + return playlists; } } \ No newline at end of file diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java index 8df83ad2..e3922602 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivityfragments/SongViewFragment.java @@ -11,7 +11,7 @@ import com.kabouzeid.gramophone.loader.SongLoader; /** * @author Karim Abou Zeid (kabouzeid) */ -public class SongViewFragment extends AbsMainActivityRecyclerViewFragment { +public class SongViewFragment extends AbsMainActivityRecyclerViewFragment { public static final String TAG = SongViewFragment.class.getSimpleName(); @@ -23,7 +23,7 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewFragment { @NonNull @Override - protected RecyclerView.Adapter createAdapter() { + protected SongAdapter createAdapter() { return new SongAdapter(getMainActivity(), SongLoader.getAllSongs(getActivity()), R.layout.item_list, getMainActivity()); } @@ -31,4 +31,9 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewFragment { protected int getEmptyMessage() { return R.string.no_songs; } + + @Override + public void onMediaStoreChanged() { + getAdapter().swapDataSet(SongLoader.getAllSongs(getActivity())); + } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java b/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java index 4ab5c526..ec998f8a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java +++ b/app/src/main/java/com/kabouzeid/gramophone/util/NavigationUtil.java @@ -105,7 +105,7 @@ public class NavigationUtil { } } } else { - Toast.makeText(activity, activity.getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show(); + Toast.makeText(activity, activity.getResources().getString(R.string.playing_queue_empty), Toast.LENGTH_SHORT).show(); } } @@ -114,7 +114,7 @@ public class NavigationUtil { if (dialog != null) { dialog.show(activity.getSupportFragmentManager(), "PLAY_QUEUE"); } else { - Toast.makeText(activity, activity.getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show(); + Toast.makeText(activity, activity.getResources().getString(R.string.playing_queue_empty), Toast.LENGTH_SHORT).show(); } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/PlayPauseDrawable.java b/app/src/main/java/com/kabouzeid/gramophone/views/PlayPauseDrawable.java index 8f645315..a6a3cd9e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/views/PlayPauseDrawable.java +++ b/app/src/main/java/com/kabouzeid/gramophone/views/PlayPauseDrawable.java @@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.views; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; import android.content.res.Resources; @@ -50,7 +49,7 @@ public class PlayPauseDrawable extends Drawable { private boolean isPlay; private boolean isPlaySet; - private AnimatorSet animatorSet; + private Animator animator; public PlayPauseDrawable(@NonNull Context context) { final Resources res = context.getResources(); @@ -173,40 +172,38 @@ public class PlayPauseDrawable extends Drawable { return a + (b - a) * t; } - public void animatedPlay() { - if (!isPlaySet) { - togglePlayPause(); + public void setPlay(boolean animate) { + if (animate) { + if (!isPlaySet) { + togglePlayPause(); + } + } else { + isPlaySet = true; + isPlay = true; + setProgress(1); } } - public void animatedPause() { - if (isPlaySet) { - togglePlayPause(); + public void setPause(boolean animate) { + if (animate) { + if (isPlaySet) { + togglePlayPause(); + } + } else { + isPlaySet = false; + isPlay = false; + setProgress(0); } } - public void setPlay() { - isPlaySet = true; - isPlay = true; - setProgress(1); - } - - public void setPause() { - isPlaySet = false; - isPlay = false; - setProgress(0); - } - public void togglePlayPause() { - if (animatorSet != null) { - animatorSet.cancel(); + if (animator != null) { + animator.cancel(); } - animatorSet = new AnimatorSet(); - final Animator pausePlayAnim = getPausePlayAnimator(); - animatorSet.setInterpolator(new DecelerateInterpolator()); - animatorSet.setDuration(PLAY_PAUSE_ANIMATION_DURATION); - animatorSet.playTogether(pausePlayAnim); - animatorSet.start(); + animator = getPausePlayAnimator(); + animator.setInterpolator(new DecelerateInterpolator()); + animator.setDuration(PLAY_PAUSE_ANIMATION_DURATION); + animator.start(); } } diff --git a/app/src/main/res/layout/activity_album_detail.xml b/app/src/main/res/layout/activity_album_detail.xml index 93f396de..f67022f8 100644 --- a/app/src/main/res/layout/activity_album_detail.xml +++ b/app/src/main/res/layout/activity_album_detail.xml @@ -97,7 +97,7 @@ diff --git a/app/src/main/res/layout/activity_album_tag_editor.xml b/app/src/main/res/layout/activity_album_tag_editor.xml index c43d4dae..50ec94e2 100644 --- a/app/src/main/res/layout/activity_album_tag_editor.xml +++ b/app/src/main/res/layout/activity_album_tag_editor.xml @@ -143,7 +143,7 @@ tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0cc0c65e..5a2a4b49 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -55,7 +55,7 @@ app:layout_behavior="@string/appbar_scrolling_view_behavior" /> diff --git a/app/src/main/res/layout/activity_music_controller.xml b/app/src/main/res/layout/activity_music_controller.xml index ba8fb4a9..9205ef06 100644 --- a/app/src/main/res/layout/activity_music_controller.xml +++ b/app/src/main/res/layout/activity_music_controller.xml @@ -120,8 +120,8 @@ android:layout_centerVertical="true" android:layout_marginEnd="@dimen/tmp_now_playing_skip_rewind_margin" android:layout_marginRight="@dimen/tmp_now_playing_skip_rewind_margin" - android:layout_toLeftOf="@+id/fab" - android:layout_toStartOf="@+id/fab" + android:layout_toLeftOf="@+id/play_pause_fab" + android:layout_toStartOf="@+id/play_pause_fab" android:background="?round_selector" android:elevation="8dp" android:padding="22dp" @@ -135,8 +135,8 @@ android:layout_centerVertical="true" android:layout_marginLeft="@dimen/tmp_now_playing_skip_rewind_margin" android:layout_marginStart="@dimen/tmp_now_playing_skip_rewind_margin" - android:layout_toEndOf="@+id/fab" - android:layout_toRightOf="@+id/fab" + android:layout_toEndOf="@+id/play_pause_fab" + android:layout_toRightOf="@+id/play_pause_fab" android:background="?round_selector" android:elevation="8dp" android:padding="22dp" @@ -174,7 +174,7 @@ android:src="@drawable/ic_shuffle_white_36dp" /> diff --git a/app/src/main/res/layout/activity_playlist_detail.xml b/app/src/main/res/layout/activity_playlist_detail.xml index e5bd9aed..be298454 100644 --- a/app/src/main/res/layout/activity_playlist_detail.xml +++ b/app/src/main/res/layout/activity_playlist_detail.xml @@ -46,7 +46,7 @@ android:textSize="@dimen/empty_text_size" /> diff --git a/app/src/main/res/layout/activity_song_tag_editor.xml b/app/src/main/res/layout/activity_song_tag_editor.xml index 4ccbb9a7..e35dd22d 100644 --- a/app/src/main/res/layout/activity_song_tag_editor.xml +++ b/app/src/main/res/layout/activity_song_tag_editor.xml @@ -174,7 +174,7 @@ tools:ignore="RtlHardcoded" /> diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 9fc2b038..6538b4dc 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -28,7 +28,7 @@ الفنانون الأغاني قوائم التشغيل - لا شيء قيد التشغيل + لا شيء قيد التشغيل عذراً، حصل خطأ أثناء محاولة تشغيل الأغنية عذراً، لم يتم العثور على سيرة ذاتية مطابقة لهذا الفنان سيرة ذاتية diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index fc380aac..f2f672dc 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -25,7 +25,7 @@ Interpreti Skladby Playlisty - Nic nehraje + Nic nehraje Omlouváme se, při pokusu přehrát tuto skladbu došlo k chybě Omlouváme se, k tomuto interpretovi nemůžeme sehnat doplňující informace. Biografie diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 5526aecc..55f8cb90 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -27,7 +27,7 @@ Interpreten Titel Wiedergabelisten - Keine Wiedergabe + Keine Wiedergabe Der Song kann nicht abgespielt werden Es konnte keine passende Biografie für diesen Interpreten gefunden werden Biografie diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 9e02519c..6ae61815 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -14,7 +14,7 @@ Καλλιτέχνες Τραγούδια Λίστες αναπαραγωγής - Δεν παίζει τίποτα + Δεν παίζει τίποτα Συγγνώμη - Υπήρξε σφάλμα στην προσπάθεια αναπαραγωγής Συγγνώμη, δεν βρήκαμε τη βιογραφία αυτού του καλλιτέχνη Βιογραφία diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 4193b17f..98d533ba 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -27,7 +27,7 @@ Artistas Canciones Listas de reproducción - Nada se está reproduciendo + Nada se está reproduciendo Ocurrió un error al reproducir esta canción. Lo sentimos, no encontramos una biografía correspondiente a éste artista Biografía @@ -106,6 +106,7 @@ Tema general Audio General + Imágenes Pantalla de bloqueo Selecciona en qué secciones la barra debe tener color Color en la barra de navegación @@ -119,6 +120,7 @@ Pie de álbum coloreado Arte del álbum en la pantalla de bloqueo Notificación coloreada + Ignorar arte proveniente de almacenamiento Quitar silencio entre canciones Forzar portada de álbum a cuadrado Barra de Reproducción Actual opaca @@ -162,6 +164,7 @@ La caja detrás de la tapa del álbum donde se encuentra el título de la canción y el artista es mas largo que su altura. Usa una barra de progreso que no cubre la tapa del álbum en vez de la barra normal de progreso. Mostrar tarjeta detrás de los botones de control de reproducción (reproducir/pausar, etc). + Si bien la calidad del arte de tapa del almacenamiento tiene mejor calidad, puede tardar más en cargar. Sólo activar si no se quieren artes de tapa de baja resolución. "No se puede descargar una tapa de álbum coincidente." Buscar en librería... Escaneando contenido... diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index a4080f1f..8dc45395 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -14,7 +14,7 @@ Artistit Kappaleet Soittolistat - Mitään ei toisteta + Mitään ei toisteta Virhe toistettaessa kappaletta Biogtagiaa ei löytynyt tälle artistille Biografia diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 04bcc164..640cf827 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -27,7 +27,7 @@ Artistes Titres Playlists - Aucune lecture en cours + Aucune lecture en cours Une erreur est survenue lors de la tentative de lecture de ce titre. Nous n\'avons pas trouvé la biographie correspondant à cet artiste. Biographie @@ -104,6 +104,7 @@ Thème général Audio Général + Images Écran de vérouillage Dans quelles vues la barre navigation doit être colorée. Barre de navigation colorée @@ -117,6 +118,7 @@ Bas d\'album coloré Vignette d\'album sur l\'écran de vérouillage Notification colorée + Ignorer stockage des artwork media Lecture sans coupure Vignette carrée Barre d\'outil opaque @@ -160,6 +162,7 @@ La boîte en dessous de la vignette de l\'album où se trouvent le titre de la musique et l\'artiste est plus large dans sa hauteur. Utilise une barre de progression qui ne recouvre pas la vignette de l\'album à la place de la barre de progression normale. Affiche une carte derrière les boutons de lecture (lecture/pause etc.) + Countourner le stockage media, ce qui peut augmenter la qualité des images mais peut cause des temps de chargement plus longs. N\'activez que si vous avez des problèmes de basse résolution des images "Impossible de télécharger la vignette correspondant à l'album." Rechercher votre bibliothèque... Réanalyse des médias… diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 2cb9730e..b0111c7b 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -27,7 +27,7 @@ Izvođači Pjesme Popisi pjesama - Ništa se ne reproducira + Ništa se ne reproducira Došlo je do greške prilikom pokušaja reproduciranja ove pjesme Nismo mogli pronaći biografiju ovog izvođača Biografija diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index e76319b7..8717cf5e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -27,7 +27,7 @@ Artisti Brani Playlist - Niente in riproduzione + Niente in riproduzione Spiacenti - Si è verificato un errore nel tentativo di riprodurre questa canzone. Spiacenti - Impossibile trovare una biografia corrispondente a questo artista. Biografia diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 4ac5bbc6..25d4c163 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -27,7 +27,7 @@ アーティスト 楽曲 プレイリスト - 再生中の曲はありません + 再生中の曲はありません 楽曲の再生時にエラーが発生しました バイオグラフィーが見つかりません バイオグラフィー diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 1b3dac87..a4b150be 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -27,7 +27,7 @@ 아티스트 노래 재생목록 - 재생 중인 노래가 없습니다. + 재생 중인 노래가 없습니다. 이 노래를 재생하려던 중 오류가 발생했습니다. 이 아티스트와 일치하는 정보를 찾을 수 없습니다. 정보 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 5b718c53..38abeedc 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -27,7 +27,7 @@ Artiesten Nummers Afspeellijsten - Niets wordt afgespeeld + Niets wordt afgespeeld Er is een fout opgetreden bij het afspelen van dit nummer. Het is niet gelukt een passende biografie te vinden voor deze artiest. Biografie diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index 0adc9368..3da0ec52 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -14,7 +14,7 @@ Artistar Songar Spelelister - Ingenting speler + Ingenting speler Orsak - ein feil oppstod medan spelaren prøvde å spele denne songen Orsak, vi fann ingen passande biografi for denne artisten. Biografi diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index b5cee15a..a2a8be8e 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -27,7 +27,7 @@ Wykonawcy Utwory Listy odtwarzania - Nic nie gra + Nic nie gra Wystąpił błąd przy próbie odtworzenia tego utworu Nie znaleziono pasującej biografii dla tego wykonawcy Biografia @@ -162,6 +162,7 @@ Zaznacz, a pole nazwy utworu i wykonawcy pod okładką albumu będzie większe Zaznacz, a w odróżnieniu od domyślnego suwaka, pasek postępu nie zasłoni okładki albumu Zaznacz, a pod przyciskami sterującymi odtwarzaczem (odtwarzanie/pauza, itp.) zostanie wyświetlona karta + Pomijaj korzystanie z Media Store, polepszy to jakość okładek, ale może spowodować ich wolniejsze ładowanie. Zaznacz tylko wtedy, gdy masz kłopoty z niską jakością grafik "Nie udało się pobrać okładki pasującej do albumu" Szukaj w bibliotece... Ponowny skan nośnika... @@ -175,7 +176,7 @@ Wyszukaj w sieci Wyłącznik czasowy Ustaw - Anuluj aktualny wyłącznik czasowy + Anuluj wyłącznik Wyłącznik czasowy został anulowany Wyłącznik czasowy ustawiony na %d minut od teraz diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ced716cb..560270a8 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -27,7 +27,7 @@ Artistas Músicas Playlists - Nada em execução + Nada em execução Desculpe - ocorreu um erro ao tentar reproduzir esta faixa Desculpe, não conseguimos encontrar a biografia deste artista. Biografia @@ -51,7 +51,7 @@ Duração Taxa de bits Taxa de amostragem - Ir para artista + Ir para o artista Ir para o álbum Lista de reprodução Salvar como playlist diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index e9cef92e..24844c5b 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -14,7 +14,7 @@ Artistas Músicas Playlists - Nada está sendo reproduzido + Nada está sendo reproduzido Desculpe - ocorreu um erro ao tentar reproduzir essa música Desculpe, mas nós não fomos capazes de encontrar uma biografia para este artista. Biografia diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 163333cd..b6972395 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -27,7 +27,7 @@ Artiști Melodii Liste de redare - Nimic nu este redat + Nimic nu este redat Ne pare rău - a apărut o problemă în încercarea de a reda această melodie. Ne pare rău, nu am putut găsi o biografie potrivită pentru acest artist. Biografie diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 1a21f4e8..13edecb3 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -26,7 +26,7 @@ Исполнители Песни Списки воспроизведения - Ничего нет для воспроизведения + Ничего нет для воспроизведения Произошла ошибка при попытке проиграть эту песню Извините, биография для этого исполнителя не найдена. Биография diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 0c679874..d74656f6 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -14,7 +14,7 @@ Artister Låtar Spellista - Ingenting att spela + Ingenting att spela Ursäkta - ett problem uppstod vid spelningen av denna låt Ursäkta, vi kunde inte hitta biografin för den här artisten Biografi diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 400dd4a6..e6d42d3b 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -27,7 +27,7 @@ Sanatçılar Şarkılar Çalma listeleri - Şu anda çalınan şarkı yok + Şu anda çalınan şarkı yok Bu şarkı oynatılırken bir hata oluştu Bu sanatçı ile ilgili hiçbir biyografi yazısı bulamadık. Biyografi diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 63b03625..af3fc2fe 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -27,7 +27,7 @@ 艺术家 歌曲 播放列表 - 没有正在播放的曲目 + 没有正在播放的曲目 尝试播放该曲目时发生错误。 找不到与该艺术家相匹配的个人简介。 歌手简介 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index ba384535..52d5b022 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -27,7 +27,7 @@ 歌手 歌曲 音樂清單 - 沒有正在播放的歌曲 + 沒有正在播放的歌曲 嘗試播放歌曲時發生錯誤 無法找到與這位歌手相符的個人簡介 個人簡介 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f56b487c..2db25b34 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -27,6 +27,7 @@ Artists Songs Playlists + Playing queue is empty Nothing is playing An error occurred while attempting to play this song Could not find a matching biography for this artist