1d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber/*
2d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Copyright (C) 2017 The Android Open Source Project
3d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
4d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * you may not use this file except in compliance with the License.
6d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * You may obtain a copy of the License at
7d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
8d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber *
10d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Unless required by applicable law or agreed to in writing, software
11d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * See the License for the specific language governing permissions and
14d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * limitations under the License.
15d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber */
1677245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber
1777245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huberpackage android.support.v17.leanback.widget;
18d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
19d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberimport android.graphics.Bitmap;
20d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
214a8b9a2363b7b7b4f98022e6d9aae8b8aa8e35e5Andreas Huber/**
22d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber * Class to be implemented by app to provide seeking data and thumbnails to UI.
23d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber */
24d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huberpublic class PlaybackSeekDataProvider {
25d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
26d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    /**
2777245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber     * Client to receive result for {@link PlaybackSeekDataProvider#getThumbnail(int,
28d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     * ResultCallback)}.
29d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     */
30d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    public static class ResultCallback {
3177245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber
3277245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber        /**
33d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber         * Client of thumbnail bitmap being loaded. PlaybackSeekDataProvider must invoke this method
34d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber         * in UI thread such as in {@link android.os.AsyncTask#onPostExecute(Object)}.
35d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber         *
36d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber         * @param bitmap Result of bitmap.
37d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber         * @param index Index of {@link #getSeekPositions()}.
38d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber         */
39d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        public void onThumbnailLoaded(Bitmap bitmap, int index) {
40d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        }
41d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    }
42d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
43d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    /**
44d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     * Get a list of sorted seek positions. The positions should not change after user starts
45e1957358f11031a554c57d4fb46988dd6044acc1Andreas Huber     * seeking.
46d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     *
47d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     * @return A list of sorted seek positions.
48d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     */
49d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    public long[] getSeekPositions() {
50d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber        return null;
51d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    }
52d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber
5377245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber    /**
5477245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber     * Called to get thumbnail bitmap. This method is called on UI thread. When provider finds
55d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     * cache bitmap, it may invoke {@link ResultCallback#onThumbnailLoaded(Bitmap, int)}
56d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     * immediately. Provider may start background thread and invoke
57d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     * {@link ResultCallback#onThumbnailLoaded(Bitmap, int)} later in UI thread. The method might
58d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     * be called multiple times for the same position, PlaybackSeekDataProvider must guarantee
5977245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber     * to replace pending {@link ResultCallback} with the new one. When seeking right,
6077245813007cf903b4b73f5d0cd20313fbf0e510Andreas Huber     * getThumbnail() will be called with increasing index; when seeking left, getThumbnail() will
6196fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber     * be called with decreasing index. The increment of index can be used by subclass to determine
6296fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber     * prefetch direction.
63d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     *
64d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     * @param index Index of position in {@link #getSeekPositions()}.
65d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     * @param callback The callback to receive the result on UI thread. It may be called within
66d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     *                 getThumbnail() if hit cache directly.
67d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber     */
68d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    public void getThumbnail(int index, ResultCallback callback) {
69d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber    }
7096fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber
7196fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    /**
7296fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber     * Called when seek stops, Provider should cancel pending requests for the thumbnails.
7396fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber     */
7496fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    public void reset() {
7596fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber    }
7696fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber}
7796fc6cc65ca93009a759a3a874b82a35771b9714Andreas Huber