1f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin/*
2f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Copyright (C) 2010 The Android Open Source Project
3f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
4f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Licensed under the Apache License, Version 2.0 (the "License");
5f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * you may not use this file except in compliance with the License.
6f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * You may obtain a copy of the License at
7f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
8f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *      http://www.apache.org/licenses/LICENSE-2.0
9f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin *
10f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * Unless required by applicable law or agreed to in writing, software
11f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * distributed under the License is distributed on an "AS IS" BASIS,
12f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * See the License for the specific language governing permissions and
14f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin * limitations under the License.
15f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin */
16f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
17f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpackage com.android.gallery3d.data;
18f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
19f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.content.ContentResolver;
20f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.database.Cursor;
21f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.Bitmap;
22f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.graphics.BitmapRegionDecoder;
23f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.net.Uri;
24f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.provider.MediaStore.Video;
25f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linimport android.provider.MediaStore.Video.VideoColumns;
26f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
272b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.app.GalleryApp;
282b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.common.BitmapUtils;
292b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.util.GalleryUtils;
302b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.util.ThreadPool.Job;
312b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.util.ThreadPool.JobContext;
322b3ee0ea07246b859a5b75d8a6102a7cce7ec838Owen Linimport com.android.gallery3d.util.UpdateHelper;
33f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
34f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin// LocalVideo represents a video in the local storage.
35f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Linpublic class LocalVideo extends LocalMediaItem {
36f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang    private static final String TAG = "LocalVideo";
37f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    static final Path ITEM_PATH = Path.fromString("/local/video/item");
38f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
39f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // Must preserve order between these indices and the order of the terms in
40f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    // the following PROJECTION array.
41f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_ID = 0;
42f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_CAPTION = 1;
43f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_MIME_TYPE = 2;
44f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_LATITUDE = 3;
45f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_LONGITUDE = 4;
46f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_DATE_TAKEN = 5;
47f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_DATE_ADDED = 6;
48f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_DATE_MODIFIED = 7;
49f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_DATA = 8;
50f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_DURATION = 9;
51f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private static final int INDEX_BUCKET_ID = 10;
52f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang    private static final int INDEX_SIZE = 11;
53f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang    private static final int INDEX_RESOLUTION = 12;
54f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
55f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    static final String[] PROJECTION = new String[] {
56f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns._ID,
57f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns.TITLE,
58f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns.MIME_TYPE,
59f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns.LATITUDE,
60f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns.LONGITUDE,
61f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns.DATE_TAKEN,
62f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns.DATE_ADDED,
63f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns.DATE_MODIFIED,
64f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns.DATA,
65f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns.DURATION,
66f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            VideoColumns.BUCKET_ID,
67f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang            VideoColumns.SIZE,
68f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang            VideoColumns.RESOLUTION,
69f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    };
70f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
71f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private final GalleryApp mApplication;
72f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
73f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int durationInSec;
74f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
75f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public LocalVideo(Path path, GalleryApp application, Cursor cursor) {
76f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super(path, nextVersionNumber());
77f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mApplication = application;
78f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        loadFromCursor(cursor);
79f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
80f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
81f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public LocalVideo(Path path, GalleryApp context, int id) {
82f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        super(path, nextVersionNumber());
83f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mApplication = context;
84f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        ContentResolver resolver = mApplication.getContentResolver();
85f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Uri uri = Video.Media.EXTERNAL_CONTENT_URI;
86f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Cursor cursor = LocalAlbum.getItemCursor(resolver, uri, PROJECTION, id);
87f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (cursor == null) {
88f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            throw new RuntimeException("cannot get cursor for: " + path);
89f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
90f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        try {
91f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (cursor.moveToNext()) {
92f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                loadFromCursor(cursor);
93f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            } else {
94f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                throw new RuntimeException("cannot find data for: " + path);
95f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            }
96f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        } finally {
97f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            cursor.close();
98f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
99f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
100f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
101f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    private void loadFromCursor(Cursor cursor) {
102f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        id = cursor.getInt(INDEX_ID);
103f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        caption = cursor.getString(INDEX_CAPTION);
104f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mimeType = cursor.getString(INDEX_MIME_TYPE);
105f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        latitude = cursor.getDouble(INDEX_LATITUDE);
106f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        longitude = cursor.getDouble(INDEX_LONGITUDE);
107f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        dateTakenInMs = cursor.getLong(INDEX_DATE_TAKEN);
10889c755cbe16f5fe6f57be429a850331cc67a46d5Teng-Hui Zhu        dateAddedInSec = cursor.getLong(INDEX_DATE_ADDED);
10989c755cbe16f5fe6f57be429a850331cc67a46d5Teng-Hui Zhu        dateModifiedInSec = cursor.getLong(INDEX_DATE_MODIFIED);
110f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        filePath = cursor.getString(INDEX_DATA);
111f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        durationInSec = cursor.getInt(INDEX_DURATION) / 1000;
112f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        bucketId = cursor.getInt(INDEX_BUCKET_ID);
113f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang        fileSize = cursor.getLong(INDEX_SIZE);
114f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang        parseResolution(cursor.getString(INDEX_RESOLUTION));
115f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang    }
116f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang
117f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang    private void parseResolution(String resolution) {
11862c29e71e226ae31573ab883a18e30fdfcb2711bChih-Chung Chang        if (resolution == null) return;
119f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang        int m = resolution.indexOf('x');
120f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang        if (m == -1) return;
121f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang        try {
122f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang            int w = Integer.parseInt(resolution.substring(0, m));
123f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang            int h = Integer.parseInt(resolution.substring(m + 1));
124f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang            width = w;
125f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang            height = h;
126f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang        } catch (Throwable t) {
127f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang            Log.w(TAG, t);
128f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang        }
129f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
130f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
131f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
132f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    protected boolean updateFromCursor(Cursor cursor) {
133f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        UpdateHelper uh = new UpdateHelper();
134f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        id = uh.update(id, cursor.getInt(INDEX_ID));
135f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        caption = uh.update(caption, cursor.getString(INDEX_CAPTION));
136f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mimeType = uh.update(mimeType, cursor.getString(INDEX_MIME_TYPE));
137f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        latitude = uh.update(latitude, cursor.getDouble(INDEX_LATITUDE));
138f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        longitude = uh.update(longitude, cursor.getDouble(INDEX_LONGITUDE));
139f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        dateTakenInMs = uh.update(
140f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                dateTakenInMs, cursor.getLong(INDEX_DATE_TAKEN));
141f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        dateAddedInSec = uh.update(
142f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                dateAddedInSec, cursor.getLong(INDEX_DATE_ADDED));
143f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        dateModifiedInSec = uh.update(
144f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                dateModifiedInSec, cursor.getLong(INDEX_DATE_MODIFIED));
145f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        filePath = uh.update(filePath, cursor.getString(INDEX_DATA));
146f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        durationInSec = uh.update(
147f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                durationInSec, cursor.getInt(INDEX_DURATION) / 1000);
148f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        bucketId = uh.update(bucketId, cursor.getInt(INDEX_BUCKET_ID));
149f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang        fileSize = uh.update(fileSize, cursor.getLong(INDEX_SIZE));
150f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return uh.isUpdated();
151f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
152f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
153f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
154f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public Job<Bitmap> requestImage(int type) {
15509169dd269f1a82efb83ea1cebf75abe4daabd26ztenghui        return new LocalVideoRequest(mApplication, getPath(), dateModifiedInSec,
15609169dd269f1a82efb83ea1cebf75abe4daabd26ztenghui                type, filePath);
157f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
158f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
159f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public static class LocalVideoRequest extends ImageCacheRequest {
160f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        private String mLocalFilePath;
161f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
16209169dd269f1a82efb83ea1cebf75abe4daabd26ztenghui        LocalVideoRequest(GalleryApp application, Path path, long timeModified,
16309169dd269f1a82efb83ea1cebf75abe4daabd26ztenghui                int type, String localFilePath) {
16409169dd269f1a82efb83ea1cebf75abe4daabd26ztenghui            super(application, path, timeModified, type,
16509169dd269f1a82efb83ea1cebf75abe4daabd26ztenghui                    MediaItem.getTargetSize(type));
166f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            mLocalFilePath = localFilePath;
167f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
168f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
169f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        @Override
170f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        public Bitmap onDecodeOriginal(JobContext jc, int type) {
171f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            Bitmap bitmap = BitmapUtils.createVideoThumbnail(mLocalFilePath);
172f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            if (bitmap == null || jc.isCancelled()) return null;
173f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            return bitmap;
174f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
175f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
176f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
177f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
178f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public Job<BitmapRegionDecoder> requestLargeImage() {
179f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        throw new UnsupportedOperationException("Cannot regquest a large image"
180f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                + " to a local video!");
181f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
182f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
183f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
184f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getSupportedOperations() {
185648b339c74da2b863304ffc61c8528cc74c2afb3Teng-Hui Zhu        return SUPPORT_DELETE | SUPPORT_SHARE | SUPPORT_PLAY | SUPPORT_INFO | SUPPORT_TRIM | SUPPORT_MUTE;
186f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
187f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
188f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
189f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void delete() {
190f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        GalleryUtils.assertNotInRenderThread();
191f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Uri baseUri = Video.Media.EXTERNAL_CONTENT_URI;
192f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        mApplication.getContentResolver().delete(baseUri, "_id=?",
193f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                new String[]{String.valueOf(id)});
194f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
195f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
196f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
197f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public void rotate(int degrees) {
198f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        // TODO
199f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
200f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
201f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
202f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public Uri getContentUri() {
203f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        Uri baseUri = Video.Media.EXTERNAL_CONTENT_URI;
204f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return baseUri.buildUpon().appendPath(String.valueOf(id)).build();
205f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
206f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
207f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
208f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public Uri getPlayUri() {
20925a329cfd7e055dd7c8ce69532aefe9a69ee4d75Chih-Chung Chang        return getContentUri();
210f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
211f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
212f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
213f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public int getMediaType() {
214f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return MEDIA_TYPE_VIDEO;
215f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
216f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin
217f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    @Override
218f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    public MediaDetails getDetails() {
219f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        MediaDetails details = super.getDetails();
220f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        int s = durationInSec;
221f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        if (s > 0) {
222f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin            details.addDetail(MediaDetails.INDEX_DURATION, GalleryUtils.formatDuration(
223f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin                    mApplication.getAndroidContext(), durationInSec));
224f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        }
225f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin        return details;
226f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin    }
227bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
228bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    @Override
229bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    public int getWidth() {
230f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang        return width;
231bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
232bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang
233bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    @Override
234bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    public int getHeight() {
235f5ce6aeba448f418c99736465f7a02dacd7715bbChih-Chung Chang        return height;
236bc2154199aee16762e3758ad0cfed685323d9a9fChih-Chung Chang    }
237a535522fa7661771351e42465c67ed70825ed2e4George Mount
238a535522fa7661771351e42465c67ed70825ed2e4George Mount    @Override
239a535522fa7661771351e42465c67ed70825ed2e4George Mount    public String getFilePath() {
240a535522fa7661771351e42465c67ed70825ed2e4George Mount        return filePath;
241a535522fa7661771351e42465c67ed70825ed2e4George Mount    }
242f9a0a4306d589b4a4e20554fed512a603426bfa1Owen Lin}
243