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