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;
1817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
1917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.app.SearchManager;
2017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.app.Service;
2117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.content.Context;
2217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.content.Intent;
2317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.content.UriMatcher;
2417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.content.res.Resources.NotFoundException;
2517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.database.MatrixCursor;
2617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.graphics.Bitmap;
2717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.media.AudioManager;
286a6a8f00946f963191612f64238bd706c2188dd8RoboErikimport android.media.MediaDescription;
2917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.media.MediaPlayer;
3017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.media.MediaPlayer.OnCompletionListener;
3117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.media.MediaPlayer.OnErrorListener;
3217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.media.MediaPlayer.OnPreparedListener;
336a6a8f00946f963191612f64238bd706c2188dd8RoboErikimport android.media.browse.MediaBrowser;
346a6a8f00946f963191612f64238bd706c2188dd8RoboErikimport android.service.media.MediaBrowserService;
356a6a8f00946f963191612f64238bd706c2188dd8RoboErikimport android.service.media.MediaBrowserService.BrowserRoot;
3617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.media.session.MediaSession;
3717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.net.Uri;
3817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.net.wifi.WifiManager;
3917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.net.wifi.WifiManager.WifiLock;
4017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.os.Bundle;
4117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.os.Handler;
4217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.os.IBinder;
4317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.os.Message;
4417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.os.PowerManager;
4517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.os.RemoteException;
4617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.os.SystemClock;
4717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport android.util.Log;
4817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
4917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport com.example.android.musicservicedemo.browser.MusicProvider;
5017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport com.example.android.musicservicedemo.browser.MusicProviderTask;
5117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport com.example.android.musicservicedemo.browser.MusicProviderTaskListener;
5217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport com.example.android.musicservicedemo.browser.MusicTrack;
5317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
5417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport org.json.JSONException;
5517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
5617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.io.IOException;
5717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.util.ArrayList;
5817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenimport java.util.List;
5917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
6017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen/**
6117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen * Service that implements MediaBrowserService and returns our menu hierarchy.
6217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen */
6317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chenpublic class BrowserService extends MediaBrowserService {
6417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    private static final String TAG = "BrowserService";
6517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
6617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    // URI paths for browsing music
6717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final String BROWSE_ROOT_BASE_PATH = "browse";
6817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final String NOW_PLAYING_PATH = "now_playing";
6917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final String PIANO_BASE_PATH = "piano";
7017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final String VOICE_BASE_PATH = "voice";
7117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
7217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    // Content URIs
7317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final String AUTHORITY = "com.example.android.automotive.musicplayer";
7417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final Uri BASE_URI = Uri.parse("content://" + AUTHORITY);
7517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final Uri BROWSE_URI = Uri.withAppendedPath(BASE_URI, BROWSE_ROOT_BASE_PATH);
7617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
7717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    // URI matcher constants for browsing paths
7817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final int BROWSE_ROOT = 1;
7917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final int NOW_PLAYING = 2;
8017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final int PIANO = 3;
8117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final int VOICE = 4;
8217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
8317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    // Map the the URI paths with the URI matcher constants
8417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    private static final UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
8517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    static {
8617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        sUriMatcher.addURI(AUTHORITY, BROWSE_ROOT_BASE_PATH, BROWSE_ROOT);
8717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        sUriMatcher.addURI(AUTHORITY, NOW_PLAYING_PATH, NOW_PLAYING);
8817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        sUriMatcher.addURI(AUTHORITY, PIANO_BASE_PATH, PIANO);
8917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        sUriMatcher.addURI(AUTHORITY, VOICE_BASE_PATH, VOICE);
9017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    }
9117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
9217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    // Media metadata that will be provided for a media container
9317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public static final String[] MEDIA_CONTAINER_PROJECTION = {
9417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen            "uri",
9517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen            "title",
9617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen            "subtitle",
9717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen            "image_uri",
9817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen            "supported_actions"
9917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    };
10017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
10117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    // MusicProvider will download the music catalog
10217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    private MusicProvider mMusicProvider;
10317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
10417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    private MediaSession mSession;
10517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
10617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    @Override
10717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public void onCreate() {
10817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        super.onCreate();
10917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
11017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        mSession = new MediaSession(this, "com.example.android.musicservicedemo.BrowserService");
11117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        setSessionToken(mSession.getSessionToken());
11217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    }
11317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
11417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    @Override
11517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public void onDestroy() {
11617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        super.onDestroy();
11717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    }
11817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
11917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    @Override
1208470857ee43444868a38d0e760981386880d6ce2Yao Chen    public BrowserRoot onGetRoot(String clientPackageName, int clientUid, Bundle rootHints) {
121c692d05951561e1d9fde952cc5389ec167bdb7bbRoboErik        return new BrowserRoot(BROWSE_URI.toString(), null);
12217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    }
12317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
12417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    @Override
125c692d05951561e1d9fde952cc5389ec167bdb7bbRoboErik    public void onLoadChildren(final String parentId,
1266a6a8f00946f963191612f64238bd706c2188dd8RoboErik            final Result<List<MediaBrowser.MediaItem>> result) {
12769b078599b8d8bc3e8f94d6cab881145f4e2c129Joe Onorato        new Handler().postDelayed(new Runnable() {
12869b078599b8d8bc3e8f94d6cab881145f4e2c129Joe Onorato                public void run() {
1296a6a8f00946f963191612f64238bd706c2188dd8RoboErik                    final ArrayList<MediaBrowser.MediaItem> list = new ArrayList();
13069b078599b8d8bc3e8f94d6cab881145f4e2c129Joe Onorato
13169b078599b8d8bc3e8f94d6cab881145f4e2c129Joe Onorato                    for (int i=0; i<10; i++) {
1326a6a8f00946f963191612f64238bd706c2188dd8RoboErik                        MediaDescription.Builder bob = new MediaDescription.Builder();
1336a6a8f00946f963191612f64238bd706c2188dd8RoboErik                        bob.setTitle("Title " + i);
1346a6a8f00946f963191612f64238bd706c2188dd8RoboErik                        bob.setSubtitle("Summary " + i);
1356a6a8f00946f963191612f64238bd706c2188dd8RoboErik                        bob.setMediaId(Uri.withAppendedPath(BASE_URI,
1366a6a8f00946f963191612f64238bd706c2188dd8RoboErik                                Integer.toString(i)).toString());
1375dfa0a5f7a6365ddf3939f29227366172979e53eRoboErik                        list.add(new MediaBrowser.MediaItem(bob.build(),
1385dfa0a5f7a6365ddf3939f29227366172979e53eRoboErik                                MediaBrowser.MediaItem.FLAG_BROWSABLE));
13969b078599b8d8bc3e8f94d6cab881145f4e2c129Joe Onorato                    }
14069b078599b8d8bc3e8f94d6cab881145f4e2c129Joe Onorato
14169b078599b8d8bc3e8f94d6cab881145f4e2c129Joe Onorato                    result.sendResult(list);
14269b078599b8d8bc3e8f94d6cab881145f4e2c129Joe Onorato                }
14369b078599b8d8bc3e8f94d6cab881145f4e2c129Joe Onorato            }, 2000);
14469b078599b8d8bc3e8f94d6cab881145f4e2c129Joe Onorato        result.detach();
14517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    }
14617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
14717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    /*
14817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    @Override
14917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    public void query(final Query query, final IMetadataResultHandler metadataResultHandler,
15017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen            final IErrorHandler errorHandler)
15117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen            throws RemoteException {
15217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        Log.d(TAG, "query: " + query);
15317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        Utils.checkNotNull(query);
15417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        Utils.checkNotNull(metadataResultHandler);
15517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        Utils.checkNotNull(errorHandler);
15617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
15717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        // Handle async response
15817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        new Thread(new Runnable() {
15917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen            public void run() {
16017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                try {
16117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    // Pre-load the list of music
16217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    List<MusicTrack> musicTracks = getMusicList();
16317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    if (musicTracks == null) {
16417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        notifyListenersOnPlaybackStateUpdate(getCurrentPlaybackState());
16517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        errorHandler.onError(new Error(Error.UNKNOWN,
16617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                getString(R.string.music_error)));
16717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        return;
16817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    }
16917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
17017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    final Uri uri = query.getUri();
17117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    int match = sUriMatcher.match(uri);
17217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    Log.d(TAG, "Queried: " + uri + "; match: " + match);
17317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    switch (match) {
17417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        case BROWSE_ROOT:
17517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        {
17617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            Log.d(TAG, "Browse_root");
17717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
17817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            try {
17917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                MatrixCursor matrixCursor = mMusicProvider
18017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        .getRootContainerCurser();
18117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                DataHolder holder = new DataHolder(MEDIA_CONTAINER_PROJECTION,
18217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        matrixCursor, null);
18317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
18417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.d(TAG, "on metadata response called " + holder.getCount());
18517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                metadataResultHandler.onMetadataResponse(holder);
18617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            } catch (RemoteException e) {
18717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.w(TAG, "Error delivering metadata in the callback.", e);
18817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            }
18917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            break;
19017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        }
19117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        case NOW_PLAYING:
19217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        {
19317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            try {
19417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.d(TAG, "query NOW_PLAYING");
19517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                MatrixCursor matrixCursor = mMusicProvider
19617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        .getRootItemCursor(
19717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        PIANO);
19817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                DataHolder holder = new DataHolder(MEDIA_CONTAINER_PROJECTION,
19917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        matrixCursor, null);
20017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.d(TAG, "on metadata response called " + holder.getCount());
20117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                metadataResultHandler.onMetadataResponse(holder);
20217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            } catch (RemoteException e) {
20317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.w(TAG, "Error querying NOW_PLAYING");
20417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            }
20517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            break;
20617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        }
20717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        case PIANO:
20817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        {
20917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            try {
21017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.d(TAG, "query PIANO");
21117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                MatrixCursor matrixCursor = mMusicProvider
21217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        .getRootItemCursor(
21317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        PIANO);
21417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                DataHolder holder = new DataHolder(MEDIA_CONTAINER_PROJECTION,
21517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        matrixCursor, null);
21617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.d(TAG, "on metadata response called " + holder.getCount());
21717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                metadataResultHandler.onMetadataResponse(holder);
21817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            } catch (RemoteException e) {
21917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.w(TAG, "Error querying PIANO");
22017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            }
22117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            break;
22217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        }
22317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        case VOICE:
22417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        {
22517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            try {
22617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.d(TAG, "query VOICE");
22717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                MatrixCursor matrixCursor = mMusicProvider
22817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        .getRootItemCursor(
22917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        VOICE);
23017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                DataHolder holder = new DataHolder(MEDIA_CONTAINER_PROJECTION,
23117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                        matrixCursor, null);
23217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.d(TAG, "on metadata response called " + holder.getCount());
23317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                metadataResultHandler.onMetadataResponse(holder);
23417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            } catch (RemoteException e) {
23517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                                Log.w(TAG, "Error querying VOICE");
23617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            }
23717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            break;
23817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        }
23917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        default:
24017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        {
24117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                            Log.w(TAG, "Skipping unmatched URI: " + uri);
24217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                        }
24317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    }
24417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                } catch (NotFoundException e) {
24517d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    Log.e(TAG, "::run:", e);
24617d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                } catch (RemoteException e) {
24717d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                    Log.e(TAG, "::run:", e);
24817d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen                }
24917d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen            } // end run
25017d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen        }).start();
25117d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    }
25217d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen
25317d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen    */
25417d47989ee53c9e54f250d29a343ba949edf0ff9Yao Chen}
255