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