/* * 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.net.Uri; import android.support.annotation.Nullable; import com.animbus.music.R; import com.animbus.music.media.objects.Album; import com.animbus.music.media.objects.Artist; import com.animbus.music.media.objects.Playlist; import com.animbus.music.media.objects.Song; import com.animbus.music.tasks.AlbumsTask; import com.animbus.music.tasks.ArtistsTask; import com.animbus.music.tasks.Loader.TaskListener; import com.animbus.music.tasks.PlaylistsTask; import com.animbus.music.tasks.SongsTask; import com.animbus.music.ui.activity.search.SearchResult; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Library { public static volatile Context context; private static volatile List<Song> mSongs = new ArrayList<>(); private static volatile List<Album> mAlbums = new ArrayList<>(); private static volatile List<Playlist> mPlaylists = new ArrayList<>(); private static volatile List<Artist> mArtists = new ArrayList<>(); private static volatile SongsTask mSongsTask; private static volatile AlbumsTask mAlbumsTask; private static volatile PlaylistsTask mPlaylistsTask; private static volatile ArtistsTask mArtistsTask; public Library(Context context) { Library.context = context.getApplicationContext(); //Creates tasks mSongsTask = new SongsTask(context); mAlbumsTask = new AlbumsTask(context); mPlaylistsTask = new PlaylistsTask(context); mArtistsTask = new ArtistsTask(context); //Adds all non-UI listeners to tasks mSongsTask.addListener(new TaskListener<Song>() { @Override public void onOneLoaded(Song item, int pos) { updateLinks(); } @Override public void onCompleted(List<Song> result) { mSongs = result; } }); mAlbumsTask.addListener(new TaskListener<Album>() { @Override public void onOneLoaded(Album item, int pos) { updateLinks(); } @Override public void onCompleted(List<Album> result) { mAlbums = result; } }); mPlaylistsTask.addListener(new TaskListener<Playlist>() { @Override public void onOneLoaded(Playlist item, int pos) { updateLinks(); } @Override public void onCompleted(List<Playlist> result) { mPlaylists = result; } }); mArtistsTask.addListener(new TaskListener<Artist>() { @Override public void onOneLoaded(Artist item, int pos) { updateLinks(); } @Override public void onCompleted(List<Artist> result) { mArtists = result; } }); } public static void setContext(Context cxt) { context = cxt; } /////////////////////////////////////////////////////////////////////////// // Builds the media library /////////////////////////////////////////////////////////////////////////// @SuppressWarnings("all") public static void build() { if (LibraryLegacy.use()) { LibraryLegacy.build(new LibraryLegacy.Data() { @Override public void done(List<Song> songs, List<Album> albums, List<Playlist> playlists) { mSongs = songs; mAlbums = albums; mPlaylists = playlists; mArtists = new ArrayList<>(); } }, context); } else { mSongsTask.run(); mAlbumsTask.run(); mPlaylistsTask.run(); mArtistsTask.run(); } } private static void updateLinks() { //TODO } /////////////////////////////////////////////////////////////////////////// // Update Listener from MediaStore /////////////////////////////////////////////////////////////////////////// public static void registerMediaStoreListeners() { mSongsTask.registerMediaStoreListener(); mAlbumsTask.registerMediaStoreListener(); mPlaylistsTask.registerMediaStoreListener(); mArtistsTask.registerMediaStoreListener(); } public static void unregisterMediaStoreListeners() { mSongsTask.unregisterMediaStoreListener(); mAlbumsTask.unregisterMediaStoreListener(); mPlaylistsTask.unregisterMediaStoreListener(); mArtistsTask.unregisterMediaStoreListener(); } /////////////////////////////////////////////////////////////////////////// // Helper methods for adding listeners to tasks /////////////////////////////////////////////////////////////////////////// public static void registerSongListener(TaskListener<Song> songListener) { mSongsTask.addListener(songListener); } public static void registerAlbumListener(TaskListener<Album> albumListener) { mAlbumsTask.addListener(albumListener); } public static void registerPlaylistListener(TaskListener<Playlist> playlistListener) { mPlaylistsTask.addListener(playlistListener); } public static void registerArtistListener(TaskListener<Artist> artistListener) { mArtistsTask.addListener(artistListener); } /////////////////////////////////////////////////////////////////////////// // Playlist Management /////////////////////////////////////////////////////////////////////////// //TODO /////////////////////////////////////////////////////////////////////////// // Getters /////////////////////////////////////////////////////////////////////////// public static List<Song> getSongs() { return mSongs; } public static List<Album> getAlbums() { return mAlbums; } public static List<Playlist> getPlaylists() { return mPlaylists; } public static List<Artist> getArtists() { return mArtists; } /////////////////////////////////////////////////////////////////////////// // Methods for finding a media object by ID /////////////////////////////////////////////////////////////////////////// @Nullable public static Song findSongById(long id) { for (Song song : getSongs()) if (song.getID() == id) return song; return null; } @Nullable public static Song findSongByUri(Uri uri) { for (Song song : getSongs()) if (song.getUri() == uri) return song; return null; } @Nullable public static Album findAlbumById(long id) { for (Album album : getAlbums()) if (album.getID() == id) return album; return null; } @Nullable public static Playlist findPlaylistById(long id) { for (Playlist playlist : getPlaylists()) if (playlist.getId() == id) return playlist; return null; } /////////////////////////////////////////////////////////////////////////// // Search /////////////////////////////////////////////////////////////////////////// public static SearchResult filterAlbums(String query) { List<Album> results = new ArrayList<>(); for (Album a : getAlbums()) { if (a.getTitle().toLowerCase().contains(query.toLowerCase())) { if (!results.contains(a)) results.add(a); } if (a.getAlbumArtistName().toLowerCase().contains(query.toLowerCase())) { if (!results.contains(a)) results.add(a); } } return new SearchResult(context.getString(R.string.page_albums), results); } public static SearchResult filterSongs(String query) { List<Song> results = new ArrayList<>(); for (Song s : getSongs()) { if (s.getTitle().toLowerCase().contains(query.toLowerCase())) { if (!results.contains(s)) results.add(s); } if (s.getSongArtist().toLowerCase().contains(query.toLowerCase())) { if (!results.contains(s)) results.add(s); } } return new SearchResult(context.getString(R.string.page_songs), results); } public static SearchResult filterPlaylists(String query) { List<Playlist> results = new ArrayList<>(); for (Playlist p : getPlaylists()) { if (p.getName().toLowerCase().contains(query.toLowerCase())) { if (!results.contains(p)) results.add(p); } } return new SearchResult(context.getString(R.string.page_playlists), results); } public static List<SearchResult> search(String query) { List<SearchResult> output = new ArrayList<>(); filterAlbums(query).addIfNotEmpty(output); filterSongs(query).addIfNotEmpty(output); filterPlaylists(query).addIfNotEmpty(output); return Collections.unmodifiableList(output); } }