1 /* 2 * Copyright 2024 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 com.android.photopicker.core.events 18 19 import com.android.photopicker.core.banners.BannerDeclaration 20 import com.android.photopicker.core.banners.BannerDefinitions 21 import com.android.photopicker.data.model.Group 22 import com.android.providers.media.MediaProviderStatsLog 23 24 /* Convenience alias for classes that implement [Event] */ 25 typealias RegisteredEventClass = Class<out Event> 26 27 /** 28 * The definition of Photopicker events that can be sent through the Event bus. 29 * 30 * Event definitions should indicate where they are intended to be dispatched from. 31 * 32 * In general, favor adding a new event over re-using or re-purposing an existing event to avoid 33 * conflicts or unintended side effects. 34 * 35 * See [Events] for implementation details and guidance on how to use the event bus. Ensure that any 36 * events added are properly registered with the [FeatureManager]. 37 */ 38 interface Event { 39 40 /** 41 * All events must contain a dispatcherToken which signifies which feature dispatched this 42 * event. If the feature is not registered in the claiming feature's [eventsProduced] registry 43 * this will cause an error. 44 */ 45 val dispatcherToken: String 46 47 /** 48 * For ending the activity and referring the intent to documents UI. This is when the user 49 * selects to browse to documents UI, rather than being re-routed automatically based on a 50 * unsupported mimetype. 51 */ 52 data class BrowseToDocumentsUi(override val dispatcherToken: String) : Event 53 54 /** 55 * For showing a message to the user in a snackbar. 56 * 57 * @see [SnackbarFeature] for snackbar implementation details. 58 */ 59 data class ShowSnackbarMessage(override val dispatcherToken: String, val message: String) : 60 Event 61 62 // Each of the following data classes is an Event representation of their corresponding 63 // atom proto 64 65 /** Logs details about the launched picker session */ 66 data class ReportPhotopickerSessionInfo( 67 override val dispatcherToken: String, 68 val sessionId: Int, 69 val packageUid: Int, 70 val pickerSelection: Telemetry.PickerSelection, 71 val cloudProviderUid: Int, 72 val userProfile: Telemetry.UserProfile, 73 val pickerStatus: Telemetry.PickerStatus, 74 val pickedItemsCount: Int, 75 val pickedItemsSize: Int, 76 val profileSwitchButtonVisible: Boolean, 77 val pickerMode: Telemetry.PickerMode, 78 val pickerCloseMethod: Telemetry.PickerCloseMethod, 79 ) : Event 80 81 /** 82 * Logs details about how the picker was launched including information on the set picker 83 * options 84 */ 85 data class ReportPhotopickerApiInfo( 86 override val dispatcherToken: String, 87 val sessionId: Int, 88 val pickerIntentAction: Telemetry.PickerIntentAction, 89 val pickerSize: Telemetry.PickerSize, 90 val mediaFilter: Telemetry.MediaType, 91 val maxPickedItemsCount: Int, 92 val selectedTab: Telemetry.SelectedTab, 93 val selectedAlbum: Telemetry.SelectedAlbum, 94 val isOrderedSelectionSet: Boolean, 95 val isAccentColorSet: Boolean, 96 val isDefaultTabSet: Boolean, 97 val isCloudSearchEnabled: Boolean, 98 val isLocalSearchEnabled: Boolean, 99 val isTranscodingRequested: Boolean, 100 ) : Event 101 102 /** 103 * A general atom capturing any and all user interactions with the picker with other atoms 104 * focusing on more specific interactions detailing the same. 105 */ 106 data class LogPhotopickerUIEvent( 107 override val dispatcherToken: String, 108 val sessionId: Int, 109 val packageUid: Int, 110 val uiEvent: Telemetry.UiEvent, 111 ) : Event 112 113 data class LogPhotopickerAlbumOpenedUIEvent( 114 override val dispatcherToken: String, 115 val sessionId: Int, 116 val packageUid: Int, 117 val albumOpened: Group.Album, 118 ) : Event 119 120 /** Details out the information of a picker media item */ 121 data class ReportPhotopickerMediaItemStatus( 122 override val dispatcherToken: String, 123 val sessionId: Int, 124 val mediaStatus: Telemetry.MediaStatus, 125 val selectionSource: Telemetry.MediaLocation, 126 val itemPosition: Int, 127 val selectedAlbum: Group.Album?, 128 val mediaType: Telemetry.MediaType, 129 val cloudOnly: Boolean, 130 val pickerSize: Telemetry.PickerSize, 131 ) : Event 132 133 /** Captures details of the picker's preview mode */ 134 data class LogPhotopickerPreviewInfo( 135 override val dispatcherToken: String, 136 val sessionId: Int, 137 val previewModeEntry: Telemetry.PreviewModeEntry, 138 val previewItemCount: Int, 139 val mediaType: Telemetry.MediaType, 140 val videoInteraction: Telemetry.VideoPlayBackInteractions, 141 ) : Event 142 143 /** Logs the user's interaction with the photopicker menu */ 144 data class LogPhotopickerMenuInteraction( 145 override val dispatcherToken: String, 146 val sessionId: Int, 147 val packageUid: Int, 148 val menuItem: Telemetry.MenuItemSelected, 149 ) : Event 150 151 /** Logs the user's interaction with different picker banners */ 152 data class LogPhotopickerBannerInteraction( 153 override val dispatcherToken: String, 154 val sessionId: Int, 155 val bannerType: Telemetry.BannerType, 156 val userInteraction: Telemetry.UserBannerInteraction, 157 ) : Event 158 159 /** Logs details of the picker media library size */ 160 data class LogPhotopickerMediaLibraryInfo( 161 override val dispatcherToken: String, 162 val sessionId: Int, 163 val cloudProviderUid: Int, 164 val librarySize: Int, 165 val mediaCount: Int, 166 ) : Event 167 168 /** 169 * Captures the picker's paging details: can give an estimate of how far the user scrolled and 170 * the items loaded in. 171 */ 172 data class LogPhotopickerPageInfo( 173 override val dispatcherToken: String, 174 val sessionId: Int, 175 val pageNumber: Int, 176 val itemsLoadedInPage: Int, 177 ) : Event 178 179 /** Logs picker media sync information: both sync start/end and incremental syncs. */ 180 data class ReportPhotopickerMediaGridSyncInfo( 181 override val dispatcherToken: String, 182 val sessionId: Int, 183 val mediaCollectionInfoStartTime: Int, 184 val mediaCollectionInfoEndTime: Int, 185 val mediaSyncStartTime: Int, 186 val mediaSyncEndTime: Int, 187 val incrementalMediaSyncStartTime: Int, 188 val incrementalMediaSyncEndTime: Int, 189 val incrementalDeletedMediaSyncStartTime: Int, 190 val incrementalDeletedMediaSyncEndTime: Int, 191 ) : Event 192 193 /** Logs sync information for picker albums: both the album details and its content */ 194 data class ReportPhotopickerAlbumSyncInfo( 195 override val dispatcherToken: String, 196 val sessionId: Int, 197 val getAlbumsStartTime: Int, 198 val getAlbumsEndTime: Int, 199 val getAlbumMediaStartTime: Int, 200 val getAlbumMediaEndTime: Int, 201 ) : Event 202 203 /** Logs information about the picker's search functionality */ 204 data class ReportPhotopickerSearchInfo( 205 override val dispatcherToken: String, 206 val sessionId: Int, 207 val searchMethod: Telemetry.SearchMethod, 208 ) : Event 209 210 /** Logs details about the requests made for extracting search data */ 211 data class ReportSearchDataExtractionDetails( 212 override val dispatcherToken: String, 213 val sessionId: Int, 214 val unprocessedImagesCount: Int, 215 val processingStartTime: Int, 216 val processingEndTime: Int, 217 val isProcessingSuccessful: Boolean, 218 val isResponseReceived: Boolean, 219 ) : Event 220 221 /** Logs information about the embedded photopicker(implementation details) */ 222 data class ReportEmbeddedPhotopickerInfo( 223 override val dispatcherToken: String, 224 val sessionId: Int, 225 val isSurfacePackageCreationSuccessful: Boolean, 226 val surfacePackageDeliveryStartTime: Int, 227 val surfacePackageDeliveryEndTime: Int, 228 ) : Event 229 230 /** Logs media capabilities of the App requesting transcoding */ 231 data class ReportPickerAppMediaCapabilities( 232 override val dispatcherToken: String, 233 val sessionId: Int, 234 val supportedHdrTypes: IntArray, 235 val unsupportedHdrTypes: IntArray, 236 ) : Event 237 238 /** Logs information about the transcoding video */ 239 data class ReportTranscodingVideoDetails( 240 override val dispatcherToken: String, 241 val sessionId: Int, 242 val duration: Int, 243 val colorTransfer: Int, 244 val colorStandard: Int, 245 val mimeType: Int, 246 ) : Event 247 } 248 249 /** 250 * Holds the abstractions classes for all the enum protos to be used in the [Event] classes defined 251 * above. 252 */ 253 interface Telemetry { 254 255 /* 256 Number of items allowed to be picked 257 */ 258 @Suppress("ktlint:standard:max-line-length") 259 enum class PickerSelection(val selection: Int) { 260 SINGLE( 261 MediaProviderStatsLog 262 .PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_PERMITTED_SELECTION__SINGLE 263 ), 264 MULTIPLE( 265 MediaProviderStatsLog 266 .PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_PERMITTED_SELECTION__MULTIPLE 267 ), 268 UNSET_PICKER_SELECTION( 269 MediaProviderStatsLog 270 .PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_PERMITTED_SELECTION__UNSET_PICKER_PERMITTED_SELECTION 271 ), 272 } 273 274 /* 275 The user profile the picker is currently opened in 276 */ 277 enum class UserProfile(val profile: Int) { 278 WORK(MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__USER_PROFILE__WORK), 279 PERSONAL(MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__USER_PROFILE__PERSONAL), 280 PRIVATE_SPACE( 281 MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__USER_PROFILE__PRIVATE_SPACE 282 ), 283 UNKNOWN(MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__USER_PROFILE__UNKNOWN), 284 UNSET_USER_PROFILE( 285 MediaProviderStatsLog 286 .PHOTOPICKER_SESSION_INFO_REPORTED__USER_PROFILE__UNSET_USER_PROFILE 287 ), 288 } 289 290 /* 291 Holds the picker state at the moment 292 */ 293 enum class PickerStatus(val status: Int) { 294 OPENED(MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_STATUS__OPENED), 295 CANCELED(MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_STATUS__CANCELED), 296 CONFIRMED( 297 MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_STATUS__CONFIRMED 298 ), 299 UNSET_PICKER_STATUS( 300 MediaProviderStatsLog 301 .PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_STATUS__UNSET_PICKER_STATUS 302 ), 303 } 304 305 /* 306 Defines the kind of picker that was opened 307 */ 308 309 enum class PickerMode(val mode: Int) { 310 REGULAR_PICKER( 311 MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_MODE__REGULAR_PICKER 312 ), 313 EMBEDDED_PICKER( 314 MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_MODE__EMBEDDED_PICKER 315 ), 316 PERMISSION_MODE_PICKER( 317 MediaProviderStatsLog 318 .PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_MODE__PERMISSION_MODE_PICKER 319 ), 320 UNSET_PICKER_MODE( 321 MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_MODE__UNSET_PICKER_MODE 322 ), 323 } 324 325 /* 326 Captures how the picker was closed 327 */ 328 329 enum class PickerCloseMethod(val method: Int) { 330 SWIPE_DOWN( 331 MediaProviderStatsLog.PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_CLOSE_METHOD__SWIPE_DOWN 332 ), 333 CROSS_BUTTON( 334 MediaProviderStatsLog 335 .PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_CLOSE_METHOD__CROSS_BUTTON 336 ), 337 BACK_BUTTON( 338 MediaProviderStatsLog 339 .PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_CLOSE_METHOD__BACK_BUTTON 340 ), 341 SELECTION_CONFIRMED( 342 MediaProviderStatsLog 343 .PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_CLOSE_METHOD__PICKER_SELECTION_CONFIRMED 344 ), 345 UNSET_PICKER_CLOSE_METHOD( 346 MediaProviderStatsLog 347 .PHOTOPICKER_SESSION_INFO_REPORTED__PICKER_CLOSE_METHOD__UNSET_PICKER_CLOSE_METHOD 348 ), 349 } 350 351 /* 352 The size of the picker on the screen 353 */ 354 enum class PickerSize(val size: Int) { 355 COLLAPSED(MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SCREEN_SIZE__COLLAPSED), 356 EXPANDED(MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SCREEN_SIZE__EXPANDED), 357 UNSET_PICKER_SIZE( 358 MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SCREEN_SIZE__UNSET_PICKER_SIZE 359 ), 360 } 361 362 /* 363 The intent action that launches the picker 364 */ 365 enum class PickerIntentAction(val intentAction: Int) { 366 ACTION_PICK_IMAGES( 367 MediaProviderStatsLog 368 .PHOTOPICKER_API_INFO_REPORTED__PICKER_INTENT_ACTION__ACTION_PICK_IMAGES 369 ), 370 ACTION_GET_CONTENT( 371 MediaProviderStatsLog 372 .PHOTOPICKER_API_INFO_REPORTED__PICKER_INTENT_ACTION__ACTION_GET_CONTENT 373 ), 374 ACTION_USER_SELECT( 375 MediaProviderStatsLog 376 .PHOTOPICKER_API_INFO_REPORTED__PICKER_INTENT_ACTION__ACTION_USER_SELECT 377 ), 378 UNSET_PICKER_INTENT_ACTION( 379 MediaProviderStatsLog 380 .PHOTOPICKER_API_INFO_REPORTED__PICKER_INTENT_ACTION__UNSET_PICKER_INTENT_ACTION 381 ), 382 } 383 384 /* 385 Different media item types in the picker 386 */ 387 enum class MediaType(val type: Int) { 388 PHOTO(MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_TYPE__PHOTO), 389 VIDEO(MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_TYPE__VIDEO), 390 PHOTO_VIDEO( 391 MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_TYPE__PHOTO_VIDEO 392 ), 393 GIF(MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_TYPE__GIF), 394 LIVE_PHOTO( 395 MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_TYPE__LIVE_PHOTO 396 ), 397 OTHER(MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_TYPE__OTHER), 398 UNSET_MEDIA_TYPE( 399 MediaProviderStatsLog 400 .PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_TYPE__UNSET_MEDIA_TYPE 401 ), 402 } 403 404 /* 405 Different supported and unsupported HDR types 406 */ 407 enum class HdrTypes(val type: Int) { 408 HDR10_SUPPORTED( 409 MediaProviderStatsLog 410 .PHOTOPICKER_APP_MEDIA_CAPABILITIES_REPORTED__SUPPORTED_HDR_TYPES__TYPE_HDR10 411 ), 412 HDR10PLUS_SUPPORTED( 413 MediaProviderStatsLog 414 .PHOTOPICKER_APP_MEDIA_CAPABILITIES_REPORTED__SUPPORTED_HDR_TYPES__TYPE_HDR10_PLUS 415 ), 416 HLG_SUPPORTED( 417 MediaProviderStatsLog 418 .PHOTOPICKER_APP_MEDIA_CAPABILITIES_REPORTED__SUPPORTED_HDR_TYPES__TYPE_HLG 419 ), 420 DOLBY_SUPPORTED( 421 MediaProviderStatsLog 422 .PHOTOPICKER_APP_MEDIA_CAPABILITIES_REPORTED__SUPPORTED_HDR_TYPES__TYPE_DOLBY_VISION 423 ), 424 HDR10_UNSUPPORTED( 425 MediaProviderStatsLog 426 .PHOTOPICKER_APP_MEDIA_CAPABILITIES_REPORTED__UNSUPPORTED_HDR_TYPES__TYPE_HDR10 427 ), 428 HDR10PLUS_UNSUPPORTED( 429 MediaProviderStatsLog 430 .PHOTOPICKER_APP_MEDIA_CAPABILITIES_REPORTED__UNSUPPORTED_HDR_TYPES__TYPE_HDR10_PLUS 431 ), 432 HLG_UNSUPPORTED( 433 MediaProviderStatsLog 434 .PHOTOPICKER_APP_MEDIA_CAPABILITIES_REPORTED__UNSUPPORTED_HDR_TYPES__TYPE_HLG 435 ), 436 DOLBY_UNSUPPORTED( 437 MediaProviderStatsLog 438 .PHOTOPICKER_APP_MEDIA_CAPABILITIES_REPORTED__UNSUPPORTED_HDR_TYPES__TYPE_DOLBY_VISION 439 ), 440 } 441 442 /* 443 Different Video mime types 444 */ 445 enum class VideoMimeType(val type: Int) { 446 DOLBY( 447 MediaProviderStatsLog 448 .PHOTOPICKER_VIDEO_TRANSCODING_DETAILS_LOGGED__MIME_TYPE__MIME_DOLBY 449 ), 450 HEVC( 451 MediaProviderStatsLog.PHOTOPICKER_VIDEO_TRANSCODING_DETAILS_LOGGED__MIME_TYPE__MIME_HEVC 452 ), 453 } 454 455 /* 456 Different picker tabs 457 */ 458 enum class SelectedTab(val tab: Int) { 459 PHOTOS(MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_TAB__PHOTOS), 460 ALBUMS(MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_TAB__ALBUMS), 461 COLLECTIONS(MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_TAB__COLLECTIONS), 462 UNSET_SELECTED_TAB( 463 MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_TAB__UNSET_SELECTED_TAB 464 ), 465 } 466 467 /* 468 Different picker albums 469 */ 470 enum class SelectedAlbum(val album: Int) { 471 FAVOURITES(MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_ALBUM__FAVORITES), 472 CAMERA(MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_ALBUM__CAMERA), 473 DOWNLOADS(MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_ALBUM__DOWNLOADS), 474 SCREENSHOTS( 475 MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_ALBUM__SCREENSHOTS 476 ), 477 VIDEOS(MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_ALBUM__VIDEOS), 478 UNDEFINED_LOCAL( 479 MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_ALBUM__UNDEFINED_LOCAL 480 ), 481 UNDEFINED_CLOUD( 482 MediaProviderStatsLog.PHOTOPICKER_API_INFO_REPORTED__SELECTED_ALBUM__UNDEFINED_CLOUD 483 ), 484 UNSET_SELECTED_ALBUM( 485 MediaProviderStatsLog 486 .PHOTOPICKER_API_INFO_REPORTED__SELECTED_ALBUM__UNSET_SELECTED_ALBUM 487 ), 488 } 489 490 /* 491 Holds multiple user interactions with the picker 492 */ 493 enum class UiEvent(val event: Int) { 494 PICKER_MENU_CLICKED( 495 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_MENU_CLICK 496 ), 497 ENTER_PICKER_PREVIEW_MODE( 498 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__ENTER_PICKER_PREVIEW_MODE 499 ), 500 SWITCH_PICKER_TAB( 501 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__SWITCH_PICKER_TAB 502 ), 503 SWITCH_USER_PROFILE( 504 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__SWITCH_USER_PROFILE 505 ), 506 PICKER_MAIN_GRID_INTERACTION( 507 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_MAIN_GRID_INTERACTION 508 ), 509 PICKER_ALBUMS_INTERACTION( 510 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_ALBUMS_INTERACTION 511 ), 512 PICKER_CLICK_ADD_BUTTON( 513 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_CLICK_ADD_BUTTON 514 ), 515 PICKER_CLICK_VIEW_SELECTED( 516 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_CLICK_VIEW_SELECTED 517 ), 518 PICKER_LONG_SELECT_MEDIA_ITEM( 519 MediaProviderStatsLog 520 .PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_LONG_SELECT_MEDIA_ITEM 521 ), 522 EXPAND_PICKER(MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__EXPAND_PICKER), 523 COLLAPSE_PICKER( 524 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__COLLAPSE_PICKER 525 ), 526 PROFILE_SWITCH_BUTTON_CLICK( 527 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PROFILE_SWITCH_BUTTON_CLICK 528 ), 529 ACTION_BAR_HOME_BUTTON_CLICK( 530 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__ACTION_BAR_HOME_BUTTON_CLICK 531 ), 532 PICKER_BACK_GESTURE_CLICK( 533 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_BACK_GESTURE_CLICK 534 ), 535 PICKER_MENU_CLICK( 536 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_MENU_CLICK 537 ), 538 MAIN_GRID_OPEN(MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__MAIN_GRID_OPEN), 539 ALBUM_FAVOURITES_OPEN( 540 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__ALBUM_FAVOURITES_OPEN 541 ), 542 ALBUM_CAMERA_OPEN( 543 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__ALBUM_CAMERA_OPEN 544 ), 545 ALBUM_DOWNLOADS_OPEN( 546 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__ALBUM_DOWNLOADS_OPEN 547 ), 548 ALBUM_SCREENSHOTS_OPEN( 549 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__ALBUM_SCREENSHOTS_OPEN 550 ), 551 ALBUM_VIDEOS_OPEM( 552 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__ALBUM_VIDEOS_OPEM 553 ), 554 ALBUM_FROM_CLOUD_OPEN( 555 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__ALBUM_FROM_CLOUD_OPEN 556 ), 557 UI_LOADED_PHOTOS( 558 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__UI_LOADED_PHOTOS 559 ), 560 UI_LOADED_ALBUMS( 561 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__UI_LOADED_ALBUMS 562 ), 563 UI_LOADED_ALBUM_CONTENTS( 564 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__UI_LOADED_ALBUM_CONTENTS 565 ), 566 CREATE_SURFACE_CONTROLLER_START( 567 MediaProviderStatsLog 568 .PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__CREATE_SURFACE_CONTROLLER_START 569 ), 570 CREATE_SURFACE_CONTROLLER_END( 571 MediaProviderStatsLog 572 .PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__CREATE_SURFACE_CONTROLLER_END 573 ), 574 PICKER_PRELOADING_START( 575 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_PRELOADING_START 576 ), 577 PICKER_PRELOADING_FINISHED( 578 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_PRELOADING_FINISHED 579 ), 580 PICKER_PRELOADING_FAILED( 581 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_PRELOADING_FAILED 582 ), 583 PICKER_PRELOADING_CANCELLED( 584 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_PRELOADING_CANCELLED 585 ), 586 PICKER_BROWSE_DOCUMENTS_UI( 587 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_BROWSE_DOCUMENTS_UI 588 ), 589 ENTER_PICKER_SEARCH( 590 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__ENTER_PICKER_SEARCH 591 ), 592 SELECT_SEARCH_CATEGORY( 593 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__SELECT_SEARCH_CATEGORY 594 ), 595 SELECT_SEARCH_RESULT( 596 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__SELECT_SEARCH_RESULT 597 ), 598 PICKER_CATEGORIES_INTERACTION( 599 MediaProviderStatsLog 600 .PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_CATEGORIES_INTERACTION 601 ), 602 CATEGORY_PEOPLEPET_OPEN( 603 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__CATEGORIES_PEOPLEPET_OPEN 604 ), 605 CATEGORY_MEDIA_SETS_OPEN( 606 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__CATEGORIES_MEDIA_SETS_OPEN 607 ), 608 UI_LOADED_CATEGORIES_AND_ALBUMS( 609 MediaProviderStatsLog 610 .PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__UI_LOADED_CATEGORIES_AND_ALBUMS 611 ), 612 UI_LOADED_MEDIA_SETS( 613 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__UI_LOADED_MEDIA_SETS 614 ), 615 UI_LOADED_MEDIA_SETS_CONTENTS( 616 MediaProviderStatsLog 617 .PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__UI_LOADED_MEDIA_SETS_CONTENTS 618 ), 619 UI_LOADED_SEARCH_SUGGESTIONS( 620 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__UI_LOADED_SEARCH_SUGGESTIONS 621 ), 622 UI_LOADED_SEARCH_RESULTS( 623 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__UI_LOADED_SEARCH_RESULTS 624 ), 625 UI_LOADED_EMPTY_STATE( 626 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__UI_LOADED_EMPTY_STATE 627 ), 628 UNSET_UI_EVENT(MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__UNSET_UI_EVENT), 629 PICKER_TRANSCODING_START( 630 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_TRANSCODING_STARTED 631 ), 632 PICKER_TRANSCODING_SUCCESS( 633 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_TRANSCODING_FINISHED 634 ), 635 PICKER_TRANSCODING_FAILED( 636 MediaProviderStatsLog.PHOTOPICKER_UIEVENT_LOGGED__UI_EVENT__PICKER_TRANSCODING_FAILED 637 ), 638 } 639 640 /* 641 Holds the selection status of the media items 642 */ 643 enum class MediaStatus(val status: Int) { 644 SELECTED( 645 MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_STATUS__SELECTED 646 ), 647 UNSELECTED( 648 MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_STATUS__UNSELECTED 649 ), 650 UNSET_MEDIA_STATUS( 651 MediaProviderStatsLog 652 .PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_STATUS__UNSET_MEDIA_STATUS 653 ), 654 } 655 656 /* 657 Holds the location of the media item 658 */ 659 enum class MediaLocation(val location: Int) { 660 MAIN_GRID( 661 MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_LOCATION__MAIN_GRID 662 ), 663 ALBUM(MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_LOCATION__ALBUM), 664 UNSET_MEDIA_LOCATION( 665 MediaProviderStatsLog 666 .PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_LOCATION__UNSET_MEDIA_LOCATION 667 ), 668 CATEGORY( 669 MediaProviderStatsLog.PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_LOCATION__CATEGORY 670 ), 671 SEARCH_GRID( 672 MediaProviderStatsLog 673 .PHOTOPICKER_MEDIA_ITEM_STATUS_REPORTED__MEDIA_LOCATION__SEARCH_GRID 674 ), 675 } 676 677 /* 678 Defines how the user entered the preview mode 679 */ 680 enum class PreviewModeEntry(val entry: Int) { 681 VIEW_SELECTED( 682 MediaProviderStatsLog.PHOTOPICKER_PREVIEW_INFO_LOGGED__PREVIEW_MODE_ENTRY__VIEW_SELECTED 683 ), 684 LONG_PRESS( 685 MediaProviderStatsLog.PHOTOPICKER_PREVIEW_INFO_LOGGED__PREVIEW_MODE_ENTRY__LONG_PRESS 686 ), 687 UNSET_PREVIEW_MODE_ENTRY( 688 MediaProviderStatsLog 689 .PHOTOPICKER_PREVIEW_INFO_LOGGED__PREVIEW_MODE_ENTRY__UNSET_PREVIEW_MODE_ENTRY 690 ), 691 } 692 693 /* 694 Defines different video playback user interactions 695 */ 696 @Suppress("ktlint:standard:max-line-length") 697 enum class VideoPlayBackInteractions(val interaction: Int) { 698 PLAY(MediaProviderStatsLog.PHOTOPICKER_PREVIEW_INFO_LOGGED__VIDEO_INTERACTIONS__PLAY), 699 PAUSE(MediaProviderStatsLog.PHOTOPICKER_PREVIEW_INFO_LOGGED__VIDEO_INTERACTIONS__PAUSE), 700 MUTE(MediaProviderStatsLog.PHOTOPICKER_PREVIEW_INFO_LOGGED__VIDEO_INTERACTIONS__MUTE), 701 UNSET_VIDEO_PLAYBACK_INTERACTION( 702 MediaProviderStatsLog 703 .PHOTOPICKER_PREVIEW_INFO_LOGGED__VIDEO_INTERACTIONS__UNSET_VIDEO_PLAYBACK_INTERACTION 704 ), 705 } 706 707 /* 708 Picker menu item options 709 */ 710 enum class MenuItemSelected(val item: Int) { 711 BROWSE( 712 MediaProviderStatsLog.PHOTOPICKER_MENU_INTERACTION_LOGGED__MENU_ITEM_SELECTED__BROWSE 713 ), 714 CLOUD_SETTINGS( 715 MediaProviderStatsLog 716 .PHOTOPICKER_MENU_INTERACTION_LOGGED__MENU_ITEM_SELECTED__CLOUD_SETTINGS 717 ), 718 UNSET_MENU_ITEM_SELECTED( 719 MediaProviderStatsLog 720 .PHOTOPICKER_MENU_INTERACTION_LOGGED__MENU_ITEM_SELECTED__UNSET_MENU_ITEM_SELECTED 721 ), 722 } 723 724 /* 725 Holds the different kind of banners displayed in the picker 726 */ 727 enum class BannerType(val type: Int) { 728 CLOUD_MEDIA_AVAILABLE( 729 MediaProviderStatsLog 730 .PHOTOPICKER_BANNER_INTERACTION_LOGGED__BANNER_TYPE__CLOUD_MEDIA_AVAILABLE 731 ), 732 ACCOUNT_UPDATED( 733 MediaProviderStatsLog 734 .PHOTOPICKER_BANNER_INTERACTION_LOGGED__BANNER_TYPE__ACCOUNT_UPDATED 735 ), 736 CHOOSE_ACCOUNT( 737 MediaProviderStatsLog.PHOTOPICKER_BANNER_INTERACTION_LOGGED__BANNER_TYPE__CHOOSE_ACCOUNT 738 ), 739 CHOOSE_APP( 740 MediaProviderStatsLog.PHOTOPICKER_BANNER_INTERACTION_LOGGED__BANNER_TYPE__CHOOSE_APP 741 ), 742 UNSET_BANNER_TYPE( 743 MediaProviderStatsLog 744 .PHOTOPICKER_BANNER_INTERACTION_LOGGED__BANNER_TYPE__UNSET_BANNER_TYPE 745 ); 746 747 companion object { 748 749 /** 750 * Attempts to map a [BannerDeclaration] to the [BannerType] enum for logging banner 751 * related data. At worst, will return [UNSET_BANNER_TYPE] for a banner without a 752 * mapping. 753 * 754 * @param declaration The [BannerDeclaration] to convert to a [BannerType] 755 * @return The corresponding [BannerType] or [UNSET_BANNER_TYPE] if a mapping isn't 756 * found. 757 */ fromBannerDeclarationnull758 fun fromBannerDeclaration(declaration: BannerDeclaration): BannerType { 759 return when (declaration.id) { 760 BannerDefinitions.CLOUD_CHOOSE_ACCOUNT.id -> BannerType.CHOOSE_ACCOUNT 761 BannerDefinitions.CLOUD_CHOOSE_PROVIDER.id -> BannerType.CHOOSE_APP 762 BannerDefinitions.CLOUD_MEDIA_AVAILABLE.id -> BannerType.CLOUD_MEDIA_AVAILABLE 763 BannerDefinitions.CLOUD_UPDATED_ACCOUNT.id -> BannerType.ACCOUNT_UPDATED 764 // TODO(b/357010907): add a BannerType enum for the PRIVACY_EXPLAINER 765 BannerDefinitions.PRIVACY_EXPLAINER.id -> BannerType.UNSET_BANNER_TYPE 766 else -> BannerType.UNSET_BANNER_TYPE 767 } 768 } 769 } 770 } 771 772 /* 773 Different user interactions with the above defined banners 774 */ 775 @Suppress("ktlint:standard:max-line-length") 776 enum class UserBannerInteraction(val interaction: Int) { 777 CLICK_BANNER_ACTION_BUTTON( 778 MediaProviderStatsLog 779 .PHOTOPICKER_BANNER_INTERACTION_LOGGED__USER_BANNER_INTERACTION__CLICK_BANNER_ACTION_BUTTON 780 ), 781 CLICK_BANNER_DISMISS_BUTTON( 782 MediaProviderStatsLog 783 .PHOTOPICKER_BANNER_INTERACTION_LOGGED__USER_BANNER_INTERACTION__CLICK_BANNER_DISMISS_BUTTON 784 ), 785 CLICK_BANNER( 786 MediaProviderStatsLog 787 .PHOTOPICKER_BANNER_INTERACTION_LOGGED__USER_BANNER_INTERACTION__CLICK_BANNER 788 ), 789 UNSET_BANNER_INTERACTION( 790 MediaProviderStatsLog 791 .PHOTOPICKER_BANNER_INTERACTION_LOGGED__BANNER_TYPE__UNSET_BANNER_TYPE 792 ), 793 } 794 795 /* 796 Different ways of searching in the picker 797 */ 798 enum class SearchMethod(val method: Int) { 799 SEARCH_QUERY( 800 MediaProviderStatsLog.PHOTOPICKER_SEARCH_INFO_REPORTED__SEARCH_METHOD__SEARCH_QUERY 801 ), 802 SUGGESTED_SEARCHES( 803 MediaProviderStatsLog 804 .PHOTOPICKER_SEARCH_INFO_REPORTED__SEARCH_METHOD__SUGGESTED_SEARCHES 805 ), 806 UNSET_SEARCH_METHOD( 807 MediaProviderStatsLog 808 .PHOTOPICKER_SEARCH_INFO_REPORTED__SEARCH_METHOD__UNSET_SEARCH_METHOD 809 ), 810 CATEGORY_SEARCH( 811 MediaProviderStatsLog.PHOTOPICKER_SEARCH_INFO_REPORTED__SEARCH_METHOD__CATEGORY_SEARCH 812 ), 813 } 814 } 815