Prepared everything for multi-selection and implemented it in the song view for now.
|
|
@ -25,7 +25,7 @@ android {
|
|||
minSdkVersion 16
|
||||
targetSdkVersion 22
|
||||
versionCode 26
|
||||
versionName "0.9.10.1b"
|
||||
versionName "0.9.10.1b DEV"
|
||||
}
|
||||
|
||||
compileOptions {
|
||||
|
|
@ -70,6 +70,7 @@ dependencies {
|
|||
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'
|
||||
|
||||
compile 'com.afollestad:material-dialogs:0.7.4.2'
|
||||
compile 'com.afollestad:material-cab:0.1.2'
|
||||
compile 'com.jpardogo.materialtabstrip:library:1.0.9'
|
||||
compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
|
||||
compile 'com.melnykov:floatingactionbutton:1.3.0'
|
||||
|
|
|
|||
|
|
@ -0,0 +1,80 @@
|
|||
package com.kabouzeid.gramophone.adapter;
|
||||
|
||||
import android.support.v7.widget.RecyclerView;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public abstract class AbsMultiSelectAdapter<VH extends RecyclerView.ViewHolder, I> extends RecyclerView.Adapter<VH> implements MaterialCab.Callback {
|
||||
private final CabHolder cabHolder;
|
||||
private MaterialCab cab;
|
||||
private ArrayList<I> checked;
|
||||
private int menuRes;
|
||||
|
||||
public AbsMultiSelectAdapter(CabHolder cabHolder, int menuRes) {
|
||||
this.cabHolder = cabHolder;
|
||||
checked = new ArrayList<>();
|
||||
this.menuRes = menuRes;
|
||||
}
|
||||
|
||||
protected void toggleChecked(final int position) {
|
||||
if (cabHolder != null) {
|
||||
openCabIfNecessary();
|
||||
if (position > 0) {
|
||||
I identifier = getIdentifier(position);
|
||||
if (!checked.remove(identifier)) checked.add(identifier);
|
||||
notifyItemChanged(position);
|
||||
}
|
||||
if (checked.isEmpty()) cab.finish();
|
||||
}
|
||||
}
|
||||
|
||||
private void openCabIfNecessary() {
|
||||
if (cab == null || !cab.isActive()) {
|
||||
cab = cabHolder.openCab(menuRes, this);
|
||||
}
|
||||
}
|
||||
|
||||
private void uncheckAll() {
|
||||
checked.clear();
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
protected boolean isChecked(I identifier) {
|
||||
return checked.contains(identifier);
|
||||
}
|
||||
|
||||
protected boolean isInQuickSelectMode() {
|
||||
return cab != null && cab.isActive();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCabCreated(MaterialCab materialCab, Menu menu) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCabItemClicked(MenuItem menuItem) {
|
||||
onMultipleItemAction(menuItem, new ArrayList<>(checked));
|
||||
cab.finish();
|
||||
uncheckAll();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCabFinished(MaterialCab materialCab) {
|
||||
uncheckAll();
|
||||
return true;
|
||||
}
|
||||
|
||||
protected abstract I getIdentifier(int position);
|
||||
|
||||
protected abstract void onMultipleItemAction(MenuItem menuItem, ArrayList<I> selection);
|
||||
}
|
||||
|
|
@ -12,11 +12,16 @@ import android.widget.ImageView;
|
|||
import android.widget.PopupMenu;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.afollestad.materialdialogs.ThemeSingleton;
|
||||
import com.kabouzeid.gramophone.App;
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.adapter.AbsMultiSelectAdapter;
|
||||
import com.kabouzeid.gramophone.dialogs.AddToPlaylistDialog;
|
||||
import com.kabouzeid.gramophone.dialogs.DeleteSongsDialog;
|
||||
import com.kabouzeid.gramophone.helper.MenuItemClickHelper;
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||
import com.kabouzeid.gramophone.loader.SongLoader;
|
||||
import com.kabouzeid.gramophone.model.DataBaseChangedEvent;
|
||||
import com.kabouzeid.gramophone.model.Song;
|
||||
|
|
@ -28,12 +33,11 @@ import com.nostra13.universalimageloader.core.ImageLoader;
|
|||
import com.squareup.otto.Subscribe;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
|
||||
public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song> implements MaterialCab.Callback {
|
||||
|
||||
public static final String TAG = AlbumSongAdapter.class.getSimpleName();
|
||||
private static final int SHUFFLE_BUTTON = 0;
|
||||
|
|
@ -41,11 +45,10 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
|
|||
|
||||
protected final AppCompatActivity activity;
|
||||
protected ArrayList<Song> dataSet;
|
||||
private HashSet<Integer> checked;
|
||||
|
||||
public SongAdapter(AppCompatActivity activity) {
|
||||
public SongAdapter(AppCompatActivity activity, CabHolder cabHolder) {
|
||||
super(cabHolder, R.menu.menu_media_selection);
|
||||
this.activity = activity;
|
||||
checked = new HashSet<>();
|
||||
loadDataSet();
|
||||
}
|
||||
|
||||
|
|
@ -80,7 +83,7 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
|
|||
.resetViewBeforeLoading(true)
|
||||
.build()
|
||||
);
|
||||
holder.view.setActivated(checked.contains(song.id));
|
||||
holder.view.setActivated(isChecked(song));
|
||||
} else {
|
||||
holder.songTitle.setText(activity.getResources().getString(R.string.shuffle_all).toUpperCase());
|
||||
holder.songTitle.setTextColor(ThemeSingleton.get().positiveColor);
|
||||
|
|
@ -101,6 +104,26 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
|
|||
return dataSet.size() + 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Song getIdentifier(int position) {
|
||||
return dataSet.get(position - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMultipleItemAction(MenuItem menuItem, ArrayList<Song> selection) {
|
||||
switch (menuItem.getItemId()) {
|
||||
case R.id.action_delete_from_disk:
|
||||
DeleteSongsDialog.create(selection).show(activity.getSupportFragmentManager(), "DELETE_SONGS");
|
||||
break;
|
||||
case R.id.action_add_to_playlist:
|
||||
AddToPlaylistDialog.create(selection).show(activity.getSupportFragmentManager(), "ADD_PLAYLIST");
|
||||
break;
|
||||
case R.id.action_add_to_current_playing:
|
||||
MusicPlayerRemote.enqueue(selection);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
|
||||
final TextView songTitle;
|
||||
final TextView songInfo;
|
||||
|
|
@ -152,6 +175,8 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
|
|||
public void onClick(View v) {
|
||||
if (getItemViewType() == SHUFFLE_BUTTON) {
|
||||
MusicPlayerRemote.shuffleAllSongs(activity);
|
||||
} else if (isInQuickSelectMode()) {
|
||||
toggleChecked(getAdapterPosition());
|
||||
} else {
|
||||
MusicPlayerRemote.openQueue(dataSet, getAdapterPosition() - 1, true);
|
||||
}
|
||||
|
|
@ -164,11 +189,6 @@ public class SongAdapter extends RecyclerView.Adapter<SongAdapter.ViewHolder> {
|
|||
}
|
||||
}
|
||||
|
||||
private void toggleChecked(final int position) {
|
||||
final int id = dataSet.get(position - 1).id;
|
||||
if (!checked.add(id)) checked.remove(id);
|
||||
notifyItemChanged(position);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ import com.kabouzeid.gramophone.service.MusicService;
|
|||
import com.kabouzeid.gramophone.util.InternalStorageUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
|
|
@ -251,6 +252,14 @@ public class MusicPlayerRemote {
|
|||
}
|
||||
}
|
||||
|
||||
public static void enqueue(List<Song> songs) {
|
||||
if (musicService != null) {
|
||||
musicService.addSongs(songs);
|
||||
final String toast = songs.size() > 1 ? musicService.getResources().getString(R.string.added_x_titles_to_playing_queue, songs.size()) : musicService.getResources().getString(R.string.added_title_to_playing_queue);
|
||||
Toast.makeText(musicService, toast, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
|
||||
public static void removeFromQueue(Song song) {
|
||||
if (musicService != null) {
|
||||
musicService.removeSong(song);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
package com.kabouzeid.gramophone.interfaces;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
|
||||
/**
|
||||
* @author Karim Abou Zeid (kabouzeid)
|
||||
*/
|
||||
public interface CabHolder {
|
||||
|
||||
MaterialCab openCab(final int menuRes, final MaterialCab.Callback callback);
|
||||
}
|
||||
|
|
@ -27,9 +27,8 @@ public class AlbumLoader {
|
|||
final int artistId = cursor.getInt(3);
|
||||
final int songCount = cursor.getInt(4);
|
||||
final int year = cursor.getInt(5);
|
||||
final String albumArtPath = cursor.getString(6);
|
||||
|
||||
final Album album = new Album(id, albumName, artist, artistId, songCount, year, albumArtPath);
|
||||
final Album album = new Album(id, albumName, artist, artistId, songCount, year);
|
||||
albums.add(album);
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
|
|
@ -58,8 +57,6 @@ public class AlbumLoader {
|
|||
MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS,
|
||||
/* 5 */
|
||||
MediaStore.Audio.AlbumColumns.FIRST_YEAR,
|
||||
/* 6 */
|
||||
MediaStore.Audio.AlbumColumns.ALBUM_ART
|
||||
}, selection, values, PreferenceUtils.getInstance(context).getAlbumSortOrder());
|
||||
}
|
||||
|
||||
|
|
@ -73,9 +70,8 @@ public class AlbumLoader {
|
|||
final int artistId = cursor.getInt(3);
|
||||
final int songCount = cursor.getInt(4);
|
||||
final int year = cursor.getInt(5);
|
||||
final String albumArtPath = cursor.getString(6);
|
||||
|
||||
album = new Album(id, albumName, artist, artistId, songCount, year, albumArtPath);
|
||||
album = new Album(id, albumName, artist, artistId, songCount, year);
|
||||
}
|
||||
|
||||
if (cursor != null) {
|
||||
|
|
@ -95,9 +91,8 @@ public class AlbumLoader {
|
|||
final int artistId = cursor.getInt(3);
|
||||
final int songCount = cursor.getInt(4);
|
||||
final int year = cursor.getInt(5);
|
||||
final String albumArtPath = cursor.getString(6);
|
||||
|
||||
final Album album = new Album(id, albumName, artist, artistId, songCount, year, albumArtPath);
|
||||
final Album album = new Album(id, albumName, artist, artistId, songCount, year);
|
||||
albums.add(album);
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,9 +27,8 @@ public class AlbumSongLoader {
|
|||
final long duration = cursor.getLong(4);
|
||||
final int trackNumber = cursor.getInt(5);
|
||||
final int artistId = cursor.getInt(6);
|
||||
final long dateModified = cursor.getInt(7);
|
||||
|
||||
final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, dateModified);
|
||||
final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber);
|
||||
songs.add(song);
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
|
|
@ -54,9 +53,7 @@ public class AlbumSongLoader {
|
|||
/* 5 */
|
||||
MediaStore.Audio.AudioColumns.TRACK,
|
||||
/* 6 */
|
||||
MediaStore.Audio.AudioColumns.ARTIST_ID,
|
||||
/* 7 */
|
||||
MediaStore.Audio.AudioColumns.DATE_MODIFIED
|
||||
MediaStore.Audio.AudioColumns.ARTIST_ID
|
||||
}, (MediaStore.Audio.AudioColumns.IS_MUSIC + "=1") + " AND " +
|
||||
MediaStore.Audio.AudioColumns.TITLE + " != ''" + " AND " +
|
||||
MediaStore.Audio.AudioColumns.ALBUM_ID + "=" + albumId, null,
|
||||
|
|
|
|||
|
|
@ -26,9 +26,8 @@ public class ArtistAlbumLoader {
|
|||
final String artist = cursor.getString(2);
|
||||
final int songCount = cursor.getInt(3);
|
||||
final int year = cursor.getInt(4);
|
||||
final String albumArtPath = cursor.getString(5);
|
||||
|
||||
final Album album = new Album(id, albumName, artist, artistId, songCount, year, albumArtPath);
|
||||
final Album album = new Album(id, albumName, artist, artistId, songCount, year);
|
||||
albums.add(album);
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
|
|
@ -51,8 +50,6 @@ public class ArtistAlbumLoader {
|
|||
MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS,
|
||||
/* 4 */
|
||||
MediaStore.Audio.AlbumColumns.FIRST_YEAR,
|
||||
/* 5 */
|
||||
MediaStore.Audio.AlbumColumns.ALBUM_ART
|
||||
}, null, null, PreferenceUtils.getInstance(context).getArtistAlbumSortOrder());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,9 +27,8 @@ public class ArtistSongLoader {
|
|||
final long duration = cursor.getLong(4);
|
||||
final int trackNumber = cursor.getInt(5);
|
||||
final int albumId = cursor.getInt(6);
|
||||
final long dateModified = cursor.getInt(7);
|
||||
|
||||
final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, dateModified);
|
||||
final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber);
|
||||
songs.add(song);
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
|
|
@ -54,9 +53,7 @@ public class ArtistSongLoader {
|
|||
/* 5 */
|
||||
MediaStore.Audio.AudioColumns.TRACK,
|
||||
/* 6 */
|
||||
MediaStore.Audio.AudioColumns.ALBUM_ID,
|
||||
/* 7 */
|
||||
MediaStore.Audio.AudioColumns.DATE_MODIFIED
|
||||
MediaStore.Audio.AudioColumns.ALBUM_ID
|
||||
}, (MediaStore.Audio.AudioColumns.IS_MUSIC + "=1") + " AND " +
|
||||
MediaStore.Audio.AudioColumns.TITLE + " != ''" + " AND " +
|
||||
MediaStore.Audio.AudioColumns.ARTIST_ID + "=" + artistId, null,
|
||||
|
|
|
|||
|
|
@ -26,9 +26,8 @@ public class PlaylistSongLoader {
|
|||
final int albumId = cursor.getInt(6);
|
||||
final int artistId = cursor.getInt(7);
|
||||
final int idInPlaylist = cursor.getInt(8);
|
||||
final long dateModified = cursor.getInt(9);
|
||||
|
||||
final PlaylistSong song = new PlaylistSong(id, albumId, artistId, songName, artist, album, duration, trackNumber, playlistID, idInPlaylist, dateModified);
|
||||
final PlaylistSong song = new PlaylistSong(id, albumId, artistId, songName, artist, album, duration, trackNumber, playlistID, idInPlaylist);
|
||||
|
||||
songs.add(song);
|
||||
} while (cursor.moveToNext());
|
||||
|
|
@ -60,9 +59,7 @@ public class PlaylistSongLoader {
|
|||
/* 7 */
|
||||
AudioColumns.ARTIST_ID,
|
||||
/* 8 */
|
||||
MediaStore.Audio.Playlists.Members._ID,
|
||||
/* 9 */
|
||||
MediaStore.Audio.AudioColumns.DATE_MODIFIED
|
||||
MediaStore.Audio.Playlists.Members._ID
|
||||
}, (AudioColumns.IS_MUSIC + "=1") + " AND " + AudioColumns.TITLE + " != ''", null,
|
||||
MediaStore.Audio.Playlists.Members.DEFAULT_SORT_ORDER);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,9 +30,8 @@ public class SongLoader {
|
|||
final int trackNumber = cursor.getInt(5);
|
||||
final int artistId = cursor.getInt(6);
|
||||
final int albumId = cursor.getInt(7);
|
||||
final long dateModified = cursor.getInt(8);
|
||||
|
||||
final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, dateModified);
|
||||
final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber);
|
||||
songs.add(song);
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
|
|
@ -68,9 +67,7 @@ public class SongLoader {
|
|||
/* 6 */
|
||||
MediaStore.Audio.AudioColumns.ARTIST_ID,
|
||||
/* 7 */
|
||||
MediaStore.Audio.AudioColumns.ALBUM_ID,
|
||||
/* 8 */
|
||||
MediaStore.Audio.AudioColumns.DATE_MODIFIED
|
||||
MediaStore.Audio.AudioColumns.ALBUM_ID
|
||||
}, finalSelection, values, PreferenceUtils.getInstance(context).getSongSortOrder());
|
||||
}
|
||||
|
||||
|
|
@ -87,9 +84,8 @@ public class SongLoader {
|
|||
final int trackNumber = cursor.getInt(5);
|
||||
final int artistId = cursor.getInt(6);
|
||||
final int albumId = cursor.getInt(7);
|
||||
final long dateModified = cursor.getInt(8);
|
||||
|
||||
final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, dateModified);
|
||||
final Song song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber);
|
||||
songs.add(song);
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
|
|
@ -111,8 +107,7 @@ public class SongLoader {
|
|||
final int trackNumber = cursor.getInt(5);
|
||||
final int artistId = cursor.getInt(6);
|
||||
final int albumId = cursor.getInt(7);
|
||||
final long dateModified = cursor.getInt(8);
|
||||
song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber, dateModified);
|
||||
song = new Song(id, albumId, artistId, songName, artist, album, duration, trackNumber);
|
||||
}
|
||||
if (cursor != null) {
|
||||
cursor.close();
|
||||
|
|
|
|||
|
|
@ -11,17 +11,15 @@ public class Album {
|
|||
public final String artistName;
|
||||
public final int songCount;
|
||||
public final int year;
|
||||
public final String albumArtPath; //used as cache key
|
||||
|
||||
public Album(final int id, final String title, final String artistName, final int artistId,
|
||||
final int songNumber, final int albumYear, final String albumArtPath) {
|
||||
final int songNumber, final int albumYear) {
|
||||
this.id = id;
|
||||
this.title = title;
|
||||
this.artistName = artistName;
|
||||
this.artistId = artistId;
|
||||
songCount = songNumber;
|
||||
year = albumYear;
|
||||
this.albumArtPath = albumArtPath != null ? albumArtPath : "";
|
||||
}
|
||||
|
||||
public Album() {
|
||||
|
|
@ -31,6 +29,5 @@ public class Album {
|
|||
this.artistId = -1;
|
||||
songCount = -1;
|
||||
year = -1;
|
||||
this.albumArtPath = "";
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,8 +8,8 @@ public class PlaylistSong extends Song {
|
|||
public final int idInPlayList;
|
||||
|
||||
public PlaylistSong(final int id, final int albumId, final int artistId, final String title, final String artistName,
|
||||
final String albumName, final long duration, final int trackNumber, final int playlistId, final int idInPlayList, final long dateModified) {
|
||||
super(id, albumId, artistId, title, artistName, albumName, duration, trackNumber, dateModified);
|
||||
final String albumName, final long duration, final int trackNumber, final int playlistId, final int idInPlayList) {
|
||||
super(id, albumId, artistId, title, artistName, albumName, duration, trackNumber);
|
||||
this.playlistId = playlistId;
|
||||
this.idInPlayList = idInPlayList;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
package com.kabouzeid.gramophone.model;
|
||||
|
||||
import android.text.TextUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
|
|
@ -17,10 +19,9 @@ public class Song implements Serializable {
|
|||
public final String albumName;
|
||||
public final long duration;
|
||||
public final int trackNumber;
|
||||
public final long dateModified; //used as cache key
|
||||
|
||||
public Song(final int id, final int albumId, final int artistId, final String title, final String artistName,
|
||||
final String albumName, final long duration, final int trackNumber, final long dateModified) {
|
||||
final String albumName, final long duration, final int trackNumber) {
|
||||
this.id = id;
|
||||
this.albumId = albumId;
|
||||
this.artistId = artistId;
|
||||
|
|
@ -29,7 +30,6 @@ public class Song implements Serializable {
|
|||
this.albumName = albumName;
|
||||
this.duration = duration;
|
||||
this.trackNumber = trackNumber;
|
||||
this.dateModified = dateModified;
|
||||
}
|
||||
|
||||
public Song() {
|
||||
|
|
@ -41,6 +41,49 @@ public class Song implements Serializable {
|
|||
this.albumName = "";
|
||||
this.duration = -1;
|
||||
this.trackNumber = -1;
|
||||
this.dateModified = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
result = prime * result + (albumName == null ? 0 : albumName.hashCode());
|
||||
result = prime * result + (artistName == null ? 0 : artistName.hashCode());
|
||||
result = prime * result + (int) duration;
|
||||
result = prime * result + id;
|
||||
result = prime * result + (title == null ? 0 : title.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
final Song other = (Song) obj;
|
||||
if (id != other.id) {
|
||||
return false;
|
||||
}
|
||||
if (!TextUtils.equals(albumName, other.albumName)) {
|
||||
return false;
|
||||
}
|
||||
if (!TextUtils.equals(artistName, other.artistName)) {
|
||||
return false;
|
||||
}
|
||||
if (duration != other.duration) {
|
||||
return false;
|
||||
}
|
||||
return TextUtils.equals(title, other.title);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return title;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListene
|
|||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MusicService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener, AudioManager.OnAudioFocusChangeListener {
|
||||
public static final String ACTION_TOGGLE_PLAYBACK = "com.kabouzeid.gramophone.action.TOGGLE_PLAYBACK";
|
||||
|
|
@ -552,6 +553,18 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe
|
|||
saveState();
|
||||
}
|
||||
|
||||
public void addSongs(int position, List<Song> songs) {
|
||||
playingQueue.addAll(position, songs);
|
||||
originalPlayingQueue.addAll(position, songs);
|
||||
saveState();
|
||||
}
|
||||
|
||||
public void addSongs(List<Song> songs) {
|
||||
playingQueue.addAll(songs);
|
||||
originalPlayingQueue.addAll(songs);
|
||||
saveState();
|
||||
}
|
||||
|
||||
public void removeSong(int position) {
|
||||
if (getShuffleMode() == SHUFFLE_MODE_NONE) {
|
||||
playingQueue.remove(position);
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ import android.view.MenuItem;
|
|||
import android.view.SubMenu;
|
||||
import android.widget.FrameLayout;
|
||||
|
||||
import com.afollestad.materialcab.MaterialCab;
|
||||
import com.afollestad.materialdialogs.ThemeSingleton;
|
||||
import com.astuetz.PagerSlidingTabStrip;
|
||||
import com.kabouzeid.gramophone.R;
|
||||
|
|
@ -32,6 +33,7 @@ import com.kabouzeid.gramophone.adapter.PagerAdapter;
|
|||
import com.kabouzeid.gramophone.dialogs.AboutDialog;
|
||||
import com.kabouzeid.gramophone.dialogs.CreatePlaylistDialog;
|
||||
import com.kabouzeid.gramophone.helper.MusicPlayerRemote;
|
||||
import com.kabouzeid.gramophone.interfaces.CabHolder;
|
||||
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
|
||||
import com.kabouzeid.gramophone.loader.AlbumSongLoader;
|
||||
import com.kabouzeid.gramophone.loader.ArtistSongLoader;
|
||||
|
|
@ -57,7 +59,7 @@ import java.util.List;
|
|||
import java.util.Set;
|
||||
|
||||
public class MainActivity extends AbsFabActivity
|
||||
implements NavigationDrawerFragment.NavigationDrawerCallbacks, KabViewsDisableAble {
|
||||
implements NavigationDrawerFragment.NavigationDrawerCallbacks, KabViewsDisableAble, CabHolder {
|
||||
|
||||
public static final String TAG = MainActivity.class.getSimpleName();
|
||||
|
||||
|
|
@ -69,6 +71,7 @@ public class MainActivity extends AbsFabActivity
|
|||
private ViewPager viewPager;
|
||||
private PagerSlidingTabStrip slidingTabLayout;
|
||||
private int currentPage = -1;
|
||||
private MaterialCab cab;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
|
|
@ -553,4 +556,14 @@ public class MainActivity extends AbsFabActivity
|
|||
});
|
||||
return super.onMenuOpened(featureId, menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MaterialCab openCab(final int menu, final MaterialCab.Callback callback) {
|
||||
if (cab != null) cab.finish();
|
||||
cab = new MaterialCab(this, R.id.cab_stub)
|
||||
.setMenu(menu)
|
||||
.setBackgroundColor(PreferenceUtils.getInstance(this).getThemeColorPrimary())
|
||||
.start(callback);
|
||||
return cab;
|
||||
}
|
||||
}
|
||||
|
|
@ -5,6 +5,7 @@ import android.support.v4.app.Fragment;
|
|||
|
||||
import com.kabouzeid.gramophone.R;
|
||||
import com.kabouzeid.gramophone.interfaces.KabViewsDisableAble;
|
||||
import com.kabouzeid.gramophone.ui.activities.MainActivity;
|
||||
import com.kabouzeid.gramophone.util.Util;
|
||||
|
||||
/**
|
||||
|
|
@ -29,6 +30,10 @@ public abstract class AbsMainActivityFragment extends Fragment implements KabVie
|
|||
return getResources().getDimensionPixelSize(R.dimen.bottom_offset_fab_activity);
|
||||
}
|
||||
|
||||
protected MainActivity getMainActivity() {
|
||||
return (MainActivity) getActivity();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void enableViews() {
|
||||
areViewsEnabled = true;
|
||||
|
|
|
|||
|
|
@ -26,6 +26,6 @@ public class SongViewFragment extends AbsMainActivityRecyclerViewFragment {
|
|||
|
||||
@Override
|
||||
protected RecyclerView.Adapter createAdapter() {
|
||||
return new SongAdapter((AppCompatActivity) getActivity());
|
||||
return new SongAdapter((AppCompatActivity) getActivity(), getMainActivity());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
BIN
app/src/main/res/drawable-hdpi/ic_delete_white_24dp.png
Normal file
|
After Width: | Height: | Size: 189 B |
BIN
app/src/main/res/drawable-hdpi/ic_playlist_add_white_24dp.png
Normal file
|
After Width: | Height: | Size: 131 B |
BIN
app/src/main/res/drawable-hdpi/ic_queue_white_24dp.png
Normal file
|
After Width: | Height: | Size: 227 B |
BIN
app/src/main/res/drawable-mdpi/ic_delete_white_24dp.png
Normal file
|
After Width: | Height: | Size: 129 B |
BIN
app/src/main/res/drawable-mdpi/ic_playlist_add_white_24dp.png
Normal file
|
After Width: | Height: | Size: 114 B |
BIN
app/src/main/res/drawable-mdpi/ic_queue_white_24dp.png
Normal file
|
After Width: | Height: | Size: 164 B |
BIN
app/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png
Normal file
|
After Width: | Height: | Size: 192 B |
BIN
app/src/main/res/drawable-xhdpi/ic_playlist_add_white_24dp.png
Normal file
|
After Width: | Height: | Size: 148 B |
BIN
app/src/main/res/drawable-xhdpi/ic_queue_white_24dp.png
Normal file
|
After Width: | Height: | Size: 240 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png
Normal file
|
After Width: | Height: | Size: 277 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_playlist_add_white_24dp.png
Normal file
|
After Width: | Height: | Size: 198 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_queue_white_24dp.png
Normal file
|
After Width: | Height: | Size: 349 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png
Normal file
|
After Width: | Height: | Size: 353 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_playlist_add_white_24dp.png
Normal file
|
After Width: | Height: | Size: 246 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_queue_white_24dp.png
Normal file
|
After Width: | Height: | Size: 444 B |
|
|
@ -20,15 +20,22 @@
|
|||
android:fitsSystemWindows="true" />
|
||||
|
||||
<LinearLayout
|
||||
android:elevation="@dimen/toolbar_elevation"
|
||||
android:id="@+id/toolbarFrame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical"
|
||||
android:paddingTop="@dimen/main_toolbar_padding_top">
|
||||
android:paddingTop="@dimen/main_toolbar_padding_top"
|
||||
tools:ignore="UnusedAttribute">
|
||||
|
||||
<android.support.v7.widget.Toolbar
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<android.support.v7.widget.Toolbar
|
||||
android:id="@+id/toolbar"
|
||||
style="@style/Toolbar"
|
||||
android:elevation="0dp"
|
||||
android:background="?colorPrimary">
|
||||
|
||||
<TextView
|
||||
|
|
@ -46,12 +53,19 @@
|
|||
|
||||
</android.support.v7.widget.Toolbar>
|
||||
|
||||
<ViewStub
|
||||
android:id="@+id/cab_stub"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="?attr/actionBarSize" />
|
||||
|
||||
</FrameLayout>
|
||||
|
||||
<com.astuetz.PagerSlidingTabStrip
|
||||
android:id="@+id/tabs"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="@dimen/tab_height"
|
||||
android:background="?colorPrimary"
|
||||
android:elevation="@dimen/toolbar_elevation"
|
||||
android:elevation="0dp"
|
||||
android:paddingLeft="64dp"
|
||||
android:paddingStart="64dp"
|
||||
android:textColor="@color/sliding_tabs_deactivated"
|
||||
|
|
|
|||
23
app/src/main/res/menu/menu_media_selection.xml
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<item
|
||||
android:id="@+id/action_add_to_playlist"
|
||||
android:icon="@drawable/ic_playlist_add_white_24dp"
|
||||
android:title="@string/action_add_to_playlist"
|
||||
app:showAsAction="ifRoom" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_add_to_current_playing"
|
||||
android:icon="@drawable/ic_queue_white_24dp"
|
||||
android:title="@string/action_add_to_playing_queue"
|
||||
app:showAsAction="ifRoom" />
|
||||
|
||||
<item
|
||||
android:id="@+id/action_delete_from_disk"
|
||||
android:icon="@drawable/ic_delete_white_24dp"
|
||||
android:title="@string/action_delete_from_disk"
|
||||
app:showAsAction="ifRoom" />
|
||||
|
||||
</menu>
|
||||
|
|
@ -1,16 +1,17 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="action_settings">"الإعدادات"</string>
|
||||
<string name="action_about">عنى</string>
|
||||
<string name="action_currently_playing">يتم التشغيل حالياً</string>
|
||||
<string name="action_playing_queue">قائمة الانتظار</string>
|
||||
<string name="action_about">" عن التطبيق
|
||||
"</string>
|
||||
<string name="action_currently_playing">الإستماع الآن</string>
|
||||
<string name="action_playing_queue">قائمة الإنتظار</string>
|
||||
<string name="action_search">بحث</string>
|
||||
<string name="action_play_next">استمع لاحقاً</string>
|
||||
<string name="action_add_to_playing_queue">أضف إلى قائمة الانتظار</string>
|
||||
<string name="action_add_to_playing_queue">أضف إلى قائمة الإنتظار</string>
|
||||
<string name="action_remove_from_playing_queue">أزل من قائمة الانتظار</string>
|
||||
<string name="action_add_to_playlist">أضف إلى قائمة تشغيل...</string>
|
||||
<string name="action_tag_editor">تعديل معلومات الموسيقى</string>
|
||||
<string name="action_delete_from_disk">حذف</string>
|
||||
<string name="action_tag_editor">تعديل معلومات الملف</string>
|
||||
<string name="action_delete_from_disk">حذف نهائي</string>
|
||||
<string name="action_details">التفاصيل</string>
|
||||
<string name="albums">الألبومات</string>
|
||||
<string name="artists">الفنانون</string>
|
||||
|
|
@ -27,30 +28,29 @@
|
|||
<string name="genre">النوع</string>
|
||||
<string name="album_artist">فنان الألبوم</string>
|
||||
<string name="year">السنة</string>
|
||||
<string name="track">الموسيقى</string>
|
||||
<string name="track">"المقطع "</string>
|
||||
<string name="track_hint">"الموسيقى (٢ للموسيقى ٢ أو ٣٠٠٤ للموسيقى ٤)"</string>
|
||||
<string name="album_or_artist_empty">حقل نص اسم الألبوم أو اسم الفنان فارغ</string>
|
||||
<string name="writing_file_number">تتم كتابة الملف</string>
|
||||
<string name="saving_changes">يتم حفظ التغييرات...</string>
|
||||
<string name="label_details">التفاصيل</string>
|
||||
<string name="label_file_name">اسم الملف</string>
|
||||
<string name="label_file_name">إسم الملف</string>
|
||||
<string name="label_file_path">مسار الملف</string>
|
||||
<string name="label_file_size">الحجم</string>
|
||||
<string name="label_file_format">التنسيق</string>
|
||||
<string name="label_file_format">نوع الملف</string>
|
||||
<string name="label_track_length">الطول</string>
|
||||
<string name="label_bit_rate">معدل البت</string>
|
||||
<string name="label_sampling_rate">معدل أخذ العينات</string>
|
||||
<string name="action_go_to_artist">اذهب إلى الفنان</string>
|
||||
<string name="action_go_to_album">اذهب إلى الألبوم</string>
|
||||
<string name="label_current_playing_queue">قائمة الانتظار</string>
|
||||
<string name="action_go_to_artist">إذهب إلى الفنان</string>
|
||||
<string name="action_go_to_album">إذهب إلى الألبوم</string>
|
||||
<string name="label_current_playing_queue">قائمة الإنتظار</string>
|
||||
<string name="save_as_playlist">حفظ كقائمة تشغيل</string>
|
||||
<string name="credits_3">الأيقونة من</string>
|
||||
<string name="credits_1">"مشغل الموسيقى فونقراف هو برنامج مجاني بشكلٍ كامل بتصميم أنيق من "</string>
|
||||
<string name="credits_3">الأيقونة من تصميم</string>
|
||||
<string name="credits_1">"مشغل الموسيقى فونقراف هو برنامج مجاني بشكلٍ كامل بتصميم أنيق من تصميم"</string>
|
||||
<string name="title_activity_search">بحث</string>
|
||||
<string name="no_results">لا توجد نتائج</string>
|
||||
<string name="action_re_download_artist_image">تحديث صورة الفنان</string>
|
||||
<string name="updating">يتم التحديث...</string>
|
||||
<string name="added_title_to_playing_queue">"تمت الإضافة إلى قائمة الانتظار"</string>
|
||||
<string name="action_delete_from_playlist">حذف من قائمة التشغيل</string>
|
||||
<string name="new_playlist_action">قائمة تشغيل جديدة...</string>
|
||||
<string name="action_grid_columns">عدد قوائم الشبكة</string>
|
||||
|
|
@ -71,14 +71,14 @@
|
|||
<string name="delete_playlist_title">حذف قائمة التشغيل</string>
|
||||
<string name="add_playlist_title">"إضافة إلى قائمة التشغيل"</string>
|
||||
<string name="new_playlist_title">قائمة تشغيل جديدة</string>
|
||||
<string name="delete_warning">"تحذير: لا يمكن التراجع هذه العملية."</string>
|
||||
<string name="delete_warning">"تحذير: لا يمكن التراجع عن هذه العملية."</string>
|
||||
<string name="shuffle_all">عشوائي</string>
|
||||
<string name="last_opened">آخر ما تم فتحه</string>
|
||||
<string name="light_theme_name">فاتح</string>
|
||||
<string name="dark_theme_name">داكن</string>
|
||||
<string name="equalizer">المعادل</string>
|
||||
<string name="pref_header_ui">واجهة المستخدم</string>
|
||||
<string name="pref_title_general_theme">السمة الأساسية</string>
|
||||
<string name="pref_title_general_theme">الثيم العام</string>
|
||||
<string name="pref_header_audio">الصوت</string>
|
||||
<string name="pref_header_general">عام</string>
|
||||
<string name="pref_summary_colored_navigation_bar">في أي مشهد يتم تلوين شريط التنقل</string>
|
||||
|
|
@ -93,4 +93,35 @@
|
|||
<string name="pref_title_colored_navigation_bar_playlists">مشهد قائمة التشغيل</string>
|
||||
<string name="pref_title_colored_navigation_bar_tag_editor">تعديل معلومات الموسيقى</string>
|
||||
<string name="pref_title_colored_navigation_bar_other_screens">في أي مكان</string>
|
||||
<string name="pref_title_colored_album_footers">الهوامش السفلية للألبومات ملونة</string>
|
||||
<string name="no_equalizer">لا يوجد معدل صوت</string>
|
||||
<string name="no_audio_ID">"لا يوجد audio id, شغل شيئا وحاول مرة أخرى."</string>
|
||||
<string name="navigation_drawer_open">إفتح قائمة التصفح الجانبية</string>
|
||||
<string name="navigation_drawer_close">"إغلاق قائمة التصفح الجانبية"</string>
|
||||
<string name="delete_action">حذف</string>
|
||||
<string name="rename_action">إعادة التسمية</string>
|
||||
<string name="select">إختيار</string>
|
||||
<string name="default_str">إفتراضي</string>
|
||||
<string name="primary_color">اللون الأساسي</string>
|
||||
<string name="accent_color">اللون الثانوي</string>
|
||||
<string name="primary_color_desc">تحديد الأزرق النيلي كلون ثيم اساسي.</string>
|
||||
<string name="accent_color_desc">تحديد الوردي كلون ثانوي.</string>
|
||||
<string name="update_image">تحديث الصورة</string>
|
||||
<string name="playlist_empty_text">قائمة التشغيل فارغة</string>
|
||||
<string name="no_playlists">لا توجد قوائم تشغيل</string>
|
||||
<string name="playlist_name">إسم قائمة الشغيل</string>
|
||||
<string name="song">الأغنية</string>
|
||||
<string name="pref_only_lollipop">"متوفر في نظام التشغيل Lollipop."</string>
|
||||
<string name="pref_summary_transparent_toolbar">جعل المحتوى الذي يمر تحت شريط الأدوات مرئيا.</string>
|
||||
<string name="pref_summary_colored_album_footers">"تلوين الهوامش السفلية للألبومات بلون غلاف الألبوم."</string>
|
||||
<string name="failed_download_albumart">"تعذر تحميل صور هذا الألبوم."</string>
|
||||
<string name="search_hint">البحث في المكتبة...</string>
|
||||
<string name="rescanning_media">إعادة تفحص الملفات...</string>
|
||||
<string-array name="update_album_cover_options">
|
||||
<item>تحميل من last.fm</item>
|
||||
<item>اختيار من ذاكرة التخزين الداخلية</item>
|
||||
<item>بحث في الإنترنات</item>
|
||||
<item>حذف الغلاف</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"تمت الإضافة إلى قائمة الانتظار"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">Žádné výsledky</string>
|
||||
<string name="action_re_download_artist_image">Změnit obrázek umělce</string>
|
||||
<string name="updating">Aktualizace...</string>
|
||||
<string name="added_title_to_playing_queue">"Přidána 1 skladba do fronty."</string>
|
||||
<string name="action_delete_from_playlist">Vymazat z playlistu</string>
|
||||
<string name="new_playlist_action">Nový playlist...</string>
|
||||
<string name="action_grid_columns">Počet sloupců mřížky</string>
|
||||
|
|
@ -120,4 +119,5 @@
|
|||
<item>Najít na webu</item>
|
||||
<item>Odstranit obal alba</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"Přidána 1 skladba do fronty."</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@
|
|||
<string name="no_results">Keine Ergebnisse</string>
|
||||
<string name="action_re_download_artist_image">Interpretenbild aktualisieren</string>
|
||||
<string name="updating">Aktualisiere...</string>
|
||||
<string name="added_title_to_playing_queue">"1 Titel wurde der Wiedergabeliste hinzugefügt."</string>
|
||||
<string name="added_x_titles_to_playing_queue">%1$d Titel wurden der Wiedergabeliste hinzugefügt.</string>
|
||||
<string name="action_delete_from_playlist">Aus Playlist entfernen</string>
|
||||
<string name="new_playlist_action">Neue Playlist…</string>
|
||||
<string name="action_grid_columns">Rastergröße</string>
|
||||
|
|
@ -120,4 +120,5 @@
|
|||
<item>Web suche</item>
|
||||
<item>Cover entfernen</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"1 Titel wurde der Wiedergabeliste hinzugefügt."</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">Κανένα αποτέλεσμα</string>
|
||||
<string name="action_re_download_artist_image">Ανανέωση εικόνας καλλιτέχνη</string>
|
||||
<string name="updating">Γίνεται ανανέωση...</string>
|
||||
<string name="added_title_to_playing_queue">"Προστέθηκε ένας τίτλος στη σειρά αναπαραγωγής"</string>
|
||||
<string name="action_delete_from_playlist">Διαγραφή από τη λίστα αναπαραγωγής</string>
|
||||
<string name="new_playlist_action">Νέα λίστα αναπαραγωγής...</string>
|
||||
<string name="action_grid_columns">Στήλες πλέγματος</string>
|
||||
|
|
@ -120,4 +119,5 @@
|
|||
<item>Αναζήτηση στο διαδίκτυο</item>
|
||||
<item>Διαγραφή εξώφυλλου</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"Προστέθηκε ένας τίτλος στη σειρά αναπαραγωγής"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">Sin resultados</string>
|
||||
<string name="action_re_download_artist_image">Actualizar imagen del artista</string>
|
||||
<string name="updating">Actualizando...</string>
|
||||
<string name="added_title_to_playing_queue">"1 título añadido a la cola de reproducción"</string>
|
||||
<string name="action_delete_from_playlist">Borrar de la lista de reproducción</string>
|
||||
<string name="new_playlist_action">Nueva lista de reproducción...</string>
|
||||
<string name="action_grid_columns">Columnas de la cuadrícula</string>
|
||||
|
|
@ -118,4 +117,5 @@
|
|||
<item>Busqueda Web</item>
|
||||
<item>Eliminar Carátula</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"1 título añadido a la cola de reproducción"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@
|
|||
<string name="action_settings">"Paramètres"</string>
|
||||
<string name="action_about">À propos</string>
|
||||
<string name="action_currently_playing">Lecture en cours</string>
|
||||
<string name="action_playing_queue">File de lecture</string>
|
||||
<string name="action_playing_queue">Liste de lecture</string>
|
||||
<string name="action_search">Rechercher</string>
|
||||
<string name="action_play_next">Lire ensuite</string>
|
||||
<string name="action_add_to_playing_queue">Ajouter à la file de lecture</string>
|
||||
<string name="action_remove_from_playing_queue">Retirer de la file de lecture</string>
|
||||
<string name="action_play_next">Prochaine lecture</string>
|
||||
<string name="action_add_to_playing_queue">Ajouter à la liste de lecture</string>
|
||||
<string name="action_remove_from_playing_queue">Retirer de la liste de lecture</string>
|
||||
<string name="action_add_to_playlist">Ajouter à une playlist...</string>
|
||||
<string name="action_tag_editor">Éditeur d\'infos</string>
|
||||
<string name="action_delete_from_disk">Supprimer de l\'appareil</string>
|
||||
|
|
@ -31,10 +31,10 @@
|
|||
<string name="track_hint">"Piste (2 pour piste 2 ou 3004 pour CD3 piste 4)"</string>
|
||||
<string name="album_or_artist_empty">Veuillez indiquer le nom et l\'artiste de l\'album.</string>
|
||||
<string name="writing_file_number">Fichier en cours d\'écriture</string>
|
||||
<string name="saving_changes">Sauvegarde des changements...</string>
|
||||
<string name="saving_changes">Sauvegarde en cours...</string>
|
||||
<string name="label_details">Détails</string>
|
||||
<string name="label_file_name">Nom du fichier</string>
|
||||
<string name="label_file_path">Chemin du fichier</string>
|
||||
<string name="label_file_path">Location du fichier</string>
|
||||
<string name="label_file_size">Taille</string>
|
||||
<string name="label_file_format">Format</string>
|
||||
<string name="label_track_length">Durée</string>
|
||||
|
|
@ -45,12 +45,11 @@
|
|||
<string name="label_current_playing_queue">File de lecture</string>
|
||||
<string name="save_as_playlist">Sauvegarder</string>
|
||||
<string name="credits_3">Icône par</string>
|
||||
<string name="credits_1">"Phonograph est un lecteur de musique avec un Material Design et entièrement gratuit créé par"</string>
|
||||
<string name="credits_1">"Phonograph est un lecteur de musique entièrement gratuit avec le concept de Material Design créé par"</string>
|
||||
<string name="title_activity_search">Rechercher</string>
|
||||
<string name="no_results">Aucun résultat</string>
|
||||
<string name="action_re_download_artist_image">Actualiser l\'image de l\'artiste</string>
|
||||
<string name="updating">Actualisation...</string>
|
||||
<string name="added_title_to_playing_queue">"1 titre ajouté à la file de lecture."</string>
|
||||
<string name="action_delete_from_playlist">Supprimer de la playlist</string>
|
||||
<string name="new_playlist_action">Nouvelle playlist...</string>
|
||||
<string name="action_grid_columns">Nombre de colonnes</string>
|
||||
|
|
@ -120,4 +119,5 @@
|
|||
<item>Recherche internet</item>
|
||||
<item>Supprimer la couverture</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"1 titre ajouté à la file de lecture."</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -12,9 +12,9 @@
|
|||
<string name="action_tag_editor">Modifica tag</string>
|
||||
<string name="action_delete_from_disk">Elimina</string>
|
||||
<string name="action_details">Dettagli</string>
|
||||
<string name="albums">album</string>
|
||||
<string name="albums">Album</string>
|
||||
<string name="artists">Artisti</string>
|
||||
<string name="songs">brani</string>
|
||||
<string name="songs">Brani</string>
|
||||
<string name="playlists">Playlist</string>
|
||||
<string name="nothing_playing">Niente in riproduzione</string>
|
||||
<string name="unplayable_file">Spiacenti - si è verificato un errore nel tentativo di riprodurre questa canzone</string>
|
||||
|
|
@ -52,7 +52,6 @@
|
|||
<string name="no_results">Nessun risultato</string>
|
||||
<string name="action_re_download_artist_image">Aggiorna immagine artista</string>
|
||||
<string name="updating">Aggiornamento...</string>
|
||||
<string name="added_title_to_playing_queue">"Un brano aggiunto alla coda."</string>
|
||||
<string name="title_activity_playlist_detail">DettagliAttivitàPlaylist</string>
|
||||
<string name="action_delete_from_playlist">Elimina dalla playlist</string>
|
||||
<string name="new_playlist_action">Nuova playlist...</string>
|
||||
|
|
@ -123,4 +122,5 @@
|
|||
<item>Cerca nel web</item>
|
||||
<item>Rimuovi copertina</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"Un brano aggiunto alla coda."</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">결과 없음</string>
|
||||
<string name="action_re_download_artist_image">아티스트 이미지 변경</string>
|
||||
<string name="updating">변경 중...</string>
|
||||
<string name="added_title_to_playing_queue">"재생 대기열에 1개의 음악을 추가했습니다."</string>
|
||||
<string name="action_delete_from_playlist">재생목록에서 삭제</string>
|
||||
<string name="new_playlist_action">새로운 재생목록...</string>
|
||||
<string name="action_grid_columns">가로세로 격자</string>
|
||||
|
|
@ -121,4 +120,5 @@
|
|||
<item>인터넷 검색</item>
|
||||
<item>커버 없애기</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"재생 대기열에 1개의 음악을 추가했습니다."</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">Geen resultaten</string>
|
||||
<string name="action_re_download_artist_image">Artiest afbeelding bijwerken</string>
|
||||
<string name="updating">Bijwerken...</string>
|
||||
<string name="added_title_to_playing_queue">"1 titel toegevoegd aan de afspeelwachtrij."</string>
|
||||
<string name="action_delete_from_playlist">Verwijderen uit afspeellijst</string>
|
||||
<string name="new_playlist_action">Nieuwe afspeellijst...</string>
|
||||
<string name="action_grid_columns">Rasterkolommen</string>
|
||||
|
|
@ -120,4 +119,5 @@
|
|||
<item>Zoeken op internet</item>
|
||||
<item>Verwijder hoes</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"1 titel toegevoegd aan de afspeelwachtrij."</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@
|
|||
<string name="no_results">Brak wyników</string>
|
||||
<string name="action_re_download_artist_image">Zaktualizuj zdjęcie wykonawcy</string>
|
||||
<string name="updating">Aktualizowanie...</string>
|
||||
<string name="added_title_to_playing_queue">"Dodano 1 tytuł do kolejki odtwarzania"</string>
|
||||
<string name="action_delete_from_playlist">Usuń z listy odtwarzania</string>
|
||||
<string name="new_playlist_action">Nowa lista odtwarzania...</string>
|
||||
<string name="action_grid_columns">Siatka kolumn</string>
|
||||
|
|
@ -122,4 +121,5 @@
|
|||
<item>Szukaj w sieci</item>
|
||||
<item>Usuń okładkę</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"Dodano 1 tytuł do kolejki odtwarzania"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">Sem resultados</string>
|
||||
<string name="action_re_download_artist_image">Atualizar imagem do artista</string>
|
||||
<string name="updating">Atualizando...</string>
|
||||
<string name="added_title_to_playing_queue">"1 título adicionado à lista de reprodução"</string>
|
||||
<string name="action_delete_from_playlist">Excluir da playlist</string>
|
||||
<string name="new_playlist_action">Nova playlist...</string>
|
||||
<string name="action_grid_columns">Colunas da grade</string>
|
||||
|
|
@ -120,4 +119,5 @@
|
|||
<item>Pesquisar na Internet</item>
|
||||
<item>Remover Arte do Album</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"1 título adicionado à lista de reprodução"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -49,7 +49,6 @@
|
|||
<string name="no_results">Nenhum resultado</string>
|
||||
<string name="action_re_download_artist_image">Atualizar imagem do artista</string>
|
||||
<string name="updating">Atualizando...</string>
|
||||
<string name="added_title_to_playing_queue">"Adicionada uma música para a fila atual de músicas."</string>
|
||||
<string name="action_delete_from_playlist">Apagar da playlist</string>
|
||||
<string name="action_grid_columns">Colunas da grade</string>
|
||||
<string name="action_grid_columns_land">Colunas da grade (Paisagem)</string>
|
||||
|
|
@ -74,4 +73,5 @@
|
|||
<string name="navigation_drawer_open">Abrir área de navegação</string>
|
||||
<string name="navigation_drawer_close">"Fechar área de navegação"</string>
|
||||
<string name="song">Música</string>
|
||||
<string name="added_title_to_playing_queue">"Adicionada uma música para a fila atual de músicas."</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -49,7 +49,6 @@
|
|||
<string name="no_results">Niciun rezultat</string>
|
||||
<string name="action_re_download_artist_image">Actualizează imagine artist</string>
|
||||
<string name="updating">Actualizare...</string>
|
||||
<string name="added_title_to_playing_queue">"Adăugat 1 melodie la lista de redare."</string>
|
||||
<string name="action_delete_from_playlist">Şterge din playlist</string>
|
||||
<string name="new_playlist_action">Playlist nou...</string>
|
||||
<string name="action_grid_columns">Rânduri pe grid</string>
|
||||
|
|
@ -99,4 +98,5 @@
|
|||
<string name="primary_color">Culoare Primară</string>
|
||||
<string name="accent_color">Culoare de accent</string>
|
||||
<string name="song">Melodie</string>
|
||||
<string name="added_title_to_playing_queue">"Adăugat 1 melodie la lista de redare."</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">Нет результатов</string>
|
||||
<string name="action_re_download_artist_image">Обновить изображение исполнителя</string>
|
||||
<string name="updating">Обновление...</string>
|
||||
<string name="added_title_to_playing_queue">"Добавлена 1 композиция в очередь воспроизведения"</string>
|
||||
<string name="action_delete_from_playlist">Удалить из списка воспроизведения</string>
|
||||
<string name="new_playlist_action">Новый список воспроизведения...</string>
|
||||
<string name="action_grid_columns">Столбцы сетки</string>
|
||||
|
|
@ -120,4 +119,5 @@
|
|||
<item>Поиск в интернете</item>
|
||||
<item>Удалить обложку</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"Добавлена 1 композиция в очередь воспроизведения"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">Inga resultat</string>
|
||||
<string name="action_re_download_artist_image">Uppdatera artistbild</string>
|
||||
<string name="updating">Uppdaterar ...</string>
|
||||
<string name="added_title_to_playing_queue">"Lagt till 1 titel till spellistan."</string>
|
||||
<string name="action_delete_from_playlist">Radera från spellista</string>
|
||||
<string name="new_playlist_action">Ny spellista ...</string>
|
||||
<string name="created_playlist_x">Spellista %1$s skapad</string>
|
||||
|
|
@ -115,4 +114,5 @@ Vill du radera <b>%1$d</b> låtar?
|
|||
<item>Weksök</item>
|
||||
<item>Ta bort omslag</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"Lagt till 1 titel till spellistan."</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">Sonuç bulunamadı</string>
|
||||
<string name="action_re_download_artist_image">Sanatçı resmini güncelle</string>
|
||||
<string name="updating">Güncelleniyor...</string>
|
||||
<string name="added_title_to_playing_queue">"Çalma sırasına 1 başlık eklendi"</string>
|
||||
<string name="action_delete_from_playlist">Çalma listesinden sil</string>
|
||||
<string name="new_playlist_action">Yeni çalma listesi</string>
|
||||
<string name="action_grid_columns">Izgara sütunları</string>
|
||||
|
|
@ -120,4 +119,5 @@
|
|||
<item>Web\'de ara</item>
|
||||
<item>Albüm Kapağını Kaldır</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"Çalma sırasına 1 başlık eklendi"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">没有找到结果</string>
|
||||
<string name="action_re_download_artist_image">更新歌手图片</string>
|
||||
<string name="updating">正在更新…</string>
|
||||
<string name="added_title_to_playing_queue">"该曲目已加入播放队列"</string>
|
||||
<string name="action_delete_from_playlist">从播放列表中删除</string>
|
||||
<string name="new_playlist_action">新建播放列表</string>
|
||||
<string name="action_grid_columns">专辑列数</string>
|
||||
|
|
@ -120,4 +119,5 @@
|
|||
<item>通过网络搜索</item>
|
||||
<item>删除封面</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"该曲目已加入播放队列"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -50,7 +50,6 @@
|
|||
<string name="no_results">無搜尋結果</string>
|
||||
<string name="action_re_download_artist_image">更新歌手圖片</string>
|
||||
<string name="updating">更新中…</string>
|
||||
<string name="added_title_to_playing_queue">"這歌曲已加入播放佇列"</string>
|
||||
<string name="action_delete_from_playlist">從音樂清單移除</string>
|
||||
<string name="new_playlist_action">新增音樂清單</string>
|
||||
<string name="action_grid_columns">專輯網格列數</string>
|
||||
|
|
@ -120,4 +119,5 @@
|
|||
<item>網路搜尋</item>
|
||||
<item>刪除封面</item>
|
||||
</string-array>
|
||||
<string name="added_title_to_playing_queue">"這歌曲已加入播放佇列"</string>
|
||||
</resources>
|
||||
|
|
|
|||
|
|
@ -53,7 +53,8 @@
|
|||
<string name="no_results">No results</string>
|
||||
<string name="action_re_download_artist_image">Update artist image</string>
|
||||
<string name="updating">Updating…</string>
|
||||
<string name="added_title_to_playing_queue">Added 1 title to the playing queue.</string>
|
||||
<string name="added_title_to_playing_queue">"Added 1 title to the playing queue."</string>
|
||||
<string name="added_x_titles_to_playing_queue">Added %1$d titles to the playing queue.</string>
|
||||
<string name="title_activity_playlist_detail">Playlist Activity</string>
|
||||
<string name="action_delete_from_playlist">Delete from playlist</string>
|
||||
<string name="new_playlist_action">New playlist…</string>
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
<style name="Toolbar">
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">?attr/actionBarSize</item>
|
||||
<item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
|
||||
<item name="android:theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
|
||||
<item name="android:minHeight">@dimen/abc_action_bar_default_height_material</item>
|
||||
<item name="popupTheme">?toolbarPopupTheme</item>
|
||||
<item name="android:elevation" tools:ignore="NewApi">@dimen/toolbar_elevation</item>
|
||||
|
|
|
|||