summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt8
-rw-r--r--core/java/android/provider/MediaStore.java164
2 files changed, 159 insertions, 13 deletions
diff --git a/api/current.txt b/api/current.txt
index 29d459ed8a52..f81eb54743ca 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -37864,7 +37864,11 @@ package android.provider {
method public static java.lang.String getVolumeName(android.net.Uri);
method public static android.provider.MediaStore.PendingSession openPending(android.content.Context, android.net.Uri);
method public static android.net.Uri setIncludePending(android.net.Uri);
+ method public static android.net.Uri setIncludeTrashed(android.net.Uri);
method public static android.net.Uri setRequireOriginal(android.net.Uri);
+ method public static void trash(android.content.Context, android.net.Uri);
+ method public static void trash(android.content.Context, android.net.Uri, long);
+ method public static void untrash(android.content.Context, android.net.Uri);
field public static final java.lang.String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE";
field public static final java.lang.String ACTION_IMAGE_CAPTURE_SECURE = "android.media.action.IMAGE_CAPTURE_SECURE";
field public static final java.lang.String ACTION_REVIEW = "android.provider.action.REVIEW";
@@ -38087,6 +38091,7 @@ package android.provider {
field public static final deprecated java.lang.String MINI_THUMB_MAGIC = "mini_thumb_magic";
field public static final java.lang.String ORIENTATION = "orientation";
field public static final deprecated java.lang.String PICASA_ID = "picasa_id";
+ field public static final java.lang.String SECONDARY_BUCKET_ID = "secondary_bucket_id";
}
public static final class MediaStore.Images.Media implements android.provider.MediaStore.Images.ImageColumns {
@@ -38131,11 +38136,13 @@ package android.provider {
public static abstract interface MediaStore.MediaColumns implements android.provider.BaseColumns {
field public static final deprecated java.lang.String DATA = "_data";
field public static final java.lang.String DATE_ADDED = "date_added";
+ field public static final java.lang.String DATE_EXPIRES = "date_expires";
field public static final java.lang.String DATE_MODIFIED = "date_modified";
field public static final java.lang.String DISPLAY_NAME = "_display_name";
field public static final java.lang.String HASH = "_hash";
field public static final java.lang.String HEIGHT = "height";
field public static final java.lang.String IS_PENDING = "is_pending";
+ field public static final java.lang.String IS_TRASHED = "is_trashed";
field public static final java.lang.String MIME_TYPE = "mime_type";
field public static final java.lang.String OWNER_PACKAGE_NAME = "owner_package_name";
field public static final java.lang.String SIZE = "_size";
@@ -38211,6 +38218,7 @@ package android.provider {
field public static final deprecated java.lang.String LONGITUDE = "longitude";
field public static final deprecated java.lang.String MINI_THUMB_MAGIC = "mini_thumb_magic";
field public static final java.lang.String RESOLUTION = "resolution";
+ field public static final java.lang.String SECONDARY_BUCKET_ID = "secondary_bucket_id";
field public static final java.lang.String TAGS = "tags";
}
diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java
index c4e2b1299fc2..f7ae28437bb2 100644
--- a/core/java/android/provider/MediaStore.java
+++ b/core/java/android/provider/MediaStore.java
@@ -17,6 +17,7 @@
package android.provider;
import android.annotation.BytesLong;
+import android.annotation.DurationMillisLong;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -55,6 +56,7 @@ import android.os.storage.StorageVolume;
import android.os.storage.VolumeInfo;
import android.service.media.CameraPrewarmService;
import android.text.TextUtils;
+import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
@@ -131,6 +133,8 @@ public final class MediaStore {
/** {@hide} */
public static final String PARAM_INCLUDE_PENDING = "includePending";
/** {@hide} */
+ public static final String PARAM_INCLUDE_TRASHED = "includeTrashed";
+ /** {@hide} */
public static final String PARAM_PROGRESS = "progress";
/** {@hide} */
public static final String PARAM_REQUIRE_ORIGINAL = "requireOriginal";
@@ -485,12 +489,29 @@ public final class MediaStore {
* By default no pending items are returned.
*
* @see MediaColumns#IS_PENDING
+ * @see MediaStore#setIncludePending(Uri)
+ * @see MediaStore#createPending(Context, PendingParams)
*/
public static @NonNull Uri setIncludePending(@NonNull Uri uri) {
return uri.buildUpon().appendQueryParameter(PARAM_INCLUDE_PENDING, "1").build();
}
/**
+ * Update the given {@link Uri} to also include any trashed media items from
+ * calls such as
+ * {@link ContentResolver#query(Uri, String[], Bundle, CancellationSignal)}.
+ * By default no trashed items are returned.
+ *
+ * @see MediaColumns#IS_TRASHED
+ * @see MediaStore#setIncludeTrashed(Uri)
+ * @see MediaStore#trash(Context, Uri)
+ * @see MediaStore#untrash(Context, Uri)
+ */
+ public static @NonNull Uri setIncludeTrashed(@NonNull Uri uri) {
+ return uri.buildUpon().appendQueryParameter(PARAM_INCLUDE_TRASHED, "1").build();
+ }
+
+ /**
* Update the given {@link Uri} to indicate that the caller requires the
* original file contents when calling
* {@link ContentResolver#openFileDescriptor(Uri, String)}.
@@ -516,6 +537,9 @@ public final class MediaStore {
*
* @return token which can be passed to {@link #openPending(Context, Uri)}
* to work with this pending item.
+ * @see MediaColumns#IS_PENDING
+ * @see MediaStore#setIncludePending(Uri)
+ * @see MediaStore#createPending(Context, PendingParams)
*/
public static @NonNull Uri createPending(@NonNull Context context,
@NonNull PendingParams params) {
@@ -572,6 +596,8 @@ public final class MediaStore {
this.insertValues.put(MediaColumns.DATE_ADDED, now);
this.insertValues.put(MediaColumns.DATE_MODIFIED, now);
this.insertValues.put(MediaColumns.IS_PENDING, 1);
+ this.insertValues.put(MediaColumns.DATE_EXPIRES,
+ (System.currentTimeMillis() + DateUtils.DAY_IN_MILLIS) / 1000);
}
/**
@@ -696,6 +722,7 @@ public final class MediaStore {
public @NonNull Uri publish() {
final ContentValues values = new ContentValues();
values.put(MediaColumns.IS_PENDING, 0);
+ values.putNull(MediaColumns.DATE_EXPIRES);
mContext.getContentResolver().update(mUri, values, null, null);
return mUri;
}
@@ -717,6 +744,67 @@ public final class MediaStore {
}
/**
+ * Mark the given item as being "trashed", meaning it should be deleted at
+ * some point in the future. This is a more gentle operation than simply
+ * calling {@link ContentResolver#delete(Uri, String, String[])}, which
+ * would take effect immediately.
+ * <p>
+ * This method preserves trashed items for at least 48 hours before erasing
+ * them, giving the user a chance to untrash the item.
+ *
+ * @see MediaColumns#IS_TRASHED
+ * @see MediaStore#setIncludeTrashed(Uri)
+ * @see MediaStore#trash(Context, Uri)
+ * @see MediaStore#untrash(Context, Uri)
+ */
+ public static void trash(@NonNull Context context, @NonNull Uri uri) {
+ trash(context, uri, 48 * DateUtils.HOUR_IN_MILLIS);
+ }
+
+ /**
+ * Mark the given item as being "trashed", meaning it should be deleted at
+ * some point in the future. This is a more gentle operation than simply
+ * calling {@link ContentResolver#delete(Uri, String, String[])}, which
+ * would take effect immediately.
+ * <p>
+ * This method preserves trashed items for at least the given timeout before
+ * erasing them, giving the user a chance to untrash the item.
+ *
+ * @see MediaColumns#IS_TRASHED
+ * @see MediaStore#setIncludeTrashed(Uri)
+ * @see MediaStore#trash(Context, Uri)
+ * @see MediaStore#untrash(Context, Uri)
+ */
+ public static void trash(@NonNull Context context, @NonNull Uri uri,
+ @DurationMillisLong long timeoutMillis) {
+ if (timeoutMillis < 0) {
+ throw new IllegalArgumentException();
+ }
+
+ final ContentValues values = new ContentValues();
+ values.put(MediaColumns.IS_TRASHED, 1);
+ values.put(MediaColumns.DATE_EXPIRES,
+ (System.currentTimeMillis() + timeoutMillis) / 1000);
+ context.getContentResolver().update(uri, values, null, null);
+ }
+
+ /**
+ * Mark the given item as being "untrashed", meaning it should no longer be
+ * deleted as previously requested through {@link #trash(Context, Uri)}.
+ *
+ * @see MediaColumns#IS_TRASHED
+ * @see MediaStore#setIncludeTrashed(Uri)
+ * @see MediaStore#trash(Context, Uri)
+ * @see MediaStore#untrash(Context, Uri)
+ */
+ public static void untrash(@NonNull Context context, @NonNull Uri uri) {
+ final ContentValues values = new ContentValues();
+ values.put(MediaColumns.IS_TRASHED, 0);
+ values.putNull(MediaColumns.DATE_EXPIRES);
+ context.getContentResolver().update(uri, values, null, null);
+ }
+
+ /**
* Common fields for most MediaProvider tables
*/
public interface MediaColumns extends BaseColumns {
@@ -821,12 +909,34 @@ public final class MediaStore {
* <p>
* Type: BOOLEAN
*
+ * @see MediaColumns#IS_PENDING
+ * @see MediaStore#setIncludePending(Uri)
* @see MediaStore#createPending(Context, PendingParams)
- * @see MediaStore#PARAM_INCLUDE_PENDING
*/
public static final String IS_PENDING = "is_pending";
/**
+ * Flag indicating if a media item is trashed.
+ * <p>
+ * Type: BOOLEAN
+ *
+ * @see MediaColumns#IS_TRASHED
+ * @see MediaStore#setIncludeTrashed(Uri)
+ * @see MediaStore#trash(Context, Uri)
+ * @see MediaStore#untrash(Context, Uri)
+ */
+ public static final String IS_TRASHED = "is_trashed";
+
+ /**
+ * The time the file should be considered expired. Units are seconds
+ * since 1970. Typically only meaningful in the context of
+ * {@link #IS_PENDING} or {@link #IS_TRASHED}.
+ * <p>
+ * Type: INTEGER
+ */
+ public static final String DATE_EXPIRES = "date_expires";
+
+ /**
* The width of the image/video in pixels.
*/
public static final String WIDTH = "width";
@@ -1251,18 +1361,32 @@ public final class MediaStore {
public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
/**
- * The bucket id of the image. This is a read-only property that
- * is automatically computed from the DATA column.
- * <P>Type: TEXT</P>
+ * The primary bucket ID of this media item. This can be useful to
+ * present the user a first-level clustering of related media items.
+ * This is a read-only column that is automatically computed.
+ * <p>
+ * Type: INTEGER
*/
public static final String BUCKET_ID = "bucket_id";
/**
- * The bucket display name of the image. This is a read-only property that
- * is automatically computed from the DATA column.
- * <P>Type: TEXT</P>
+ * The primary bucket display name of this media item. This can be
+ * useful to present the user a first-level clustering of related
+ * media items. This is a read-only column that is automatically
+ * computed.
+ * <p>
+ * Type: TEXT
*/
public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
+
+ /**
+ * The secondary bucket ID of this media item. This can be useful to
+ * present the user a second-level clustering of related media
+ * items. This is a read-only column that is automatically computed.
+ * <p>
+ * Type: INTEGER
+ */
+ public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
}
public static final class Media implements ImageColumns {
@@ -2500,20 +2624,34 @@ public final class MediaStore {
public static final String MINI_THUMB_MAGIC = "mini_thumb_magic";
/**
- * The bucket id of the video. This is a read-only property that
- * is automatically computed from the DATA column.
- * <P>Type: TEXT</P>
+ * The primary bucket ID of this media item. This can be useful to
+ * present the user a first-level clustering of related media items.
+ * This is a read-only column that is automatically computed.
+ * <p>
+ * Type: INTEGER
*/
public static final String BUCKET_ID = "bucket_id";
/**
- * The bucket display name of the video. This is a read-only property that
- * is automatically computed from the DATA column.
- * <P>Type: TEXT</P>
+ * The primary bucket display name of this media item. This can be
+ * useful to present the user a first-level clustering of related
+ * media items. This is a read-only column that is automatically
+ * computed.
+ * <p>
+ * Type: TEXT
*/
public static final String BUCKET_DISPLAY_NAME = "bucket_display_name";
/**
+ * The secondary bucket ID of this media item. This can be useful to
+ * present the user a second-level clustering of related media
+ * items. This is a read-only column that is automatically computed.
+ * <p>
+ * Type: INTEGER
+ */
+ public static final String SECONDARY_BUCKET_ID = "secondary_bucket_id";
+
+ /**
* The bookmark for the video. Time in ms. Represents the location in the video that the
* video should start playing at the next time it is opened. If the value is null or
* out of the range 0..DURATION-1 then the video should start playing from the