package com.sregg.android.tv.spotifyPlayer.providers; import android.app.SearchManager; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; import com.sregg.android.tv.spotifyPlayer.Constants; import com.sregg.android.tv.spotifyPlayer.R; import com.sregg.android.tv.spotifyPlayer.SpotifyTvApplication; import java.util.HashMap; import java.util.Map; import kaaes.spotify.webapi.android.SpotifyService; import kaaes.spotify.webapi.android.models.AlbumSimple; import kaaes.spotify.webapi.android.models.AlbumsPager; import kaaes.spotify.webapi.android.models.Artist; import kaaes.spotify.webapi.android.models.ArtistsPager; import kaaes.spotify.webapi.android.models.PlaylistSimple; import kaaes.spotify.webapi.android.models.PlaylistsPager; import kaaes.spotify.webapi.android.models.Track; import kaaes.spotify.webapi.android.models.TracksPager; public class SearchProvider extends ContentProvider { private static final String[] CURSOR_COLUMNS = { SearchManager.SUGGEST_COLUMN_TEXT_1, // Required SearchManager.SUGGEST_COLUMN_CONTENT_TYPE, // Required SearchManager.SUGGEST_COLUMN_PRODUCTION_YEAR, // Required SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE, SearchManager.SUGGEST_COLUMN_TEXT_2, SearchManager.SUGGEST_COLUMN_DURATION, SearchManager.SUGGEST_COLUMN_INTENT_DATA, }; @Override public String getType(Uri uri) { return SearchManager.SUGGEST_MIME_TYPE; } @Override public boolean onCreate() { return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String query = selectionArgs[0]; MatrixCursor cursor = new MatrixCursor(CURSOR_COLUMNS); searchArtists(query, cursor); searchAlbums(query, cursor); searchTracks(query, cursor); searchPlaylists(query, cursor); return cursor; } private void searchArtists(String query, MatrixCursor cursor) { ArtistsPager artistsPager = SpotifyTvApplication.getInstance().getSpotifyService().searchArtists(query, getSearchOptions()); if (artistsPager != null && artistsPager.artists != null) { for (Artist artist : artistsPager.artists.items) { MatrixCursor.RowBuilder row = cursor.newRow(); row.add(SearchManager.SUGGEST_COLUMN_TEXT_1, artist.name); row.add(SearchManager.SUGGEST_COLUMN_CONTENT_TYPE, artist.type); row.add(SearchManager.SUGGEST_COLUMN_INTENT_DATA, artist.uri); row.add(SearchManager.SUGGEST_COLUMN_TEXT_2, getContext().getString(R.string.artists)); if (artist.images != null && artist.images.size() > 0) { row.add(SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE, artist.images.get(0).url); } } } } private void searchAlbums(String query, MatrixCursor cursor) { AlbumsPager albumsPager = SpotifyTvApplication.getInstance().getSpotifyService().searchAlbums(query, getSearchOptions()); if (albumsPager != null && albumsPager.albums != null) { for (AlbumSimple album : albumsPager.albums.items) { MatrixCursor.RowBuilder row = cursor.newRow(); row.add(SearchManager.SUGGEST_COLUMN_TEXT_1, album.name); row.add(SearchManager.SUGGEST_COLUMN_CONTENT_TYPE, album.type); row.add(SearchManager.SUGGEST_COLUMN_INTENT_DATA, album.uri); row.add(SearchManager.SUGGEST_COLUMN_TEXT_2, getContext().getString(R.string.albums)); if (album.images != null && album.images.size() > 0) { row.add(SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE, album.images.get(0).url); } } } } private void searchTracks(String query, MatrixCursor cursor) { TracksPager tracksPager = SpotifyTvApplication.getInstance().getSpotifyService().searchTracks(query, getSearchOptions()); if (tracksPager != null && tracksPager.tracks != null) { for (Track track : tracksPager.tracks.items) { MatrixCursor.RowBuilder row = cursor.newRow(); row.add(SearchManager.SUGGEST_COLUMN_TEXT_1, track.name); row.add(SearchManager.SUGGEST_COLUMN_CONTENT_TYPE, track.type); row.add(SearchManager.SUGGEST_COLUMN_DURATION, track.duration_ms); row.add(SearchManager.SUGGEST_COLUMN_INTENT_DATA, track.uri); if (track.artists != null && track.artists.size() > 0) { row.add(SearchManager.SUGGEST_COLUMN_TEXT_2, track.artists.get(0).name); } if (track.album != null && track.album.images != null && track.album.images.size() > 0) { row.add(SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE, track.album.images.get(0).url); } } } } private void searchPlaylists(String query, MatrixCursor cursor) { PlaylistsPager playlistsPager = SpotifyTvApplication.getInstance().getSpotifyService().searchPlaylists(query, getSearchOptions()); if (playlistsPager != null && playlistsPager.playlists != null) { for (PlaylistSimple playlist : playlistsPager.playlists.items) { MatrixCursor.RowBuilder row = cursor.newRow(); row.add(SearchManager.SUGGEST_COLUMN_TEXT_1, playlist.name); row.add(SearchManager.SUGGEST_COLUMN_CONTENT_TYPE, playlist.type); row.add(SearchManager.SUGGEST_COLUMN_INTENT_DATA, playlist.uri); row.add(SearchManager.SUGGEST_COLUMN_TEXT_2, getContext().getString(R.string.playlists)); if (playlist.images != null && playlist.images.size() > 0) { row.add(SearchManager.SUGGEST_COLUMN_RESULT_CARD_IMAGE, playlist.images.get(0).url); } } } } private Map<String, Object> getSearchOptions() { Map<String, Object> options = new HashMap<>(); options.put(SpotifyService.MARKET, Constants.MARKET_FROM_TOKEN); return options; } /* Below are Provider Methods not used by search */ @Override public Uri insert(Uri uri, ContentValues values) { // TODO: Implement this to handle requests to insert a new row. throw new UnsupportedOperationException("Not yet implemented"); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO: Implement this to handle requests to update one or more rows. throw new UnsupportedOperationException("Not yet implemented"); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // Implement this to handle requests to delete one or more rows. throw new UnsupportedOperationException("Not yet implemented"); } }