package pasta.music;
import android.app.Application;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.view.ViewCompat;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import pasta.music.data.AlbumListData;
import pasta.music.data.ArtistListData;
import pasta.music.data.CategoryListData;
import pasta.music.data.PlaylistListData;
import pasta.music.data.TrackListData;
import pasta.music.dialogs.ErrorDialog;
import pasta.music.utils.PreferenceUtils;
public class Pasta extends Application {
private ErrorDialog errorDialog;
private List<TrackListData> tracks;
private List<AlbumListData> albums;
private List<PlaylistListData> playlists;
private List<ArtistListData> artists;
private ContentResolver musicResolver;
@Override
public void onCreate() {
super.onCreate();
musicResolver = getContentResolver();
tracks = new ArrayList<>();
albums = new ArrayList<>();
playlists = new ArrayList<>();
artists = new ArrayList<>();
}
public void setUpArtists() {
Cursor artistCursor = musicResolver.query(
MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
new String[]{
MediaStore.Audio.Artists.ARTIST,
MediaStore.Audio.Artists.ARTIST_KEY
}, null, null,
MediaStore.Audio.Artists.ARTIST + " ASC"
);
if (artistCursor != null && artistCursor.moveToFirst()) {
do {
String artistKey = artistCursor.getString(artistCursor.getColumnIndex(MediaStore.Audio.Artists.ARTIST_KEY));
String artistName = artistCursor.getString(artistCursor.getColumnIndex(MediaStore.Audio.Artists.ARTIST));
Log.d("Artist", "Found new Artist " + artistName + " key= " + artistKey);
artists.add(new ArtistListData(artistName, String.valueOf(artistKey)));
} while (artistCursor.moveToNext());
artistCursor.close();
}
}
public void setUpAlbums() {
Cursor albumCursor = musicResolver.query(
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
new String[]{
MediaStore.Audio.Albums.ARTIST,
MediaStore.Audio.Albums._ID,
MediaStore.Audio.Albums.ALBUM_ART,
MediaStore.Audio.Albums.LAST_YEAR,
MediaStore.Audio.Albums.NUMBER_OF_SONGS,
MediaStore.Audio.Albums.ALBUM}, null, null,
MediaStore.Audio.Albums.ALBUM + " ASC");
if (albumCursor != null && albumCursor.moveToFirst()) {
do {
String albumDate = albumCursor.getString(albumCursor.getColumnIndex(MediaStore.Audio.Albums.LAST_YEAR));
String albumArt = albumCursor.getString(albumCursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
long albumId = albumCursor.getLong(albumCursor.getColumnIndex(MediaStore.Audio.Albums._ID));
String albumName = albumCursor.getString(albumCursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM));
int numSongs = albumCursor.getInt(albumCursor.getColumnIndex(MediaStore.Audio.Albums.NUMBER_OF_SONGS));
Log.d("Albums", "Found new album " + albumName + " ID= " + albumId + " albumArt " + albumArt + " Date= " + albumDate);
albums.add(new AlbumListData(String.valueOf(albumId), albumName, albumDate, albumArt,numSongs));
} while (albumCursor.moveToNext());
albumCursor.close();
}
}
public void setUpSongs() {
Uri musicUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
if (musicCursor != null && musicCursor.moveToFirst()) {
int titleColumn = musicCursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
int albumColumn = musicCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
int idColumn = musicCursor.getColumnIndex(MediaStore.Audio.Media._ID);
do {
long thisId = musicCursor.getLong(idColumn);
String thisTitle = musicCursor.getString(titleColumn);
String thisAlbum = musicCursor.getString(albumColumn);
Uri trackUri = ContentUris.withAppendedId(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, thisId);
tracks.add(new TrackListData(thisTitle, thisAlbum, trackUri.toString()));
} while (musicCursor.moveToNext());
}
if (musicCursor != null) {
musicCursor.close();
}
}
public void setScreen(Context context) {
//TODO: weird analytics things
}
public void onCriticalError(final Context context, String message) {
if (errorDialog == null || !errorDialog.isShowing()) {
String errorMessage = getString(R.string.error_msg);
if (PreferenceUtils.isDebug(this))
errorMessage += "\n\nError: " + message + "\nLocation: " + context.getClass().getName();
errorDialog = new ErrorDialog(context).setMessage(errorMessage);
errorDialog.show();
}
}
public void onError(Context context, String message) {
String toastMessage = getString(R.string.error);
if (PreferenceUtils.isDebug(this))
toastMessage += "\n\nError: " + message + "\nLocation: " + context.getClass().getName();
showToast(toastMessage);
}
public void showToast(String message) {
Toast toast = new Toast(this);
View snackbar = LayoutInflater.from(this).inflate(R.layout.snackbar_layout, null);
((TextView) snackbar.findViewById(R.id.message)).setText(message);
ViewCompat.setElevation(snackbar, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, getResources().getDisplayMetrics()));
toast.setView(snackbar);
toast.setDuration(Toast.LENGTH_LONG);
toast.setMargin(0, 0);
toast.setGravity(Gravity.FILL_HORIZONTAL | Gravity.BOTTOM, 0, 0);
toast.show();
}
public List<AlbumListData> getFavoriteAlbums() {
return new ArrayList<>();
}
@Nullable
public List<PlaylistListData> getFavoritePlaylists() throws InterruptedException {
return new ArrayList<>();
}
@Nullable
public List<ArtistListData> getFavoriteArtists() throws InterruptedException {
return new ArrayList<>();
}
public List<TrackListData> getFavoriteTracks() {
return new ArrayList<>();
}
public boolean toggleFavorite(PlaylistListData data) {
try {
if (isFavorite(data)) {
//TODO: remove playlist from favorites
} else {
//TODO: add playlist to favorites
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean toggleFavorite(AlbumListData data) {
try {
if (isFavorite(data)) {
//TODO: remove album from favorites
} else {
//TODO: add album to favorites
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean toggleFavorite(TrackListData data) {
try {
if (isFavorite(data)) {
//TODO: remove track from favorites
} else {
//TODO: add track to favorites
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean toggleFavorite(ArtistListData data) {
try {
if (isFavorite(data)) {
//TODO: remove artist from favorites
} else {
//TODO: add artist to favorites
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
@Nullable
public Boolean isFavorite(PlaylistListData data) throws InterruptedException {
return false;
}
@Nullable
public Boolean isFavorite(AlbumListData data) {
return false;
}
@Nullable
public Boolean isFavorite(TrackListData data) {
return false;
}
@Nullable
public Boolean isFavorite(ArtistListData data) throws InterruptedException {
return false;
}
@Nullable
public ArtistListData getArtist(String id) throws InterruptedException {
return null;
}
@Nullable
public AlbumListData getAlbum(String id) throws InterruptedException {
return null;
}
@Nullable
public List<TrackListData> getTracks(PlaylistListData data) throws InterruptedException {
return new ArrayList<>();
}
@Nullable
public List<TrackListData> getTracks(ArtistListData data) throws InterruptedException {
return new ArrayList<>();
}
@Nullable
public List<TrackListData> getTracks(AlbumListData data) throws InterruptedException {
return new ArrayList<>();
}
@Nullable
public List<TrackListData> getTracks(CategoryListData data) {
return new ArrayList<>();
}
@Nullable
public List<AlbumListData> getAlbums(ArtistListData data) {
return new ArrayList<>();
}
@Nullable
public List<PlaylistListData> getPlaylists(ArtistListData data) {
return new ArrayList<>();
}
@Nullable
public List<PlaylistListData> getPlaylists(CategoryListData data) {
return new ArrayList<>();
}
@Nullable
public List<ArtistListData> getArtists(ArtistListData data) {
return new ArrayList<>();
}
public List<CategoryListData> getCategories() {
return new ArrayList<>();
}
@Nullable
public List<PlaylistListData> searchPlaylists(String query, int limit) throws InterruptedException {
query = query.toLowerCase();
List<PlaylistListData> playlists = new ArrayList<>();
for (int i = 0; i < this.playlists.size() && i < limit; i++) {
PlaylistListData data = this.playlists.get(i);
if (query.contains(data.playlistName.toLowerCase()) || data.playlistName.toLowerCase().contains(query))
playlists.add(data);
}
return playlists;
}
@Nullable
public List<ArtistListData> searchArtists(String query, int limit) throws InterruptedException {
query = query.toLowerCase();
List<ArtistListData> artists = new ArrayList<>();
for (int i = 0; i < this.artists.size() && i < limit; i++) {
ArtistListData data = this.artists.get(i);
if (query.contains(data.artistName.toLowerCase()) || data.artistName.toLowerCase().contains(query))
artists.add(data);
}
return artists;
}
@Nullable
public List<TrackListData> searchTracks(String query, int limit) throws InterruptedException {
query = query.toLowerCase();
List<TrackListData> tracks = new ArrayList<>();
for (int i = 0; i < this.tracks.size() && i < limit; i++) {
TrackListData data = this.tracks.get(i);
if (query.contains(data.trackName.toLowerCase()) || data.trackName.toLowerCase().contains(query))
tracks.add(data);
}
return tracks;
}
@Nullable
public List<AlbumListData> searchAlbums(String query, int limit) throws InterruptedException {
query = query.toLowerCase();
List<AlbumListData> albums = new ArrayList<>();
for (int i = 0; i < this.albums.size() && i < limit; i++) {
AlbumListData data = this.albums.get(i);
if (query.contains(data.albumName.toLowerCase()) || data.albumName.toLowerCase().contains(query))
albums.add(data);
}
return albums;
}
@Nullable
public List<AlbumListData> getNewAlbums() {
List<AlbumListData> albums = new ArrayList<>();
Collections.sort(this.albums, new Comparator<AlbumListData>() {
@Override
public int compare(AlbumListData o1, AlbumListData o2) {
if (o1.albumDate == null || o2.albumDate == null) return 0;
else return o1.albumDate.compareTo(o2.albumDate);
}
});
for (int i = 0; i < this.albums.size() && i < 10; i++) {
albums.add(this.albums.get(i));
}
return albums;
}
@Nullable
public List<PlaylistListData> getFeaturedPlaylists() {
return new ArrayList<>();
}
}