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;
243822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissenimport android.content.Context;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.DatabaseUtils;
2700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.database.sqlite.SQLiteException;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.BitmapFactory;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Matrix;
3100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.media.MiniThumbFile;
32bf124e7e41f7850ac1b7be808221a462db6f3447Ray Chenimport android.media.ThumbnailUtils;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Environment;
3500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenimport android.os.ParcelFileDescriptor;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.OutputStream;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Media provider contains meta data for all available media on both internal
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and external storage devices.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
4800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chenpublic final class MediaStore {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final static String TAG = "MediaStore";
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String AUTHORITY = "media";
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String CONTENT_AUTHORITY_SLASH = "content://" + AUTHORITY + "/";
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
55a31560598af25d5116effc2a6af0d9be12a0628dMike Lockwood   /**
56a31560598af25d5116effc2a6af0d9be12a0628dMike Lockwood     * Broadcast Action:  A broadcast to indicate the end of an MTP session with the host.
57a31560598af25d5116effc2a6af0d9be12a0628dMike Lockwood     * This broadcast is only sent if MTP activity has modified the media database during the
58a31560598af25d5116effc2a6af0d9be12a0628dMike Lockwood     * most recent MTP session.
59e222872a77324dd7a1a8b9a11900a0c70bc4d6e8Mike Lockwood     *
60e222872a77324dd7a1a8b9a11900a0c70bc4d6e8Mike Lockwood     * @hide
61a31560598af25d5116effc2a6af0d9be12a0628dMike Lockwood     */
62a31560598af25d5116effc2a6af0d9be12a0628dMike Lockwood    public static final String ACTION_MTP_SESSION_END = "android.provider.action.MTP_SESSION_END";
63a31560598af25d5116effc2a6af0d9be12a0628dMike Lockwood
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
65edcdbb6d3bb6f66e9fd91b15ef45f4cec5694393Daniel Sandler     * Activity Action: Launch a music player.
66edcdbb6d3bb6f66e9fd91b15ef45f4cec5694393Daniel Sandler     * The activity should be able to play, browse, or manipulate music files stored on the device.
676651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown     *
686651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown     * @deprecated Use {@link android.content.Intent#CATEGORY_APP_MUSIC} instead.
69edcdbb6d3bb6f66e9fd91b15ef45f4cec5694393Daniel Sandler     */
706651a638348c15e89e265b0a53c775cac9beafa2Jeff Brown    @Deprecated
71edcdbb6d3bb6f66e9fd91b15ef45f4cec5694393Daniel Sandler    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
72edcdbb6d3bb6f66e9fd91b15ef45f4cec5694393Daniel Sandler    public static final String INTENT_ACTION_MUSIC_PLAYER = "android.intent.action.MUSIC_PLAYER";
73edcdbb6d3bb6f66e9fd91b15ef45f4cec5694393Daniel Sandler
74edcdbb6d3bb6f66e9fd91b15ef45f4cec5694393Daniel Sandler    /**
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Activity Action: Perform a search for media.
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Contains at least the {@link android.app.SearchManager#QUERY} extra.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * May also contain any combination of the following extras:
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * EXTRA_MEDIA_ARTIST, EXTRA_MEDIA_ALBUM, EXTRA_MEDIA_TITLE, EXTRA_MEDIA_FOCUS
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.provider.MediaStore#EXTRA_MEDIA_ARTIST
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.provider.MediaStore#EXTRA_MEDIA_ALBUM
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.provider.MediaStore#EXTRA_MEDIA_TITLE
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.provider.MediaStore#EXTRA_MEDIA_FOCUS
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String INTENT_ACTION_MEDIA_SEARCH = "android.intent.action.MEDIA_SEARCH";
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
892fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * An intent to perform a search for music media and automatically play content from the
902fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * result when possible. This can be fired, for example, by the result of a voice recognition
912fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * command to listen to music.
922fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * <p>
932fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * Contains the {@link android.app.SearchManager#QUERY} extra, which is a string
942fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * that can contain any type of unstructured music search, like the name of an artist,
952fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * an album, a song, a genre, or any combination of these.
962fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * <p>
972fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * Because this intent includes an open-ended unstructured search string, it makes the most
982fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * sense for apps that can support large-scale search of music, such as services connected
992fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     * to an online database of music which can be streamed and played on the device.
1002fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau     */
1012fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau    public static final String INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH =
1022fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau            "android.media.action.MEDIA_PLAY_FROM_SEARCH";
1032fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau
1042fe6fd055874ff70a9faeaa27716173b12e671fbMike LeBeau    /**
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to define the artist
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_MEDIA_ARTIST = "android.intent.extra.artist";
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to define the album
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_MEDIA_ALBUM = "android.intent.extra.album";
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to define the song title
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_MEDIA_TITLE = "android.intent.extra.title";
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to define the search focus. The search focus
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * indicates whether the search should be for things related to the artist, album
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * or song that is identified by the other extras.
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_MEDIA_FOCUS = "android.intent.extra.focus";
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to control the orientation of a ViewImage or a MovieView.
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is an int property that overrides the activity's requestedOrientation.
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_SCREEN_ORIENTATION = "android.intent.extra.screenOrientation";
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of an Intent-extra used to control the UI of a ViewImage.
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a boolean property that overrides the activity's default fullscreen state.
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_FULL_SCREEN = "android.intent.extra.fullScreen";
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of an Intent-extra used to control the UI of a ViewImage.
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a boolean property that specifies whether or not to show action icons.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_SHOW_ACTION_ICONS = "android.intent.extra.showActionIcons";
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to control the onCompletion behavior of a MovieView.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * This is a boolean property that specifies whether or not to finish the MovieView activity
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * when the movie completes playing. The default value is true, which means to automatically
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * exit the movie player activity when the movie completes playing.
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String EXTRA_FINISH_ON_COMPLETION = "android.intent.extra.finishOnCompletion";
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent action used to launch a camera in still image mode.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA";
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent action used to launch a camera in video mode.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA";
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard Intent action that can be sent to have the camera application
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * capture an image and return it.
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The caller may pass an extra EXTRA_OUTPUT to control where this image will be written.
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the EXTRA_OUTPUT is not present, then a small sized image is returned as a Bitmap
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * object in the extra field. This is useful for applications that only need a small image.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * If the EXTRA_OUTPUT is present, then the full-sized image will be written to the Uri
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value of EXTRA_OUTPUT.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_OUTPUT
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Standard Intent action that can be sent to have the camera application
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * capture an video and return it.
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The caller may pass in an extra EXTRA_VIDEO_QUALITY to control the video quality.
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The caller may pass in an extra EXTRA_OUTPUT to control
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * where the video is written. If EXTRA_OUTPUT is not present the video will be
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * written to the standard location for videos, and the Uri of that location will be
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * returned in the data field of the Uri.
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #EXTRA_OUTPUT
184e7bc746e67a5b9d9cab34bd4ebe06b977772d356Wu-cheng Li     * @see #EXTRA_VIDEO_QUALITY
185e7bc746e67a5b9d9cab34bd4ebe06b977772d356Wu-cheng Li     * @see #EXTRA_SIZE_LIMIT
186e7bc746e67a5b9d9cab34bd4ebe06b977772d356Wu-cheng Li     * @see #EXTRA_DURATION_LIMIT
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE";
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to control the quality of a recorded video. This is an
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * integer property. Currently value 0 means low quality, suitable for MMS messages, and
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * value 1 means high quality. In the future other quality levels may be added.
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String EXTRA_VIDEO_QUALITY = "android.intent.extra.videoQuality";
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Specify the maximum allowed size.
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String EXTRA_SIZE_LIMIT = "android.intent.extra.sizeLimit";
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
203eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang     * Specify the maximum allowed recording duration in seconds.
204eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang     */
205eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang    public final static String EXTRA_DURATION_LIMIT = "android.intent.extra.durationLimit";
206eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang
207eb0098d8e89033b78017a9e0068e3ac7ca51c112Chih-Chung Chang    /**
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The name of the Intent-extra used to indicate a content resolver Uri to be used to
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * store the requested image or video.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final static String EXTRA_OUTPUT = "output";
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
214ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen      * The string that is used when a media attribute is not known. For example,
215ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen      * if an audio file does not have any meta data, the artist and album columns
216ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen      * will be set to this value.
217ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen      */
218ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen    public static final String UNKNOWN_STRING = "<unknown>";
219ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen
220ed297a8417b1a44cf94ba0e33175a87055088424Marco Nelissen    /**
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Common fields for most MediaProvider tables
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen    public interface MediaColumns extends BaseColumns {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The data stream for the file
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: DATA STREAM</P>
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DATA = "_data";
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The size of the file in bytes
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String SIZE = "_size";
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The display name of the file
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DISPLAY_NAME = "_display_name";
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The title of the content
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String TITLE = "title";
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The time the file was added to the media provider
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Units are seconds since 1970.
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DATE_ADDED = "date_added";
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The time the file was last modified
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Units are seconds since 1970.
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * NOTE: This is for internal use by the media scanner.  Do not modify this field.
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: INTEGER (long)</P>
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DATE_MODIFIED = "date_modified";
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The MIME type of the file
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * <P>Type: TEXT</P>
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String MIME_TYPE = "mime_type";
269d815f79766984fce499e147ecbacc01914683f74Mike Lockwood
270d815f79766984fce499e147ecbacc01914683f74Mike Lockwood        /**
271d815f79766984fce499e147ecbacc01914683f74Mike Lockwood         * The MTP object handle of a newly transfered file.
272cbaea35759791f083735f7a5c43e0dc0ed228ff1Mike Lockwood         * Used to pass the new file's object handle through the media scanner
273cbaea35759791f083735f7a5c43e0dc0ed228ff1Mike Lockwood         * from MTP to the media provider
274cbaea35759791f083735f7a5c43e0dc0ed228ff1Mike Lockwood         * For internal use only by MTP, media scanner and media provider.
275d815f79766984fce499e147ecbacc01914683f74Mike Lockwood         * <P>Type: INTEGER</P>
276d815f79766984fce499e147ecbacc01914683f74Mike Lockwood         * @hide
277d815f79766984fce499e147ecbacc01914683f74Mike Lockwood         */
278cbaea35759791f083735f7a5c43e0dc0ed228ff1Mike Lockwood        public static final String MEDIA_SCANNER_NEW_OBJECT_ID = "media_scanner_new_object_id";
27982428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang
28082428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang        /**
28182428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang         * Non-zero if the media file is drm-protected
28282428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang         * <P>Type: INTEGER (boolean)</P>
28382428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang         * @hide
28482428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang         */
28582428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang        public static final String IS_DRM = "is_drm";
28682428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang
287e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang        /**
288e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang         * The width of the image/video in pixels.
289e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang         * @hide
290e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang         */
291e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang        public static final String WIDTH = "width";
292e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang
293e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang        /**
294e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang         * The height of the image/video in pixels.
295e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang         * @hide
296e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang         */
297e1bf8efaff42dc33b7a4663f3c9d50d12de81bcbChih-Chung Chang        public static final String HEIGHT = "height";
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
300d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood    /**
3010b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood     * Media provider table containing an index of all files in the media storage,
3020b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood     * including non-media files.  This should be used by applications that work with
3030b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood     * non-media file types (text, HTML, PDF, etc) as well as applications that need to
3040b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood     * work with multiple media file types in a single query.
305d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood     */
3063b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood    public static final class Files {
307d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood
3080b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood        /**
3090b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * Get the content:// style URI for the files table on the
3100b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * given volume.
3110b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         *
3120b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * @param volumeName the name of the volume to get the URI for
3130b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * @return the URI to the files table on the given volume
3140b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         */
315d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood        public static Uri getContentUri(String volumeName) {
316d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood            return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
3173b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood                    "/file");
318d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood        }
319d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood
3200b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood        /**
3210b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * Get the content:// style URI for a single row in the files table on the
3220b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * given volume.
3230b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         *
3240b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * @param volumeName the name of the volume to get the URI for
3250b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * @param rowId the file to get the URI for
3260b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * @return the URI to the files table on the given volume
3270b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         */
328d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood        public static final Uri getContentUri(String volumeName,
3290b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood                long rowId) {
330d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood            return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
3310b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood                    + "/file/" + rowId);
332d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood        }
333d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood
3340b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood        /**
3350b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * For use only by the MTP implementation.
3360b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * @hide
3370b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         */
3388490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood        public static Uri getMtpObjectsUri(String volumeName) {
3398490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood            return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
3408490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood                    "/object");
3418490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood        }
3428490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood
3430b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood        /**
3440b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * For use only by the MTP implementation.
3450b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * @hide
3460b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         */
3478490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood        public static final Uri getMtpObjectsUri(String volumeName,
3488490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood                long fileId) {
3498490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood            return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
3508490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood                    + "/object/" + fileId);
3518490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood        }
3528490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood
3530b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood        /**
3540b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * Used to implement the MTP GetObjectReferences and SetObjectReferences commands.
3550b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         * @hide
3560b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood         */
3578490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood        public static final Uri getMtpReferencesUri(String volumeName,
3583b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood                long fileId) {
3599a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood            return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
3608490e66f57506d4e4b05e7c987c7ca34295843e6Mike Lockwood                    + "/object/" + fileId + "/references");
3619a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood        }
3629a2046fb5ceeee4d5334274cbff15f1058bb3244Mike Lockwood
363d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood        /**
364d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood         * Fields for master table for all media files.
365d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood         * Table also contains MediaColumns._ID, DATA, SIZE and DATE_MODIFIED.
366d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood         */
3673b2a62e5b35ea5f8da9d9bee52f75c9c2ebb4eceMike Lockwood        public interface FileColumns extends MediaColumns {
368d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood            /**
369b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood             * The MTP storage ID of the file
370b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood             * <P>Type: INTEGER</P>
371b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood             * @hide
372b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood             */
373b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood            public static final String STORAGE_ID = "storage_id";
374b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood
375b239b683765f63d79e74b8ba2a8cc2855f236536Mike Lockwood            /**
376d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood             * The MTP format code of the file
377d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood             * <P>Type: INTEGER</P>
3780b20b77ff5a67a054695954bc65f1c5c473b348bMike Lockwood             * @hide
379d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood             */
380d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood            public static final String FORMAT = "format";
381d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood
382d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood            /**
383d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood             * The index of the parent directory of the file
384d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood             * <P>Type: INTEGER</P>
385d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood             */
386d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood            public static final String PARENT = "parent";
387fed161799bb40ea4cda19f5ef6c8c2462a0066e4Mike Lockwood
388fed161799bb40ea4cda19f5ef6c8c2462a0066e4Mike Lockwood            /**
389c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood             * The MIME type of the file
390c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood             * <P>Type: TEXT</P>
391fed161799bb40ea4cda19f5ef6c8c2462a0066e4Mike Lockwood             */
392c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood            public static final String MIME_TYPE = "mime_type";
393fed161799bb40ea4cda19f5ef6c8c2462a0066e4Mike Lockwood
394fed161799bb40ea4cda19f5ef6c8c2462a0066e4Mike Lockwood            /**
395c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood             * The title of the content
396c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood             * <P>Type: TEXT</P>
397fed161799bb40ea4cda19f5ef6c8c2462a0066e4Mike Lockwood             */
398c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood            public static final String TITLE = "title";
399c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood
400c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood            /**
401c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood             * The media type (audio, video, image or playlist)
402c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood             * of the file, or 0 for not a media file
403c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood             * <P>Type: TEXT</P>
404c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood             */
405c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood            public static final String MEDIA_TYPE = "media_type";
406c37255d5d0fd9e0ec02b0d7cb5c4b235e200d367Mike Lockwood
407c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood            /**
408ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood             * Constant for the {@link #MEDIA_TYPE} column indicating that file
409ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood             * is not an audio, image, video or playlist file.
410c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood             */
411c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood            public static final int MEDIA_TYPE_NONE = 0;
412ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood
413ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood            /**
414ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood             * Constant for the {@link #MEDIA_TYPE} column indicating that file is an image file.
415ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood             */
416c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood            public static final int MEDIA_TYPE_IMAGE = 1;
417ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood
418ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood            /**
419ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood             * Constant for the {@link #MEDIA_TYPE} column indicating that file is an audio file.
420ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood             */
421c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood            public static final int MEDIA_TYPE_AUDIO = 2;
422ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood
423ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood            /**
424ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood             * Constant for the {@link #MEDIA_TYPE} column indicating that file is an video file.
425ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood             */
426c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood            public static final int MEDIA_TYPE_VIDEO = 3;
427ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood
428ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood            /**
429ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood             * Constant for the {@link #MEDIA_TYPE} column indicating that file is an playlist file.
430ed723b4095828fd6e183b650390bc4725e15886fMike Lockwood             */
431c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood            public static final int MEDIA_TYPE_PLAYLIST = 4;
432c2206a0710a3ca2c29854c1a0638c5ba55629ba2Mike Lockwood        }
433d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood    }
434d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
43600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen     * This class is used internally by Images.Thumbnails and Video.Thumbnails, it's not intended
43700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen     * to be accessed elsewhere.
43800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen     */
43900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen    private static class InternalThumbnails implements BaseColumns {
44000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        private static final int MINI_KIND = 1;
44100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        private static final int FULL_SCREEN_KIND = 2;
44200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        private static final int MICRO_KIND = 3;
44300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        private static final String[] PROJECTION = new String[] {_ID, MediaColumns.DATA};
44413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen        static final int DEFAULT_GROUP_ID = 0;
4452ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang        private static final Object sThumbBufLock = new Object();
4462ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang        private static byte[] sThumbBuf;
44700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
448f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen        private static Bitmap getMiniThumbFromFile(Cursor c, Uri baseUri, ContentResolver cr, BitmapFactory.Options options) {
449f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            Bitmap bitmap = null;
450f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            Uri thumbUri = null;
451f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            try {
452f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                long thumbId = c.getLong(0);
453f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                String filePath = c.getString(1);
454f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                thumbUri = ContentUris.withAppendedId(baseUri, thumbId);
455f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                ParcelFileDescriptor pfdInput = cr.openFileDescriptor(thumbUri, "r");
456f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                bitmap = BitmapFactory.decodeFileDescriptor(
457f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        pfdInput.getFileDescriptor(), null, options);
458f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                pfdInput.close();
459f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            } catch (FileNotFoundException ex) {
460f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                Log.e(TAG, "couldn't open thumbnail " + thumbUri + "; " + ex);
461f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            } catch (IOException ex) {
462f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                Log.e(TAG, "couldn't open thumbnail " + thumbUri + "; " + ex);
463f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            } catch (OutOfMemoryError ex) {
464f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                Log.e(TAG, "failed to allocate memory for thumbnail "
465f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        + thumbUri + "; " + ex);
466f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            }
467f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            return bitmap;
468f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen        }
469f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen
47000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        /**
471b994419263fb4f595379838f62efc50f90565e20Ray Chen         * This method cancels the thumbnail request so clients waiting for getThumbnail will be
472b994419263fb4f595379838f62efc50f90565e20Ray Chen         * interrupted and return immediately. Only the original process which made the getThumbnail
473b994419263fb4f595379838f62efc50f90565e20Ray Chen         * requests can cancel their own requests.
474b994419263fb4f595379838f62efc50f90565e20Ray Chen         *
475b994419263fb4f595379838f62efc50f90565e20Ray Chen         * @param cr ContentResolver
476ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen         * @param origId original image or video id. use -1 to cancel all requests.
47713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen         * @param groupId the same groupId used in getThumbnail
478b994419263fb4f595379838f62efc50f90565e20Ray Chen         * @param baseUri the base URI of requested thumbnails
479b994419263fb4f595379838f62efc50f90565e20Ray Chen         */
48013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen        static void cancelThumbnailRequest(ContentResolver cr, long origId, Uri baseUri,
48113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                long groupId) {
482b994419263fb4f595379838f62efc50f90565e20Ray Chen            Uri cancelUri = baseUri.buildUpon().appendQueryParameter("cancel", "1")
48313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                    .appendQueryParameter("orig_id", String.valueOf(origId))
48413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                    .appendQueryParameter("group_id", String.valueOf(groupId)).build();
485b994419263fb4f595379838f62efc50f90565e20Ray Chen            Cursor c = null;
486b994419263fb4f595379838f62efc50f90565e20Ray Chen            try {
487b994419263fb4f595379838f62efc50f90565e20Ray Chen                c = cr.query(cancelUri, PROJECTION, null, null, null);
488b994419263fb4f595379838f62efc50f90565e20Ray Chen            }
489b994419263fb4f595379838f62efc50f90565e20Ray Chen            finally {
490b994419263fb4f595379838f62efc50f90565e20Ray Chen                if (c != null) c.close();
491b994419263fb4f595379838f62efc50f90565e20Ray Chen            }
492b994419263fb4f595379838f62efc50f90565e20Ray Chen        }
493b994419263fb4f595379838f62efc50f90565e20Ray Chen        /**
49400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * This method ensure thumbnails associated with origId are generated and decode the byte
49500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * stream from database (MICRO_KIND) or file (MINI_KIND).
49600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         *
49700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * Special optimization has been done to avoid further IPC communication for MICRO_KIND
49800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * thumbnails.
49900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         *
50000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @param cr ContentResolver
50100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @param origId original image or video id
50200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @param kind could be MINI_KIND or MICRO_KIND
50300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @param options this is only used for MINI_KIND when decoding the Bitmap
50400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @param baseUri the base URI of requested thumbnails
50513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen         * @param groupId the id of group to which this request belongs
50600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * @return Bitmap bitmap of specified thumbnail kind
50700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         */
50813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen        static Bitmap getThumbnail(ContentResolver cr, long origId, long groupId, int kind,
50900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                BitmapFactory.Options options, Uri baseUri, boolean isVideo) {
51000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            Bitmap bitmap = null;
51100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            String filePath = null;
512b994419263fb4f595379838f62efc50f90565e20Ray Chen            // Log.v(TAG, "getThumbnail: origId="+origId+", kind="+kind+", isVideo="+isVideo);
513f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen            // If the magic is non-zero, we simply return thumbnail if it does exist.
51400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            // querying MediaProvider and simply return thumbnail.
5151ba38b600e181168c8897220048027a164c68b10Ray Chen            MiniThumbFile thumbFile = new MiniThumbFile(isVideo ? Video.Media.EXTERNAL_CONTENT_URI
5161ba38b600e181168c8897220048027a164c68b10Ray Chen                    : Images.Media.EXTERNAL_CONTENT_URI);
5171ba38b600e181168c8897220048027a164c68b10Ray Chen            Cursor c = null;
5181ba38b600e181168c8897220048027a164c68b10Ray Chen            try {
5191ba38b600e181168c8897220048027a164c68b10Ray Chen                long magic = thumbFile.getMagic(origId);
5201ba38b600e181168c8897220048027a164c68b10Ray Chen                if (magic != 0) {
5211ba38b600e181168c8897220048027a164c68b10Ray Chen                    if (kind == MICRO_KIND) {
5229439241d35afc203d47b327619a49b5d70cf722bChih-Chung Chang                        synchronized (sThumbBufLock) {
5239439241d35afc203d47b327619a49b5d70cf722bChih-Chung Chang                            if (sThumbBuf == null) {
5249439241d35afc203d47b327619a49b5d70cf722bChih-Chung Chang                                sThumbBuf = new byte[MiniThumbFile.BYTES_PER_MINTHUMB];
5259439241d35afc203d47b327619a49b5d70cf722bChih-Chung Chang                            }
5269439241d35afc203d47b327619a49b5d70cf722bChih-Chung Chang                            if (thumbFile.getMiniThumbFromFile(origId, sThumbBuf) != null) {
5279439241d35afc203d47b327619a49b5d70cf722bChih-Chung Chang                                bitmap = BitmapFactory.decodeByteArray(sThumbBuf, 0, sThumbBuf.length);
5289439241d35afc203d47b327619a49b5d70cf722bChih-Chung Chang                                if (bitmap == null) {
5299439241d35afc203d47b327619a49b5d70cf722bChih-Chung Chang                                    Log.w(TAG, "couldn't decode byte array.");
5309439241d35afc203d47b327619a49b5d70cf722bChih-Chung Chang                                }
5311ba38b600e181168c8897220048027a164c68b10Ray Chen                            }
53200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        }
5331ba38b600e181168c8897220048027a164c68b10Ray Chen                        return bitmap;
5341ba38b600e181168c8897220048027a164c68b10Ray Chen                    } else if (kind == MINI_KIND) {
5351ba38b600e181168c8897220048027a164c68b10Ray Chen                        String column = isVideo ? "video_id=" : "image_id=";
536f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        c = cr.query(baseUri, PROJECTION, column + origId, null, null);
537f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        if (c != null && c.moveToFirst()) {
538f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                            bitmap = getMiniThumbFromFile(c, baseUri, cr, options);
539f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                            if (bitmap != null) {
540f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                                return bitmap;
541f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                            }
542f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        }
543f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                    }
54400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                }
54500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
54600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                Uri blockingUri = baseUri.buildUpon().appendQueryParameter("blocking", "1")
54713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        .appendQueryParameter("orig_id", String.valueOf(origId))
54813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        .appendQueryParameter("group_id", String.valueOf(groupId)).build();
5491ba38b600e181168c8897220048027a164c68b10Ray Chen                if (c != null) c.close();
55000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                c = cr.query(blockingUri, PROJECTION, null, null, null);
55100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                // This happens when original image/video doesn't exist.
55200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                if (c == null) return null;
55300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
55400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                // Assuming thumbnail has been generated, at least original image exists.
55500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                if (kind == MICRO_KIND) {
5562ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang                    synchronized (sThumbBufLock) {
5572ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang                        if (sThumbBuf == null) {
5582ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang                            sThumbBuf = new byte[MiniThumbFile.BYTES_PER_MINTHUMB];
5592ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang                        }
5602ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang                        if (thumbFile.getMiniThumbFromFile(origId, sThumbBuf) != null) {
5612ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang                            bitmap = BitmapFactory.decodeByteArray(sThumbBuf, 0, sThumbBuf.length);
5622ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang                            if (bitmap == null) {
5632ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang                                Log.w(TAG, "couldn't decode byte array.");
5642ca36196ea97d14cd0ef24439204f6725966d9d7Chih-Chung Chang                            }
56500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        }
56600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    }
56700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                } else if (kind == MINI_KIND) {
56800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    if (c.moveToFirst()) {
569f9a243d4a8052ddaec611852d4877ba6262373f4Ray Chen                        bitmap = getMiniThumbFromFile(c, baseUri, cr, options);
57000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    }
57100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                } else {
57200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    throw new IllegalArgumentException("Unsupported kind: " + kind);
57300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                }
57400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
57500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                // We probably run out of space, so create the thumbnail in memory.
57600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                if (bitmap == null) {
57744dcf658718fcc0b563dcad50fb59e8fe507cd0aRay Chen                    Log.v(TAG, "Create the thumbnail in memory: origId=" + origId
57844dcf658718fcc0b563dcad50fb59e8fe507cd0aRay Chen                            + ", kind=" + kind + ", isVideo="+isVideo);
57900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    Uri uri = Uri.parse(
58000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                            baseUri.buildUpon().appendPath(String.valueOf(origId))
58100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                                    .toString().replaceFirst("thumbnails", "media"));
582ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                    if (filePath == null) {
5839b150b74573ce506abd00c692fb42f46980441a3Marco Nelissen                        if (c != null) c.close();
58400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        c = cr.query(uri, PROJECTION, null, null, null);
585ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                        if (c == null || !c.moveToFirst()) {
586ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                            return null;
587ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                        }
588ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                        filePath = c.getString(1);
589ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                    }
590ef093cd6c4ab4d3c8a1c8be5ed7147d5f06d7027Ray Chen                    if (isVideo) {
59144dcf658718fcc0b563dcad50fb59e8fe507cd0aRay Chen                        bitmap = ThumbnailUtils.createVideoThumbnail(filePath, kind);
59200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    } else {
59344dcf658718fcc0b563dcad50fb59e8fe507cd0aRay Chen                        bitmap = ThumbnailUtils.createImageThumbnail(filePath, kind);
59400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    }
59500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                }
59600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            } catch (SQLiteException ex) {
59700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                Log.w(TAG, ex);
59800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            } finally {
59900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                if (c != null) c.close();
6001ba38b600e181168c8897220048027a164c68b10Ray Chen                // To avoid file descriptor leak in application process.
6011ba38b600e181168c8897220048027a164c68b10Ray Chen                thumbFile.deactivate();
6021ba38b600e181168c8897220048027a164c68b10Ray Chen                thumbFile = null;
60300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            }
60400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            return bitmap;
60500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        }
60600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen    }
60700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
60800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen    /**
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Contains meta data for all available images.
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
61100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen    public static final class Images {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface ImageColumns extends MediaColumns {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The description of the image
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DESCRIPTION = "description";
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The picasa id of the image
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String PICASA_ID = "picasa_id";
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Whether the video should be published as public or private
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_PRIVATE = "isprivate";
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The latitude where the image was captured.
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DOUBLE</P>
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LATITUDE = "latitude";
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The longitude where the image was captured.
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DOUBLE</P>
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LONGITUDE = "longitude";
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The date & time that the image was taken in units
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * of milliseconds since jan 1, 1970.
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATE_TAKEN = "datetaken";
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The orientation for the image expressed as degrees.
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Only degrees 0, 90, 180, 270 will work.
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ORIENTATION = "orientation";
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The mini thumb id.
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The bucket id of the image. This is a read-only property that
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * is automatically computed from the DATA column.
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BUCKET_ID = "bucket_id";
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The bucket display name of the image. This is a read-only property that
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * is automatically computed from the DATA column.
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Media implements ImageColumns {
67900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) {
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection,
68400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    String where, String orderBy) {
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(uri, projection, where,
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                             null, orderBy == null ? DEFAULT_SORT_ORDER : orderBy);
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection,
69000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    String selection, String [] selectionArgs, String orderBy) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(uri, projection, selection,
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        selectionArgs, orderBy == null ? DEFAULT_SORT_ORDER : orderBy);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Retrieves an image for the given url as a {@link Bitmap}.
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param cr The content resolver to use
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param url The url of the image
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @throws FileNotFoundException
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @throws IOException
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Bitmap getBitmap(ContentResolver cr, Uri url)
70400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    throws FileNotFoundException, IOException {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InputStream input = cr.openInputStream(url);
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Bitmap bitmap = BitmapFactory.decodeStream(input);
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                input.close();
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return bitmap;
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Insert an image and create a thumbnail for it.
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param cr The content resolver to use
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param imagePath The path to the image to insert
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param name The name of the image
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param description The description of the image
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return The URL to the newly created image
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @throws FileNotFoundException
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
72100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String insertImage(ContentResolver cr, String imagePath,
72200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    String name, String description) throws FileNotFoundException {
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Check if file exists with a FileInputStream
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                FileInputStream stream = new FileInputStream(imagePath);
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
7262f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen                    Bitmap bm = BitmapFactory.decodeFile(imagePath);
7272f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen                    String ret = insertImage(cr, bm, name, description);
7282f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen                    bm.recycle();
7292f189fa0f75d6899b9fa7db11f5301bc7850b744Marco Nelissen                    return ret;
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } finally {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        stream.close();
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (IOException e) {
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private static final Bitmap StoreThumbnail(
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ContentResolver cr,
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Bitmap source,
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long id,
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    float width, float height,
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int kind) {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // create the matrix to scale it
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Matrix matrix = new Matrix();
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float scaleX = width / source.getWidth();
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                float scaleY = height / source.getHeight();
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                matrix.setScale(scaleX, scaleY);
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Bitmap thumb = Bitmap.createBitmap(source, 0, 0,
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   source.getWidth(),
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   source.getHeight(), matrix,
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   true);
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ContentValues values = new ContentValues(4);
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Thumbnails.KIND,     kind);
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Thumbnails.IMAGE_ID, (int)id);
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Thumbnails.HEIGHT,   thumb.getHeight());
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Thumbnails.WIDTH,    thumb.getWidth());
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri url = cr.insert(Images.Thumbnails.EXTERNAL_CONTENT_URI, values);
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                try {
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    OutputStream thumbOut = cr.openOutputStream(url);
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thumb.compress(Bitmap.CompressFormat.JPEG, 100, thumbOut);
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    thumbOut.close();
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return thumb;
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                catch (FileNotFoundException ex) {
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                catch (IOException ex) {
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Insert an image and create a thumbnail for it.
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param cr The content resolver to use
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param source The stream to use for the image
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param title The name of the image
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param description The description of the image
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return The URL to the newly created image, or <code>null</code> if the image failed to be stored
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *              for any reason.
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String insertImage(ContentResolver cr, Bitmap source,
79100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                                                   String title, String description) {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ContentValues values = new ContentValues();
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Media.TITLE, title);
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Media.DESCRIPTION, description);
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                values.put(Images.Media.MIME_TYPE, "image/jpeg");
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uri url = null;
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String stringUrl = null;    /* value to be returned */
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
80000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                try {
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    url = cr.insert(EXTERNAL_CONTENT_URI, values);
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (source != null) {
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        OutputStream imageOut = cr.openOutputStream(url);
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        try {
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            source.compress(Bitmap.CompressFormat.JPEG, 50, imageOut);
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } finally {
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            imageOut.close();
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long id = ContentUris.parseId(url);
81244dcf658718fcc0b563dcad50fb59e8fe507cd0aRay Chen                        // Wait until MINI_KIND thumbnail is generated.
81344dcf658718fcc0b563dcad50fb59e8fe507cd0aRay Chen                        Bitmap miniThumb = Images.Thumbnails.getThumbnail(cr, id,
81444dcf658718fcc0b563dcad50fb59e8fe507cd0aRay Chen                                Images.Thumbnails.MINI_KIND, null);
81544dcf658718fcc0b563dcad50fb59e8fe507cd0aRay Chen                        // This is for backward compatibility.
81644dcf658718fcc0b563dcad50fb59e8fe507cd0aRay Chen                        Bitmap microThumb = StoreThumbnail(cr, miniThumb, id, 50F, 50F,
81744dcf658718fcc0b563dcad50fb59e8fe507cd0aRay Chen                                Images.Thumbnails.MICRO_KIND);
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Log.e(TAG, "Failed to create thumbnail, removing original");
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cr.delete(url, null, null);
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        url = null;
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } catch (Exception e) {
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.e(TAG, "Failed to insert image", e);
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (url != null) {
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        cr.delete(url, null, null);
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        url = null;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (url != null) {
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    stringUrl = url.toString();
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return stringUrl;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the image media table on the
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the image media table on the given volume
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/images/media");
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type of of this directory of
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * images.  Note that each entry in this directory will have a standard
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * image MIME type as appropriate -- for example, image/jpeg.
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/image";
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = ImageColumns.BUCKET_DISPLAY_NAME;
87400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        }
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
87600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        /**
87700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * This class allows developers to query and get two kinds of thumbnails:
87800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * MINI_KIND: 512 x 384 thumbnail
87900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * MICRO_KIND: 96 x 96 thumbnail
88000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         */
88100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        public static class Thumbnails implements BaseColumns {
88200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) {
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER);
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
88600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Cursor queryMiniThumbnails(ContentResolver cr, Uri uri, int kind,
88700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    String[] projection) {
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(uri, projection, "kind = " + kind, null, DEFAULT_SORT_ORDER);
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
89100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Cursor queryMiniThumbnail(ContentResolver cr, long origId, int kind,
89200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    String[] projection) {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return cr.query(EXTERNAL_CONTENT_URI, projection,
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        IMAGE_ID + " = " + origId + " AND " + KIND + " = " +
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        kind, null, null);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
899b994419263fb4f595379838f62efc50f90565e20Ray Chen             * This method cancels the thumbnail request so clients waiting for getThumbnail will be
900b994419263fb4f595379838f62efc50f90565e20Ray Chen             * interrupted and return immediately. Only the original process which made the getThumbnail
901b994419263fb4f595379838f62efc50f90565e20Ray Chen             * requests can cancel their own requests.
902b994419263fb4f595379838f62efc50f90565e20Ray Chen             *
903b994419263fb4f595379838f62efc50f90565e20Ray Chen             * @param cr ContentResolver
904b994419263fb4f595379838f62efc50f90565e20Ray Chen             * @param origId original image id
905b994419263fb4f595379838f62efc50f90565e20Ray Chen             */
906b994419263fb4f595379838f62efc50f90565e20Ray Chen            public static void cancelThumbnailRequest(ContentResolver cr, long origId) {
90713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI,
90813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        InternalThumbnails.DEFAULT_GROUP_ID);
909b994419263fb4f595379838f62efc50f90565e20Ray Chen            }
910b994419263fb4f595379838f62efc50f90565e20Ray Chen
911b994419263fb4f595379838f62efc50f90565e20Ray Chen            /**
91200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * This method checks if the thumbnails of the specified image (origId) has been created.
91300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * It will be blocked until the thumbnails are generated.
91400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             *
91500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param cr ContentResolver used to dispatch queries to MediaProvider.
91600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param origId Original image id associated with thumbnail of interest.
91700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND.
91800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param options this is only used for MINI_KIND when decoding the Bitmap
91900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @return A Bitmap instance. It could be null if the original image
92000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             *         associated with origId doesn't exist or memory is not enough.
92100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
92200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind,
92300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    BitmapFactory.Options options) {
92413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                return InternalThumbnails.getThumbnail(cr, origId,
92513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        InternalThumbnails.DEFAULT_GROUP_ID, kind, options,
92613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        EXTERNAL_CONTENT_URI, false);
92713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            }
92813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen
92913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            /**
93013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * This method cancels the thumbnail request so clients waiting for getThumbnail will be
93113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * interrupted and return immediately. Only the original process which made the getThumbnail
93213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * requests can cancel their own requests.
93313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *
93413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param cr ContentResolver
93513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param origId original image id
93613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param groupId the same groupId used in getThumbnail.
93713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             */
93813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            public static void cancelThumbnailRequest(ContentResolver cr, long origId, long groupId) {
93913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI, groupId);
94013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            }
94113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen
94213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            /**
94313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * This method checks if the thumbnails of the specified image (origId) has been created.
94413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * It will be blocked until the thumbnails are generated.
94513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *
94613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param cr ContentResolver used to dispatch queries to MediaProvider.
94713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param origId Original image id associated with thumbnail of interest.
94813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param groupId the id of group to which this request belongs
94913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND.
95013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param options this is only used for MINI_KIND when decoding the Bitmap
95113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @return A Bitmap instance. It could be null if the original image
95213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *         associated with origId doesn't exist or memory is not enough.
95313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             */
95413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            public static Bitmap getThumbnail(ContentResolver cr, long origId, long groupId,
95513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                    int kind, BitmapFactory.Options options) {
95613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                return InternalThumbnails.getThumbnail(cr, origId, groupId, kind, options,
95700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        EXTERNAL_CONTENT_URI, false);
95800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            }
95900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
96000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the image media table on the
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the image media table on the given volume
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/images/thumbnails");
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = "image_id ASC";
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The data stream for the thumbnail
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DATA STREAM</P>
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATA = "_data";
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The original image for the thumbnal
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (ID from Images table)</P>
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IMAGE_ID = "image_id";
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The kind of the thumbnail
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (One of the values below)</P>
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String KIND = "kind";
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int MINI_KIND = 1;
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int FULL_SCREEN_KIND = 2;
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final int MICRO_KIND = 3;
101100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
101200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The blob raw data of thumbnail
101300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: DATA STREAM</P>
101400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
101500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String THUMB_DATA = "thumb_data";
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The width of the thumbnal
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String WIDTH = "width";
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The height of the thumbnail
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String HEIGHT = "height";
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Container for all audio content.
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class Audio {
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Columns for audio file that show up in multiple tables.
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface AudioColumns extends MediaColumns {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A non human readable key calculated from the TITLE, used for
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * searching, sorting and grouping
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String TITLE_KEY = "title_key";
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The duration of the audio file, in ms
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DURATION = "duration";
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The position, in ms, playback was at when playback for this file
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * was last stopped.
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BOOKMARK = "bookmark";
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The id of the artist who created the audio file, if any
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST_ID = "artist_id";
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The artist who created the audio file, if any
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST = "artist";
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
1073abc2819328c32f2f66506d342c5f560da5107889Marco Nelissen             * The artist credited for the album that contains the audio file
1074abc2819328c32f2f66506d342c5f560da5107889Marco Nelissen             * <P>Type: TEXT</P>
1075abc2819328c32f2f66506d342c5f560da5107889Marco Nelissen             * @hide
1076abc2819328c32f2f66506d342c5f560da5107889Marco Nelissen             */
1077abc2819328c32f2f66506d342c5f560da5107889Marco Nelissen            public static final String ALBUM_ARTIST = "album_artist";
1078abc2819328c32f2f66506d342c5f560da5107889Marco Nelissen
1079abc2819328c32f2f66506d342c5f560da5107889Marco Nelissen            /**
1080ee35aff74494e6c0b718e219427af6a6c573b928Marco Nelissen             * Whether the song is part of a compilation
1081ee35aff74494e6c0b718e219427af6a6c573b928Marco Nelissen             * <P>Type: TEXT</P>
1082ee35aff74494e6c0b718e219427af6a6c573b928Marco Nelissen             * @hide
1083ee35aff74494e6c0b718e219427af6a6c573b928Marco Nelissen             */
1084ee35aff74494e6c0b718e219427af6a6c573b928Marco Nelissen            public static final String COMPILATION = "compilation";
1085ee35aff74494e6c0b718e219427af6a6c573b928Marco Nelissen
1086ee35aff74494e6c0b718e219427af6a6c573b928Marco Nelissen            /**
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A non human readable key calculated from the ARTIST, used for
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * searching, sorting and grouping
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST_KEY = "artist_key";
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The composer of the audio file, if any
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String COMPOSER = "composer";
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The id of the album the audio file is from, if any
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_ID = "album_id";
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The album the audio file is from, if any
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM = "album";
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A non human readable key calculated from the ALBUM, used for
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * searching, sorting and grouping
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_KEY = "album_key";
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The track number of this song on the album, if any.
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * This number encodes both the track number and the
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * disc number. For multi-disc sets, this number will
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * be 1xxx for tracks on the first disc, 2xxx for tracks
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * on the second disc, etc.
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String TRACK = "track";
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The year the audio file was recorded, if any
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String YEAR = "year";
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Non-zero if the audio file is music
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (boolean)</P>
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_MUSIC = "is_music";
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Non-zero if the audio file is a podcast
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (boolean)</P>
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_PODCAST = "is_podcast";
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
114782428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang             * Non-zero if the audio file may be a ringtone
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (boolean)</P>
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_RINGTONE = "is_ringtone";
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
115382428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang             * Non-zero if the audio file may be an alarm
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (boolean)</P>
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_ALARM = "is_alarm";
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
115982428a862f325238cfb5646bbd65de3f1a11e7ccGloria Wang             * Non-zero if the audio file may be a notification sound
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (boolean)</P>
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_NOTIFICATION = "is_notification";
1163e5d0495d5206167c597efcd81436a0f881f069f9Mike Lockwood
1164e5d0495d5206167c597efcd81436a0f881f069f9Mike Lockwood            /**
1165e5d0495d5206167c597efcd81436a0f881f069f9Mike Lockwood             * The genre of the audio file, if any
1166e5d0495d5206167c597efcd81436a0f881f069f9Mike Lockwood             * <P>Type: TEXT</P>
1167e5d0495d5206167c597efcd81436a0f881f069f9Mike Lockwood             * Does not exist in the database - only used by the media scanner for inserts.
1168e5d0495d5206167c597efcd81436a0f881f069f9Mike Lockwood             * @hide
1169e5d0495d5206167c597efcd81436a0f881f069f9Mike Lockwood             */
1170e5d0495d5206167c597efcd81436a0f881f069f9Mike Lockwood            public static final String GENRE = "genre";
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Converts a name to a "key" that can be used for grouping, sorting
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * and searching.
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The rules that govern this conversion are:
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - remove 'special' characters like ()[]'!?.,
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - remove leading/trailing spaces
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - convert everything to lowercase
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - remove leading "the ", "an " and "a "
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - remove trailing ", the|an|a"
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * - remove accents. This step leaves us with CollationKey data,
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *   which is not human readable
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param name The artist or album name to convert
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @return The "key" for the given name.
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static String keyFor(String name) {
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (name != null)  {
1190816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                boolean sortfirst = false;
11919a488b44cb479bc42375d2cfcdd4aa6161dc17cfMarco Nelissen                if (name.equals(UNKNOWN_STRING)) {
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return "\001";
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1194816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                // Check if the first character is \001. We use this to
1195816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                // force sorting of certain special files, like the silent ringtone.
1196816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                if (name.startsWith("\001")) {
1197816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                    sortfirst = true;
1198816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                }
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                name = name.trim().toLowerCase();
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.startsWith("the ")) {
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name = name.substring(4);
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.startsWith("an ")) {
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name = name.substring(3);
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.startsWith("a ")) {
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name = name.substring(2);
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.endsWith(", the") || name.endsWith(",the") ||
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name.endsWith(", an") || name.endsWith(",an") ||
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name.endsWith(", a") || name.endsWith(",a")) {
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name = name.substring(0, name.lastIndexOf(','));
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1214e754e128e6237ea1c5b263ec2a02b0413851cfbaMarco Nelissen                name = name.replaceAll("[\\[\\]\\(\\)\"'.,?!]", "").trim();
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (name.length() > 0) {
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Insert a separator between the characters to avoid
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // matches on a partial character. If we ever change
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // to start-of-word-only matches, this can be removed.
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    StringBuilder b = new StringBuilder();
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    b.append('.');
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int nl = name.length();
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    for (int i = 0; i < nl; i++) {
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        b.append(name.charAt(i));
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        b.append('.');
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    name = b.toString();
1227816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                    String key = DatabaseUtils.getCollationKey(name);
1228816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                    if (sortfirst) {
1229816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                        key = "\001" + key;
1230816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                    }
1231816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                    return key;
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               } else {
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return "";
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Media implements AudioColumns {
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the audio media table on the
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the audio media table on the given volume
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/audio/media");
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUriForPath(String path) {
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return (path.startsWith(Environment.getExternalStorageDirectory().getPath()) ?
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        EXTERNAL_CONTENT_URI : INTERNAL_CONTENT_URI);
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/audio";
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1278816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen            public static final String DEFAULT_SORT_ORDER = TITLE_KEY;
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Activity Action: Start SoundRecorder application.
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <p>Input: nothing.
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <p>Output: An uri to the recorded sound stored in the Media Library
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * if the recording was successful.
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * May also contain the extra EXTRA_MAX_BYTES.
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @see #EXTRA_MAX_BYTES
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String RECORD_SOUND_ACTION =
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "android.provider.MediaStore.RECORD_SOUND";
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The name of the Intent-extra used to define a maximum file size for
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * a recording made by the SoundRecorder application.
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @see #RECORD_SOUND_ACTION
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             public static final String EXTRA_MAX_BYTES =
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    "android.provider.MediaStore.extra.MAX_BYTES";
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Columns representing an audio genre
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface GenresColumns {
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The name of the genre
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NAME = "name";
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Contains all genres for audio files
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Genres implements BaseColumns, GenresColumns {
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the audio genres table on the
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the audio genres table on the given volume
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/audio/genres");
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
1329bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood             * Get the content:// style URI for querying the genres of an audio file.
1330bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood             *
1331bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood             * @param volumeName the name of the volume to get the URI for
1332bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood             * @param audioId the ID of the audio file for which to retrieve the genres
1333bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood             * @return the URI to for querying the genres for the audio file
1334bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood             * with the given the volume and audioID
1335bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood             */
1336bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood            public static Uri getContentUriForAudioId(String volumeName, int audioId) {
1337bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
1338bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood                        "/audio/media/" + audioId + "/genres");
1339bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood            }
1340bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood
1341bdb05df757847ebf343ad332f319a97f7482957cMike Lockwood            /**
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/genre";
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for entries in this table.
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/genre";
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = NAME;
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Sub-directory of each genre containing all members.
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final class Members implements AudioColumns {
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final Uri getContentUri(String volumeName,
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long genreId) {
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + "/audio/genres/" + genreId + "/members");
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * A subdirectory of each genre containing all member audio files.
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String CONTENT_DIRECTORY = "members";
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The default sort order for this table
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
1388816cf52abd8f45770f0ac922bbb819184ed4b90fMarco Nelissen                public static final String DEFAULT_SORT_ORDER = TITLE_KEY;
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The ID of the audio file
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * <P>Type: INTEGER (long)</P>
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String AUDIO_ID = "audio_id";
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The ID of the genre
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * <P>Type: INTEGER (long)</P>
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String GENRE_ID = "genre_id";
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         * Columns representing a playlist
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface PlaylistsColumns {
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The name of the playlist
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NAME = "name";
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The data stream for the playlist file
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DATA STREAM</P>
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATA = "_data";
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The time the file was added to the media provider
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Units are seconds since 1970.
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATE_ADDED = "date_added";
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The time the file was last modified
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Units are seconds since 1970.
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * NOTE: This is for internal use by the media scanner.  Do not modify this field.
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATE_MODIFIED = "date_modified";
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Contains playlists for audio files
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Playlists implements BaseColumns,
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PlaylistsColumns {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the audio playlists table on the
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the audio playlists table on the given volume
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/audio/playlists");
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/playlist";
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for entries in this table.
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/playlist";
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = NAME;
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Sub-directory of each playlist containing all members.
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final class Members implements AudioColumns {
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final Uri getContentUri(String volumeName,
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long playlistId) {
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + "/audio/playlists/" + playlistId + "/members");
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
1492e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * Convenience method to move a playlist item to a new location
1493e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @param res The content resolver to use
1494e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @param playlistId The numeric id of the playlist
1495e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @param from The position of the item to move
1496e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @param to The position to move the item to
1497e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 * @return true on success
1498e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                 */
1499e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                public static final boolean moveItem(ContentResolver res,
1500e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                        long playlistId, int from, int to) {
1501e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                    Uri uri = MediaStore.Audio.Playlists.Members.getContentUri("external",
1502e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                            playlistId)
1503e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                            .buildUpon()
1504e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                            .appendEncodedPath(String.valueOf(from))
1505e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                            .appendQueryParameter("move", "true")
1506e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                            .build();
1507e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                    ContentValues values = new ContentValues();
1508e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                    values.put(MediaStore.Audio.Playlists.Members.PLAY_ORDER, to);
1509e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                    return res.update(uri, values, null, null) != 0;
1510e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                }
1511e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen
1512e3d05fcf396fd0e48a0741df4ddb77533fe934b3Marco Nelissen                /**
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The ID within the playlist.
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String _ID = "_id";
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * A subdirectory of each playlist containing all member audio
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * files.
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String CONTENT_DIRECTORY = "members";
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The ID of the audio file
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * <P>Type: INTEGER (long)</P>
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String AUDIO_ID = "audio_id";
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The ID of the playlist
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * <P>Type: INTEGER (long)</P>
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String PLAYLIST_ID = "playlist_id";
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The order of the songs in the playlist
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * <P>Type: INTEGER (long)></P>
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String PLAY_ORDER = "play_order";
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The default sort order for this table
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final String DEFAULT_SORT_ORDER = PLAY_ORDER;
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Columns representing an artist
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface ArtistColumns {
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The artist who created the audio file, if any
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST = "artist";
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A non human readable key calculated from the ARTIST, used for
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * searching, sorting and grouping
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST_KEY = "artist_key";
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of albums in the database for this artist
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NUMBER_OF_ALBUMS = "number_of_albums";
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of albums in the database for this artist
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NUMBER_OF_TRACKS = "number_of_tracks";
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Contains artists for audio files
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Artists implements BaseColumns, ArtistColumns {
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the artists table on the
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the audio artists table on the given volume
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/audio/artists");
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/artists";
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for entries in this table.
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/artist";
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = ARTIST_KEY;
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Sub-directory of each artist containing all albums on which
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * a song by the artist appears.
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final class Albums implements AlbumColumns {
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public static final Uri getContentUri(String volumeName,
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long artistId) {
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + "/audio/artists/" + artistId + "/albums");
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Columns representing an album
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface AlbumColumns {
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The id for the album
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_ID = "album_id";
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The album on which the audio file appears, if any
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM = "album";
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The artist whose songs appear on this album
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST = "artist";
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of songs on this album
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NUMBER_OF_SONGS = "numsongs";
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * This column is available when getting album info via artist,
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * and indicates the number of songs on the album by the given
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * artist.
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String NUMBER_OF_SONGS_FOR_ARTIST = "numsongs_by_artist";
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
1671f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * The year in which the earliest songs
1672f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * on this album were released. This will often
1673f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * be the same as {@link #LAST_YEAR}, but for compilation albums
1674f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * they might differ.
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String FIRST_YEAR = "minyear";
167800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
1679f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler            /**
1680f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * The year in which the latest songs
1681f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * on this album were released. This will often
1682f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * be the same as {@link #FIRST_YEAR}, but for compilation albums
1683f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * they might differ.
1684f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             * <P>Type: INTEGER</P>
1685f8a7ceaef2e7d5cd530c9426bde91b6fa9a40b75Andy Stadler             */
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LAST_YEAR = "maxyear";
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * A non human readable key calculated from the ALBUM, used for
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * searching, sorting and grouping
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_KEY = "album_key";
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Cached album art.
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM_ART = "album_art";
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Contains artists for audio files
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Albums implements BaseColumns, AlbumColumns {
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the albums table on the
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the audio albums table on the given volume
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/audio/albums");
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/albums";
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for entries in this table.
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ENTRY_CONTENT_TYPE = "vnd.android.cursor.item/album";
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = ALBUM_KEY;
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class Video {
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The default sort order for this table.
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final String DEFAULT_SORT_ORDER = MediaColumns.DISPLAY_NAME;
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
175500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        public static final Cursor query(ContentResolver cr, Uri uri, String[] projection) {
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return cr.query(uri, projection, null, null, DEFAULT_SORT_ORDER);
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public interface VideoColumns extends MediaColumns {
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The duration of the video file, in ms
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER (long)</P>
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DURATION = "duration";
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The artist who created the video file, if any
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ARTIST = "artist";
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The album the video file is from, if any
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String ALBUM = "album";
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The resolution of the video file, formatted as "XxY"
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String RESOLUTION = "resolution";
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The description of the video recording
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DESCRIPTION = "description";
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Whether the video should be published as public or private
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String IS_PRIVATE = "isprivate";
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The user-added tags associated with a video
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String TAGS = "tags";
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The YouTube category of the video
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CATEGORY = "category";
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The language of the video
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LANGUAGE = "language";
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The latitude where the image was captured.
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DOUBLE</P>
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LATITUDE = "latitude";
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The longitude where the image was captured.
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: DOUBLE</P>
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String LONGITUDE = "longitude";
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The date & time that the image was taken in units
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * of milliseconds since jan 1, 1970.
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DATE_TAKEN = "datetaken";
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The mini thumb id.
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The bucket id of the video. This is a read-only property that
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * is automatically computed from the DATA column.
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BUCKET_ID = "bucket_id";
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The bucket display name of the video. This is a read-only property that
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * is automatically computed from the DATA column.
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: TEXT</P>
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The bookmark for the video. Time in ms. Represents the location in the video that the
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * video should start playing at the next time it is opened. If the value is null or
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * out of the range 0..DURATION-1 then the video should start playing from the
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * beginning.
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * <P>Type: INTEGER</P>
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String BOOKMARK = "bookmark";
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static final class Media implements VideoColumns {
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Get the content:// style URI for the video media table on the
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * given volume.
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param volumeName the name of the volume to get the URI for
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @return the URI to the video media table on the given volume
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static Uri getContentUri(String volumeName) {
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        "/video/media");
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the internal storage.
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri INTERNAL_CONTENT_URI =
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("internal");
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The content:// style URI for the "primary" external storage
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * volume.
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final Uri EXTERNAL_CONTENT_URI =
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    getContentUri("external");
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The MIME type for this table.
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String CONTENT_TYPE = "vnd.android.cursor.dir/video";
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The default sort order for this table
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public static final String DEFAULT_SORT_ORDER = TITLE;
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
190000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
190100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        /**
190200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * This class allows developers to query and get two kinds of thumbnails:
190300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * MINI_KIND: 512 x 384 thumbnail
190400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         * MICRO_KIND: 96 x 96 thumbnail
190500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         *
190600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen         */
190700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        public static class Thumbnails implements BaseColumns {
190800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
1909b994419263fb4f595379838f62efc50f90565e20Ray Chen             * This method cancels the thumbnail request so clients waiting for getThumbnail will be
1910b994419263fb4f595379838f62efc50f90565e20Ray Chen             * interrupted and return immediately. Only the original process which made the getThumbnail
1911b994419263fb4f595379838f62efc50f90565e20Ray Chen             * requests can cancel their own requests.
1912b994419263fb4f595379838f62efc50f90565e20Ray Chen             *
1913b994419263fb4f595379838f62efc50f90565e20Ray Chen             * @param cr ContentResolver
1914b994419263fb4f595379838f62efc50f90565e20Ray Chen             * @param origId original video id
1915b994419263fb4f595379838f62efc50f90565e20Ray Chen             */
1916b994419263fb4f595379838f62efc50f90565e20Ray Chen            public static void cancelThumbnailRequest(ContentResolver cr, long origId) {
191713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI,
191813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        InternalThumbnails.DEFAULT_GROUP_ID);
191913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            }
192013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen
192113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            /**
192213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * This method checks if the thumbnails of the specified image (origId) has been created.
192313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * It will be blocked until the thumbnails are generated.
192413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *
192513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param cr ContentResolver used to dispatch queries to MediaProvider.
192613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param origId Original image id associated with thumbnail of interest.
192713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND.
192813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param options this is only used for MINI_KIND when decoding the Bitmap
192913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @return A Bitmap instance. It could be null if the original image
193013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *         associated with origId doesn't exist or memory is not enough.
193113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             */
193213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            public static Bitmap getThumbnail(ContentResolver cr, long origId, int kind,
193313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                    BitmapFactory.Options options) {
193413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                return InternalThumbnails.getThumbnail(cr, origId,
193513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        InternalThumbnails.DEFAULT_GROUP_ID, kind, options,
193613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                        EXTERNAL_CONTENT_URI, true);
1937b994419263fb4f595379838f62efc50f90565e20Ray Chen            }
1938b994419263fb4f595379838f62efc50f90565e20Ray Chen
1939b994419263fb4f595379838f62efc50f90565e20Ray Chen            /**
194000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * This method checks if the thumbnails of the specified image (origId) has been created.
194100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * It will be blocked until the thumbnails are generated.
194200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             *
194300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param cr ContentResolver used to dispatch queries to MediaProvider.
194400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param origId Original image id associated with thumbnail of interest.
194513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param groupId the id of group to which this request belongs
194600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param kind The type of thumbnail to fetch. Should be either MINI_KIND or MICRO_KIND
194700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param options this is only used for MINI_KIND when decoding the Bitmap
194800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @return A Bitmap instance. It could be null if the original image associated with
194900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             *         origId doesn't exist or memory is not enough.
195000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
195113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            public static Bitmap getThumbnail(ContentResolver cr, long origId, long groupId,
195213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                    int kind, BitmapFactory.Options options) {
195313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                return InternalThumbnails.getThumbnail(cr, origId, groupId, kind, options,
195400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        EXTERNAL_CONTENT_URI, true);
195500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            }
195600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
195700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
195813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * This method cancels the thumbnail request so clients waiting for getThumbnail will be
195913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * interrupted and return immediately. Only the original process which made the getThumbnail
196013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * requests can cancel their own requests.
196113ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             *
196213ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param cr ContentResolver
196313ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param origId original video id
196413ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             * @param groupId the same groupId used in getThumbnail.
196513ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen             */
196613ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            public static void cancelThumbnailRequest(ContentResolver cr, long origId, long groupId) {
196713ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen                InternalThumbnails.cancelThumbnailRequest(cr, origId, EXTERNAL_CONTENT_URI, groupId);
196813ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            }
196913ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen
197013ed5750ba515c3b4345937c7a11667a90cb1265Ray Chen            /**
197100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * Get the content:// style URI for the image media table on the
197200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * given volume.
197300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             *
197400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @param volumeName the name of the volume to get the URI for
197500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * @return the URI to the image media table on the given volume
197600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
197700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static Uri getContentUri(String volumeName) {
197800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                return Uri.parse(CONTENT_AUTHORITY_SLASH + volumeName +
197900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                        "/video/thumbnails");
198000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            }
198100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
198200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
198300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The content:// style URI for the internal storage.
198400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
198500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Uri INTERNAL_CONTENT_URI =
198600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    getContentUri("internal");
198700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
198800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
198900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The content:// style URI for the "primary" external storage
199000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * volume.
199100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
199200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final Uri EXTERNAL_CONTENT_URI =
199300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen                    getContentUri("external");
199400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
199500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
199600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The default sort order for this table
199700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
199800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String DEFAULT_SORT_ORDER = "video_id ASC";
199900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
200000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
200100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The data stream for the thumbnail
200200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: DATA STREAM</P>
200300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
200400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String DATA = "_data";
200500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
200600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
200700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The original image for the thumbnal
200800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: INTEGER (ID from Video table)</P>
200900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
201000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String VIDEO_ID = "video_id";
201100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
201200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
201300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The kind of the thumbnail
201400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: INTEGER (One of the values below)</P>
201500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
201600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String KIND = "kind";
201700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
201800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final int MINI_KIND = 1;
201900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final int FULL_SCREEN_KIND = 2;
202000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final int MICRO_KIND = 3;
202100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
202200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
202300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The width of the thumbnal
202400c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: INTEGER (long)</P>
202500c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
202600c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String WIDTH = "width";
202700c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen
202800c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            /**
202900c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * The height of the thumbnail
203000c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             * <P>Type: INTEGER (long)</P>
203100c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen             */
203200c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen            public static final String HEIGHT = "height";
203300c575a3fccb9d3065e913f1b8fcf93e18d44eafRay Chen        }
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Uri for querying the state of the media scanner.
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Uri getMediaScannerUri() {
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return Uri.parse(CONTENT_AUTHORITY_SLASH + "none/media_scanner");
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Name of current volume being scanned by the media scanner.
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final String MEDIA_SCANNER_VOLUME = "volume";
20478ce072d579e0c0e9329b5a3830155de8da7de4cfKarl Ostmo
20488ce072d579e0c0e9329b5a3830155de8da7de4cfKarl Ostmo    /**
20498ce072d579e0c0e9329b5a3830155de8da7de4cfKarl Ostmo     * Name of the file signaling the media scanner to ignore media in the containing directory
20508ce072d579e0c0e9329b5a3830155de8da7de4cfKarl Ostmo     * and its subdirectories. Developers should use this to avoid application graphics showing
20518ce072d579e0c0e9329b5a3830155de8da7de4cfKarl Ostmo     * up in the Gallery and likewise prevent application sounds and music from showing up in
20528ce072d579e0c0e9329b5a3830155de8da7de4cfKarl Ostmo     * the Music app.
20538ce072d579e0c0e9329b5a3830155de8da7de4cfKarl Ostmo     */
20548ce072d579e0c0e9329b5a3830155de8da7de4cfKarl Ostmo    public static final String MEDIA_IGNORE_FILENAME = ".nomedia";
20553822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen
20563822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen    /**
20573822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen     * Get the media provider's version.
20583822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen     * Applications that import data from the media provider into their own caches
20593822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen     * can use this to detect that the media provider changed, and reimport data
20603822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen     * as needed. No other assumptions should be made about the meaning of the version.
20613822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen     * @param context Context to use for performing the query.
20623822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen     * @return A version string, or null if the version could not be determined.
20633822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen     */
20643822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen    public static String getVersion(Context context) {
20653822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen        Cursor c = context.getContentResolver().query(
20663822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen                Uri.parse(CONTENT_AUTHORITY_SLASH + "none/version"),
20673822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen                null, null, null, null);
20683822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen        if (c != null) {
20693822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen            try {
20703822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen                if (c.moveToFirst()) {
20713822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen                    return c.getString(0);
20723822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen                }
20733822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen            } finally {
20743822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen                c.close();
20753822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen            }
20763822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen        }
20773822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen        return null;
20783822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen    }
20793822f73a58af67ea7955f926c7d10335d86572c0Marco Nelissen
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2081