/* * Copyright 2016 Substance Mobile * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.animbus.music.media; import android.content.Context; import android.database.Cursor; import android.provider.MediaStore; import android.text.TextUtils; import com.animbus.music.media.objects.Album; import com.animbus.music.media.objects.Playlist; import com.animbus.music.media.objects.Song; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * This is a temporary class. It contains the old code for the library loading. Used only if the options class wants it. * TODO: Remove */ public class LibraryLegacy { interface Data { void done(List<Song> songs, List<Album> albums, List<Playlist> playlists); } public static boolean use() { return false; } public static void build(Data listener, Context context) { List<Album> albums = buildAlbums(context); List<Song> songs = buildSongs(context); List<Playlist> playlists = buildPlaylists(context); buildDataMesh(songs, playlists, context); listener.done(songs, albums, playlists); } private static List<Song> buildSongs(Context context) { ArrayList<Song> mSongs = new ArrayList<>(); try { final String where = MediaStore.Audio.Media.IS_MUSIC + "=1"; Cursor songsCursor = context.getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, where, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); assert songsCursor != null; int titleColumn = songsCursor.getColumnIndex (MediaStore.Audio.Media.TITLE); int idColumn = songsCursor.getColumnIndex (MediaStore.Audio.Media._ID); int artistColumn = songsCursor.getColumnIndex (MediaStore.Audio.Media.ARTIST); int durColumn = songsCursor.getColumnIndex (MediaStore.Audio.Media.DURATION); int albumIdColumn = songsCursor.getColumnIndex (MediaStore.Audio.Media.ALBUM_ID); int trackNumber = songsCursor.getColumnIndex(MediaStore.Audio.Media.TRACK); songsCursor.moveToFirst(); do { Song s = new Song(); s.setTitle(songsCursor.getString(titleColumn)); s.setSongArtist(songsCursor.getString(artistColumn)); s.setID(songsCursor.getLong(idColumn)); s.setAlbumID(songsCursor.getLong(albumIdColumn)); s.setSongDuration(songsCursor.getLong(durColumn)); s.setTrackNumber(songsCursor.getInt(trackNumber)); s.lock(); mSongs.add(s); } while (songsCursor.moveToNext()); songsCursor.close(); } catch (IndexOutOfBoundsException ignored) { } return mSongs; } private static List<Album> buildAlbums(Context context) { ArrayList<Album> mAlbums = new ArrayList<>(); try { Cursor albumsCursor = context.getContentResolver().query( MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Albums.DEFAULT_SORT_ORDER); assert albumsCursor != null; int titleColumn = albumsCursor.getColumnIndex (MediaStore.Audio.Albums.ALBUM); int idColumn = albumsCursor.getColumnIndex (MediaStore.Audio.Albums._ID); int artistColumn = albumsCursor.getColumnIndex (MediaStore.Audio.Albums.ARTIST); int albumArtColumn = albumsCursor.getColumnIndex (MediaStore.Audio.Albums.ALBUM_ART); albumsCursor.moveToFirst(); do { Album album = new Album(); album.setID(albumsCursor.getLong(idColumn)); album.setContext(context); album.setTitle(albumsCursor.getString(titleColumn)); album.setAlbumArtistName(albumsCursor.getString(artistColumn)); album.setAlbumArtPath(albumsCursor.getString(albumArtColumn)); mAlbums.add(album); } while (albumsCursor.moveToNext()); albumsCursor.close(); } catch (IndexOutOfBoundsException ignored) { } return mAlbums; } private static List<Playlist> buildPlaylists(Context context) { ArrayList<Playlist> mPlaylists = new ArrayList<>(); try { Cursor playlistsCursor = context.getContentResolver().query( MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Playlists.DEFAULT_SORT_ORDER); assert playlistsCursor != null; int titleColumn = playlistsCursor.getColumnIndex (MediaStore.Audio.Playlists.NAME); int idColumn = playlistsCursor.getColumnIndex (MediaStore.Audio.Playlists._ID); playlistsCursor.moveToFirst(); do { Playlist playlist = new Playlist(); String name = playlistsCursor.getString(titleColumn); playlist.setName(name); playlist.setType(TextUtils.equals(name.toLowerCase(), "favorites") ? 0 : 1); playlist.setId(playlistsCursor.getLong(idColumn)); mPlaylists.add(playlist); } while (playlistsCursor.moveToNext()); Collections.sort(mPlaylists, new Comparator<Playlist>() { @Override public int compare(Playlist lhs, Playlist rhs) { return ((Integer) lhs.getType()).compareTo(rhs.getType()); } }); playlistsCursor.close(); } catch (IndexOutOfBoundsException ignored) { } return mPlaylists; } private static void loadSongsForPlaylist(Playlist playlist, Context context) { try { Cursor playlistSongsCursor = context.getContentResolver().query(MediaStore.Audio.Playlists.Members.getContentUri("external", playlist.getId()), null, null, null, MediaStore.Audio.Playlists.Members.PLAY_ORDER); assert playlistSongsCursor != null; int idColumn = playlistSongsCursor.getColumnIndex(MediaStore.Audio.Playlists.Members.AUDIO_ID); playlistSongsCursor.moveToFirst(); do { playlist.getSongs().add(Library.findSongById(playlistSongsCursor.getLong(idColumn))); } while (playlistSongsCursor.moveToNext()); playlistSongsCursor.close(); } catch (IndexOutOfBoundsException ignored) { } } private static void buildDataMesh(List<Song> mSongs, List<Playlist> mPlaylists, Context c) { if (!mPlaylists.isEmpty() && !mSongs.isEmpty()) { for (Playlist p : mPlaylists) loadSongsForPlaylist(p, c); } } }