1ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu/*
2ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * Copyright (C) 2017 The Android Open Source Project
3ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu *
4ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * Licensed under the Apache License, Version 2.0 (the "License");
5ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * you may not use this file except in compliance with the License.
6ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * You may obtain a copy of the License at
7ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu *
8ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu *      http://www.apache.org/licenses/LICENSE-2.0
9ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu *
10ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * Unless required by applicable law or agreed to in writing, software
11ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * distributed under the License is distributed on an "AS IS" BASIS,
12ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * See the License for the specific language governing permissions and
14ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * limitations under the License.
15ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu */
16ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu
17ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gupackage com.example.android.leanback;
18ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu
19ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Guimport android.graphics.Bitmap;
20ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Guimport android.graphics.BitmapFactory;
21ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Guimport android.graphics.Canvas;
22ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Guimport android.graphics.Color;
23ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Guimport android.graphics.Paint;
24ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu
25ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Guimport java.io.File;
26ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu
27ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu/**
28ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * Sample PlaybackSeekDataProvider that reads bitmaps stored on disk.
29ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * e.g. new PlaybackSeekDiskDataProvider(duration, 1000, "/sdcard/frame_%04d.jpg")
30ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * Expects the seek positions are 1000ms interval, snapshots are stored at
31ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu * /sdcard/frame_0001.jpg, ...
32ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu */
33ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Guclass PlaybackSeekDiskDataProvider extends PlaybackSeekAsyncDataProvider {
34ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu
35ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu    final Paint mPaint;
36ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu    final String mPathPattern;
37ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu    PlaybackSeekDiskDataProvider(long duration, long interval, String pathPattern) {
38ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        mPathPattern = pathPattern;
39ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        int size = (int) (duration / interval) + 1;
40ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        long[] pos = new long[size];
41ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        for (int i = 0; i < pos.length; i++) {
42ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            pos[i] = i * duration / pos.length;
43ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        }
44ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        setSeekPositions(pos);
45ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        mPaint = new Paint();
46ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        mPaint.setTextSize(16);
47ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        mPaint.setColor(Color.BLUE);
48ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu    }
49ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu
50ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu    protected Bitmap doInBackground(Object task, int index, long position) {
51ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        try {
52ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            Thread.sleep(100);
53ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        } catch (InterruptedException ex) {
54ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            // Thread might be interrupted by cancel() call.
55ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        }
56ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        if (isCancelled(task)) {
57ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            return null;
58ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        }
59ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        String path = String.format(mPathPattern, (index + 1));
60ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        if (new File(path).exists()) {
61ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            return BitmapFactory.decodeFile(path);
62ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        } else {
63ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            Bitmap bmp = Bitmap.createBitmap(160, 160, Bitmap.Config.ARGB_8888);
64ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            Canvas canvas = new Canvas(bmp);
65ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            canvas.drawColor(Color.YELLOW);
66ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            canvas.drawText(path, 10, 80, mPaint);
67ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            canvas.drawText(Integer.toString(index), 10, 150, mPaint);
68ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu            return bmp;
69ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu        }
70ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu    }
71ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu
72ffddec570a27891c0e13d24b1558c6f61ed99fb9Dake Gu}
73