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