/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.support.v17.leanback.widget;

import android.graphics.Bitmap;

/**
 * Class to be implemented by app to provide seeking data and thumbnails to UI.
 */
public class PlaybackSeekDataProvider {

    /**
     * Client to receive result for {@link PlaybackSeekDataProvider#getThumbnail(int,
     * ResultCallback)}.
     */
    public static class ResultCallback {

        /**
         * Client of thumbnail bitmap being loaded. PlaybackSeekDataProvider must invoke this method
         * in UI thread such as in {@link android.os.AsyncTask#onPostExecute(Object)}.
         *
         * @param bitmap Result of bitmap.
         * @param index Index of {@link #getSeekPositions()}.
         */
        public void onThumbnailLoaded(Bitmap bitmap, int index) {
        }
    }

    /**
     * Get a list of sorted seek positions. The positions should not change after user starts
     * seeking.
     *
     * @return A list of sorted seek positions.
     */
    public long[] getSeekPositions() {
        return null;
    }

    /**
     * Called to get thumbnail bitmap. This method is called on UI thread. When provider finds
     * cache bitmap, it may invoke {@link ResultCallback#onThumbnailLoaded(Bitmap, int)}
     * immediately. Provider may start background thread and invoke
     * {@link ResultCallback#onThumbnailLoaded(Bitmap, int)} later in UI thread. The method might
     * be called multiple times for the same position, PlaybackSeekDataProvider must guarantee
     * to replace pending {@link ResultCallback} with the new one. When seeking right,
     * getThumbnail() will be called with increasing index; when seeking left, getThumbnail() will
     * be called with decreasing index. The increment of index can be used by subclass to determine
     * prefetch direction.
     *
     * @param index Index of position in {@link #getSeekPositions()}.
     * @param callback The callback to receive the result on UI thread. It may be called within
     *                 getThumbnail() if hit cache directly.
     */
    public void getThumbnail(int index, ResultCallback callback) {
    }

    /**
     * Called when seek stops, Provider should cancel pending requests for the thumbnails.
     */
    public void reset() {
    }
}
