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