117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen/* 217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * Copyright (C) 2014 Google Inc. All Rights Reserved. 317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * 417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * Licensed under the Apache License, Version 2.0 (the "License"); 517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * you may not use this file except in compliance with the License. 617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * You may obtain a copy of the License at 717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * 817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * http://www.apache.org/licenses/LICENSE-2.0 917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * 1017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * Unless required by applicable law or agreed to in writing, software 1117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * distributed under the License is distributed on an "AS IS" BASIS, 1217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * See the License for the specific language governing permissions and 1417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * limitations under the License. 1517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen */ 1617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 1717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenpackage com.example.android.musicservicedemo.browser; 1817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 1917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.database.MatrixCursor; 2017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.media.session.PlaybackState; 2117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.net.Uri; 2217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.util.Log; 2317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 2417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport com.example.android.musicservicedemo.BrowserService; 2517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 2617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport org.json.JSONArray; 2717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport org.json.JSONException; 2817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport org.json.JSONObject; 2917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 3017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.io.BufferedInputStream; 3117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.io.BufferedReader; 3217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.io.IOException; 3317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.io.InputStream; 3417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.io.InputStreamReader; 3517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.net.URLConnection; 3617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.util.ArrayList; 3717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.util.List; 3817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 3917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen/** 4017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * Utility class to get a list of MusicTrack's based on a server-side JSON 4117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * configuration. 4217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen */ 4317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenpublic class MusicProvider { 4417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 4517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static final String TAG = "MusicProvider"; 4617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 4717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static final String MUSIC_URL = "http://storage.googleapis.com/automotive-media/music.json"; 4817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 4917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static String MUSIC = "music"; 5017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static String TITLE = "title"; 5117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static String ALBUM = "album"; 5217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static String ARTIST = "artist"; 5317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static String GENRE = "genre"; 5417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static String SOURCE = "source"; 5517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static String IMAGE = "image"; 5617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static String TRACK_NUMBER = "trackNumber"; 5717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static String TOTAL_TRACK_COUNT = "totalTrackCount"; 5817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static String DURATION = "duration"; 5917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 6017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen // Cache for music track data 6117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private static List<MusicTrack> mMusicList; 6217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 6317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen /** 6417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * Get the cached list of music tracks 6517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * 6617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * @return 6717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * @throws JSONException 6817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen */ 6917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public List<MusicTrack> getMedia() throws JSONException { 7017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen if (null != mMusicList && mMusicList.size() > 0) { 7117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return mMusicList; 7217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 7317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return null; 7417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 7517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 7617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen /** 7717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * Get the list of music tracks from a server and return the list of 7817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * MusicTrack objects. 7917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * 8017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * @return 8117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * @throws JSONException 8217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen */ 8317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public List<MusicTrack> retreiveMedia() throws JSONException { 8417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen if (null != mMusicList) { 8517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return mMusicList; 8617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 8717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen int slashPos = MUSIC_URL.lastIndexOf('/'); 8817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen String path = MUSIC_URL.substring(0, slashPos + 1); 8917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen JSONObject jsonObj = parseUrl(MUSIC_URL); 9017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 9117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen try { 9217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen JSONArray videos = jsonObj.getJSONArray(MUSIC); 9317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen if (null != videos) { 9417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen mMusicList = new ArrayList<MusicTrack>(); 9517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen for (int j = 0; j < videos.length(); j++) { 9617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen JSONObject music = videos.getJSONObject(j); 9717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen String title = music.getString(TITLE); 9817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen String album = music.getString(ALBUM); 9917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen String artist = music.getString(ARTIST); 10017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen String genre = music.getString(GENRE); 10117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen String source = music.getString(SOURCE); 10217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen // Media is stored relative to JSON file 10317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen if (!source.startsWith("http")) { 10417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen source = path + source; 10517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 10617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen String image = music.getString(IMAGE); 10717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen if (!image.startsWith("http")) { 10817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen image = path + image; 10917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 11017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen int trackNumber = music.getInt(TRACK_NUMBER); 11117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen int totalTrackCount = music.getInt(TOTAL_TRACK_COUNT); 11217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen int duration = music.getInt(DURATION) * 1000; // ms 11317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 11417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen mMusicList.add(new MusicTrack(title, album, artist, genre, source, 11517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen image, trackNumber, totalTrackCount, duration)); 11617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 11717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 11817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } catch (NullPointerException e) { 11917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.e(TAG, "retreiveMedia", e); 12017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 12117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return mMusicList; 12217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 12317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 12417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen /** 12517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * Download a JSON file from a server, parse the content and return the JSON 12617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * object. 12717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * 12817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * @param urlString 12917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * @return 13017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen */ 13117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen private JSONObject parseUrl(String urlString) { 13217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen InputStream is = null; 13317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen try { 13417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen java.net.URL url = new java.net.URL(urlString); 13517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen URLConnection urlConnection = url.openConnection(); 13617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen is = new BufferedInputStream(urlConnection.getInputStream()); 13717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen BufferedReader reader = new BufferedReader(new InputStreamReader( 13817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen urlConnection.getInputStream(), "iso-8859-1"), 8); 13917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen StringBuilder sb = new StringBuilder(); 14017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen String line = null; 14117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen while ((line = reader.readLine()) != null) { 14217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen sb.append(line); 14317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 14417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return new JSONObject(sb.toString()); 14517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } catch (Exception e) { 14617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.d(TAG, "Failed to parse the json for media list", e); 14717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return null; 14817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } finally { 14917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen if (null != is) { 15017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen try { 15117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen is.close(); 15217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } catch (IOException e) { 15317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen // ignore 15417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 15517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 15617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 15717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 15817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 15917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public MatrixCursor getRootContainerCurser() { 16017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen MatrixCursor matrixCursor = new MatrixCursor(BrowserService.MEDIA_CONTAINER_PROJECTION); 16117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Uri.Builder pianoBuilder = new Uri.Builder(); 16217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen pianoBuilder.authority(BrowserService.AUTHORITY); 16317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen pianoBuilder.appendPath(BrowserService.PIANO_BASE_PATH); 16417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen matrixCursor.addRow(new Object[] { 16517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen pianoBuilder.build(), 16617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen BrowserService.PIANO_BASE_PATH, 16717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen "subtitle", 16817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen null, 16917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 0 17017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen }); 17117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 17217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Uri.Builder voiceBuilder = new Uri.Builder(); 17317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen voiceBuilder.authority(BrowserService.AUTHORITY); 17417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen voiceBuilder.appendPath(BrowserService.VOICE_BASE_PATH); 17517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen matrixCursor.addRow(new Object[] { 17617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen voiceBuilder.build(), 17717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen BrowserService.VOICE_BASE_PATH, 17817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen "subtitle", 17917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen null, 18017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 0 18117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen }); 18217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return matrixCursor; 18317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 18417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 18517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen public MatrixCursor getRootItemCursor(int type) { 18617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen if (type == BrowserService.NOW_PLAYING) { 18717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen MatrixCursor matrixCursor = new MatrixCursor(BrowserService.MEDIA_CONTAINER_PROJECTION); 18817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 18917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen try { 19017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen // Just return all of the tracks for now 19117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen List<MusicTrack> musicTracks = retreiveMedia(); 19217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen for (MusicTrack musicTrack : musicTracks) { 19317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Uri.Builder builder = new Uri.Builder(); 19417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.authority(BrowserService.AUTHORITY); 19517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.appendPath(BrowserService.NOW_PLAYING_PATH); 19617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.appendPath(musicTrack.getTitle()); 19717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen matrixCursor.addRow(new Object[] { 19817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.build(), 19917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen musicTrack.getTitle(), 20017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen musicTrack.getArtist(), 20117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen musicTrack.getImage(), 20217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen PlaybackState.ACTION_PLAY 20317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen }); 20417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.d(TAG, "Uri " + builder.build()); 20517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 20617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } catch (JSONException e) { 20717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.e(TAG, "::getRootItemCursor:", e); 20817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 20917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 21017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.d(TAG, "cursor: " + matrixCursor.getCount()); 21117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return matrixCursor; 21217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } else if (type == BrowserService.PIANO) { 21317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen MatrixCursor matrixCursor = new MatrixCursor(BrowserService.MEDIA_CONTAINER_PROJECTION); 21417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 21517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen try { 21617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen List<MusicTrack> musicTracks = retreiveMedia(); 21717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen for (MusicTrack musicTrack : musicTracks) { 21817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Uri.Builder builder = new Uri.Builder(); 21917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.authority(BrowserService.AUTHORITY); 22017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.appendPath(BrowserService.PIANO_BASE_PATH); 22117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.appendPath(musicTrack.getTitle()); 22217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen matrixCursor.addRow(new Object[] { 22317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.build(), 22417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen musicTrack.getTitle(), 22517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen musicTrack.getArtist(), 22617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen musicTrack.getImage(), 22717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen PlaybackState.ACTION_PLAY 22817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen }); 22917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.d(TAG, "Uri " + builder.build()); 23017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 23117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } catch (JSONException e) { 23217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.e(TAG, "::getRootItemCursor:", e); 23317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 23417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 23517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.d(TAG, "cursor: " + matrixCursor.getCount()); 23617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return matrixCursor; 23717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } else if (type == BrowserService.VOICE) { 23817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen MatrixCursor matrixCursor = new MatrixCursor(BrowserService.MEDIA_CONTAINER_PROJECTION); 23917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 24017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen try { 24117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen List<MusicTrack> musicTracks = retreiveMedia(); 24217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen for (MusicTrack musicTrack : musicTracks) { 24317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Uri.Builder builder = new Uri.Builder(); 24417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.authority(BrowserService.AUTHORITY); 24517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.appendPath(BrowserService.VOICE_BASE_PATH); 24617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.appendPath(musicTrack.getTitle()); 24717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen matrixCursor.addRow(new Object[] { 24817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen builder.build(), 24917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen musicTrack.getTitle(), 25017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen musicTrack.getArtist(), 25117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen musicTrack.getImage(), 25217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen PlaybackState.ACTION_PLAY 25317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen }); 25417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.d(TAG, "Uri " + builder.build()); 25517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 25617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } catch (JSONException e) { 25717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.e(TAG, "::getRootItemCursor:", e); 25817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 25917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 26017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen Log.d(TAG, "cursor: " + matrixCursor.getCount()); 26117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return matrixCursor; 26217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen 26317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 26417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen return null; 26517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen } 26617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen} 267