1045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng/*
2045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng * Copyright (C) 2011 The Android Open Source Project
3045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng *
4045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng * Licensed under the Apache License, Version 2.0 (the "License");
5045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng * you may not use this file except in compliance with the License.
6045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng * You may obtain a copy of the License at
7045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng *
8045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng *      http://www.apache.org/licenses/LICENSE-2.0
9045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng *
10045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng * Unless required by applicable law or agreed to in writing, software
11045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng * distributed under the License is distributed on an "AS IS" BASIS,
12045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng * See the License for the specific language governing permissions and
14045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng * limitations under the License.
15045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng */
16045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
17045133a84c417b1469050980990f1623c6448e2cShih-chia Chengpackage com.android.videoeditor;
18045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
19045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.content.Context;
20045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.content.res.Resources;
21045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.graphics.Bitmap;
22045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.graphics.BitmapFactory;
23045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.graphics.Canvas;
24045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.graphics.Color;
25045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.graphics.Paint;
26045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.graphics.Paint.Style;
27045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.graphics.Typeface;
28045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.media.videoeditor.VideoEditor;
297347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Chengimport android.os.AsyncTask;
30045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.text.format.DateUtils;
312d70f9362d4575e52f4bc7951a2b0fd7e0693872Shih-chia Chengimport android.text.TextPaint;
322d70f9362d4575e52f4bc7951a2b0fd7e0693872Shih-chia Chengimport android.text.TextUtils;
332d70f9362d4575e52f4bc7951a2b0fd7e0693872Shih-chia Chengimport android.util.Log;
347347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Chengimport android.util.LruCache;
35045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.view.LayoutInflater;
36045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.view.View;
37045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.view.ViewGroup;
38045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.widget.BaseAdapter;
39045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.widget.ImageView;
40045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport android.widget.TextView;
41045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
42045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport com.android.videoeditor.service.VideoEditorProject;
43045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport com.android.videoeditor.util.ImageUtils;
44045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
45045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport java.io.File;
46045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport java.io.IOException;
47045133a84c417b1469050980990f1623c6448e2cShih-chia Chengimport java.util.List;
48045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
49045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
50045133a84c417b1469050980990f1623c6448e2cShih-chia Chengpublic class ProjectPickerAdapter extends BaseAdapter {
51045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    private Context mContext;
52045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    private Resources mResources;
53045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    private LayoutInflater mInflater;
54045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    private List<VideoEditorProject> mProjects;
55045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    private int mItemWidth;
56045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    private int mItemHeight;
57ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    private int mOverlayHeight;
58ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    private int mOverlayVerticalInset;
59ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    private int mOverlayHorizontalInset;
607347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    private LruCache<String, Bitmap> mPreviewBitmapCache;
61045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
62045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    public ProjectPickerAdapter(Context context, LayoutInflater inflater,
63045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng            List<VideoEditorProject> projects) {
64045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        mContext = context;
65045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        mResources = context.getResources();
66045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        mInflater = inflater;
67045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        mProjects = projects;
68045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        mItemWidth = (int) mResources.getDimension(R.dimen.project_picker_item_width);
69045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        mItemHeight = (int) mResources.getDimension(R.dimen.project_picker_item_height);
70ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        mOverlayHeight = (int) mResources.getDimension(
71ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                R.dimen.project_picker_item_overlay_height);
72ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        mOverlayVerticalInset = (int) mResources.getDimension(
73ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                R.dimen.project_picker_item_overlay_vertical_inset);
74ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        mOverlayHorizontalInset = (int) mResources.getDimension(
75ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                R.dimen.project_picker_item_overlay_horizontal_inset);
767347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        // Limit the cache size to 15 thumbnails.
777347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        mPreviewBitmapCache = new LruCache<String, Bitmap>(15);
78045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    }
79045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
807a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng    /**
817a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng     * Clears project list and update display.
827a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng     */
83045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    public void clear() {
84e6e5edf189ebaa1dbcec99c4ea0ea6ccaced43adChih-Chung Chang        mPreviewBitmapCache.evictAll();
85045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        mProjects.clear();
867a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng        notifyDataSetChanged();
87045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    }
88045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
89045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    /**
907a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng     * Removes the project with specified {@code projectPath} from the project list and updates the
917a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng     * display.
92045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng     *
93045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng     * @param projectPath The project path of the to-be-removed project
94ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng     * @return {@code true} if the project is successfully removed,
95ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng     *      {@code false} if no removal happened
96045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng     */
97045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    public boolean remove(String projectPath) {
98045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        for (VideoEditorProject project : mProjects) {
99045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng            if (project.getPath().equals(projectPath)) {
1007a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng                if (mProjects.remove(project)) {
1017a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng                    notifyDataSetChanged();
1027a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng                    return true;
1037a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng                } else {
1047a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng                    return false;
1057a4bb5384f847bc29c01c75556188637f528b1edShih-chia Cheng                }
106045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng            }
107045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        }
108045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        return false;
109045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    }
110045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
111045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    @Override
112045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    public int getCount() {
113045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        // Add one to represent an additional dummy project for "create new project" option.
114045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        return mProjects.size() + 1;
115045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    }
116045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
117045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    @Override
118045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    public Object getItem(int position) {
119045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        if (position == mProjects.size()) {
120045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng            return null;
121045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        }
122045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        return mProjects.get(position);
123045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    }
124045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
125045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    @Override
126045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    public long getItemId(int position) {
127045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        return position;
128045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    }
129045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
130045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    @Override
131045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    public View getView(int position, View convertView, ViewGroup parent) {
1327347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        // Inflate a new view with project thumbnail and information.
1337347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        // We never reuse convertView because we load thumbnails asynchronously
1347347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        // and hook an async task with the new view. If the new view is reused
1357347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        // as a convertView, the async task might put a wrong thumbnail on it.
1367347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        View v = mInflater.inflate(R.layout.project_picker_item, null);
137045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        ImageView iv = (ImageView) v.findViewById(R.id.thumbnail);
1387347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        Bitmap thumbnail;
139ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        String title;
140ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        String duration;
141045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        if (position == mProjects.size()) {
142ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng            title = mContext.getString(R.string.projects_new_project);
143ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng            duration = "";
144045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng            thumbnail = renderNewProjectThumbnail();
145045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        } else {
146045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng            VideoEditorProject project = mProjects.get(position);
147ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng            title = project.getName();
148d6bf111e5e95b74274720a2b42c7b8b6329698f4Shih-chia Cheng            if (title == null) {
149d6bf111e5e95b74274720a2b42c7b8b6329698f4Shih-chia Cheng                title = "";
150d6bf111e5e95b74274720a2b42c7b8b6329698f4Shih-chia Cheng            }
151ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng            duration = millisecondsToTimeString(project.getProjectDuration());
152ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng            thumbnail = getThumbnail(project.getPath(), iv, title, duration);
153045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        }
1547347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng
1557347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        if (thumbnail != null) {
156ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng            drawBottomOverlay(thumbnail, title, duration);
1577347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng            iv.setImageBitmap(thumbnail);
1587347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        }
159045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
160045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        return v;
161045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    }
162045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
163ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    /**
164ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng     * Draws transparent black bottom overlay with movie title and duration on the bitmap.
165ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng     */
166ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    public void drawBottomOverlay(Bitmap bitmap, String title, String duration) {
167ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        // Draw overlay at the bottom of the canvas.
168ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        final Canvas canvas = new Canvas(bitmap);
169ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
170ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        paint.setColor(Color.BLACK);
171ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        paint.setAlpha(128);
172ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        final int left = 0, top = bitmap.getHeight() - mOverlayHeight,
173ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                right = bitmap.getWidth(), bottom = bitmap.getHeight();
174ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        canvas.drawRect(left, top, right, bottom, paint);
175ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng
176ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        paint.setColor(Color.WHITE);
1772d70f9362d4575e52f4bc7951a2b0fd7e0693872Shih-chia Cheng        paint.setTextSize((int) mResources.getDimension(R.dimen.project_picker_item_font_size));
1782d70f9362d4575e52f4bc7951a2b0fd7e0693872Shih-chia Cheng
1792d70f9362d4575e52f4bc7951a2b0fd7e0693872Shih-chia Cheng        // Draw movie title at the left of the overlay. Trim title if it is going to overlap with
1802d70f9362d4575e52f4bc7951a2b0fd7e0693872Shih-chia Cheng        // duration text.
1812d70f9362d4575e52f4bc7951a2b0fd7e0693872Shih-chia Cheng        final int availableTitleWidth = bitmap.getWidth() - (int) paint.measureText(duration);
1822d70f9362d4575e52f4bc7951a2b0fd7e0693872Shih-chia Cheng        title = TextUtils.ellipsize(title, new TextPaint(paint), availableTitleWidth,
1832d70f9362d4575e52f4bc7951a2b0fd7e0693872Shih-chia Cheng                TextUtils.TruncateAt.END).toString();
184ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        canvas.drawText(title, mOverlayHorizontalInset,
185ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                bitmap.getHeight() - mOverlayHeight + mOverlayVerticalInset,
186ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                paint);
187ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng
188ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        // Draw movie duration at the right of the overlay.
189ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        canvas.drawText(duration,
190ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                bitmap.getWidth() - paint.measureText(duration) - mOverlayHorizontalInset,
191ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                bitmap.getHeight() - mOverlayHeight + mOverlayVerticalInset,
192ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                paint);
193ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    }
194ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng
195ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    private Bitmap getThumbnail(String projectPath, ImageView imageView, String title,
196ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng            String duration) {
1977347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        Bitmap previewBitmap = mPreviewBitmapCache.get(projectPath);
1987347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        if (previewBitmap == null) {
1997347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng            // Cache miss: asynchronously load bitmap to avoid scroll stuttering
2007347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng            // in the project picker.
201ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng            new LoadPreviewBitmapTask(this, projectPath, imageView, mItemWidth, mItemHeight,
202ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                    title, duration, mPreviewBitmapCache).execute();
2037347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        } else {
2047347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng            return previewBitmap;
205045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        }
206045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
2077347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        return null;
208045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    }
209045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
2107347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    private Bitmap renderNewProjectThumbnail() {
211045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        final Bitmap bitmap = Bitmap.createBitmap(mItemWidth, mItemHeight,
212045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng                Bitmap.Config.ARGB_8888);
213045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        final Canvas canvas = new Canvas(bitmap);
214045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        final Paint paint = new Paint();
215ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        canvas.drawRect(0, 0, mItemWidth, mItemHeight, paint);
216045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
217045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        paint.setTextSize(18.0f);
218045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        paint.setAlpha(255);
219045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        final Bitmap newProjectIcon = BitmapFactory.decodeResource(mResources,
22040fa5d5a1866087e54960373efbb4c49aadde725Shih-chia Cheng                R.drawable.add_video_project_big);
221045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        final int x = (mItemWidth - newProjectIcon.getWidth()) / 2;
222045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        final int y = (mItemHeight - newProjectIcon.getHeight()) / 2;
223045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        canvas.drawBitmap(newProjectIcon, x, y, paint);
224045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        newProjectIcon.recycle();
225045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
2267347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        return bitmap;
227045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    }
228045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng
229045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    /**
230045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng     * Converts milliseconds into the string time format HH:mm:ss.
231045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng     */
232045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    private String millisecondsToTimeString(long milliseconds) {
233045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng        return DateUtils.formatElapsedTime(milliseconds / 1000);
234045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng    }
235045133a84c417b1469050980990f1623c6448e2cShih-chia Cheng}
2367347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng
2377347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng/**
2387347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng * Worker that loads preview bitmap for a project,
2397347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng */
2407347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Chengclass LoadPreviewBitmapTask extends AsyncTask<Void, Void, Bitmap> {
241ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    // Handle to the adapter that initiates this async task.
242ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    private ProjectPickerAdapter mContextAdapter;
2437347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    private String mProjectPath;
2447347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    // Handle to the image view we should update when the preview bitmap is loaded.
2457347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    private ImageView mImageView;
2467347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    private int mWidth;
2477347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    private int mHeight;
248ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    private String mTitle;
249ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    private String mDuration;
2507347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    private LruCache<String, Bitmap> mPreviewBitmapCache;
2517347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng
252ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng    public LoadPreviewBitmapTask(ProjectPickerAdapter contextAdapter, String projectPath,
253ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng            ImageView imageView, int width, int height, String title, String duration,
254ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng            LruCache<String, Bitmap> previewBitmapCache) {
255ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        mContextAdapter = contextAdapter;
2567347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        mProjectPath = projectPath;
2577347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        mImageView = imageView;
2587347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        mWidth = width;
2597347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        mHeight = height;
260ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        mTitle = title;
261ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng        mDuration = duration;
2627347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        mPreviewBitmapCache = previewBitmapCache;
2637347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    }
2647347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng
2657347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    @Override
2667347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    protected Bitmap doInBackground(Void... param) {
2677347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        final File thumbnail = new File(mProjectPath, VideoEditor.THUMBNAIL_FILENAME);
2687347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        // Return early if thumbnail does not exist.
2697347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        if (!thumbnail.exists()) {
2707347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng            return null;
2717347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        }
2727347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng
2737347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        try {
2747347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng            final Bitmap previewBitmap = ImageUtils.scaleImage(
2757347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                    thumbnail.getAbsolutePath(),
276ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                    mWidth,
277ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                    mHeight,
278ded6c6febe18b10a0cdf58ab086d0e30efef6a0eShih-chia Cheng                    ImageUtils.MATCH_LARGER_DIMENSION);
2797347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng            if (previewBitmap != null) {
2807347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                final Bitmap bitmap = Bitmap.createBitmap(mWidth, mHeight,
2817347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                        Bitmap.Config.ARGB_8888);
2827347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                final Canvas canvas = new Canvas(bitmap);
2837347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
2847347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng
2857347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                // Draw bitmap at the center of the canvas.
2867347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                canvas.drawBitmap(previewBitmap,
2877347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                        (mWidth - previewBitmap.getWidth()) / 2,
2887347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                        (mHeight - previewBitmap.getHeight()) / 2,
2897347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                        paint);
2907347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng                return bitmap;
2917347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng            }
2927347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        } catch (IOException e) {
2937347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng            e.printStackTrace();
2947347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        }
2954c37a4611cc04128fcd28429f92380f73540b5dbShih-chia Cheng
2967347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        return null;
2977347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    }
2987347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng
2997347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    @Override
3007347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    protected void onPostExecute(Bitmap result) {
3014c37a4611cc04128fcd28429f92380f73540b5dbShih-chia Cheng        if (result == null) {
3024c37a4611cc04128fcd28429f92380f73540b5dbShih-chia Cheng            // If we don't have thumbnail, default to a black canvas.
3034c37a4611cc04128fcd28429f92380f73540b5dbShih-chia Cheng            result = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
3044c37a4611cc04128fcd28429f92380f73540b5dbShih-chia Cheng            result.eraseColor(Color.BLACK);
3054c37a4611cc04128fcd28429f92380f73540b5dbShih-chia Cheng        } else {
3067347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng            mPreviewBitmapCache.put(mProjectPath, result);
3077347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng        }
3084c37a4611cc04128fcd28429f92380f73540b5dbShih-chia Cheng
3094c37a4611cc04128fcd28429f92380f73540b5dbShih-chia Cheng        // Update the image view.
3104c37a4611cc04128fcd28429f92380f73540b5dbShih-chia Cheng        mContextAdapter.drawBottomOverlay(result, mTitle, mDuration);
3114c37a4611cc04128fcd28429f92380f73540b5dbShih-chia Cheng        mImageView.setImageBitmap(result);
3127347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng    }
3137347ed1e162009eeeb3113eafaebbc39a9f67fdaShih-chia Cheng}
314