• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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