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