Main Activity Fragments should be updated automatically now when the Media Store has changed.
This commit is contained in:
parent
e0a6535f9f
commit
9c8cba612b
59 changed files with 428 additions and 352 deletions
|
|
@ -29,8 +29,6 @@ public class PagerAdapter extends FragmentPagerAdapter {
|
|||
@NonNull
|
||||
private final Context mContext;
|
||||
|
||||
private int mCurrentPage;
|
||||
|
||||
@NonNull
|
||||
private final String[] titles;
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
|||
import com.kabouzeid.gramophone.model.Playlist;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
|
|
@ -60,6 +60,15 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
|||
setHasStableIds(true);
|
||||
}
|
||||
|
||||
public ArrayList<Playlist> getDataSet() {
|
||||
return dataSet;
|
||||
}
|
||||
|
||||
public void swapDataSet(ArrayList<Playlist> dataSet) {
|
||||
this.dataSet = dataSet;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return dataSet.get(position).id;
|
||||
|
|
@ -208,8 +217,8 @@ public class PlaylistAdapter extends AbsMultiSelectAdapter<PlaylistAdapter.ViewH
|
|||
toggleChecked(getAdapterPosition());
|
||||
} else {
|
||||
Pair[] sharedViews = null;
|
||||
if (activity instanceof AbsFabActivity)
|
||||
sharedViews = ((AbsFabActivity) activity).getSharedViewsWithFab(null);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
sharedViews = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(null);
|
||||
Playlist playlist = dataSet.get(getAdapterPosition());
|
||||
NavigationUtil.goToPlaylist(activity, playlist, sharedViews);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import com.kabouzeid.gramophone.interfaces.CabHolder;
|
|||
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
|
||||
import com.kabouzeid.gramophone.model.Album;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
|
|
@ -62,6 +62,15 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
setHasStableIds(true);
|
||||
}
|
||||
|
||||
public List<Album> getDataSet() {
|
||||
return dataSet;
|
||||
}
|
||||
|
||||
public void swapDataSet(List<Album> dataSet) {
|
||||
this.dataSet = dataSet;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
|
|
@ -205,8 +214,8 @@ public class AlbumAdapter extends AbsMultiSelectAdapter<AlbumAdapter.ViewHolder,
|
|||
Pair.create(image,
|
||||
activity.getResources().getString(R.string.transition_album_art)
|
||||
)};
|
||||
if (activity instanceof AbsFabActivity)
|
||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(albumPairs);
|
||||
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).id, albumPairs);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import com.kabouzeid.gramophone.lastfm.rest.model.artistinfo.Image;
|
|||
import com.kabouzeid.gramophone.loader.ArtistSongLoader;
|
||||
import com.kabouzeid.gramophone.model.Artist;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
|
|
@ -54,6 +54,15 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
|
|||
setHasStableIds(true);
|
||||
}
|
||||
|
||||
public ArrayList<Artist> getDataSet() {
|
||||
return dataSet;
|
||||
}
|
||||
|
||||
public void swapDataSet(ArrayList<Artist> dataSet) {
|
||||
this.dataSet = dataSet;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getItemId(int position) {
|
||||
return dataSet.get(position).id;
|
||||
|
|
@ -170,8 +179,8 @@ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolde
|
|||
Pair.create(image,
|
||||
activity.getResources().getString(R.string.transition_artist_image)
|
||||
)};
|
||||
if (activity instanceof AbsFabActivity)
|
||||
artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(artistPairs);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
artistPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(artistPairs);
|
||||
NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).id, artistPairs);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
|||
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
|
|
@ -98,8 +98,8 @@ public class ArtistSongAdapter extends ArrayAdapter<Song> implements MaterialCab
|
|||
Pair[] albumPairs = new Pair[]{
|
||||
Pair.create(albumArt, activity.getResources().getString(R.string.transition_album_art))
|
||||
};
|
||||
if (activity instanceof AbsFabActivity)
|
||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(albumPairs);
|
||||
NavigationUtil.goToAlbum(activity, song.albumId, albumPairs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import android.view.View;
|
|||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
|
@ -54,8 +54,8 @@ public class SmartPlaylistSongAdapter extends SongAdapter {
|
|||
Pair[] albumPairs = new Pair[]{
|
||||
Pair.create(image, activity.getString(R.string.transition_album_art))
|
||||
};
|
||||
if (activity instanceof AbsFabActivity)
|
||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(albumPairs);
|
||||
NavigationUtil.goToAlbum(activity, dataSet.get(getAdapterPosition()).albumId, albumPairs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
|||
import com.kabouzeid.gramophone.helper.menu.SongMenuHelper;
|
||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
|
|
@ -50,6 +50,11 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
|
|||
setHasStableIds(true);
|
||||
}
|
||||
|
||||
public void swapDataSet(ArrayList<Song> dataSet) {
|
||||
this.dataSet = dataSet;
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public ArrayList<Song> getDataSet() {
|
||||
return dataSet;
|
||||
}
|
||||
|
|
@ -176,8 +181,8 @@ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, S
|
|||
Pair[] albumPairs = new Pair[]{
|
||||
Pair.create(image, activity.getResources().getString(R.string.transition_album_art))
|
||||
};
|
||||
if (activity instanceof AbsFabActivity)
|
||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(albumPairs);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(albumPairs);
|
||||
NavigationUtil.goToAlbum(activity, getSong().albumId, albumPairs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -101,10 +101,6 @@ public class MusicPlayerRemote {
|
|||
}
|
||||
}
|
||||
|
||||
public static boolean isServiceConnected() {
|
||||
return musicService != null;
|
||||
}
|
||||
|
||||
public static void playSongAt(final int position) {
|
||||
if (musicService != null) {
|
||||
musicService.playSongAt(position);
|
||||
|
|
@ -231,11 +227,7 @@ public class MusicPlayerRemote {
|
|||
return false;
|
||||
}
|
||||
|
||||
public static boolean shuffleAllSongs(@NonNull final Context context, boolean startPlaying) {
|
||||
return openAndShuffleQueue(context, SongLoader.getAllSongs(context), startPlaying);
|
||||
}
|
||||
|
||||
public static boolean openAndShuffleQueue(final Context context, @NonNull final ArrayList<Song> songs, boolean startPlaying) {
|
||||
public static boolean openAndShuffleQueue(@NonNull final ArrayList<Song> songs, boolean startPlaying) {
|
||||
if (musicService != null) {
|
||||
if (!songs.isEmpty()) {
|
||||
MusicPlayerRemote.openQueue(songs, new Random().nextInt(songs.size()), startPlaying);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
|
|||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.interfaces.PaletteColorHolder;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
|
|
@ -62,14 +62,14 @@ public class SongMenuHelper {
|
|||
return true;
|
||||
case R.id.action_go_to_album:
|
||||
Pair[] albumPairs = null;
|
||||
if (activity instanceof AbsFabActivity)
|
||||
albumPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(null);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
albumPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(null);
|
||||
NavigationUtil.goToAlbum(activity, song.albumId, albumPairs);
|
||||
return true;
|
||||
case R.id.action_go_to_artist:
|
||||
Pair[] artistPairs = null;
|
||||
if (activity instanceof AbsFabActivity)
|
||||
artistPairs = ((AbsFabActivity) activity).getSharedViewsWithFab(null);
|
||||
if (activity instanceof AbsSlidingMusicPanelActivity)
|
||||
artistPairs = ((AbsSlidingMusicPanelActivity) activity).getSharedViewsWithPlayPauseFab(null);
|
||||
NavigationUtil.goToArtist(activity, song.artistId, artistPairs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,14 @@
|
|||
package com.kabouzeid.gramophone.interfaces;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public interface MusicStateListener {
|
||||
void onPlayingMetaChanged();
|
||||
|
||||
|
||||
void onPlayStateChanged();
|
||||
|
||||
|
||||
void onMediaStoreChanged();
|
||||
}
|
||||
|
|
@ -919,7 +919,8 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
|
|||
@Override
|
||||
public void run() {
|
||||
// actually call refresh when the delayed callback fires
|
||||
notifyChange(MEDIA_STORE_CHANGED);
|
||||
// do not send a sticky broadcast here
|
||||
sendBroadcast(new Intent(MEDIA_STORE_CHANGED));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ import com.kabouzeid.gramophone.loader.AlbumSongLoader;
|
|||
import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks;
|
||||
import com.kabouzeid.gramophone.misc.SmallTransitionListener;
|
||||
import com.kabouzeid.gramophone.model.Album;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.AlbumTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||
|
|
@ -58,7 +58,7 @@ import butterknife.InjectView;
|
|||
* <p/>
|
||||
* Should be kinda stable ONLY AS IT IS!!!
|
||||
*/
|
||||
public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorHolder, CabHolder {
|
||||
public class AlbumDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
|
||||
|
||||
public static final String TAG = AlbumDetailActivity.class.getSimpleName();
|
||||
private static final int TAG_EDITOR_REQUEST = 2001;
|
||||
|
|
@ -334,7 +334,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
|
|||
NavigationUtil.openEqualizer(this);
|
||||
return true;
|
||||
case R.id.action_shuffle_album:
|
||||
MusicPlayerRemote.openAndShuffleQueue(this, adapter.getDataSet(), true);
|
||||
MusicPlayerRemote.openAndShuffleQueue(adapter.getDataSet(), true);
|
||||
return true;
|
||||
case android.R.id.home:
|
||||
super.onBackPressed();
|
||||
|
|
@ -343,7 +343,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
|
|||
NavigationUtil.openPlayingQueueDialog(this);
|
||||
return true;
|
||||
case R.id.action_now_playing:
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null));
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
case R.id.action_tag_editor:
|
||||
Intent intent = new Intent(this, AlbumTagEditorActivity.class);
|
||||
|
|
@ -351,7 +351,7 @@ public class AlbumDetailActivity extends AbsFabActivity implements PaletteColorH
|
|||
startActivityForResult(intent, TAG_EDITOR_REQUEST);
|
||||
return true;
|
||||
case R.id.action_go_to_artist:
|
||||
Pair[] artistPairs = getSharedViewsWithFab(null);
|
||||
Pair[] artistPairs = getSharedViewsWithPlayPauseFab(null);
|
||||
NavigationUtil.goToArtist(this, album.artistId, artistPairs);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ import com.kabouzeid.gramophone.loader.ArtistSongLoader;
|
|||
import com.kabouzeid.gramophone.misc.SmallObservableScrollViewCallbacks;
|
||||
import com.kabouzeid.gramophone.misc.SmallTransitionListener;
|
||||
import com.kabouzeid.gramophone.model.Artist;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
|
|
@ -75,7 +75,7 @@ import retrofit.client.Response;
|
|||
* <p/>
|
||||
* Should be kinda stable ONLY AS IT IS!!!
|
||||
*/
|
||||
public class ArtistDetailActivity extends AbsFabActivity implements PaletteColorHolder, CabHolder {
|
||||
public class ArtistDetailActivity extends AbsSlidingMusicPanelActivity implements PaletteColorHolder, CabHolder {
|
||||
|
||||
public static final String TAG = ArtistDetailActivity.class.getSimpleName();
|
||||
|
||||
|
|
@ -449,7 +449,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
|
|||
NavigationUtil.openEqualizer(this);
|
||||
return true;
|
||||
case R.id.action_shuffle_artist:
|
||||
MusicPlayerRemote.openAndShuffleQueue(this, songAdapter.getDataSet(), true);
|
||||
MusicPlayerRemote.openAndShuffleQueue(songAdapter.getDataSet(), true);
|
||||
return true;
|
||||
case android.R.id.home:
|
||||
super.onBackPressed();
|
||||
|
|
@ -469,7 +469,7 @@ public class ArtistDetailActivity extends AbsFabActivity implements PaletteColor
|
|||
setUpArtistImageAndApplyPalette(true);
|
||||
return true;
|
||||
case R.id.action_now_playing:
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null));
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.kabouzeid.gramophone.ui.activities;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Intent;
|
||||
import android.content.res.ColorStateList;
|
||||
import android.content.res.Configuration;
|
||||
|
|
@ -7,6 +8,7 @@ import android.graphics.Color;
|
|||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.IBinder;
|
||||
import android.provider.MediaStore;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
|
@ -46,8 +48,9 @@ import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
|
|||
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
|
||||
import com.kabouzeid.gramophone.loader.ArtistSongLoader;
|
||||
import com.kabouzeid.gramophone.loader.PlaylistSongLoader;
|
||||
import com.kabouzeid.gramophone.loader.SongLoader;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AbsMainActivityFragment;
|
||||
import com.kabouzeid.gramophone.ui.fragments.mainactivityfragments.AlbumViewFragment;
|
||||
import com.kabouzeid.gramophone.util.MusicUtil;
|
||||
|
|
@ -66,7 +69,7 @@ import java.util.ArrayList;
|
|||
import butterknife.ButterKnife;
|
||||
import butterknife.InjectView;
|
||||
|
||||
public class MainActivity extends AbsFabActivity
|
||||
public class MainActivity extends AbsSlidingMusicPanelActivity
|
||||
implements KabViewsDisableAble, CabHolder {
|
||||
|
||||
public static final String TAG = MainActivity.class.getSimpleName();
|
||||
|
|
@ -86,7 +89,6 @@ public class MainActivity extends AbsFabActivity
|
|||
|
||||
private ActionBarDrawerToggle drawerToggle;
|
||||
private PagerAdapter pagerAdapter;
|
||||
private int currentPage = -1;
|
||||
private MaterialCab cab;
|
||||
@Nullable
|
||||
private View navigationDrawerHeader;
|
||||
|
|
@ -117,7 +119,6 @@ public class MainActivity extends AbsFabActivity
|
|||
|
||||
int startPosition = PreferenceUtil.getInstance(this).getDefaultStartPage();
|
||||
startPosition = startPosition == -1 ? PreferenceUtil.getInstance(this).getLastStartPage() : startPosition;
|
||||
currentPage = startPosition;
|
||||
|
||||
navigationView.getMenu().getItem(startPosition).setChecked(true);
|
||||
|
||||
|
|
@ -133,7 +134,6 @@ public class MainActivity extends AbsFabActivity
|
|||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
navigationView.getMenu().getItem(position).setChecked(true);
|
||||
currentPage = position;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -271,7 +271,7 @@ public class MainActivity extends AbsFabActivity
|
|||
@Override
|
||||
public void onClick(View v) {
|
||||
//noinspection ConstantConditions
|
||||
NavigationUtil.openCurrentPlayingIfPossible(MainActivity.this, getSharedViewsWithFab(new Pair[]{
|
||||
NavigationUtil.openCurrentPlayingIfPossible(MainActivity.this, getSharedViewsWithPlayPauseFab(new Pair[]{
|
||||
Pair.create(navigationDrawerHeader.findViewById(R.id.image),
|
||||
getResources().getString(R.string.transition_album_art)
|
||||
)
|
||||
|
|
@ -303,9 +303,8 @@ public class MainActivity extends AbsFabActivity
|
|||
try {
|
||||
super.enableViews();
|
||||
toolbar.setEnabled(true);
|
||||
((AbsMainActivityFragment) pagerAdapter.getItem(pager.getCurrentItem())).enableViews();
|
||||
} catch (NullPointerException e) {
|
||||
//Log.e(TAG, "wasn't able to enable the views", e);
|
||||
((AbsMainActivityFragment) pagerAdapter.getFragment(pager.getCurrentItem())).enableViews();
|
||||
} catch (NullPointerException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -313,9 +312,8 @@ public class MainActivity extends AbsFabActivity
|
|||
public void disableViews() {
|
||||
try {
|
||||
super.disableViews();
|
||||
((AbsMainActivityFragment) pagerAdapter.getItem(pager.getCurrentItem())).disableViews();
|
||||
} catch (NullPointerException e) {
|
||||
//Log.e(TAG, "wasn't able to disable the views", e);
|
||||
((AbsMainActivityFragment) pagerAdapter.getFragment(pager.getCurrentItem())).disableViews();
|
||||
} catch (NullPointerException ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -326,9 +324,8 @@ public class MainActivity extends AbsFabActivity
|
|||
}
|
||||
|
||||
@Override
|
||||
public void onServiceConnected() {
|
||||
super.onServiceConnected();
|
||||
updateNavigationDrawerHeader();
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
super.onServiceConnected(name, service);
|
||||
handlePlaybackIntent(getIntent());
|
||||
}
|
||||
|
||||
|
|
@ -371,7 +368,7 @@ public class MainActivity extends AbsFabActivity
|
|||
NavigationUtil.openEqualizer(this);
|
||||
return true;
|
||||
case R.id.action_shuffle_all:
|
||||
MusicPlayerRemote.shuffleAllSongs(this, true);
|
||||
MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(this), true);
|
||||
return true;
|
||||
case R.id.action_new_playlist:
|
||||
CreatePlaylistDialog.create().show(getSupportFragmentManager(), "CREATE_PLAYLIST");
|
||||
|
|
@ -380,7 +377,7 @@ public class MainActivity extends AbsFabActivity
|
|||
startActivity(new Intent(MainActivity.this, SearchActivity.class));
|
||||
return true;
|
||||
case R.id.action_now_playing:
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null));
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
case R.id.action_playing_queue:
|
||||
NavigationUtil.openPlayingQueueDialog(this);
|
||||
|
|
@ -405,7 +402,7 @@ public class MainActivity extends AbsFabActivity
|
|||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
PreferenceUtil.getInstance(MainActivity.this).setLastStartPage(currentPage);
|
||||
PreferenceUtil.getInstance(MainActivity.this).setLastStartPage(pager.getCurrentItem());
|
||||
}
|
||||
|
||||
private void handlePlaybackIntent(@Nullable Intent intent) {
|
||||
|
|
|
|||
|
|
@ -43,10 +43,11 @@ import com.kabouzeid.gramophone.dialogs.SongDetailDialog;
|
|||
import com.kabouzeid.gramophone.dialogs.SongShareDialog;
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.imageloader.BlurProcessor;
|
||||
import com.kabouzeid.gramophone.loader.SongLoader;
|
||||
import com.kabouzeid.gramophone.misc.SmallTransitionListener;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.service.MusicService;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.AbsTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.tageditor.SongTagEditorActivity;
|
||||
import com.kabouzeid.gramophone.util.ColorUtil;
|
||||
|
|
@ -68,7 +69,7 @@ import butterknife.ButterKnife;
|
|||
import butterknife.InjectView;
|
||||
import hugo.weaving.DebugLog;
|
||||
|
||||
public class MusicControllerActivity extends AbsFabActivity {
|
||||
public class MusicControllerActivity extends AbsSlidingMusicPanelActivity {
|
||||
|
||||
public static final String TAG = MusicControllerActivity.class.getSimpleName();
|
||||
private static final int FAB_CIRCULAR_REVEAL_ANIMATION_TIME = 1000;
|
||||
|
|
@ -193,11 +194,11 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
|
||||
@Override
|
||||
public void onTransitionEnd(Transition transition) {
|
||||
int cx = (getFab().getLeft() + getFab().getRight()) / 2;
|
||||
int cy = (getFab().getTop() + getFab().getBottom()) / 2;
|
||||
int cx = (getPlayPauseFab().getLeft() + getPlayPauseFab().getRight()) / 2;
|
||||
int cy = (getPlayPauseFab().getTop() + getPlayPauseFab().getBottom()) / 2;
|
||||
int finalRadius = Math.max(mediaControllerContainer.getWidth(), mediaControllerContainer.getHeight());
|
||||
|
||||
Animator animator = ViewAnimationUtils.createCircularReveal(mediaControllerContainer, cx, cy, getFab().getWidth() / 2, finalRadius);
|
||||
Animator animator = ViewAnimationUtils.createCircularReveal(mediaControllerContainer, cx, cy, getPlayPauseFab().getWidth() / 2, finalRadius);
|
||||
animator.setInterpolator(new DecelerateInterpolator());
|
||||
animator.setDuration(FAB_CIRCULAR_REVEAL_ANIMATION_TIME);
|
||||
animator.start();
|
||||
|
|
@ -225,11 +226,13 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
}
|
||||
|
||||
private void startUpdatingProgressViews() {
|
||||
startHandler();
|
||||
progressViewsUpdateHandler.sendEmptyMessage(CMD_UPDATE_PROGRESS_VIEWS);
|
||||
}
|
||||
|
||||
private void stopUpdatingProgressViews() {
|
||||
progressViewsUpdateHandler.removeMessages(CMD_UPDATE_PROGRESS_VIEWS);
|
||||
stopHandler();
|
||||
}
|
||||
|
||||
private void initAppearanceVarsFromSharedPrefs() {
|
||||
|
|
@ -244,7 +247,7 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
@Override
|
||||
protected void onPostCreate(Bundle savedInstanceState) {
|
||||
super.onPostCreate(savedInstanceState);
|
||||
getFab().setOnLongClickListener(null);
|
||||
getPlayPauseFab().setOnLongClickListener(null);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -384,9 +387,6 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
updateControllerState();
|
||||
updateCurrentSong();
|
||||
startHandler();
|
||||
startUpdatingProgressViews();
|
||||
}
|
||||
|
||||
|
|
@ -394,7 +394,6 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
protected void onPause() {
|
||||
super.onPause();
|
||||
stopUpdatingProgressViews();
|
||||
stopHandler();
|
||||
}
|
||||
|
||||
private void updateCurrentSong() {
|
||||
|
|
@ -536,12 +535,6 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
});
|
||||
}
|
||||
|
||||
protected void updateControllerState() {
|
||||
updateFabState();
|
||||
updateRepeatState();
|
||||
updateShuffleState();
|
||||
}
|
||||
|
||||
private void animateSetFavorite() {
|
||||
favoriteIcon.clearAnimation();
|
||||
|
||||
|
|
@ -641,7 +634,7 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
NavigationUtil.openEqualizer(this);
|
||||
return true;
|
||||
case R.id.action_shuffle_all:
|
||||
MusicPlayerRemote.shuffleAllSongs(this, true);
|
||||
MusicPlayerRemote.openAndShuffleQueue(SongLoader.getAllSongs(this), true);
|
||||
return true;
|
||||
case R.id.action_add_to_playlist:
|
||||
AddToPlaylistDialog.create(song).show(getSupportFragmentManager(), "ADD_PLAYLIST");
|
||||
|
|
@ -662,10 +655,10 @@ public class MusicControllerActivity extends AbsFabActivity {
|
|||
SongDetailDialog.create(songFile).show(getSupportFragmentManager(), "SONG_DETAIL");
|
||||
return true;
|
||||
case R.id.action_go_to_album:
|
||||
NavigationUtil.goToAlbum(this, song.albumId, getSharedViewsWithFab(null));
|
||||
NavigationUtil.goToAlbum(this, song.albumId, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
case R.id.action_go_to_artist:
|
||||
NavigationUtil.goToArtist(this, song.artistId, getSharedViewsWithFab(null));
|
||||
NavigationUtil.goToArtist(this, song.artistId, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ import com.kabouzeid.gramophone.misc.DragSortRecycler;
|
|||
import com.kabouzeid.gramophone.model.Playlist;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
import com.kabouzeid.gramophone.model.smartplaylist.AbsSmartPlaylist;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsFabActivity;
|
||||
import com.kabouzeid.gramophone.ui.activities.base.AbsSlidingMusicPanelActivity;
|
||||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.kabouzeid.gramophone.util.PlaylistsUtil;
|
||||
import com.kabouzeid.gramophone.util.PreferenceUtil;
|
||||
|
|
@ -31,7 +31,7 @@ import com.kabouzeid.gramophone.util.PreferenceUtil;
|
|||
import butterknife.ButterKnife;
|
||||
import butterknife.InjectView;
|
||||
|
||||
public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder {
|
||||
public class PlaylistDetailActivity extends AbsSlidingMusicPanelActivity implements CabHolder {
|
||||
|
||||
public static final String TAG = PlaylistDetailActivity.class.getSimpleName();
|
||||
|
||||
|
|
@ -132,7 +132,7 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder
|
|||
new SleepTimerDialog().show(getSupportFragmentManager(), "SET_SLEEP_TIMER");
|
||||
return true;
|
||||
case R.id.action_shuffle_playlist:
|
||||
MusicPlayerRemote.openAndShuffleQueue(this, adapter.getDataSet(), true);
|
||||
MusicPlayerRemote.openAndShuffleQueue(adapter.getDataSet(), true);
|
||||
return true;
|
||||
case R.id.action_equalizer:
|
||||
NavigationUtil.openEqualizer(this);
|
||||
|
|
@ -141,7 +141,7 @@ public class PlaylistDetailActivity extends AbsFabActivity implements CabHolder
|
|||
onBackPressed();
|
||||
return true;
|
||||
case R.id.action_now_playing:
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithFab(null));
|
||||
NavigationUtil.openCurrentPlayingIfPossible(this, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
case R.id.action_playing_queue:
|
||||
NavigationUtil.openPlayingQueueDialog(this);
|
||||
|
|
|
|||
|
|
@ -24,11 +24,21 @@ public abstract class AbsBaseActivity extends AbsThemeActivity implements KabVie
|
|||
enableViews();
|
||||
}
|
||||
|
||||
/**
|
||||
* Should be overwritten and re enable all {@link android.view.View} to ensure they are accessible again
|
||||
* <p>
|
||||
* This is necessary because of a bug with the shared element transition
|
||||
*/
|
||||
@Override
|
||||
public void enableViews() {
|
||||
areViewsEnabled = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should be overwritten and disable all views that start a new activity on click to prevent opening an activity multiple times
|
||||
* <p>
|
||||
* This is necessary because of a bug with the shared element transition
|
||||
*/
|
||||
@Override
|
||||
public void disableViews() {
|
||||
areViewsEnabled = false;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,145 @@
|
|||
package com.kabouzeid.gramophone.ui.activities.base;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.support.annotation.NonNull;
|
||||
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.interfaces.MusicStateListener;
|
||||
import com.kabouzeid.gramophone.service.MusicService;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsMusicStateActivity extends AbsBaseActivity implements ServiceConnection, MusicStateListener {
|
||||
public static final String TAG = AbsMusicStateActivity.class.getSimpleName();
|
||||
|
||||
private final ArrayList<MusicStateListener> mMusicStateListener = new ArrayList<>();
|
||||
|
||||
private MusicPlayerRemote.ServiceToken serviceToken;
|
||||
private MusicStateReceiver musicStateReceiver;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
serviceToken = MusicPlayerRemote.bindToService(this, this);
|
||||
musicStateReceiver = new MusicStateReceiver(this);
|
||||
|
||||
final IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(MusicService.PLAY_STATE_CHANGED);
|
||||
filter.addAction(MusicService.SHUFFLE_MODE_CHANGED);
|
||||
filter.addAction(MusicService.REPEAT_MODE_CHANGED);
|
||||
filter.addAction(MusicService.META_CHANGED);
|
||||
filter.addAction(MusicService.MEDIA_STORE_CHANGED);
|
||||
|
||||
registerReceiver(musicStateReceiver, filter);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
onPlayStateChanged();
|
||||
onPlayingMetaChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
MusicPlayerRemote.unbindFromService(serviceToken);
|
||||
unregisterReceiver(musicStateReceiver);
|
||||
}
|
||||
|
||||
public void addMusicStateListenerListener(final MusicStateListener listener) {
|
||||
if (listener != null) {
|
||||
mMusicStateListener.add(listener);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeMusicStateListenerListener(final MusicStateListener listener) {
|
||||
if (listener != null) {
|
||||
mMusicStateListener.remove(listener);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayingMetaChanged() {
|
||||
for (MusicStateListener listener : mMusicStateListener) {
|
||||
if (listener != null) {
|
||||
listener.onPlayingMetaChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayStateChanged() {
|
||||
for (MusicStateListener listener : mMusicStateListener) {
|
||||
if (listener != null) {
|
||||
listener.onPlayStateChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMediaStoreChanged() {
|
||||
for (MusicStateListener listener : mMusicStateListener) {
|
||||
if (listener != null) {
|
||||
listener.onMediaStoreChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onRepeatModeChanged() {
|
||||
|
||||
}
|
||||
|
||||
public void onShuffleModeChanged() {
|
||||
|
||||
}
|
||||
|
||||
private static final class MusicStateReceiver extends BroadcastReceiver {
|
||||
|
||||
private final WeakReference<AbsMusicStateActivity> reference;
|
||||
|
||||
public MusicStateReceiver(final AbsMusicStateActivity activity) {
|
||||
reference = new WeakReference<>(activity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(final Context context, @NonNull final Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
AbsMusicStateActivity activity = reference.get();
|
||||
if (activity != null) {
|
||||
switch (action) {
|
||||
case MusicService.META_CHANGED:
|
||||
activity.onPlayingMetaChanged();
|
||||
break;
|
||||
case MusicService.PLAY_STATE_CHANGED:
|
||||
activity.onPlayStateChanged();
|
||||
break;
|
||||
case MusicService.REPEAT_MODE_CHANGED:
|
||||
activity.onRepeatModeChanged();
|
||||
break;
|
||||
case MusicService.SHUFFLE_MODE_CHANGED:
|
||||
activity.onShuffleModeChanged();
|
||||
break;
|
||||
case MusicService.MEDIA_STORE_CHANGED:
|
||||
activity.onMediaStoreChanged();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,120 +0,0 @@
|
|||
package com.kabouzeid.gramophone.ui.activities.base;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.ServiceConnection;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.service.MusicService;
|
||||
|
||||
import java.lang.ref.WeakReference;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsPlaybackControlActivity extends AbsBaseActivity {
|
||||
@Nullable
|
||||
private MusicPlayerRemote.ServiceToken serviceToken;
|
||||
private PlaybackStatusReceiver playbackStatusReceiver;
|
||||
|
||||
public void onPlayingMetaChanged() {
|
||||
|
||||
}
|
||||
|
||||
public void onPlayStateChanged() {
|
||||
|
||||
}
|
||||
|
||||
public void onRepeatModeChanged() {
|
||||
|
||||
}
|
||||
|
||||
public void onShuffleModeChanged() {
|
||||
|
||||
}
|
||||
|
||||
public void onServiceConnected() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
serviceToken = MusicPlayerRemote.bindToService(this, new ServiceConnection() {
|
||||
@Override
|
||||
public void onServiceConnected(ComponentName name, IBinder service) {
|
||||
AbsPlaybackControlActivity.this.onServiceConnected();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceDisconnected(ComponentName name) {
|
||||
|
||||
}
|
||||
});
|
||||
playbackStatusReceiver = new PlaybackStatusReceiver(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
super.onStart();
|
||||
|
||||
final IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(MusicService.PLAY_STATE_CHANGED);
|
||||
filter.addAction(MusicService.SHUFFLE_MODE_CHANGED);
|
||||
filter.addAction(MusicService.REPEAT_MODE_CHANGED);
|
||||
filter.addAction(MusicService.META_CHANGED);
|
||||
|
||||
registerReceiver(playbackStatusReceiver, filter);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
super.onStop();
|
||||
try {
|
||||
unregisterReceiver(playbackStatusReceiver);
|
||||
} catch (Throwable ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
MusicPlayerRemote.unbindFromService(serviceToken);
|
||||
}
|
||||
|
||||
private static final class PlaybackStatusReceiver extends BroadcastReceiver {
|
||||
|
||||
@NonNull
|
||||
private final WeakReference<AbsPlaybackControlActivity> reference;
|
||||
|
||||
public PlaybackStatusReceiver(final AbsPlaybackControlActivity activity) {
|
||||
reference = new WeakReference<>(activity);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(final Context context, @NonNull final Intent intent) {
|
||||
final String action = intent.getAction();
|
||||
switch (action) {
|
||||
case MusicService.META_CHANGED:
|
||||
reference.get().onPlayingMetaChanged();
|
||||
break;
|
||||
case MusicService.PLAY_STATE_CHANGED:
|
||||
reference.get().onPlayStateChanged();
|
||||
break;
|
||||
case MusicService.REPEAT_MODE_CHANGED:
|
||||
reference.get().onRepeatModeChanged();
|
||||
break;
|
||||
case MusicService.SHUFFLE_MODE_CHANGED:
|
||||
reference.get().onShuffleModeChanged();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -22,54 +22,46 @@ import com.kabouzeid.gramophone.util.ColorUtil;
|
|||
import com.kabouzeid.gramophone.util.NavigationUtil;
|
||||
import com.kabouzeid.gramophone.views.PlayPauseDrawable;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
import butterknife.InjectView;
|
||||
import butterknife.Optional;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsFabActivity extends AbsPlaybackControlActivity {
|
||||
public static final String TAG = AbsFabActivity.class.getSimpleName();
|
||||
public abstract class AbsSlidingMusicPanelActivity extends AbsMusicStateActivity {
|
||||
public static final String TAG = AbsSlidingMusicPanelActivity.class.getSimpleName();
|
||||
|
||||
@Nullable
|
||||
@Optional
|
||||
@InjectView(R.id.fab)
|
||||
FloatingActionButton fab;
|
||||
FloatingActionButton playPauseFab;
|
||||
|
||||
private PlayPauseDrawable playPauseDrawable;
|
||||
|
||||
@Override
|
||||
protected void onPostCreate(Bundle savedInstanceState) {
|
||||
super.onPostCreate(savedInstanceState);
|
||||
ButterKnife.inject(this);
|
||||
setUpFab();
|
||||
setUpPlayPauseButton();
|
||||
}
|
||||
|
||||
private void setUpFab() {
|
||||
private void setUpPlayPauseButton() {
|
||||
if (playPauseDrawable == null) {
|
||||
playPauseDrawable = new PlayPauseDrawable(this);
|
||||
}
|
||||
|
||||
getFab().setImageDrawable(playPauseDrawable);
|
||||
getPlayPauseFab().setImageDrawable(playPauseDrawable);
|
||||
final int accentColor = ThemeSingleton.get().positiveColor;
|
||||
getFab().setBackgroundTintList(ColorUtil.getEmptyColorStateList(accentColor));
|
||||
getPlayPauseFab().setBackgroundTintList(ColorUtil.getEmptyColorStateList(accentColor));
|
||||
if (accentColor == Color.WHITE) {
|
||||
getFab().getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
|
||||
getPlayPauseFab().getDrawable().setColorFilter(Color.BLACK, PorterDuff.Mode.SRC_IN);
|
||||
} else {
|
||||
getFab().getDrawable().clearColorFilter();
|
||||
getPlayPauseFab().getDrawable().clearColorFilter();
|
||||
}
|
||||
|
||||
updateFabState();
|
||||
updateFabState(false);
|
||||
final GestureDetector gestureDetector = new GestureDetector(this, new SmallOnGestureListener() {
|
||||
@Override
|
||||
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
|
||||
NavigationUtil.openCurrentPlayingIfPossible(AbsFabActivity.this, getSharedViewsWithFab(null));
|
||||
NavigationUtil.openCurrentPlayingIfPossible(AbsSlidingMusicPanelActivity.this, getSharedViewsWithPlayPauseFab(null));
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
getFab().setOnClickListener(new View.OnClickListener() {
|
||||
getPlayPauseFab().setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (MusicPlayerRemote.getPosition() != -1) {
|
||||
|
|
@ -79,12 +71,12 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity {
|
|||
MusicPlayerRemote.resumePlaying();
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(AbsFabActivity.this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(AbsSlidingMusicPanelActivity.this, getResources().getString(R.string.playing_queue_empty), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
getFab().setOnTouchListener(new View.OnTouchListener() {
|
||||
getPlayPauseFab().setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public boolean onTouch(View view, @NonNull MotionEvent event) {
|
||||
gestureDetector.onTouchEvent(event);
|
||||
|
|
@ -92,55 +84,41 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity {
|
|||
}
|
||||
});
|
||||
|
||||
getFab().setOnLongClickListener(new View.OnLongClickListener() {
|
||||
getPlayPauseFab().setOnLongClickListener(new View.OnLongClickListener() {
|
||||
@Override
|
||||
public boolean onLongClick(View view) {
|
||||
final Song song = MusicPlayerRemote.getCurrentSong();
|
||||
if (song.id != -1) {
|
||||
Toast.makeText(AbsFabActivity.this, song.title + " - " + song.artistName, Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(AbsSlidingMusicPanelActivity.this, song.title + " - " + song.artistName, Toast.LENGTH_SHORT).show();
|
||||
} else {
|
||||
Toast.makeText(AbsFabActivity.this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(AbsSlidingMusicPanelActivity.this, getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected void updateFabState() {
|
||||
protected void updateFabState(boolean animate) {
|
||||
if (MusicPlayerRemote.isPlaying()) {
|
||||
playPauseDrawable.setPause();
|
||||
playPauseDrawable.setPause(animate);
|
||||
} else {
|
||||
playPauseDrawable.setPlay();
|
||||
}
|
||||
}
|
||||
|
||||
protected void animateUpdateFabState() {
|
||||
if (MusicPlayerRemote.isPlaying()) {
|
||||
setFabPause();
|
||||
} else {
|
||||
setFabPlay();
|
||||
playPauseDrawable.setPlay(animate);
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
protected FloatingActionButton getFab() {
|
||||
if (fab == null) {
|
||||
fab = (FloatingActionButton) findViewById(R.id.fab);
|
||||
if (fab == null) {
|
||||
fab = new FloatingActionButton(this);
|
||||
Log.e(TAG, "No FAB found created default FAB.");
|
||||
protected FloatingActionButton getPlayPauseFab() {
|
||||
if (playPauseFab == null) {
|
||||
playPauseFab = (FloatingActionButton) findViewById(R.id.play_pause_fab);
|
||||
if (playPauseFab == null) {
|
||||
playPauseFab = new FloatingActionButton(this);
|
||||
Log.e(TAG, "PlayPauseFAB not found, created default FAB.");
|
||||
}
|
||||
}
|
||||
return fab;
|
||||
return playPauseFab;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
updateFabState();
|
||||
}
|
||||
|
||||
public Pair[] getSharedViewsWithFab(@Nullable Pair[] sharedViews) {
|
||||
public Pair[] getSharedViewsWithPlayPauseFab(@Nullable Pair[] sharedViews) {
|
||||
Pair[] sharedViewsWithFab;
|
||||
if (sharedViews != null) {
|
||||
sharedViewsWithFab = new Pair[sharedViews.length + 1];
|
||||
|
|
@ -148,21 +126,13 @@ public abstract class AbsFabActivity extends AbsPlaybackControlActivity {
|
|||
} else {
|
||||
sharedViewsWithFab = new Pair[1];
|
||||
}
|
||||
sharedViewsWithFab[sharedViewsWithFab.length - 1] = Pair.create((View) getFab(), getString(R.string.transition_fab));
|
||||
sharedViewsWithFab[sharedViewsWithFab.length - 1] = Pair.create((View) getPlayPauseFab(), getString(R.string.transition_fab));
|
||||
return sharedViewsWithFab;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayStateChanged() {
|
||||
super.onPlayStateChanged();
|
||||
animateUpdateFabState();
|
||||
}
|
||||
|
||||
private void setFabPlay() {
|
||||
playPauseDrawable.animatedPlay();
|
||||
}
|
||||
|
||||
private void setFabPause() {
|
||||
playPauseDrawable.animatedPause();
|
||||
updateFabState(true);
|
||||
}
|
||||
}
|
||||
|
|
@ -70,7 +70,7 @@ public abstract class AbsTagEditorActivity extends AbsBaseActivity {
|
|||
private int paletteColorPrimary;
|
||||
private boolean isInNoImageMode;
|
||||
|
||||
@InjectView(R.id.fab)
|
||||
@InjectView(R.id.play_pause_fab)
|
||||
FloatingActionButton fab;
|
||||
@InjectView(R.id.observableScrollView)
|
||||
ObservableScrollView observableScrollView;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import android.view.ViewGroup;
|
|||
import android.widget.TextView;
|
||||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.interfaces.MusicStateListener;
|
||||
import com.kabouzeid.gramophone.views.FastScroller;
|
||||
|
||||
import butterknife.ButterKnife;
|
||||
|
|
@ -23,7 +24,7 @@ import butterknife.Optional;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivityFragment implements OnOffsetChangedListener {
|
||||
public abstract class AbsMainActivityRecyclerViewFragment<A extends RecyclerView.Adapter> extends AbsMainActivityFragment implements OnOffsetChangedListener, MusicStateListener {
|
||||
|
||||
public static final String TAG = AbsMainActivityRecyclerViewFragment.class.getSimpleName();
|
||||
|
||||
|
|
@ -38,7 +39,7 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
|
|||
@InjectView(R.id.fast_scroller)
|
||||
FastScroller fastScroller;
|
||||
|
||||
private RecyclerView.Adapter mAdapter;
|
||||
private A mAdapter;
|
||||
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||
|
|
@ -56,6 +57,7 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
|
|||
}
|
||||
|
||||
getMainActivity().addOnAppBarOffsetChangedListener(this);
|
||||
getMainActivity().addMusicStateListenerListener(this);
|
||||
|
||||
setUpRecyclerView();
|
||||
|
||||
|
|
@ -76,7 +78,7 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
|
|||
recyclerView.setAdapter(mAdapter);
|
||||
}
|
||||
|
||||
public RecyclerView.Adapter getAdapter() {
|
||||
public A getAdapter() {
|
||||
return mAdapter;
|
||||
}
|
||||
|
||||
|
|
@ -93,6 +95,16 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayingMetaChanged() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayStateChanged() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enableViews() {
|
||||
super.enableViews();
|
||||
|
|
@ -131,13 +143,13 @@ public abstract class AbsMainActivityRecyclerViewFragment extends AbsMainActivit
|
|||
|
||||
protected abstract RecyclerView.LayoutManager createLayoutManager();
|
||||
|
||||
@NonNull
|
||||
protected abstract RecyclerView.Adapter createAdapter();
|
||||
protected abstract A createAdapter();
|
||||
|
||||
@Override
|
||||
public void onDestroyView() {
|
||||
super.onDestroyView();
|
||||
getMainActivity().removeOnAppBarOffsetChangedListener(this);
|
||||
getMainActivity().removeMusicStateListenerListener(this);
|
||||
ButterKnife.reset(this);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import com.kabouzeid.gramophone.util.Util;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment {
|
||||
public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment<AlbumAdapter> {
|
||||
public static final String TAG = AlbumViewFragment.class.getSimpleName();
|
||||
|
||||
private GridLayoutManager layoutManager;
|
||||
|
|
@ -27,8 +27,12 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
@NonNull
|
||||
@Override
|
||||
protected RecyclerView.Adapter createAdapter() {
|
||||
return new AlbumAdapter(getMainActivity(), AlbumLoader.getAllAlbums(getActivity()), R.layout.item_grid, getMainActivity());
|
||||
protected AlbumAdapter createAdapter() {
|
||||
return new AlbumAdapter(
|
||||
getMainActivity(),
|
||||
AlbumLoader.getAllAlbums(getActivity()),
|
||||
R.layout.item_grid,
|
||||
getMainActivity());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -40,4 +44,9 @@ public class AlbumViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
layoutManager.setSpanCount(columns);
|
||||
layoutManager.requestLayout();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMediaStoreChanged() {
|
||||
getAdapter().swapDataSet(AlbumLoader.getAllAlbums(getActivity()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import com.kabouzeid.gramophone.loader.ArtistLoader;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
||||
public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment<ArtistAdapter> {
|
||||
|
||||
public static final String TAG = ArtistViewFragment.class.getSimpleName();
|
||||
|
||||
|
|
@ -23,7 +23,7 @@ public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
@NonNull
|
||||
@Override
|
||||
protected RecyclerView.Adapter createAdapter() {
|
||||
protected ArtistAdapter createAdapter() {
|
||||
return new ArtistAdapter(
|
||||
getMainActivity(),
|
||||
ArtistLoader.getAllArtists(getActivity()),
|
||||
|
|
@ -35,4 +35,9 @@ public class ArtistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
protected int getEmptyMessage() {
|
||||
return R.string.no_artists;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMediaStoreChanged() {
|
||||
getAdapter().swapDataSet(ArtistLoader.getAllArtists(getActivity()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ import java.util.ArrayList;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
||||
public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment<PlaylistAdapter> {
|
||||
|
||||
public static final String TAG = PlaylistViewFragment.class.getSimpleName();
|
||||
|
||||
|
|
@ -29,7 +29,21 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
@NonNull
|
||||
@Override
|
||||
protected RecyclerView.Adapter createAdapter() {
|
||||
protected PlaylistAdapter createAdapter() {
|
||||
return new PlaylistAdapter(getMainActivity(), getAllPlaylists(), R.layout.item_list_single_row, getMainActivity());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getEmptyMessage() {
|
||||
return R.string.no_playlists;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMediaStoreChanged() {
|
||||
getAdapter().swapDataSet(getAllPlaylists());
|
||||
}
|
||||
|
||||
private ArrayList<Playlist> getAllPlaylists() {
|
||||
ArrayList<Playlist> playlists = new ArrayList<>();
|
||||
|
||||
playlists.add(new LastAddedPlaylist(getActivity()));
|
||||
|
|
@ -38,11 +52,6 @@ public class PlaylistViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
playlists.addAll(PlaylistLoader.getAllPlaylists(getActivity()));
|
||||
|
||||
return new PlaylistAdapter(getMainActivity(), playlists, R.layout.item_list_single_row, getMainActivity());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getEmptyMessage() {
|
||||
return R.string.no_playlists;
|
||||
return playlists;
|
||||
}
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@ import com.kabouzeid.gramophone.loader.SongLoader;
|
|||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class SongViewFragment extends AbsMainActivityRecyclerViewFragment {
|
||||
public class SongViewFragment extends AbsMainActivityRecyclerViewFragment<SongAdapter> {
|
||||
|
||||
public static final String TAG = SongViewFragment.class.getSimpleName();
|
||||
|
||||
|
|
@ -23,7 +23,7 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
@NonNull
|
||||
@Override
|
||||
protected RecyclerView.Adapter createAdapter() {
|
||||
protected SongAdapter createAdapter() {
|
||||
return new SongAdapter(getMainActivity(), SongLoader.getAllSongs(getActivity()), R.layout.item_list, getMainActivity());
|
||||
}
|
||||
|
||||
|
|
@ -31,4 +31,9 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
protected int getEmptyMessage() {
|
||||
return R.string.no_songs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onMediaStoreChanged() {
|
||||
getAdapter().swapDataSet(SongLoader.getAllSongs(getActivity()));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -105,7 +105,7 @@ public class NavigationUtil {
|
|||
}
|
||||
}
|
||||
} else {
|
||||
Toast.makeText(activity, activity.getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(activity, activity.getResources().getString(R.string.playing_queue_empty), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -114,7 +114,7 @@ public class NavigationUtil {
|
|||
if (dialog != null) {
|
||||
dialog.show(activity.getSupportFragmentManager(), "PLAY_QUEUE");
|
||||
} else {
|
||||
Toast.makeText(activity, activity.getResources().getString(R.string.nothing_playing), Toast.LENGTH_SHORT).show();
|
||||
Toast.makeText(activity, activity.getResources().getString(R.string.playing_queue_empty), Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@ package com.kabouzeid.gramophone.views;
|
|||
|
||||
import android.animation.Animator;
|
||||
import android.animation.AnimatorListenerAdapter;
|
||||
import android.animation.AnimatorSet;
|
||||
import android.animation.ObjectAnimator;
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
|
|
@ -50,7 +49,7 @@ public class PlayPauseDrawable extends Drawable {
|
|||
private boolean isPlay;
|
||||
private boolean isPlaySet;
|
||||
|
||||
private AnimatorSet animatorSet;
|
||||
private Animator animator;
|
||||
|
||||
public PlayPauseDrawable(@NonNull Context context) {
|
||||
final Resources res = context.getResources();
|
||||
|
|
@ -173,40 +172,38 @@ public class PlayPauseDrawable extends Drawable {
|
|||
return a + (b - a) * t;
|
||||
}
|
||||
|
||||
public void animatedPlay() {
|
||||
if (!isPlaySet) {
|
||||
togglePlayPause();
|
||||
public void setPlay(boolean animate) {
|
||||
if (animate) {
|
||||
if (!isPlaySet) {
|
||||
togglePlayPause();
|
||||
}
|
||||
} else {
|
||||
isPlaySet = true;
|
||||
isPlay = true;
|
||||
setProgress(1);
|
||||
}
|
||||
}
|
||||
|
||||
public void animatedPause() {
|
||||
if (isPlaySet) {
|
||||
togglePlayPause();
|
||||
public void setPause(boolean animate) {
|
||||
if (animate) {
|
||||
if (isPlaySet) {
|
||||
togglePlayPause();
|
||||
}
|
||||
} else {
|
||||
isPlaySet = false;
|
||||
isPlay = false;
|
||||
setProgress(0);
|
||||
}
|
||||
}
|
||||
|
||||
public void setPlay() {
|
||||
isPlaySet = true;
|
||||
isPlay = true;
|
||||
setProgress(1);
|
||||
}
|
||||
|
||||
public void setPause() {
|
||||
isPlaySet = false;
|
||||
isPlay = false;
|
||||
setProgress(0);
|
||||
}
|
||||
|
||||
public void togglePlayPause() {
|
||||
if (animatorSet != null) {
|
||||
animatorSet.cancel();
|
||||
if (animator != null) {
|
||||
animator.cancel();
|
||||
}
|
||||
|
||||
animatorSet = new AnimatorSet();
|
||||
final Animator pausePlayAnim = getPausePlayAnimator();
|
||||
animatorSet.setInterpolator(new DecelerateInterpolator());
|
||||
animatorSet.setDuration(PLAY_PAUSE_ANIMATION_DURATION);
|
||||
animatorSet.playTogether(pausePlayAnim);
|
||||
animatorSet.start();
|
||||
animator = getPausePlayAnimator();
|
||||
animator.setInterpolator(new DecelerateInterpolator());
|
||||
animator.setDuration(PLAY_PAUSE_ANIMATION_DURATION);
|
||||
animator.start();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,7 +97,7 @@
|
|||
</LinearLayout>
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:id="@+id/play_pause_fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_gravity="end|right|bottom"
|
||||
android:layout_margin="@dimen/fab_margin" />
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@
|
|||
tools:ignore="RtlHardcoded" />
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:id="@+id/play_pause_fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_gravity="bottom|right|end"
|
||||
android:layout_margin="@dimen/fab_margin"
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@
|
|||
</LinearLayout>
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:id="@+id/play_pause_fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_gravity="end|bottom"
|
||||
android:layout_margin="@dimen/fab_margin" />
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@
|
|||
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:id="@+id/play_pause_fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_gravity="end|bottom"
|
||||
android:layout_margin="@dimen/fab_margin" />
|
||||
|
|
|
|||
|
|
@ -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" />
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:id="@+id/play_pause_fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_centerInParent="true"
|
||||
android:layout_margin="0dp" />
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@
|
|||
android:textSize="@dimen/empty_text_size" />
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:id="@+id/play_pause_fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_margin="@dimen/fab_margin" />
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@
|
|||
tools:ignore="RtlHardcoded" />
|
||||
|
||||
<android.support.design.widget.FloatingActionButton
|
||||
android:id="@+id/fab"
|
||||
android:id="@+id/play_pause_fab"
|
||||
style="@style/PlayPauseFab"
|
||||
android:layout_gravity="bottom|right|end"
|
||||
android:layout_margin="@dimen/fab_margin"
|
||||
|
|
|
|||
|
|
@ -49,7 +49,6 @@
|
|||
android:layout_marginRight="16dp"
|
||||
android:fontFamily="sans-serif"
|
||||
android:singleLine="true"
|
||||
android:text="@string/nothing_playing"
|
||||
android:textAppearance="@style/TextAppearance.AppCompat.Body1"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="14sp" />
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
<string name="artists">الفنانون</string>
|
||||
<string name="songs">الأغاني</string>
|
||||
<string name="playlists">قوائم التشغيل</string>
|
||||
<string name="nothing_playing">لا شيء قيد التشغيل</string>
|
||||
<string name="playing_queue_empty">لا شيء قيد التشغيل</string>
|
||||
<string name="unplayable_file">عذراً، حصل خطأ أثناء محاولة تشغيل الأغنية</string>
|
||||
<string name="biography_unavailable">عذراً، لم يتم العثور على سيرة ذاتية مطابقة لهذا الفنان</string>
|
||||
<string name="biography">سيرة ذاتية</string>
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
<string name="artists">Interpreti</string>
|
||||
<string name="songs">Skladby</string>
|
||||
<string name="playlists">Playlisty</string>
|
||||
<string name="nothing_playing">Nic nehraje</string>
|
||||
<string name="playing_queue_empty">Nic nehraje</string>
|
||||
<string name="unplayable_file">Omlouváme se, při pokusu přehrát tuto skladbu došlo k chybě</string>
|
||||
<string name="biography_unavailable">Omlouváme se, k tomuto interpretovi nemůžeme sehnat doplňující informace.</string>
|
||||
<string name="biography">Biografie</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">Interpreten</string>
|
||||
<string name="songs">Titel</string>
|
||||
<string name="playlists">Wiedergabelisten</string>
|
||||
<string name="nothing_playing">Keine Wiedergabe</string>
|
||||
<string name="playing_queue_empty">Keine Wiedergabe</string>
|
||||
<string name="unplayable_file">Der Song kann nicht abgespielt werden</string>
|
||||
<string name="biography_unavailable">Es konnte keine passende Biografie für diesen Interpreten gefunden werden</string>
|
||||
<string name="biography">Biografie</string>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
<string name="artists">Καλλιτέχνες</string>
|
||||
<string name="songs">Τραγούδια</string>
|
||||
<string name="playlists">Λίστες αναπαραγωγής</string>
|
||||
<string name="nothing_playing">Δεν παίζει τίποτα</string>
|
||||
<string name="playing_queue_empty">Δεν παίζει τίποτα</string>
|
||||
<string name="unplayable_file">Συγγνώμη - Υπήρξε σφάλμα στην προσπάθεια αναπαραγωγής</string>
|
||||
<string name="biography_unavailable">Συγγνώμη, δεν βρήκαμε τη βιογραφία αυτού του καλλιτέχνη</string>
|
||||
<string name="biography">Βιογραφία</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">Artistas</string>
|
||||
<string name="songs">Canciones</string>
|
||||
<string name="playlists">Listas de reproducción</string>
|
||||
<string name="nothing_playing">Nada se está reproduciendo</string>
|
||||
<string name="playing_queue_empty">Nada se está reproduciendo</string>
|
||||
<string name="unplayable_file">Ocurrió un error al reproducir esta canción.</string>
|
||||
<string name="biography_unavailable">Lo sentimos, no encontramos una biografía correspondiente a éste artista</string>
|
||||
<string name="biography">Biografía</string>
|
||||
|
|
@ -106,6 +106,7 @@
|
|||
<string name="pref_title_general_theme">Tema general</string>
|
||||
<string name="pref_header_audio">Audio</string>
|
||||
<string name="pref_header_general">General</string>
|
||||
<string name="pref_header_images">Imágenes</string>
|
||||
<string name="pref_header_lockscreen">Pantalla de bloqueo</string>
|
||||
<string name="pref_summary_colored_navigation_bar">Selecciona en qué secciones la barra debe tener color</string>
|
||||
<string name="pref_title_navigation_bar">Color en la barra de navegación</string>
|
||||
|
|
@ -119,6 +120,7 @@
|
|||
<string name="pref_title_colored_album_footers">Pie de álbum coloreado</string>
|
||||
<string name="pref_title_album_art_on_lockscreen">Arte del álbum en la pantalla de bloqueo</string>
|
||||
<string name="pref_title_colored_notification">Notificación coloreada</string>
|
||||
<string name="pref_title_ignore_media_store_artwork">Ignorar arte proveniente de almacenamiento</string>
|
||||
<string name="pref_title_gapless_playback">Quitar silencio entre canciones</string>
|
||||
<string name="pref_title_force_square_album_art">Forzar portada de álbum a cuadrado</string>
|
||||
<string name="pref_title_opaque_toolbar_now_playing">Barra de Reproducción Actual opaca</string>
|
||||
|
|
@ -162,6 +164,7 @@
|
|||
<string name="pref_summary_larger_title_box_now_playing">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.</string>
|
||||
<string name="pref_summary_alternative_progress_slider_now_playing">Usa una barra de progreso que no cubre la tapa del álbum en vez de la barra normal de progreso.</string>
|
||||
<string name="pref_summary_playback_controller_card_now_playing">Mostrar tarjeta detrás de los botones de control de reproducción (reproducir/pausar, etc).</string>
|
||||
<string name="pref_summary_ignore_media_store_artwork">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.</string>
|
||||
<string name="could_not_download_album_cover">"No se puede descargar una tapa de álbum coincidente."</string>
|
||||
<string name="search_hint">Buscar en librería...</string>
|
||||
<string name="rescanning_media">Escaneando contenido...</string>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
<string name="artists">Artistit</string>
|
||||
<string name="songs">Kappaleet</string>
|
||||
<string name="playlists">Soittolistat</string>
|
||||
<string name="nothing_playing">Mitään ei toisteta</string>
|
||||
<string name="playing_queue_empty">Mitään ei toisteta</string>
|
||||
<string name="unplayable_file">Virhe toistettaessa kappaletta</string>
|
||||
<string name="biography_unavailable">Biogtagiaa ei löytynyt tälle artistille</string>
|
||||
<string name="biography">Biografia</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">Artistes</string>
|
||||
<string name="songs">Titres</string>
|
||||
<string name="playlists">Playlists</string>
|
||||
<string name="nothing_playing">Aucune lecture en cours</string>
|
||||
<string name="playing_queue_empty">Aucune lecture en cours</string>
|
||||
<string name="unplayable_file">Une erreur est survenue lors de la tentative de lecture de ce titre.</string>
|
||||
<string name="biography_unavailable">Nous n\'avons pas trouvé la biographie correspondant à cet artiste.</string>
|
||||
<string name="biography">Biographie</string>
|
||||
|
|
@ -104,6 +104,7 @@
|
|||
<string name="pref_title_general_theme">Thème général</string>
|
||||
<string name="pref_header_audio">Audio</string>
|
||||
<string name="pref_header_general">Général</string>
|
||||
<string name="pref_header_images">Images</string>
|
||||
<string name="pref_header_lockscreen">Écran de vérouillage</string>
|
||||
<string name="pref_summary_colored_navigation_bar">Dans quelles vues la barre navigation doit être colorée.</string>
|
||||
<string name="pref_title_navigation_bar">Barre de navigation colorée</string>
|
||||
|
|
@ -117,6 +118,7 @@
|
|||
<string name="pref_title_colored_album_footers">Bas d\'album coloré</string>
|
||||
<string name="pref_title_album_art_on_lockscreen">Vignette d\'album sur l\'écran de vérouillage</string>
|
||||
<string name="pref_title_colored_notification">Notification colorée</string>
|
||||
<string name="pref_title_ignore_media_store_artwork">Ignorer stockage des artwork media</string>
|
||||
<string name="pref_title_gapless_playback">Lecture sans coupure</string>
|
||||
<string name="pref_title_force_square_album_art">Vignette carrée</string>
|
||||
<string name="pref_title_opaque_toolbar_now_playing">Barre d\'outil opaque</string>
|
||||
|
|
@ -160,6 +162,7 @@
|
|||
<string name="pref_summary_larger_title_box_now_playing">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.</string>
|
||||
<string name="pref_summary_alternative_progress_slider_now_playing">Utilise une barre de progression qui ne recouvre pas la vignette de l\'album à la place de la barre de progression normale.</string>
|
||||
<string name="pref_summary_playback_controller_card_now_playing">Affiche une carte derrière les boutons de lecture (lecture/pause etc.)</string>
|
||||
<string name="pref_summary_ignore_media_store_artwork">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</string>
|
||||
<string name="could_not_download_album_cover">"Impossible de télécharger la vignette correspondant à l'album."</string>
|
||||
<string name="search_hint">Rechercher votre bibliothèque...</string>
|
||||
<string name="rescanning_media">Réanalyse des médias…</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">Izvođači</string>
|
||||
<string name="songs">Pjesme</string>
|
||||
<string name="playlists">Popisi pjesama</string>
|
||||
<string name="nothing_playing">Ništa se ne reproducira</string>
|
||||
<string name="playing_queue_empty">Ništa se ne reproducira</string>
|
||||
<string name="unplayable_file">Došlo je do greške prilikom pokušaja reproduciranja ove pjesme</string>
|
||||
<string name="biography_unavailable">Nismo mogli pronaći biografiju ovog izvođača</string>
|
||||
<string name="biography">Biografija</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">Artisti</string>
|
||||
<string name="songs">Brani</string>
|
||||
<string name="playlists">Playlist</string>
|
||||
<string name="nothing_playing">Niente in riproduzione</string>
|
||||
<string name="playing_queue_empty">Niente in riproduzione</string>
|
||||
<string name="unplayable_file">Spiacenti - Si è verificato un errore nel tentativo di riprodurre questa canzone.</string>
|
||||
<string name="biography_unavailable">Spiacenti - Impossibile trovare una biografia corrispondente a questo artista.</string>
|
||||
<string name="biography">Biografia</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">アーティスト</string>
|
||||
<string name="songs">楽曲</string>
|
||||
<string name="playlists">プレイリスト</string>
|
||||
<string name="nothing_playing">再生中の曲はありません</string>
|
||||
<string name="playing_queue_empty">再生中の曲はありません</string>
|
||||
<string name="unplayable_file">楽曲の再生時にエラーが発生しました</string>
|
||||
<string name="biography_unavailable">バイオグラフィーが見つかりません</string>
|
||||
<string name="biography">バイオグラフィー</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">아티스트</string>
|
||||
<string name="songs">노래</string>
|
||||
<string name="playlists">재생목록</string>
|
||||
<string name="nothing_playing">재생 중인 노래가 없습니다.</string>
|
||||
<string name="playing_queue_empty">재생 중인 노래가 없습니다.</string>
|
||||
<string name="unplayable_file">이 노래를 재생하려던 중 오류가 발생했습니다.</string>
|
||||
<string name="biography_unavailable">이 아티스트와 일치하는 정보를 찾을 수 없습니다.</string>
|
||||
<string name="biography">정보</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">Artiesten</string>
|
||||
<string name="songs">Nummers</string>
|
||||
<string name="playlists">Afspeellijsten</string>
|
||||
<string name="nothing_playing">Niets wordt afgespeeld</string>
|
||||
<string name="playing_queue_empty">Niets wordt afgespeeld</string>
|
||||
<string name="unplayable_file">Er is een fout opgetreden bij het afspelen van dit nummer.</string>
|
||||
<string name="biography_unavailable">Het is niet gelukt een passende biografie te vinden voor deze artiest.</string>
|
||||
<string name="biography">Biografie</string>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
<string name="artists">Artistar</string>
|
||||
<string name="songs">Songar</string>
|
||||
<string name="playlists">Spelelister</string>
|
||||
<string name="nothing_playing">Ingenting speler</string>
|
||||
<string name="playing_queue_empty">Ingenting speler</string>
|
||||
<string name="unplayable_file">Orsak - ein feil oppstod medan spelaren prøvde å spele denne songen</string>
|
||||
<string name="biography_unavailable">Orsak, vi fann ingen passande biografi for denne artisten.</string>
|
||||
<string name="biography">Biografi</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">Wykonawcy</string>
|
||||
<string name="songs">Utwory</string>
|
||||
<string name="playlists">Listy odtwarzania</string>
|
||||
<string name="nothing_playing">Nic nie gra</string>
|
||||
<string name="playing_queue_empty">Nic nie gra</string>
|
||||
<string name="unplayable_file">Wystąpił błąd przy próbie odtworzenia tego utworu</string>
|
||||
<string name="biography_unavailable">Nie znaleziono pasującej biografii dla tego wykonawcy</string>
|
||||
<string name="biography">Biografia</string>
|
||||
|
|
@ -162,6 +162,7 @@
|
|||
<string name="pref_summary_larger_title_box_now_playing">Zaznacz, a pole nazwy utworu i wykonawcy pod okładką albumu będzie większe</string>
|
||||
<string name="pref_summary_alternative_progress_slider_now_playing">Zaznacz, a w odróżnieniu od domyślnego suwaka, pasek postępu nie zasłoni okładki albumu</string>
|
||||
<string name="pref_summary_playback_controller_card_now_playing">Zaznacz, a pod przyciskami sterującymi odtwarzaczem (odtwarzanie/pauza, itp.) zostanie wyświetlona karta</string>
|
||||
<string name="pref_summary_ignore_media_store_artwork">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</string>
|
||||
<string name="could_not_download_album_cover">"Nie udało się pobrać okładki pasującej do albumu"</string>
|
||||
<string name="search_hint">Szukaj w bibliotece...</string>
|
||||
<string name="rescanning_media">Ponowny skan nośnika...</string>
|
||||
|
|
@ -175,7 +176,7 @@
|
|||
<string name="web_search">Wyszukaj w sieci</string>
|
||||
<string name="action_sleep_timer">Wyłącznik czasowy</string>
|
||||
<string name="action_set">Ustaw</string>
|
||||
<string name="cancel_current_timer">Anuluj aktualny wyłącznik czasowy</string>
|
||||
<string name="cancel_current_timer">Anuluj wyłącznik</string>
|
||||
<string name="sleep_timer_canceled">Wyłącznik czasowy został anulowany</string>
|
||||
<string name="sleep_timer_set">Wyłącznik czasowy ustawiony na %d minut od teraz</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">Artistas</string>
|
||||
<string name="songs">Músicas</string>
|
||||
<string name="playlists">Playlists</string>
|
||||
<string name="nothing_playing">Nada em execução</string>
|
||||
<string name="playing_queue_empty">Nada em execução</string>
|
||||
<string name="unplayable_file">Desculpe - ocorreu um erro ao tentar reproduzir esta faixa</string>
|
||||
<string name="biography_unavailable">Desculpe, não conseguimos encontrar a biografia deste artista.</string>
|
||||
<string name="biography">Biografia</string>
|
||||
|
|
@ -51,7 +51,7 @@
|
|||
<string name="label_track_length">Duração</string>
|
||||
<string name="label_bit_rate">Taxa de bits</string>
|
||||
<string name="label_sampling_rate">Taxa de amostragem</string>
|
||||
<string name="action_go_to_artist">Ir para artista</string>
|
||||
<string name="action_go_to_artist">Ir para o artista</string>
|
||||
<string name="action_go_to_album">Ir para o álbum</string>
|
||||
<string name="label_current_playing_queue">Lista de reprodução</string>
|
||||
<string name="save_as_playlist">Salvar como playlist</string>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
<string name="artists">Artistas</string>
|
||||
<string name="songs">Músicas</string>
|
||||
<string name="playlists">Playlists</string>
|
||||
<string name="nothing_playing">Nada está sendo reproduzido</string>
|
||||
<string name="playing_queue_empty">Nada está sendo reproduzido</string>
|
||||
<string name="unplayable_file">Desculpe - ocorreu um erro ao tentar reproduzir essa música</string>
|
||||
<string name="biography_unavailable">Desculpe, mas nós não fomos capazes de encontrar uma biografia para este artista.</string>
|
||||
<string name="biography">Biografia</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">Artiști</string>
|
||||
<string name="songs">Melodii</string>
|
||||
<string name="playlists">Liste de redare</string>
|
||||
<string name="nothing_playing">Nimic nu este redat</string>
|
||||
<string name="playing_queue_empty">Nimic nu este redat</string>
|
||||
<string name="unplayable_file">Ne pare rău - a apărut o problemă în încercarea de a reda această melodie.</string>
|
||||
<string name="biography_unavailable">Ne pare rău, nu am putut găsi o biografie potrivită pentru acest artist.</string>
|
||||
<string name="biography">Biografie</string>
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
<string name="artists">Исполнители</string>
|
||||
<string name="songs">Песни</string>
|
||||
<string name="playlists">Списки воспроизведения</string>
|
||||
<string name="nothing_playing">Ничего нет для воспроизведения</string>
|
||||
<string name="playing_queue_empty">Ничего нет для воспроизведения</string>
|
||||
<string name="unplayable_file">Произошла ошибка при попытке проиграть эту песню</string>
|
||||
<string name="biography_unavailable">Извините, биография для этого исполнителя не найдена.</string>
|
||||
<string name="biography">Биография</string>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
<string name="artists">Artister</string>
|
||||
<string name="songs">Låtar</string>
|
||||
<string name="playlists">Spellista</string>
|
||||
<string name="nothing_playing">Ingenting att spela</string>
|
||||
<string name="playing_queue_empty">Ingenting att spela</string>
|
||||
<string name="unplayable_file">Ursäkta - ett problem uppstod vid spelningen av denna låt</string>
|
||||
<string name="biography_unavailable">Ursäkta, vi kunde inte hitta biografin för den här artisten</string>
|
||||
<string name="biography">Biografi</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">Sanatçılar</string>
|
||||
<string name="songs">Şarkılar</string>
|
||||
<string name="playlists">Çalma listeleri</string>
|
||||
<string name="nothing_playing">Şu anda çalınan şarkı yok</string>
|
||||
<string name="playing_queue_empty">Şu anda çalınan şarkı yok</string>
|
||||
<string name="unplayable_file">Bu şarkı oynatılırken bir hata oluştu</string>
|
||||
<string name="biography_unavailable">Bu sanatçı ile ilgili hiçbir biyografi yazısı bulamadık.</string>
|
||||
<string name="biography">Biyografi</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">艺术家</string>
|
||||
<string name="songs">歌曲</string>
|
||||
<string name="playlists">播放列表</string>
|
||||
<string name="nothing_playing">没有正在播放的曲目</string>
|
||||
<string name="playing_queue_empty">没有正在播放的曲目</string>
|
||||
<string name="unplayable_file">尝试播放该曲目时发生错误。</string>
|
||||
<string name="biography_unavailable">找不到与该艺术家相匹配的个人简介。</string>
|
||||
<string name="biography">歌手简介</string>
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@
|
|||
<string name="artists">歌手</string>
|
||||
<string name="songs">歌曲</string>
|
||||
<string name="playlists">音樂清單</string>
|
||||
<string name="nothing_playing">沒有正在播放的歌曲</string>
|
||||
<string name="playing_queue_empty">沒有正在播放的歌曲</string>
|
||||
<string name="unplayable_file">嘗試播放歌曲時發生錯誤</string>
|
||||
<string name="biography_unavailable">無法找到與這位歌手相符的個人簡介</string>
|
||||
<string name="biography">個人簡介</string>
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
<string name="artists">Artists</string>
|
||||
<string name="songs">Songs</string>
|
||||
<string name="playlists">Playlists</string>
|
||||
<string name="playing_queue_empty">Playing queue is empty</string>
|
||||
<string name="nothing_playing">Nothing is playing</string>
|
||||
<string name="unplayable_file">An error occurred while attempting to play this song</string>
|
||||
<string name="biography_unavailable">Could not find a matching biography for this artist</string>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue