18ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde/* 28ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * Copyright (C) 2013 The Android Open Source Project 38ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * 48ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * Licensed under the Apache License, Version 2.0 (the "License"); 58ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * you may not use this file except in compliance with the License. 68ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * You may obtain a copy of the License at 78ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * 88ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * http://www.apache.org/licenses/LICENSE-2.0 98ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * 108ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * Unless required by applicable law or agreed to in writing, software 118ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * distributed under the License is distributed on an "AS IS" BASIS, 128ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * See the License for the specific language governing permissions and 148ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde * limitations under the License. 158ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde */ 168ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 178ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohdepackage com.android.camera.data; 188ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 198ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohdeimport android.content.ContentResolver; 208ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohdeimport android.content.Context; 218ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohdeimport android.database.Cursor; 228ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohdeimport android.net.Uri; 238ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohdeimport android.provider.MediaStore; 248ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 258ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohdeimport com.android.camera.data.FilmstripContentQueries.CursorToFilmstripItemFactory; 268ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohdeimport com.android.camera.debug.Log; 278ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 288ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohdeimport java.util.List; 298ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 3071dd56f86579b953bf13ee2617989c8ff5042edaAlan Newbergerpublic class VideoItemFactory implements CursorToFilmstripItemFactory<VideoItem> { 318ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde private static final Log.Tag TAG = new Log.Tag("VideoItemFact"); 328ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde private static final String QUERY_ORDER = MediaStore.Video.VideoColumns.DATE_TAKEN 338ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde + " DESC, " + MediaStore.Video.VideoColumns._ID + " DESC"; 348ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 358ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde private final Context mContext; 3677d9f023e76816e5da7bd067ad46cc0e9c98623fPaul Rohde private final GlideFilmstripManager mGlideManager; 378ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde private final ContentResolver mContentResolver; 388ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde private final VideoDataFactory mVideoDataFactory; 398ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 4077d9f023e76816e5da7bd067ad46cc0e9c98623fPaul Rohde public VideoItemFactory(Context context, GlideFilmstripManager glideManager, 4177d9f023e76816e5da7bd067ad46cc0e9c98623fPaul Rohde ContentResolver contentResolver, VideoDataFactory videoDataFactory) { 428ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde mContext = context; 4377d9f023e76816e5da7bd067ad46cc0e9c98623fPaul Rohde mGlideManager = glideManager; 448ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde mContentResolver = contentResolver; 458ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde mVideoDataFactory = videoDataFactory; 468ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde } 478ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 488ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde @Override 498ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde public VideoItem get(Cursor c) { 508ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde VideoItemData data = mVideoDataFactory.fromCursor(c); 51539eff07760146baebb2331156a4e22a4b1472a4Alan Newberger if (data != null) { 5277d9f023e76816e5da7bd067ad46cc0e9c98623fPaul Rohde return new VideoItem(mContext, mGlideManager, data, this); 53539eff07760146baebb2331156a4e22a4b1472a4Alan Newberger } else { 54539eff07760146baebb2331156a4e22a4b1472a4Alan Newberger Log.w(TAG, "skipping item with null data, returning null for item"); 55539eff07760146baebb2331156a4e22a4b1472a4Alan Newberger return null; 56539eff07760146baebb2331156a4e22a4b1472a4Alan Newberger } 578ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde } 588ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 598ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde /** Query for a single video data item */ 608ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde public VideoItem get(Uri uri) { 618ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde VideoItem newData = null; 628ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde Cursor c = mContext.getContentResolver().query(uri, VideoDataQuery.QUERY_PROJECTION, null, 638ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde null, null); 648ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde if (c != null) { 658ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde if (c.moveToFirst()) { 668ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde newData = get(c); 678ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde } 688ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde c.close(); 698ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde } 708ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 718ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde return newData; 728ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde } 738ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 748ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde /** Query for all the video data items */ 7571dd56f86579b953bf13ee2617989c8ff5042edaAlan Newberger public List<VideoItem> queryAll() { 768ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde return queryAll(VideoDataQuery.CONTENT_URI, 778ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde FilmstripItemBase.QUERY_ALL_MEDIA_ID); 788ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde } 798ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 808ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde /** Query for all the video data items */ 8171dd56f86579b953bf13ee2617989c8ff5042edaAlan Newberger public List<VideoItem> queryAll(Uri uri, long lastId) { 828ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde return FilmstripContentQueries 838ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde .forCameraPath(mContentResolver, uri, VideoDataQuery.QUERY_PROJECTION, lastId, 848ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde QUERY_ORDER, this); 858ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde } 868ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde 878ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde /** Query for a single data item */ 8871dd56f86579b953bf13ee2617989c8ff5042edaAlan Newberger public VideoItem queryContentUri(Uri uri) { 898ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde // TODO: Consider refactoring this, this approach may be slow. 9071dd56f86579b953bf13ee2617989c8ff5042edaAlan Newberger List<VideoItem> videos = queryAll(uri, 918ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde FilmstripItemBase.QUERY_ALL_MEDIA_ID); 928ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde if (videos.isEmpty()) { 938ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde return null; 948ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde } 958ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde return videos.get(0); 968ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde } 978ee16b8a323ffa20e6fb1270d498ec445f64defcPaul Rohde} 98