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