MediaStore.java revision ed297a8417b1a44cf94ba0e33175a87055088424
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.provider;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.annotation.SdkConstant.SdkConstantType;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentResolver;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentValues;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ContentUris;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DatabaseUtils;
2600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.database.sqlite.SQLiteException;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.BitmapFactory;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix;
3000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.media.MiniThumbFile;
3100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.media.ThumbnailUtil;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Environment;
3400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.os.ParcelFileDescriptor;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.UnsupportedEncodingException;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.text.Collator;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Media provider contains meta data for all available media on both internal
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and external storage devices.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
4900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenpublic final class MediaStore {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "MediaStore";
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String AUTHORITY = "media";
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CONTENT_AUTHORITY_SLASH = "content://" + AUTHORITY + "/";
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity Action: Perform a search for media.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Contains at least the {@link android.app.SearchManager#QUERY} extra.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * May also contain any combination of the following extras:
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * EXTRA_MEDIA_ARTIST, EXTRA_MEDIA_ALBUM, EXTRA_MEDIA_TITLE, EXTRA_MEDIA_FOCUS
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.provider.MediaStore#EXTRA_MEDIA_ARTIST
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.provider.MediaStore#EXTRA_MEDIA_ALBUM
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.provider.MediaStore#EXTRA_MEDIA_TITLE
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.provider.MediaStore#EXTRA_MEDIA_FOCUS
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String INTENT_ACTION_MEDIA_SEARCH = "android.intent.action.MEDIA_SEARCH";
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to define the artist
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_MEDIA_ARTIST = "android.intent.extra.artist";
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to define the album
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_MEDIA_ALBUM = "android.intent.extra.album";
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to define the song title
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_MEDIA_TITLE = "android.intent.extra.title";
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to define the search focus. The search focus
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * indicates whether the search should be for things related to the artist, album
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or song that is identified by the other extras.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_MEDIA_FOCUS = "android.intent.extra.focus";
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to control the orientation of a ViewImage or a MovieView.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is an int property that overrides the activity's requestedOrientation.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_SCREEN_ORIENTATION = "android.intent.extra.screenOrientation";
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of an Intent-extra used to control the UI of a ViewImage.
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a boolean property that overrides the activity's default fullscreen state.
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_FULL_SCREEN = "android.intent.extra.fullScreen";
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of an Intent-extra used to control the UI of a ViewImage.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a boolean property that specifies whether or not to show action icons.
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_SHOW_ACTION_ICONS = "android.intent.extra.showActionIcons";
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to control the onCompletion behavior of a MovieView.
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a boolean property that specifies whether or not to finish the MovieView activity
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when the movie completes playing. The default value is true, which means to automatically
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * exit the movie player activity when the movie completes playing.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_FINISH_ON_COMPLETION = "android.intent.extra.finishOnCompletion";
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent action used to launch a camera in still image mode.
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA";
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent action used to launch a camera in video mode.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA";
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard Intent action that can be sent to have the camera application
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * capture an image and return it.
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The caller may pass an extra EXTRA_OUTPUT to control where this image will be written.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the EXTRA_OUTPUT is not present, then a small sized image is returned as a Bitmap
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object in the extra field. This is useful for applications that only need a small image.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the EXTRA_OUTPUT is present, then the full-sized image will be written to the Uri
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of EXTRA_OUTPUT.
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_OUTPUT
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_VIDEO_QUALITY
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard Intent action that can be sent to have the camera application
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * capture an video and return it.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The caller may pass in an extra EXTRA_VIDEO_QUALITY to control the video quality.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The caller may pass in an extra EXTRA_OUTPUT to control
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the video is written. If EXTRA_OUTPUT is not present the video will be
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * written to the standard location for videos, and the Uri of that location will be
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned in the data field of the Uri.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_OUTPUT
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE";
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to control the quality of a recorded video. This is an
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * integer property. Currently value 0 means low quality, suitable for MMS messages, and
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value 1 means high quality. In the future other quality levels may be added.
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String EXTRA_VIDEO_QUALITY = "android.intent.extra.videoQuality";
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify the maximum allowed size.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @hide
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String EXTRA_SIZE_LIMIT = "android.intent.extra.sizeLimit";
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
170eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang     * Specify the maximum allowed recording duration in seconds.
171eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang     * @hide
172eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang     */
173eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang    public final static String EXTRA_DURATION_LIMIT = "android.intent.extra.durationLimit";
174eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang
175eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang    /**
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to indicate a content resolver Uri to be used to
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * store the requested image or video.
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String EXTRA_OUTPUT = "output";
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
182ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen      * The string that is used when a media attribute is not known. For example,
183ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen      * if an audio file does not have any meta data, the artist and album columns
184ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen      * will be set to this value.
185ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen      * @hide
186ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen      */
187ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen    public static final String UNKNOWN_STRING = "<unknown>";
188ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen
189ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen    /**
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Common fields for most MediaProvider tables
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen    public interface MediaColumns extends BaseColumns {
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The data stream for the file
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: DATA STREAM</P>
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DATA = "_data";
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The size of the file in bytes
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String SIZE = "_size";
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The display name of the file
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DISPLAY_NAME = "_display_name";
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The title of the content
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TITLE = "title";
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The time the file was added to the media provider
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Units are seconds since 1970.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DATE_ADDED = "date_added";
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The time the file was last modified
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Units are seconds since 1970.
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * NOTE: This is for internal use by the media scanner.  Do not modify this field.
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DATE_MODIFIED = "date_modified";
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The MIME type of the file
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MIME_TYPE = "mime_type";
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
24100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen     * This class is used internally by Images.Thumbnails and Video.Thumbnails, it's not intended
24200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen     * to be accessed elsewhere.
24300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen     */
24400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen    private static class InternalThumbnails implements BaseColumns {
24500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        private static final int MINI_KIND = 1;
24600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        private static final int FULL_SCREEN_KIND = 2;
24700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        private static final int MICRO_KIND = 3;
24800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        private static final String[] PROJECTION = new String[] {_ID, MediaColumns.DATA};
24913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen        static final int DEFAULT_GROUP_ID = 0;
25000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
251f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen        private static Bitmap getMiniThumbFromFile(Cursor c, Uri baseUri, ContentResolver cr, BitmapFactory.Options options) {
252f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            Bitmap bitmap = null;
253f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            Uri thumbUri = null;
254f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            try {
255f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                long thumbId = c.getLong(0);
256f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                String filePath = c.getString(1);
257f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                thumbUri = ContentUris.withAppendedId(baseUri, thumbId);
258f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                ParcelFileDescriptor pfdInput = cr.openFileDescriptor(thumbUri, "r");
259f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                bitmap = BitmapFactory.decodeFileDescriptor(
260f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        pfdInput.getFileDescriptor(), null, options);
261f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                pfdInput.close();
262f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            } catch (FileNotFoundException ex) {
263f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                Log.e(TAG, "couldn't open thumbnail " + thumbUri + "; " + ex);
264f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            } catch (IOException ex) {
265f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                Log.e(TAG, "couldn't open thumbnail " + thumbUri + "; " + ex);
266f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            } catch (OutOfMemoryError ex) {
267f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                Log.e(TAG, "failed to allocate memory for thumbnail "
268f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        + thumbUri + "; " + ex);
269f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            }
270f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            return bitmap;
271f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen        }
272f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen
27300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        /**
274b994419263fb4f595379838f62efc50f90565e20Ray Chen         * This method cancels the thumbnail request so clients waiting for getThumbnail will be
275b994419263fb4f595379838f62efc50f90565e20Ray Chen         * interrupted and return immediately. Only the original process which made the getThumbnail
276b994419263fb4f595379838f62efc50f90565e20Ray Chen         * requests can cancel their own requests.
277b994419263fb4f595379838f62efc50f90565e20Ray Chen         *
278b994419263fb4f595379838f62efc50f90565e20Ray Chen         * @param cr ContentResolver
279ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen         * @param origId original image or video id. use -1 to cancel all requests.
28013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen         * @param groupId the same groupId used in getThumbnail
281b994419263fb4f595379838f62efc50f90565e20Ray Chen         * @param baseUri the base URI of requested thumbnails
282b994419263fb4f595379838f62efc50f90565e20Ray Chen         */
28313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen        static void cancelThumbnailRequest(ContentResolver cr, long origId, Uri baseUri,
28413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                long groupId) {
285b994419263fb4f595379838f62efc50f90565e20Ray Chen            Uri cancelUri = baseUri.buildUpon().appendQueryParameter("cancel", "1")
28613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                    .appendQueryParameter("orig_id", String.valueOf(origId))
28713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                    .appendQueryParameter("group_id", String.valueOf(groupId)).build();
288b994419263fb4f595379838f62efc50f90565e20Ray Chen            Cursor c = null;
289b994419263fb4f595379838f62efc50f90565e20Ray Chen            try {
290b994419263fb4f595379838f62efc50f90565e20Ray Chen                c = cr.query(cancelUri, PROJECTION, null, null, null);
291b994419263fb4f595379838f62efc50f90565e20Ray Chen            }
292b994419263fb4f595379838f62efc50f90565e20Ray Chen            finally {
293b994419263fb4f595379838f62efc50f90565e20Ray Chen                if (c != null) c.close();
294b994419263fb4f595379838f62efc50f90565e20Ray Chen            }
295b994419263fb4f595379838f62efc50f90565e20Ray Chen        }
296b994419263fb4f595379838f62efc50f90565e20Ray Chen        /**
29700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * This method ensure thumbnails associated with origId are generated and decode the byte
29800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * stream from database (MICRO_KIND) or file (MINI_KIND).
29900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         *
30000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * Special optimization has been done to avoid further IPC communication for MICRO_KIND
30100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * thumbnails.
30200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         *
30300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @param cr ContentResolver
30400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @param origId original image or video id
30500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @param kind could be MINI_KIND or MICRO_KIND
30600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @param options this is only used for MINI_KIND when decoding the Bitmap
30700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @param baseUri the base URI of requested thumbnails
30813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen         * @param groupId the id of group to which this request belongs
30900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @return Bitmap bitmap of specified thumbnail kind
31000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         */
31113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen        static Bitmap getThumbnail(ContentResolver cr, long origId, long groupId, int kind,
31200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                BitmapFactory.Options options, Uri baseUri, boolean isVideo) {
31300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            Bitmap bitmap = null;
31400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            String filePath = null;
315b994419263fb4f595379838f62efc50f90565e20Ray Chen            // Log.v(TAG, "getThumbnail: origId="+origId+", kind="+kind+", isVideo="+isVideo);
316f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            // If the magic is non-zero, we simply return thumbnail if it does exist.
31700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            // querying MediaProvider and simply return thumbnail.
318f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            MiniThumbFile thumbFile = MiniThumbFile.instance(baseUri);
319f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            long magic = thumbFile.getMagic(origId);
320f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            if (magic != 0) {
321f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                if (kind == MICRO_KIND) {
32200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    byte[] data = new byte[MiniThumbFile.BYTES_PER_MINTHUMB];
32300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    if (thumbFile.getMiniThumbFromFile(origId, data) != null) {
32400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
32500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        if (bitmap == null) {
32600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                            Log.w(TAG, "couldn't decode byte array.");
32700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        }
32800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    }
32900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    return bitmap;
330f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                } else if (kind == MINI_KIND) {
331f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                    String column = isVideo ? "video_id=" : "image_id=";
332f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                    Cursor c = null;
333f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                    try {
334f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        c = cr.query(baseUri, PROJECTION, column + origId, null, null);
335f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        if (c != null && c.moveToFirst()) {
336f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                            bitmap = getMiniThumbFromFile(c, baseUri, cr, options);
337f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                            if (bitmap != null) {
338f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                                return bitmap;
339f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                            }
340f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        }
341f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                    } finally {
342f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        if (c != null) c.close();
343f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                    }
34400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                }
34500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            }
34600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
34700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            Cursor c = null;
34800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            try {
34900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                Uri blockingUri = baseUri.buildUpon().appendQueryParameter("blocking", "1")
35013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        .appendQueryParameter("orig_id", String.valueOf(origId))
35113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        .appendQueryParameter("group_id", String.valueOf(groupId)).build();
35200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                c = cr.query(blockingUri, PROJECTION, null, null, null);
35300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                // This happens when original image/video doesn't exist.
35400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                if (c == null) return null;
35500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
35600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                // Assuming thumbnail has been generated, at least original image exists.
35700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                if (kind == MICRO_KIND) {
35800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    byte[] data = new byte[MiniThumbFile.BYTES_PER_MINTHUMB];
35900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    if (thumbFile.getMiniThumbFromFile(origId, data) != null) {
36000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
36100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        if (bitmap == null) {
36200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                            Log.w(TAG, "couldn't decode byte array.");
36300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        }
36400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    }
36500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                } else if (kind == MINI_KIND) {
36600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    if (c.moveToFirst()) {
367f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        bitmap = getMiniThumbFromFile(c, baseUri, cr, options);
36800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    }
36900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                } else {
37000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    throw new IllegalArgumentException("Unsupported kind: " + kind);
37100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                }
37200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
37300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                // We probably run out of space, so create the thumbnail in memory.
37400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                if (bitmap == null) {
37500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    Log.v(TAG, "We probably run out of space, so create the thumbnail in memory.");
376ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen
37700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    Uri uri = Uri.parse(
37800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                            baseUri.buildUpon().appendPath(String.valueOf(origId))
37900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                                    .toString().replaceFirst("thumbnails", "media"));
380ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                    if (filePath == null) {
3819b150b74573ce506abd00c692fb42f46980441a3Marco Nelissen                        if (c != null) c.close();
38200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        c = cr.query(uri, PROJECTION, null, null, null);
383ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                        if (c == null || !c.moveToFirst()) {
384ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                            return null;
385ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                        }
386ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                        filePath = c.getString(1);
387ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                    }
388ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                    if (isVideo) {
389ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                        bitmap = ThumbnailUtil.createVideoThumbnail(filePath);
39013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        if (kind == MICRO_KIND && bitmap != null) {
391ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                            bitmap = ThumbnailUtil.extractMiniThumb(bitmap,
392ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                                    ThumbnailUtil.MINI_THUMB_TARGET_SIZE,
393ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                                    ThumbnailUtil.MINI_THUMB_TARGET_SIZE,
394ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                                    ThumbnailUtil.RECYCLE_INPUT);
39500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        }
39600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    } else {
397ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                        bitmap = ThumbnailUtil.createImageThumbnail(cr, filePath, uri, origId,
398ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                                kind, false);
39900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    }
40000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                }
40100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            } catch (SQLiteException ex) {
40200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                Log.w(TAG, ex);
40300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            } finally {
40400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                if (c != null) c.close();
40500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            }
40600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            return bitmap;
40700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        }
40800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen    }
40900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
41000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen    /**
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Contains meta data for all available images.
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
41300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen    public static final class Images {
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface ImageColumns extends MediaColumns {
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The description of the image
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DESCRIPTION = "description";
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The picasa id of the image
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String PICASA_ID = "picasa_id";
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Whether the video should be published as public or private
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_PRIVATE = "isprivate";
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The latitude where the image was captured.
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DOUBLE</P>
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LATITUDE = "latitude";
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The longitude where the image was captured.
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DOUBLE</P>
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LONGITUDE = "longitude";
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The date & time that the image was taken in units
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * of milliseconds since jan 1, 1970.
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATE_TAKEN = "datetaken";
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The orientation for the image expressed as degrees.
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Only degrees 0, 90, 180, 270 will work.
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ORIENTATION = "orientation";
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The mini thumb id.
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The bucket id of the image. This is a read-only property that
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * is automatically computed from the DATA column.
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BUCKET_ID = "bucket_id";
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The bucket display name of the image. This is a read-only property that
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * is automatically computed from the DATA column.
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Media implements ImageColumns {
48100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection,
48600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    String where, String orderBy) {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(uri, projection, where,
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                             null, orderBy == null ? DEFAULT_SORT_ORDER : orderBy);
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection,
49200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    String selection, String [] selectionArgs, String orderBy) {
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(uri, projection, selection,
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        selectionArgs, orderBy == null ? DEFAULT_SORT_ORDER : orderBy);
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Retrieves an image for the given url as a {@link Bitmap}.
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param cr The content resolver to use
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param url The url of the image
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @throws FileNotFoundException
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @throws IOException
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Bitmap getBitmap(ContentResolver cr, Uri url)
50600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    throws FileNotFoundException, IOException {
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InputStream input = cr.openInputStream(url);
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Bitmap bitmap = BitmapFactory.decodeStream(input);
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                input.close();
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return bitmap;
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Insert an image and create a thumbnail for it.
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param cr The content resolver to use
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param imagePath The path to the image to insert
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param name The name of the image
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param description The description of the image
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return The URL to the newly created image
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @throws FileNotFoundException
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
52300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String insertImage(ContentResolver cr, String imagePath,
52400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    String name, String description) throws FileNotFoundException {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Check if file exists with a FileInputStream
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileInputStream stream = new FileInputStream(imagePath);
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
5282f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen                    Bitmap bm = BitmapFactory.decodeFile(imagePath);
5292f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen                    String ret = insertImage(cr, bm, name, description);
5302f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen                    bm.recycle();
5312f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen                    return ret;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } finally {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        stream.close();
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException e) {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private static final Bitmap StoreThumbnail(
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ContentResolver cr,
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Bitmap source,
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long id,
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float width, float height,
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int kind) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // create the matrix to scale it
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Matrix matrix = new Matrix();
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float scaleX = width / source.getWidth();
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float scaleY = height / source.getHeight();
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                matrix.setScale(scaleX, scaleY);
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Bitmap thumb = Bitmap.createBitmap(source, 0, 0,
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   source.getWidth(),
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   source.getHeight(), matrix,
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   true);
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ContentValues values = new ContentValues(4);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Thumbnails.KIND,     kind);
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Thumbnails.IMAGE_ID, (int)id);
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Thumbnails.HEIGHT,   thumb.getHeight());
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Thumbnails.WIDTH,    thumb.getWidth());
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri url = cr.insert(Images.Thumbnails.EXTERNAL_CONTENT_URI, values);
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    OutputStream thumbOut = cr.openOutputStream(url);
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thumb.compress(Bitmap.CompressFormat.JPEG, 100, thumbOut);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thumbOut.close();
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return thumb;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                catch (FileNotFoundException ex) {
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                catch (IOException ex) {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Insert an image and create a thumbnail for it.
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param cr The content resolver to use
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param source The stream to use for the image
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param title The name of the image
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param description The description of the image
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return The URL to the newly created image, or <code>null</code> if the image failed to be stored
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *              for any reason.
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String insertImage(ContentResolver cr, Bitmap source,
59300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                                                   String title, String description) {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ContentValues values = new ContentValues();
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Media.TITLE, title);
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Media.DESCRIPTION, description);
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Media.MIME_TYPE, "image/jpeg");
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri url = null;
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String stringUrl = null;    /* value to be returned */
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
60200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                try {
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    url = cr.insert(EXTERNAL_CONTENT_URI, values);
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (source != null) {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        OutputStream imageOut = cr.openOutputStream(url);
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } finally {
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            imageOut.close();
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long id = ContentUris.parseId(url);
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Bitmap miniThumb  = StoreThumbnail(cr, source, id, 320F, 240F, Images.Thumbnails.MINI_KIND);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Bitmap microThumb = StoreThumbnail(cr, miniThumb, id, 50F, 50F, Images.Thumbnails.MICRO_KIND);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e(TAG, "Failed to create thumbnail, removing original");
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cr.delete(url, null, null);
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        url = null;
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (Exception e) {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Failed to insert image", e);
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (url != null) {
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cr.delete(url, null, null);
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        url = null;
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (url != null) {
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    stringUrl = url.toString();
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return stringUrl;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the image media table on the
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the image media table on the given volume
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/images/media");
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type of of this directory of
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * images.  Note that each entry in this directory will have a standard
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * image MIME type as appropriate -- for example, image/jpeg.
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/image";
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = ImageColumns.BUCKET_DISPLAY_NAME;
67200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        }
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
67400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        /**
67500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * This class allows developers to query and get two kinds of thumbnails:
67600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * MINI_KIND: 512 x 384 thumbnail
67700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * MICRO_KIND: 96 x 96 thumbnail
67800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         */
67900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        public static class Thumbnails implements BaseColumns {
68000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) {
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER);
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Cursor queryMiniThumbnails(ContentResolver cr, Uri uri, int kind,
68500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    String[] projection) {
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(uri, projection, "kind = " + kind, null, DEFAULT_SORT_ORDER);
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
68900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Cursor queryMiniThumbnail(ContentResolver cr, long origId, int kind,
69000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    String[] projection) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(EXTERNAL_CONTENT_URI, projection,
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        IMAGE_ID + " = " + origId + " AND " + KIND + " = " +
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        kind, null, null);
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
697b994419263fb4f595379838f62efc50f90565e20Ray Chen             * This method cancels the thumbnail request so clients waiting for getThumbnail will be
698b994419263fb4f595379838f62efc50f90565e20Ray Chen             * interrupted and return immediately. Only the original process which made the getThumbnail
699b994419263fb4f595379838f62efc50f90565e20Ray Chen             * requests can cancel their own requests.
700b994419263fb4f595379838f62efc50f90565e20Ray Chen             *
701b994419263fb4f595379838f62efc50f90565e20Ray Chen             * @param cr ContentResolver
702b994419263fb4f595379838f62efc50f90565e20Ray Chen             * @param origId original image id
703b994419263fb4f595379838f62efc50f90565e20Ray Chen             */
704b994419263fb4f595379838f62efc50f90565e20Ray Chen            public static void cancelThumbnailRequest(ContentResolver cr, long origId) {
70513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI,
70613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        InternalThumbnails.DEFAULT_GROUP_ID);
707b994419263fb4f595379838f62efc50f90565e20Ray Chen            }
708b994419263fb4f595379838f62efc50f90565e20Ray Chen
709b994419263fb4f595379838f62efc50f90565e20Ray Chen            /**
71000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * This method checks if the thumbnails of the specified image (origId) has been created.
71100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * It will be blocked until the thumbnails are generated.
71200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             *
71300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param cr ContentResolver used to dispatch queries to MediaProvider.
71400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param origId Original image id associated with thumbnail of interest.
71500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND.
71600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param options this is only used for MINI_KIND when decoding the Bitmap
71700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @return A Bitmap instance. It could be null if the original image
71800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             *         associated with origId doesn't exist or memory is not enough.
71900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
72000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind,
72100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    BitmapFactory.Options options) {
72213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                return InternalThumbnails.getThumbnail(cr, origId,
72313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        InternalThumbnails.DEFAULT_GROUP_ID, kind, options,
72413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        EXTERNAL_CONTENT_URI, false);
72513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            }
72613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen
72713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            /**
72813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * This method cancels the thumbnail request so clients waiting for getThumbnail will be
72913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * interrupted and return immediately. Only the original process which made the getThumbnail
73013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * requests can cancel their own requests.
73113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *
73213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param cr ContentResolver
73313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param origId original image id
73413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param groupId the same groupId used in getThumbnail.
73513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             */
73613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            public static void cancelThumbnailRequest(ContentResolver cr, long origId, long groupId) {
73713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI, groupId);
73813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            }
73913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen
74013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            /**
74113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * This method checks if the thumbnails of the specified image (origId) has been created.
74213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * It will be blocked until the thumbnails are generated.
74313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *
74413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param cr ContentResolver used to dispatch queries to MediaProvider.
74513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param origId Original image id associated with thumbnail of interest.
74613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param groupId the id of group to which this request belongs
74713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND.
74813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param options this is only used for MINI_KIND when decoding the Bitmap
74913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @return A Bitmap instance. It could be null if the original image
75013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *         associated with origId doesn't exist or memory is not enough.
75113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             */
75213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            public static Bitmap getThumbnail(ContentResolver cr, long origId, long groupId,
75313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                    int kind, BitmapFactory.Options options) {
75413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                return InternalThumbnails.getThumbnail(cr, origId, groupId, kind, options,
75500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        EXTERNAL_CONTENT_URI, false);
75600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            }
75700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
75800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the image media table on the
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the image media table on the given volume
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/images/thumbnails");
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = "image_id ASC";
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The data stream for the thumbnail
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DATA STREAM</P>
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATA = "_data";
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The original image for the thumbnal
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (ID from Images table)</P>
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IMAGE_ID = "image_id";
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The kind of the thumbnail
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (One of the values below)</P>
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String KIND = "kind";
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int MINI_KIND = 1;
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int FULL_SCREEN_KIND = 2;
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int MICRO_KIND = 3;
80900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
81000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The blob raw data of thumbnail
81100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: DATA STREAM</P>
81200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
81300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String THUMB_DATA = "thumb_data";
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The width of the thumbnal
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String WIDTH = "width";
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The height of the thumbnail
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String HEIGHT = "height";
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Container for all audio content.
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class Audio {
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Columns for audio file that show up in multiple tables.
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface AudioColumns extends MediaColumns {
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A non human readable key calculated from the TITLE, used for
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * searching, sorting and grouping
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String TITLE_KEY = "title_key";
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The duration of the audio file, in ms
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DURATION = "duration";
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The position, in ms, playback was at when playback for this file
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * was last stopped.
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @hide
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BOOKMARK = "bookmark";
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The id of the artist who created the audio file, if any
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST_ID = "artist_id";
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The artist who created the audio file, if any
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST = "artist";
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A non human readable key calculated from the ARTIST, used for
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * searching, sorting and grouping
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST_KEY = "artist_key";
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The composer of the audio file, if any
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String COMPOSER = "composer";
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The id of the album the audio file is from, if any
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_ID = "album_id";
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The album the audio file is from, if any
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM = "album";
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A non human readable key calculated from the ALBUM, used for
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * searching, sorting and grouping
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_KEY = "album_key";
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A URI to the album art, if any
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_ART = "album_art";
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The track number of this song on the album, if any.
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * This number encodes both the track number and the
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * disc number. For multi-disc sets, this number will
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * be 1xxx for tracks on the first disc, 2xxx for tracks
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * on the second disc, etc.
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String TRACK = "track";
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The year the audio file was recorded, if any
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String YEAR = "year";
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Non-zero if the audio file is music
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (boolean)</P>
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_MUSIC = "is_music";
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Non-zero if the audio file is a podcast
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (boolean)</P>
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @hide
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_PODCAST = "is_podcast";
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Non-zero id the audio file may be a ringtone
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (boolean)</P>
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_RINGTONE = "is_ringtone";
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Non-zero id the audio file may be an alarm
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (boolean)</P>
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_ALARM = "is_alarm";
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Non-zero id the audio file may be a notification sound
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (boolean)</P>
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_NOTIFICATION = "is_notification";
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Converts a name to a "key" that can be used for grouping, sorting
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * and searching.
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The rules that govern this conversion are:
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - remove 'special' characters like ()[]'!?.,
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - remove leading/trailing spaces
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - convert everything to lowercase
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - remove leading "the ", "an " and "a "
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - remove trailing ", the|an|a"
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - remove accents. This step leaves us with CollationKey data,
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *   which is not human readable
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param name The artist or album name to convert
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return The "key" for the given name.
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static String keyFor(String name) {
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name != null)  {
974816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                boolean sortfirst = false;
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.equals(android.media.MediaFile.UNKNOWN_STRING)) {
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return "\001";
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
978816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                // Check if the first character is \001. We use this to
979816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                // force sorting of certain special files, like the silent ringtone.
980816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                if (name.startsWith("\001")) {
981816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                    sortfirst = true;
982816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                }
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                name = name.trim().toLowerCase();
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.startsWith("the ")) {
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name = name.substring(4);
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.startsWith("an ")) {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name = name.substring(3);
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.startsWith("a ")) {
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name = name.substring(2);
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.endsWith(", the") || name.endsWith(",the") ||
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name.endsWith(", an") || name.endsWith(",an") ||
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name.endsWith(", a") || name.endsWith(",a")) {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name = name.substring(0, name.lastIndexOf(','));
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
998e754e128e6237ea1c5b263ec2a02b0413851cfbaMarco Nelissen                name = name.replaceAll("[\\[\\]\\(\\)\"'.,?!]", "").trim();
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.length() > 0) {
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Insert a separator between the characters to avoid
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // matches on a partial character. If we ever change
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to start-of-word-only matches, this can be removed.
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    StringBuilder b = new StringBuilder();
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    b.append('.');
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int nl = name.length();
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < nl; i++) {
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        b.append(name.charAt(i));
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        b.append('.');
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name = b.toString();
1011816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                    String key = DatabaseUtils.getCollationKey(name);
1012816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                    if (sortfirst) {
1013816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                        key = "\001" + key;
1014816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                    }
1015816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                    return key;
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               } else {
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return "";
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Media implements AudioColumns {
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the audio media table on the
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the audio media table on the given volume
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/audio/media");
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUriForPath(String path) {
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return (path.startsWith(Environment.getExternalStorageDirectory().getPath()) ?
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        EXTERNAL_CONTENT_URI : INTERNAL_CONTENT_URI);
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/audio";
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1062816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen            public static final String DEFAULT_SORT_ORDER = TITLE_KEY;
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Activity Action: Start SoundRecorder application.
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <p>Input: nothing.
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <p>Output: An uri to the recorded sound stored in the Media Library
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * if the recording was successful.
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * May also contain the extra EXTRA_MAX_BYTES.
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @see #EXTRA_MAX_BYTES
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String RECORD_SOUND_ACTION =
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "android.provider.MediaStore.RECORD_SOUND";
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The name of the Intent-extra used to define a maximum file size for
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * a recording made by the SoundRecorder application.
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @see #RECORD_SOUND_ACTION
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             public static final String EXTRA_MAX_BYTES =
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "android.provider.MediaStore.extra.MAX_BYTES";
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Columns representing an audio genre
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface GenresColumns {
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The name of the genre
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NAME = "name";
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Contains all genres for audio files
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Genres implements BaseColumns, GenresColumns {
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the audio genres table on the
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the audio genres table on the given volume
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/audio/genres");
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/genre";
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for entries in this table.
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/genre";
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = NAME;
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Sub-directory of each genre containing all members.
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final class Members implements AudioColumns {
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final Uri getContentUri(String volumeName,
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long genreId) {
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + "/audio/genres/" + genreId + "/members");
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * A subdirectory of each genre containing all member audio files.
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String CONTENT_DIRECTORY = "members";
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The default sort order for this table
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
1159816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                public static final String DEFAULT_SORT_ORDER = TITLE_KEY;
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The ID of the audio file
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * <P>Type: INTEGER (long)</P>
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String AUDIO_ID = "audio_id";
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The ID of the genre
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * <P>Type: INTEGER (long)</P>
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String GENRE_ID = "genre_id";
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Columns representing a playlist
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface PlaylistsColumns {
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The name of the playlist
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NAME = "name";
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The data stream for the playlist file
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DATA STREAM</P>
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATA = "_data";
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The time the file was added to the media provider
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Units are seconds since 1970.
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATE_ADDED = "date_added";
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The time the file was last modified
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Units are seconds since 1970.
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * NOTE: This is for internal use by the media scanner.  Do not modify this field.
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATE_MODIFIED = "date_modified";
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Contains playlists for audio files
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Playlists implements BaseColumns,
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PlaylistsColumns {
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the audio playlists table on the
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the audio playlists table on the given volume
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/audio/playlists");
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/playlist";
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for entries in this table.
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/playlist";
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = NAME;
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Sub-directory of each playlist containing all members.
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final class Members implements AudioColumns {
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final Uri getContentUri(String volumeName,
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long playlistId) {
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + "/audio/playlists/" + playlistId + "/members");
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
1263e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * Convenience method to move a playlist item to a new location
1264e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @param res The content resolver to use
1265e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @param playlistId The numeric id of the playlist
1266e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @param from The position of the item to move
1267e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @param to The position to move the item to
1268e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @return true on success
1269e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @hide
1270e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 */
1271e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                public static final boolean moveItem(ContentResolver res,
1272e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                        long playlistId, int from, int to) {
1273e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                    Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external",
1274e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                            playlistId)
1275e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                            .buildUpon()
1276e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                            .appendEncodedPath(String.valueOf(from))
1277e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                            .appendQueryParameter("move", "true")
1278e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                            .build();
1279e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                    ContentValues values = new ContentValues();
1280e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                    values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, to);
1281e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                    return res.update(uri, values, null, null) != 0;
1282e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                }
1283e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen
1284e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                /**
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The ID within the playlist.
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String _ID = "_id";
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * A subdirectory of each playlist containing all member audio
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * files.
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String CONTENT_DIRECTORY = "members";
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The ID of the audio file
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * <P>Type: INTEGER (long)</P>
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String AUDIO_ID = "audio_id";
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The ID of the playlist
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * <P>Type: INTEGER (long)</P>
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String PLAYLIST_ID = "playlist_id";
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The order of the songs in the playlist
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * <P>Type: INTEGER (long)></P>
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String PLAY_ORDER = "play_order";
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The default sort order for this table
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String DEFAULT_SORT_ORDER = PLAY_ORDER;
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Columns representing an artist
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface ArtistColumns {
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The artist who created the audio file, if any
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST = "artist";
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A non human readable key calculated from the ARTIST, used for
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * searching, sorting and grouping
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST_KEY = "artist_key";
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of albums in the database for this artist
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NUMBER_OF_ALBUMS = "number_of_albums";
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of albums in the database for this artist
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NUMBER_OF_TRACKS = "number_of_tracks";
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Contains artists for audio files
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Artists implements BaseColumns, ArtistColumns {
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the artists table on the
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the audio artists table on the given volume
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/audio/artists");
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/artists";
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for entries in this table.
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/artist";
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = ARTIST_KEY;
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Sub-directory of each artist containing all albums on which
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * a song by the artist appears.
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final class Albums implements AlbumColumns {
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final Uri getContentUri(String volumeName,
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long artistId) {
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + "/audio/artists/" + artistId + "/albums");
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Columns representing an album
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface AlbumColumns {
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The id for the album
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_ID = "album_id";
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The album on which the audio file appears, if any
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM = "album";
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The artist whose songs appear on this album
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST = "artist";
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of songs on this album
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NUMBER_OF_SONGS = "numsongs";
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * This column is available when getting album info via artist,
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * and indicates the number of songs on the album by the given
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * artist.
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NUMBER_OF_SONGS_FOR_ARTIST = "numsongs_by_artist";
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
1443f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * The year in which the earliest songs
1444f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * on this album were released. This will often
1445f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * be the same as {@link #LAST_YEAR}, but for compilation albums
1446f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * they might differ.
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String FIRST_YEAR = "minyear";
145000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
1451f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler            /**
1452f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * The year in which the latest songs
1453f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * on this album were released. This will often
1454f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * be the same as {@link #FIRST_YEAR}, but for compilation albums
1455f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * they might differ.
1456f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * <P>Type: INTEGER</P>
1457f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             */
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LAST_YEAR = "maxyear";
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A non human readable key calculated from the ALBUM, used for
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * searching, sorting and grouping
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_KEY = "album_key";
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Cached album art.
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_ART = "album_art";
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Contains artists for audio files
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Albums implements BaseColumns, AlbumColumns {
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the albums table on the
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the audio albums table on the given volume
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/audio/albums");
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/albums";
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for entries in this table.
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/album";
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = ALBUM_KEY;
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class Video {
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table.
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DEFAULT_SORT_ORDER = MediaColumns.DISPLAY_NAME;
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
152700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) {
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER);
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface VideoColumns extends MediaColumns {
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The duration of the video file, in ms
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DURATION = "duration";
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The artist who created the video file, if any
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST = "artist";
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The album the video file is from, if any
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM = "album";
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The resolution of the video file, formatted as "XxY"
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String RESOLUTION = "resolution";
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The description of the video recording
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DESCRIPTION = "description";
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Whether the video should be published as public or private
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_PRIVATE = "isprivate";
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The user-added tags associated with a video
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String TAGS = "tags";
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The YouTube category of the video
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CATEGORY = "category";
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The language of the video
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LANGUAGE = "language";
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The latitude where the image was captured.
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DOUBLE</P>
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LATITUDE = "latitude";
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The longitude where the image was captured.
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DOUBLE</P>
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LONGITUDE = "longitude";
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The date & time that the image was taken in units
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * of milliseconds since jan 1, 1970.
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATE_TAKEN = "datetaken";
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The mini thumb id.
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The bucket id of the video. This is a read-only property that
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * is automatically computed from the DATA column.
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BUCKET_ID = "bucket_id";
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The bucket display name of the video. This is a read-only property that
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * is automatically computed from the DATA column.
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The bookmark for the video. Time in ms. Represents the location in the video that the
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * video should start playing at the next time it is opened. If the value is null or
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * out of the range 0..DURATION-1 then the video should start playing from the
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * beginning.
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BOOKMARK = "bookmark";
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Media implements VideoColumns {
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the video media table on the
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the video media table on the given volume
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/video/media");
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/video";
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = TITLE;
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
167200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
167300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        /**
167400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * This class allows developers to query and get two kinds of thumbnails:
167500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * MINI_KIND: 512 x 384 thumbnail
167600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * MICRO_KIND: 96 x 96 thumbnail
167700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         *
167800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         */
167900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        public static class Thumbnails implements BaseColumns {
168000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
1681b994419263fb4f595379838f62efc50f90565e20Ray Chen             * This method cancels the thumbnail request so clients waiting for getThumbnail will be
1682b994419263fb4f595379838f62efc50f90565e20Ray Chen             * interrupted and return immediately. Only the original process which made the getThumbnail
1683b994419263fb4f595379838f62efc50f90565e20Ray Chen             * requests can cancel their own requests.
1684b994419263fb4f595379838f62efc50f90565e20Ray Chen             *
1685b994419263fb4f595379838f62efc50f90565e20Ray Chen             * @param cr ContentResolver
1686b994419263fb4f595379838f62efc50f90565e20Ray Chen             * @param origId original video id
1687b994419263fb4f595379838f62efc50f90565e20Ray Chen             */
1688b994419263fb4f595379838f62efc50f90565e20Ray Chen            public static void cancelThumbnailRequest(ContentResolver cr, long origId) {
168913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI,
169013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        InternalThumbnails.DEFAULT_GROUP_ID);
169113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            }
169213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen
169313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            /**
169413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * This method checks if the thumbnails of the specified image (origId) has been created.
169513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * It will be blocked until the thumbnails are generated.
169613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *
169713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param cr ContentResolver used to dispatch queries to MediaProvider.
169813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param origId Original image id associated with thumbnail of interest.
169913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND.
170013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param options this is only used for MINI_KIND when decoding the Bitmap
170113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @return A Bitmap instance. It could be null if the original image
170213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *         associated with origId doesn't exist or memory is not enough.
170313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             */
170413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind,
170513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                    BitmapFactory.Options options) {
170613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                return InternalThumbnails.getThumbnail(cr, origId,
170713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        InternalThumbnails.DEFAULT_GROUP_ID, kind, options,
170813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        EXTERNAL_CONTENT_URI, true);
1709b994419263fb4f595379838f62efc50f90565e20Ray Chen            }
1710b994419263fb4f595379838f62efc50f90565e20Ray Chen
1711b994419263fb4f595379838f62efc50f90565e20Ray Chen            /**
171200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * This method checks if the thumbnails of the specified image (origId) has been created.
171300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * It will be blocked until the thumbnails are generated.
171400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             *
171500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param cr ContentResolver used to dispatch queries to MediaProvider.
171600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param origId Original image id associated with thumbnail of interest.
171713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param groupId the id of group to which this request belongs
171800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND
171900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param options this is only used for MINI_KIND when decoding the Bitmap
172000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @return A Bitmap instance. It could be null if the original image associated with
172100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             *         origId doesn't exist or memory is not enough.
172200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
172313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            public static Bitmap getThumbnail(ContentResolver cr, long origId, long groupId,
172413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                    int kind, BitmapFactory.Options options) {
172513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                return InternalThumbnails.getThumbnail(cr, origId, groupId, kind, options,
172600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        EXTERNAL_CONTENT_URI, true);
172700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            }
172800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
172900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
173013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * This method cancels the thumbnail request so clients waiting for getThumbnail will be
173113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * interrupted and return immediately. Only the original process which made the getThumbnail
173213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * requests can cancel their own requests.
173313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *
173413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param cr ContentResolver
173513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param origId original video id
173613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param groupId the same groupId used in getThumbnail.
173713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             */
173813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            public static void cancelThumbnailRequest(ContentResolver cr, long origId, long groupId) {
173913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI, groupId);
174013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            }
174113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen
174213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            /**
174300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * Get the content:// style URI for the image media table on the
174400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * given volume.
174500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             *
174600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param volumeName the name of the volume to get the URI for
174700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @return the URI to the image media table on the given volume
174800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
174900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static Uri getContentUri(String volumeName) {
175000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
175100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        "/video/thumbnails");
175200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            }
175300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
175400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
175500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The content:// style URI for the internal storage.
175600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
175700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Uri INTERNAL_CONTENT_URI =
175800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    getContentUri("internal");
175900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
176000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
176100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The content:// style URI for the "primary" external storage
176200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * volume.
176300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
176400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Uri EXTERNAL_CONTENT_URI =
176500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    getContentUri("external");
176600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
176700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
176800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The default sort order for this table
176900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
177000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String DEFAULT_SORT_ORDER = "video_id ASC";
177100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
177200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
177300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The data stream for the thumbnail
177400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: DATA STREAM</P>
177500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
177600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String DATA = "_data";
177700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
177800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
177900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The original image for the thumbnal
178000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: INTEGER (ID from Video table)</P>
178100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
178200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String VIDEO_ID = "video_id";
178300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
178400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
178500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The kind of the thumbnail
178600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: INTEGER (One of the values below)</P>
178700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
178800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String KIND = "kind";
178900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
179000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final int MINI_KIND = 1;
179100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final int FULL_SCREEN_KIND = 2;
179200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final int MICRO_KIND = 3;
179300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
179400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
179500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The width of the thumbnal
179600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: INTEGER (long)</P>
179700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
179800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String WIDTH = "width";
179900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
180000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
180100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The height of the thumbnail
180200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: INTEGER (long)</P>
180300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
180400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String HEIGHT = "height";
180500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        }
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Uri for querying the state of the media scanner.
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Uri getMediaScannerUri() {
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Uri.parse(CONTENT_AUTHORITY_SLASH + "none/media_scanner");
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Name of current volume being scanned by the media scanner.
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String MEDIA_SCANNER_VOLUME = "volume";
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1820