1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.provider; 18 19 import android.app.Activity; 20 import android.content.ContentResolver; 21 import android.content.Intent; 22 import android.database.Cursor; 23 import android.os.Bundle; 24 25 import java.util.UUID; 26 27 /** 28 * Defines the contract between a cloud media provider and the OS. 29 * <p> 30 * To create a cloud media provider, extend {@link CloudMediaProvider}, which 31 * provides a foundational implementation of this contract. 32 * 33 * @see CloudMediaProvider 34 */ 35 public final class CloudMediaProviderContract { 36 private static final String TAG = "CloudMediaProviderContract"; 37 CloudMediaProviderContract()38 private CloudMediaProviderContract() {} 39 40 /** 41 * {@link Intent} action used to identify {@link CloudMediaProvider} instances. This 42 * is used in the {@code <intent-filter>} of the {@code <provider>}. 43 */ 44 public static final String PROVIDER_INTERFACE = "android.content.action.CLOUD_MEDIA_PROVIDER"; 45 46 /** 47 * Permission required to protect {@link CloudMediaProvider} instances. Providers should 48 * require this in the {@code permission} attribute in their {@code <provider>} tag. 49 * The OS will not connect to a provider without this protection. 50 */ 51 public static final String MANAGE_CLOUD_MEDIA_PROVIDERS_PERMISSION = 52 "com.android.providers.media.permission.MANAGE_CLOUD_MEDIA_PROVIDERS"; 53 54 /** Constants related to a media item, including {@link Cursor} column names */ 55 public static final class MediaColumns { MediaColumns()56 private MediaColumns() {} 57 58 /** 59 * Unique ID of a media item. This ID is both provided by and interpreted 60 * by a {@link CloudMediaProvider}, and should be treated as an opaque 61 * value by client applications. 62 * 63 * <p> 64 * Each media item must have a unique ID within a provider. 65 * 66 * <p> 67 * A provider must always return stable IDs, since they will be used to 68 * issue long-term URI permission grants when an application interacts 69 * with {@link MediaStore#ACTION_PICK_IMAGES}. 70 * <p> 71 * Type: STRING 72 */ 73 public static final String ID = "id"; 74 75 /** 76 * Timestamp when a media item was capture, in milliseconds since 77 * January 1, 1970 00:00:00.0 UTC. 78 * <p> 79 * Implementations should extract this data from the metadata embedded in the media 80 * file. If this information is not available, a reasonable heuristic can be used, e.g. 81 * the time the media file was added to the media collection. 82 * <p> 83 * Type: LONG 84 * 85 * @see CloudMediaProviderContract.AlbumColumns#DATE_TAKEN_MILLIS 86 * @see System#currentTimeMillis() 87 */ 88 public static final String DATE_TAKEN_MILLIS = "date_taken_millis"; 89 90 /** 91 * Number associated with a media item indicating what generation or batch the media item 92 * was synced into the media collection. 93 * <p> 94 * Providers should associate a monotonically increasing sync generation number to each 95 * media item which is expected to increase for each atomic modification on the media item. 96 * This is useful for the OS to quickly identify that a media item has changed since a 97 * previous point in time. Note that this does not need to be unique across all media items, 98 * i.e. multiple media items can have the same SYNC_GENERATION value. However, the 99 * modification of a media item should increase the 100 * {@link MediaCollectionInfo#LAST_MEDIA_SYNC_GENERATION}. 101 * <p> 102 * Type: LONG 103 * 104 * @see MediaCollectionInfo#LAST_MEDIA_SYNC_GENERATION 105 */ 106 public static final String SYNC_GENERATION = "sync_generation"; 107 108 /** 109 * Concrete MIME type of a media file. For example, "image/png" or 110 * "video/mp4". 111 * <p> 112 * Type: STRING 113 */ 114 public static final String MIME_TYPE = "mime_type"; 115 116 /** 117 * Mime-type extension representing special format for a media item. 118 * 119 * Photo Picker requires special format tagging for media items. 120 * This is essential as media items can have various formats like 121 * Motion Photos, GIFs etc, which are not identifiable by 122 * {@link #MIME_TYPE}. 123 * <p> 124 * Type: INTEGER 125 */ 126 public static final String STANDARD_MIME_TYPE_EXTENSION = "standard_mime_type_extension"; 127 128 /** 129 * Constant for the {@link #STANDARD_MIME_TYPE_EXTENSION} column indicating 130 * that the media item doesn't have any special format associated with it. 131 */ 132 public static final int STANDARD_MIME_TYPE_EXTENSION_NONE = 0; 133 134 /** 135 * Constant for the {@link #STANDARD_MIME_TYPE_EXTENSION} column indicating 136 * that the media item is a GIF. 137 */ 138 public static final int STANDARD_MIME_TYPE_EXTENSION_GIF = 1; 139 140 /** 141 * Constant for the {@link #STANDARD_MIME_TYPE_EXTENSION} column indicating 142 * that the media item is a Motion Photo. 143 */ 144 public static final int STANDARD_MIME_TYPE_EXTENSION_MOTION_PHOTO = 2; 145 146 /** 147 * Constant for the {@link #STANDARD_MIME_TYPE_EXTENSION} column indicating 148 * that the media item is an Animated Webp. 149 */ 150 public static final int STANDARD_MIME_TYPE_EXTENSION_ANIMATED_WEBP = 3; 151 152 /** 153 * Size of a media file, in bytes. 154 * <p> 155 * Type: LONG 156 */ 157 public static final String SIZE_BYTES = "size_bytes"; 158 159 /** 160 * {@link MediaStore} URI of a media file if the file is available locally on the device. 161 * <p> 162 * If it's a cloud-only media file, this field should not be set. 163 * Any of the following URIs can be used: {@link MediaStore.Files}, 164 * {@link MediaStore.Images} or {@link MediaStore.Video} e.g. 165 * {@code content://media/file/45}. 166 * <p> 167 * Implementations don't need to handle the {@link MediaStore} URI becoming invalid after 168 * the local item has been deleted or modified. If the URI becomes invalid or the 169 * local and cloud file content diverges, the OS will treat the cloud media item as a 170 * cloud-only item. 171 * <p> 172 * Type: STRING 173 */ 174 public static final String MEDIA_STORE_URI = "media_store_uri"; 175 176 /** 177 * Duration of a video file in ms. If the file is an image for which duration is not 178 * applicable, this field can be left empty or set to {@code zero}. 179 * <p> 180 * Type: LONG 181 */ 182 public static final String DURATION_MILLIS = "duration_millis"; 183 184 /** 185 * Whether the item has been favourited in the media collection. If {@code non-zero}, this 186 * media item will appear in the favourites category in the Photo Picker. 187 * <p> 188 * Type: INTEGER 189 */ 190 public static final String IS_FAVORITE = "is_favorite"; 191 192 /** 193 * Authority of the media item 194 * <p> 195 * Type: STRING 196 * 197 * @hide 198 */ 199 public static final String AUTHORITY = "authority"; 200 201 /** 202 * File path of the media item 203 * <p> 204 * Type: STRING 205 * 206 * @hide 207 */ 208 public static final String DATA = "data"; 209 210 /** 211 * Array of all {@link MediaColumn} fields. 212 * 213 * @hide 214 */ 215 public static final String[] ALL_PROJECTION = new String[] { 216 ID, 217 DATE_TAKEN_MILLIS, 218 SYNC_GENERATION, 219 MIME_TYPE, 220 STANDARD_MIME_TYPE_EXTENSION, 221 SIZE_BYTES, 222 MEDIA_STORE_URI, 223 DURATION_MILLIS, 224 IS_FAVORITE, 225 DATA, 226 AUTHORITY, 227 }; 228 } 229 230 /** Constants related to an album item, including {@link Cursor} column names */ 231 public static final class AlbumColumns { AlbumColumns()232 private AlbumColumns() {} 233 234 /** 235 * Unique ID of an album. This ID is both provided by and interpreted 236 * by a {@link CloudMediaProvider}. 237 * <p> 238 * Each album item must have a unique ID within a media collection. 239 * <p> 240 * A provider should return durable IDs, since they will be used to cache 241 * album information in the OS. 242 * <p> 243 * Type: STRING 244 */ 245 public static final String ID = "id"; 246 247 248 /** 249 * Display name of a an album, used as the primary title displayed to a 250 * user. 251 * <p> 252 * Type: STRING 253 */ 254 public static final String DISPLAY_NAME = "display_name"; 255 256 /** 257 * Timestamp of the most recently taken photo in an album, in milliseconds since 258 * January 1, 1970 00:00:00.0 UTC. 259 * <p> 260 * Type: LONG 261 * 262 * @see CloudMediaProviderContract.MediaColumns#DATE_TAKEN_MILLIS 263 * @see System#currentTimeMillis() 264 */ 265 public static final String DATE_TAKEN_MILLIS = "date_taken_millis"; 266 267 /** 268 * Media id to use as the album cover photo. 269 * <p> 270 * If this field is not provided, albums will be shown in the Photo Picker without a cover 271 * photo. 272 * <p> 273 * Type: LONG 274 * 275 * @see CloudMediaProviderContract.MediaColumns#ID 276 */ 277 public static final String MEDIA_COVER_ID = "album_media_cover_id"; 278 279 /** 280 * Total count of all media within the album, including photos and videos. 281 * <p> 282 * If this field is not provided, albums will be shown without a count in the Photo Picker. 283 * <p> 284 * Empty albums should be omitted from the {@link CloudMediaProvider#onQueryAlbums} result, 285 * i.e. zero is not a valid media count. 286 * <p> 287 * Type: LONG 288 */ 289 public static final String MEDIA_COUNT = "album_media_count"; 290 291 /** 292 * Authority of the album item 293 * <p> 294 * Type: STRING 295 * 296 * @hide 297 */ 298 public static final String AUTHORITY = "authority"; 299 300 /** 301 * Whether the album item was generated locally 302 * <p> 303 * Type: STRING 304 * 305 * @hide 306 */ 307 public static final String IS_LOCAL = "is_local"; 308 309 /** 310 * Array of all {@link AlbumColumn} fields. 311 * 312 * @hide 313 */ 314 public static final String[] ALL_PROJECTION = new String[] { 315 ID, 316 DATE_TAKEN_MILLIS, 317 DISPLAY_NAME, 318 MEDIA_COVER_ID, 319 MEDIA_COUNT, 320 AUTHORITY, 321 }; 322 323 /** 324 * Includes local media present in any directory containing 325 * {@link Environment#DIRECTORY_SCREENSHOTS} in relative path 326 * 327 * @hide 328 */ 329 public static final String ALBUM_ID_SCREENSHOTS = "Screenshots"; 330 331 /** 332 * Includes local images/videos that are present in the 333 * {@link Environment#DIRECTORY_DCIM}/Camera directory. 334 * 335 * @hide 336 */ 337 public static final String ALBUM_ID_CAMERA = "Camera"; 338 339 /** 340 * Includes local and cloud videos only. 341 * 342 * @hide 343 */ 344 public static final String ALBUM_ID_VIDEOS = "Videos"; 345 346 /** 347 * Includes local images/videos that have {@link MediaStore.MediaColumns#IS_DOWNLOAD} set. 348 * 349 * @hide 350 */ 351 public static final String ALBUM_ID_DOWNLOADS = "Downloads"; 352 353 /** 354 * Includes local and cloud images/videos that have been favorited by the user. 355 * 356 * @hide 357 */ 358 public static final String ALBUM_ID_FAVORITES = "Favorites"; 359 } 360 361 /** Constants related to a media collection */ 362 public static final class MediaCollectionInfo { MediaCollectionInfo()363 private MediaCollectionInfo() {} 364 365 /** 366 * Media collection identifier 367 * <p> 368 * The only requirement on the collection ID is uniqueness on a device. 369 * <p> 370 * This value will not be interpreted by the OS, however it will be used to check the 371 * validity of cached data and URI grants to client apps. Anytime the media or album ids 372 * get re-indexed, a new collection with a new and unique id should be created so that the 373 * OS can clear its cache and more importantly, revoke any URI grants to apps. 374 * <p> 375 * Apps are recommended to generate unique collection ids with, {@link UUID#randomUUID}. 376 * This is preferred to using a simple monotonic sequence because the provider data could 377 * get cleared and it might have to re-index media items on the device without any history 378 * of its last ID. With random UUIDs, if data gets cleared, a new one can easily be 379 * generated safely. 380 * <p> 381 * Type: STRING 382 * 383 * @see CloudMediaProvider#onGetMediaCollectionInfo 384 */ 385 public static final String MEDIA_COLLECTION_ID = "media_collection_id"; 386 387 /** 388 * Last {@link CloudMediaProviderContract.MediaColumns#SYNC_GENERATION} in the media 389 * collection including deleted media items. 390 * <p> 391 * Providers should associate a monotonically increasing sync generation to each 392 * media item change (insertion/deletion/update). This is useful for the OS to quickly 393 * identify exactly which media items have changed since a previous point in time. 394 * <p> 395 * Type: LONG 396 * 397 * @see CloudMediaProviderContract#EXTRA_SYNC_GENERATION 398 * @see CloudMediaProvider#onGetMediaCollectionInfo 399 * @see CloudMediaProviderContract.MediaColumns#SYNC_GENERATION 400 */ 401 public static final String LAST_MEDIA_SYNC_GENERATION = "last_media_sync_generation"; 402 403 /** 404 * Name of the account that owns the media collection. 405 * <p> 406 * Type: STRING 407 * 408 * @see CloudMediaProvider#onGetMediaCollectionInfo 409 */ 410 public static final String ACCOUNT_NAME = "account_name"; 411 412 /** 413 * {@link Intent} Intent to launch an {@link Activity} to allow users configure their media 414 * collection account information like the account name. 415 * <p> 416 * Type: PARCELABLE 417 * 418 * @see CloudMediaProvider#onGetMediaCollectionInfo 419 */ 420 public static final String ACCOUNT_CONFIGURATION_INTENT = "account_configuration_intent"; 421 } 422 423 /** 424 * Opaque pagination token to retrieve the next page (cursor) from a media or album query. 425 * <p> 426 * Providers can optionally set this token as part of the {@link Cursor#setExtras} 427 * {@link Bundle}. If a token is set, the OS can pass it as a {@link Bundle} parameter when 428 * querying for media or albums to fetch subsequent pages. The provider can keep returning 429 * pagination tokens until the last page at which point it should not set a token on the 430 * {@link Cursor}. 431 * <p> 432 * If the provider handled the page token as part of the query, they must add 433 * the {@link #EXTRA_PAGE_TOKEN} key to the array of {@link ContentResolver#EXTRA_HONORED_ARGS} 434 * as part of the returned {@link Cursor#setExtras} {@link Bundle}. 435 * 436 * @see CloudMediaProvider#onQueryMedia 437 * @see CloudMediaProvider#onQueryAlbums 438 * <p> 439 * Type: STRING 440 */ 441 public static final String EXTRA_PAGE_TOKEN = "android.provider.extra.PAGE_TOKEN"; 442 443 /** 444 * {@link MediaCollectionInfo#MEDIA_COLLECTION_ID} on which the media or album query occurred. 445 * 446 * <p> 447 * Providers must set this token as part of the {@link Cursor#setExtras} 448 * {@link Bundle} returned from the cursors on query. 449 * This allows the OS to verify that the returned results match the 450 * {@link MediaCollectionInfo#MEDIA_COLLECTION_ID} queried via 451 * {@link CloudMediaProvider#onGetMediaCollectionInfo}. If the collection differs, the OS will 452 * ignore the result and may try again. 453 * 454 * @see CloudMediaProvider#onQueryMedia 455 * @see CloudMediaProvider#onQueryDeletedMedia 456 * @see CloudMediaProvider#onQueryAlbums 457 * <p> 458 * Type: STRING 459 */ 460 public static final String EXTRA_MEDIA_COLLECTION_ID = 461 "android.provider.extra.MEDIA_COLLECTION_ID"; 462 463 /** 464 * Generation number to fetch the latest media or album metadata changes from the media 465 * collection. 466 * <p> 467 * The provider should associate a monotonically increasing sync generation to each media 468 * item change (insertion/deletion/update). This is useful to quickly identify exactly which 469 * media items have changed since a previous point in time. 470 * <p> 471 * Providers should also associate a separate monotonically increasing sync generation 472 * for album changes (insertion/deletion/update). This album sync generation, should record 473 * both changes to the album metadata itself and changes to the media items contained in the 474 * album. E.g. a direct change to an album's 475 * {@link CloudMediaProviderContract.AlbumColumns#DISPLAY_NAME} will increase the 476 * album sync generation, likewise adding a photo to that album should also increase the 477 * sync generation. 478 * <p> 479 * Note that multiple media (or album) items can share a sync generation as long as the entire 480 * change appears atomic from the perspective of the query APIs. E.g. each item in a batch photo 481 * sync from the cloud can have the same sync generation if they were all synced atomically into 482 * the collection from the perspective of an external observer. 483 * <p> 484 * This extra can be passed as a {@link Bundle} parameter to the media or album query methods 485 * and the provider should only return items with a sync generation that is strictly greater 486 * than the one provided in the filter. 487 * <p> 488 * If the provider supports this filter, it must support the respective 489 * {@link CloudMediaProvider#onGetMediaCollectionInfo} methods to return the {@code count} and 490 * {@code max generation} for media or albums. 491 * <p> 492 * If the provider handled the generation, they must add the 493 * {@link #EXTRA_SYNC_GENERATION} key to the array of {@link ContentResolver#EXTRA_HONORED_ARGS} 494 * as part of the returned {@link Cursor#setExtras} {@link Bundle}. 495 * 496 * @see MediaCollectionInfo#LAST_MEDIA_SYNC_GENERATION 497 * @see CloudMediaProvider#onQueryMedia 498 * @see CloudMediaProvider#onQueryAlbums 499 * @see MediaStore.MediaColumns#GENERATION_MODIFIED 500 * <p> 501 * Type: LONG 502 */ 503 public static final String EXTRA_SYNC_GENERATION = "android.provider.extra.SYNC_GENERATION"; 504 505 /** 506 * Limits the query results to only media items matching the given album id. 507 * <p> 508 * If the provider handled the album filter, they must also add the {@link #EXTRA_ALBUM_ID} 509 * key to the array of {@link ContentResolver#EXTRA_HONORED_ARGS} as part of the returned 510 * {@link Cursor#setExtras} {@link Bundle}. 511 * 512 * @see CloudMediaProvider#onQueryMedia 513 * <p> 514 * Type: STRING 515 */ 516 public static final String EXTRA_ALBUM_ID = "android.provider.extra.ALBUM_ID"; 517 518 /** 519 * Limits the query results to only media items matching the give mimetype. 520 * <p> 521 * This may be a pattern, such as */*, to query for all available MIME types that match the 522 * pattern, e.g. {@code image/*} should match {@code image/jpeg} and {@code image/png}. 523 * 524 * @see CloudMediaProvider#onQueryMedia 525 * <p> 526 * Type: STRING 527 * @hide 528 */ 529 public static final String EXTRA_MIME_TYPE = "android.provider.extra.MIME_TYPE"; 530 531 /** 532 * Limits the query results to only media items less than the given file size in bytes. 533 * <p> 534 * This is only intended for the MediaProvider to implement for cross-user communication. Not 535 * for third party apps. 536 * 537 * @see CloudMediaProvider#onQueryMedia 538 * <p> 539 * Type: LONG 540 * @hide 541 */ 542 public static final String EXTRA_SIZE_LIMIT_BYTES = 543 "android.provider.extra.EXTRA_SIZE_LIMIT_BYTES"; 544 545 /** 546 * Forces the {@link CloudMediaProvider#onOpenPreview} file descriptor to return a thumbnail 547 * image. This is only useful for videos where the OS can either request a video or image 548 * for preview. 549 * 550 * @see CloudMediaProvider#onOpenPreview 551 * <p> 552 * Type: BOOLEAN 553 */ 554 public static final String EXTRA_PREVIEW_THUMBNAIL = 555 "android.provider.extra.PREVIEW_THUMBNAIL"; 556 557 /** 558 * A boolean to indicate {@link com.android.providers.media.photopicker.PhotoPickerProvider} 559 * this request is requesting a cached thumbnail file from MediaStore. 560 * 561 * Type: BOOLEAN 562 * 563 * {@hide} 564 */ 565 public static final String EXTRA_MEDIASTORE_THUMB = "android.provider.extra.MEDIASTORE_THUMB"; 566 567 /** 568 * Constant used to execute {@link CloudMediaProvider#onGetMediaCollectionInfo} via 569 * {@link ContentProvider#call}. 570 * 571 * {@hide} 572 */ 573 public static final String METHOD_GET_MEDIA_COLLECTION_INFO = "android:getMediaCollectionInfo"; 574 575 /** 576 * Constant used to execute {@link CloudMediaProvider#onCreateCloudMediaSurfaceController} via 577 * {@link ContentProvider#call}. 578 * 579 * {@hide} 580 */ 581 public static final String METHOD_CREATE_SURFACE_CONTROLLER = "android:createSurfaceController"; 582 583 /** 584 * Gets surface controller from {@link CloudMediaProvider#onCreateCloudMediaSurfaceController}. 585 * {@hide} 586 */ 587 public static final String EXTRA_SURFACE_CONTROLLER = 588 "android.provider.extra.SURFACE_CONTROLLER"; 589 590 /** 591 * Indicates whether to enable looping playback of media items. 592 * <p> 593 * In case this is not present, the default value should be false. 594 * 595 * @see CloudMediaProvider#onCreateCloudMediaSurfaceController 596 * @see CloudMediaProvider.CloudMediaSurfaceController#onConfigChange 597 * <p> 598 * Type: BOOLEAN 599 * By default, the value is true 600 */ 601 public static final String EXTRA_LOOPING_PLAYBACK_ENABLED = 602 "android.provider.extra.LOOPING_PLAYBACK_ENABLED"; 603 604 /** 605 * Indicates whether to mute audio during preview of media items. 606 * 607 * @see CloudMediaProvider#onCreateCloudMediaSurfaceController 608 * @see CloudMediaProvider.CloudMediaSurfaceController#onConfigChange 609 * <p> 610 * Type: BOOLEAN 611 * By default, the value is false 612 */ 613 public static final String EXTRA_SURFACE_CONTROLLER_AUDIO_MUTE_ENABLED = 614 "android.provider.extra.SURFACE_CONTROLLER_AUDIO_MUTE_ENABLED"; 615 616 /** 617 * Gets surface state callback from picker launched via 618 * {@link MediaStore#ACTION_PICK_IMAGES}). 619 * 620 * @see MediaStore#ACTION_PICK_IMAGES 621 * 622 * {@hide} 623 */ 624 public static final String EXTRA_SURFACE_STATE_CALLBACK = 625 "android.provider.extra.SURFACE_STATE_CALLBACK"; 626 627 /** 628 * Constant used to execute {@link CloudMediaProvider#onGetAsyncContentProvider()} via 629 * {@link android.content.ContentProvider#call}. 630 * 631 * {@hide} 632 */ 633 public static final String METHOD_GET_ASYNC_CONTENT_PROVIDER = 634 "android:getAsyncContentProvider"; 635 636 /** 637 * Constant used to get/set {@link IAsyncContentProvider} in {@link Bundle}. 638 * 639 * {@hide} 640 */ 641 public static final String EXTRA_ASYNC_CONTENT_PROVIDER = 642 "android.provider.extra.ASYNC_CONTENT_PROVIDER"; 643 644 /** 645 * Constant used to get/set {@link android.os.ParcelFileDescriptor} in {@link Bundle}. 646 * 647 * {@hide} 648 */ 649 public static final String EXTRA_FILE_DESCRIPTOR = "android.provider.extra.file_descriptor"; 650 651 /** 652 * Constant used to get/set CMP exception message in {@link Bundle}. 653 * 654 * {@hide} 655 */ 656 public static final String EXTRA_ERROR_MESSAGE = "android.provider.extra.error_message"; 657 658 /** 659 * Constant used to get/set the {@link CloudMediaProvider} authority. 660 * 661 * {@hide} 662 */ 663 public static final String EXTRA_AUTHORITY = "android.provider.extra.authority"; 664 665 /** 666 * URI path for {@link CloudMediaProvider#onQueryMedia} 667 * 668 * {@hide} 669 */ 670 public static final String URI_PATH_MEDIA = "media"; 671 672 /** 673 * URI path for {@link CloudMediaProvider#onQueryDeletedMedia} 674 * 675 * {@hide} 676 */ 677 public static final String URI_PATH_DELETED_MEDIA = "deleted_media"; 678 679 /** 680 * URI path for {@link CloudMediaProvider#onQueryAlbums} 681 * 682 * {@hide} 683 */ 684 public static final String URI_PATH_ALBUM = "album"; 685 686 /** 687 * URI path for {@link CloudMediaProvider#onGetMediaCollectionInfo} 688 * 689 * {@hide} 690 */ 691 public static final String URI_PATH_MEDIA_COLLECTION_INFO = "media_collection_info"; 692 693 /** 694 * URI path for {@link CloudMediaProvider#onCreateCloudMediaSurfaceController} 695 * 696 * {@hide} 697 */ 698 public static final String URI_PATH_SURFACE_CONTROLLER = "surface_controller"; 699 } 700