StubMediaBrowserServiceCompat.java revision 24919ee8c30d91ec056cae6c4f578d7007cbe968
1/* 2 * Copyright 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package android.support.mediacompat.service; 18 19import static android.support.mediacompat.testlib.MediaBrowserConstants.CUSTOM_ACTION; 20import static android.support.mediacompat.testlib.MediaBrowserConstants.CUSTOM_ACTION_FOR_ERROR; 21import static android.support.mediacompat.testlib.MediaBrowserConstants.EXTRAS_KEY; 22import static android.support.mediacompat.testlib.MediaBrowserConstants.EXTRAS_VALUE; 23import static android.support.mediacompat.testlib.MediaBrowserConstants.MEDIA_ID_CHILDREN; 24import static android.support.mediacompat.testlib.MediaBrowserConstants.MEDIA_ID_CHILDREN_DELAYED; 25import static android.support.mediacompat.testlib.MediaBrowserConstants.MEDIA_ID_INCLUDE_METADATA; 26import static android.support.mediacompat.testlib.MediaBrowserConstants.MEDIA_ID_INVALID; 27import static android.support.mediacompat.testlib.MediaBrowserConstants.MEDIA_ID_ROOT; 28import static android.support.mediacompat.testlib.MediaBrowserConstants.MEDIA_METADATA; 29import static android.support.mediacompat.testlib.MediaBrowserConstants.SEARCH_QUERY; 30import static android.support.mediacompat.testlib.MediaBrowserConstants.SEARCH_QUERY_FOR_ERROR; 31import static android.support.mediacompat.testlib.MediaBrowserConstants.SEARCH_QUERY_FOR_NO_RESULT; 32 33import static org.junit.Assert.assertNull; 34 35import android.os.Bundle; 36import android.support.v4.media.MediaBrowserCompat.MediaItem; 37import android.support.v4.media.MediaDescriptionCompat; 38import android.support.v4.media.MediaMetadataCompat; 39import android.support.v4.media.session.MediaSessionCompat; 40 41import androidx.annotation.NonNull; 42import androidx.media.MediaBrowserServiceCompat; 43 44import java.util.ArrayList; 45import java.util.Collections; 46import java.util.List; 47 48/** 49 * Stub implementation of {@link MediaBrowserServiceCompat}. 50 */ 51public class StubMediaBrowserServiceCompat extends MediaBrowserServiceCompat { 52 53 public static StubMediaBrowserServiceCompat sInstance; 54 55 public static MediaSessionCompat sSession; 56 private Bundle mExtras; 57 private Result<List<MediaItem>> mPendingLoadChildrenResult; 58 private Result<MediaItem> mPendingLoadItemResult; 59 private Bundle mPendingRootHints; 60 61 public Bundle mCustomActionExtras; 62 public Result<Bundle> mCustomActionResult; 63 64 @Override 65 public void onCreate() { 66 super.onCreate(); 67 sInstance = this; 68 sSession = new MediaSessionCompat(this, "StubMediaBrowserServiceCompat"); 69 setSessionToken(sSession.getSessionToken()); 70 } 71 72 @Override 73 public void onDestroy() { 74 super.onDestroy(); 75 sSession.release(); 76 sSession = null; 77 } 78 79 @Override 80 public BrowserRoot onGetRoot(String clientPackageName, int clientUid, Bundle rootHints) { 81 mExtras = new Bundle(); 82 mExtras.putString(EXTRAS_KEY, EXTRAS_VALUE); 83 return new BrowserRoot(MEDIA_ID_ROOT, mExtras); 84 } 85 86 @Override 87 public void onLoadChildren(final String parentId, final Result<List<MediaItem>> result) { 88 List<MediaItem> mediaItems = new ArrayList<>(); 89 if (MEDIA_ID_ROOT.equals(parentId)) { 90 Bundle rootHints = getBrowserRootHints(); 91 for (String id : MEDIA_ID_CHILDREN) { 92 mediaItems.add(createMediaItem(id)); 93 } 94 result.sendResult(mediaItems); 95 } else if (MEDIA_ID_CHILDREN_DELAYED.equals(parentId)) { 96 assertNull(mPendingLoadChildrenResult); 97 mPendingLoadChildrenResult = result; 98 mPendingRootHints = getBrowserRootHints(); 99 result.detach(); 100 } else if (MEDIA_ID_INVALID.equals(parentId)) { 101 result.sendResult(null); 102 } 103 } 104 105 @Override 106 public void onLoadChildren(@NonNull String parentId, @NonNull Result<List<MediaItem>> result, 107 @NonNull Bundle options) { 108 if (MEDIA_ID_INCLUDE_METADATA.equals(parentId)) { 109 // Test unparcelling the Bundle. 110 MediaMetadataCompat metadata = options.getParcelable(MEDIA_METADATA); 111 if (metadata == null) { 112 super.onLoadChildren(parentId, result, options); 113 } else { 114 List<MediaItem> mediaItems = new ArrayList<>(); 115 mediaItems.add(new MediaItem(metadata.getDescription(), MediaItem.FLAG_PLAYABLE)); 116 result.sendResult(mediaItems); 117 } 118 } else { 119 super.onLoadChildren(parentId, result, options); 120 } 121 } 122 123 @Override 124 public void onLoadItem(String itemId, Result<MediaItem> result) { 125 if (MEDIA_ID_CHILDREN_DELAYED.equals(itemId)) { 126 mPendingLoadItemResult = result; 127 mPendingRootHints = getBrowserRootHints(); 128 result.detach(); 129 return; 130 } 131 132 if (MEDIA_ID_INVALID.equals(itemId)) { 133 result.sendResult(null); 134 return; 135 } 136 137 for (String id : MEDIA_ID_CHILDREN) { 138 if (id.equals(itemId)) { 139 result.sendResult(createMediaItem(id)); 140 return; 141 } 142 } 143 144 // Test the case where onLoadItem is not implemented. 145 super.onLoadItem(itemId, result); 146 } 147 148 @Override 149 public void onSearch(String query, Bundle extras, Result<List<MediaItem>> result) { 150 if (SEARCH_QUERY_FOR_NO_RESULT.equals(query)) { 151 result.sendResult(Collections.<MediaItem>emptyList()); 152 } else if (SEARCH_QUERY_FOR_ERROR.equals(query)) { 153 result.sendResult(null); 154 } else if (SEARCH_QUERY.equals(query)) { 155 List<MediaItem> items = new ArrayList<>(); 156 for (String id : MEDIA_ID_CHILDREN) { 157 if (id.contains(query)) { 158 items.add(createMediaItem(id)); 159 } 160 } 161 result.sendResult(items); 162 } 163 } 164 165 @Override 166 public void onCustomAction(String action, Bundle extras, Result<Bundle> result) { 167 mCustomActionResult = result; 168 mCustomActionExtras = extras; 169 if (CUSTOM_ACTION_FOR_ERROR.equals(action)) { 170 result.sendError(null); 171 } else if (CUSTOM_ACTION.equals(action)) { 172 result.detach(); 173 } 174 } 175 176 public void sendDelayedNotifyChildrenChanged() { 177 if (mPendingLoadChildrenResult != null) { 178 mPendingLoadChildrenResult.sendResult(Collections.<MediaItem>emptyList()); 179 mPendingRootHints = null; 180 mPendingLoadChildrenResult = null; 181 } 182 } 183 184 public void sendDelayedItemLoaded() { 185 if (mPendingLoadItemResult != null) { 186 mPendingLoadItemResult.sendResult(new MediaItem(new MediaDescriptionCompat.Builder() 187 .setMediaId(MEDIA_ID_CHILDREN_DELAYED).setExtras(mPendingRootHints).build(), 188 MediaItem.FLAG_BROWSABLE)); 189 mPendingRootHints = null; 190 mPendingLoadItemResult = null; 191 } 192 } 193 194 private MediaItem createMediaItem(String id) { 195 return new MediaItem(new MediaDescriptionCompat.Builder().setMediaId(id).build(), 196 MediaItem.FLAG_BROWSABLE); 197 } 198} 199